Montre moi le démon le plus proche


42

Un nombre démoniaque est un entier positif dont la représentation décimale est constituée de 6. La liste des nombres démoniaques commence par 6, 66, 666, 6666.

Étant donné un entier positif, indiquez le nombre démoniaque le plus proche. S'il y en a deux, affichez le plus gros.

Testcases:

n   output
1   6
2   6
3   6
6   6
35  6
36  66
37  66
100 66
365 66
366 666
666 666
999 666

C'est du . La réponse la plus courte en octets l'emporte.


1
Quel est le nombre maximum que nous devons supporter?
M. Xcoder

1
@ Mr.Xcoder aussi grand que vous pouvez soutenir.
Leaky Nun

3
@ LeakyNun, bien que je ne sois pas un habitué du PPCG, je dirais que cette règle n'est pas vraiment géniale, car je peux simplement dire "je ne peux prendre en charge que des nombres allant jusqu'à 34 parce que je voulais avoir le code le plus court"
Ferrybig

5
@Ferrybig aussi grand que vous pouvez supporter, donc aussi gros que la langue vous limite.
Leaky Nun

3
Apparemment, le démon le plus proche est Jörg W Mittag .
user2357112 prend en charge Monica

Réponses:


51

Python 2, 28 octets

lambda n:'6'*len(`-~n*3/11`)

3
C'est une solution soignée.
Leaky Nun

Wow c'est impressionnant. Le mien était de 105 octets en utilisant la méthode triviale rip. Agréable!
HyperNeutrino

4
Très sympa. Comment avez-vous trouvé cet algorithme?
David Z

C'est génial. L'équivalent en JS est un peu plus long:x=>'6'.repeat((''+-~(x*3/11)).length)
Steve Bennett

8
@DavidZ Indice: la moyenne de 666 et 6666 est 3666 3.6666... = 11/3..
Orlp

14

JavaScript (ES6), 31 29 octets

f=(x,s='6')=>x<3+s?s:f(x,s+6)

"C'est pourquoi, je me délecte de faiblesses […] Car quand je suis faible, alors je suis fort."


Wow, pour une fois, la conversion de type en Javascript est exactement ce dont vous avez besoin :) C'est génial.
Steve Bennett

“C'est pourquoi, je me complais dans les faiblesses […] Car quand je suis faible, alors je suis fort.” ~~ 2 Corinthiens 12:10
John Dvorak

@JohnDvorak "C'est pourquoi je prends plaisir aux infirmités [...] car quand je suis faible, alors je suis fort." sonne mieux.
MoustacheMoses


5

Java 7, 96 93 66 octets

String c(int n){String r="";for(n*=11/3;n>1;r+=6,n/=10);return r;}

Port de @orlp incroyable réponse Python 2 .

Essayez ici.

Je suppose que mon compte de 66 octets est également un démon. ;)
(Ce n'est pas la réponse la plus courte en Java, voir la réponse de @JollyJoker pour cela à la place.


L'utilisation d'arithmétique entière doit être plus courte.
Leaky Nun

1
Allez golf, juste un octet de plus s'il vous plait! : p
Olivier Grégoire

1
Aucun de vos cas de test n'est correct.
Leaky Nun

1
@ OlivierGrégoire a besoin de r = "" comme une correction de toute façon, donc vous obtiendrez votre souhait :)
JollyJoker

@LeakyNun Oups .. Copié le code incorrect .. le "6"aurait dû être "".
Kevin Cruijssen

4

Gelée , 9 octets

Ẇa6ḌạÐṂ⁸Ṫ

Un lien monadique.

Essayez-le en ligne! - Presque pas de point dans ce lien (voir ci-dessous)!

Comment?

Dans le style des vrais golfeurs, cela est vraiment inefficace - il arrive à la fin des années 60 chez TIO pour le scénario de test 365 ! Localement cela se termine en 37s.

Ẇa6ḌạÐṂ⁸Ṫ - Main link: n
Ẇ         - all sublists - this has an implicit make_range on it's input
          -   so, for example, an input of 3 yields [[1],[2],[3],[1,2],[2,3],[1,2,3]]
          -   the important things are: that it contains both a list of the length of the
          -   decimal number, and a list 1 shorter; and that it's lists only contain
          -   non-zero numbers and are monotonically increasing in length.
  6       - literal 6
 a        - and (vectorises), this changes all the values to 6s
          -    so, the example above becomes [[6],[6],[6],[6,6],[6,6],[6,6,6]]
   Ḍ      - convert to decimal (vectorises)  [ 6,  6,, 6,  66,   66,   666   ]
       ⁸  - link's right argument, n
     ÐṂ   - filter keep those with minimal:
    ạ     -   absolute difference (for 366 this keeps 66 AND 666; same goes for 3666; etc.)
        Ṫ - tail - get the rightmost result (for 366 keeps 666, since it's longer)

Un patch pour faire le même parcours de l' algorithme dans les années 60 limite pour 365 et 366 sur TIO est d'éviter la vectorisation implicite avec Ẇa6Ḍ€ạÐṂ⁸Ṫ( essayer ), mais cela va maintenant seg-faute pour une entrée de 999 ( Triangle (999) est seulement 499,500 mais chacun est une liste d’entiers, ce qui donne un total de Tetrahedral (999) = 166 666 500 entiers, ce qui optimise la mémoire, du moins en Python).


3

Gelée , 10 octets

RD6ṁḌạÐṂ¹Ṫ

Essayez-le en ligne!


Un port ne serait-il pas plus court?
Leaky Nun

J'ai essayé et j'ai eu 10 aussi.
Dennis

oh, le problème est-il qu'un espace doit être inséré entre 11 et 6?
Leaky Nun

Vous ne savez pas comment vous placeriez 11 et 6 l'un à côté de l'autre; peut-être me manque quelque chose. Je ai eu ‘×3:11Ṿ”6ṁpour la sortie de chaîne, ‘×3:11D6ṁḌpour un entier.
Dennis


3

JavaScript (ES6), 41 octets

f=(n,i=0,j=6)=>n*2<j?i||6:f(n-j,i+j,j*10)

Cas de test


3

Mathematica, 36 octets

Fonction pure:

Max[NestList[6+10#&,6,#]~Nearest~#]&

Explication:

    NestList[6+10#&,6,#]

Itératif créer une liste de longueur égale à l'entrée en NestListsuivant le modèle à 6+10x(previous_value)partir de la valeur 6.

                        ~Nearest~#

Trouvez ensuite la valeur dans cette liste la plus proche de l’entrée.

Max[                              ]

Enfin, prenez la valeur maximale dans la liste des valeurs les plus proches.

Tandis que la longueur de la liste est super inefficace car mathematica peut travailler avec des nombres de longueur de précision arbitraire, ce programme n’est limité que par la mémoire physique.



3

05AB1E , 10 à 9 octets

- 1 octet grâce à Riley

6׌ΣI-Ä}¬

Essayez-le en ligne!

Le code ci-dessus peut avoir des problèmes de performances, voici une version un peu plus efficace avec 10 octets: Alternative TIO

Explication

6׌ΣI-Ä}¬   Main link. Argument n
6×          Push string containing '6' n times
  Œ         Push substrings
   Σ   }    Sort by result of code
    I-Ä     Absolute difference between n
        ¬   Head, implicit output

Oui, mais il y avait des problèmes de performances lors du dernier test. Les 60 secondes maximum sur TIO ne suffisaient pas pour l'exécuter):
kalsowerus 22/05/17

@Riley merci, j'ai mis à jour ma réponse :)
kalsowerus

2

Mathematica, 76 octets

Max[Take[LinearRecurrence[{11,-10},{0,6},IntegerLength[#]+1],-2]~Nearest~#]&

2

Neim , 12 à 10 octets (non en concurrence)

-1 octet grâce à steenbergh

𝐥𝐈Γ6Θℝ)₁>𝕔

Explication:

               Implicit input: [366]
𝐥               Push the length of the input
                [3]
  𝐈             Inclusive range
                [[1, 2, 3]]
   Γ            For each
       ℝ         Repeat
    6            6
     Θ           currently looped value times
                 [[6, 66, 666]]
          )     End for each
             𝕔  Get the closest value to
           ₁    The first line of input...
            >   ...incremented by one
                [666]
                Implicitly print entire stack

Malheureusement, 𝕔 nous renverrons la valeur la plus basse dans une liste si deux nombres ont la même différence. Nous avons donc dû ajouter 2 octets pour en tenir compte.

Non en concurrence comme >, <et ont été ajoutés après cette question a été posée (et𝐥 été corrigé pour fonctionner avec des nombres, pas seulement des listes)

Remarque: ne fonctionnera pas pour les nombres de longueur égale ou supérieure à 19, car ils deviennent trop volumineux pour les longs traitements de Java. (mais c'est une valeur assez importante, et ça devrait aller)

L'essayer


Vous pouvez sûrement faire cette réponse en compétition ....
Leaky Nun

par exemple cela fonctionnerait-il si vous remplacez Γ6Θℝ)par ΓΘ𝐈Γ6)𝐣)?
Leaky Nun

@ LeakyNun Je vais y jeter un coup d'œil.
Okx

@ LeakyNun Non, je ne pense pas qu'il y ait un moyen de le rendre concurrentiel, car il y avait un bogue (maintenant corrigé) avec les boucles intégrées.
Okx

Qui a voté bas, et pourquoi?
Okx

2

Java 8, 37 octets

 n->(""+-~n*3/11).replaceAll(".","6");

En passant par l'exemple de Kevin Cruijssen et juste retourner une chaîne.

Faites l’astuce * 3/11 pour obtenir la bonne longueur, puis remplacez-les tous par des six.


@LeakyNun Bien sûr, -~je devais ajouter celui que j'aurais dû voir dix fois sur cette page si j'avais prêté attention ...
JollyJoker

2
Je compte 36 octets. Votre code comporte un point-virgule de fin inutile et un espace de début.
Esolanging Fruit

1

QBIC , 37 27 octets

≈!@36`!<=:|A=A+!6$]?_sA,2,a

Au lieu d'utiliser Maths ™, il utilise maintenant la manipulation de chaînes pour trouver les ruptures dans les domaines démoniaques (36, 366, ...). Inspiré par la réponse JS de @ eush77.

Explication

≈         |  WHILE <condition> 
 !    !        a numerical cast of
  @  `         the string literal A$
   36          starting out as "36"
       <=    is smaller than or equal to
         :   cmd line argument 'a'
A=A+ 6       Add a 6 to the end of A$ (36 ==> 366 ==> 3666)
    ! $         as a string-cast
]            WEND (ends the WHIOLE loop body)
?_sA         PRINT a substring of A$            n=37, A$ = 366
  ,2           starting at index 2                          ^
  ,a           running well past the end of the string      66

1

dc , 46 octets

dsxZ1-10r^d11*2-3/dsylx[0r-]s.<.3*ly+d[6]s.0=.

Essayez-le en ligne!

dsxZ1-10r^d11*2-3/dsylx[0r-]s.<.3*ly+d[6]s.0=.
   Z1-10r^                                      Nearest power of 10
           11*2-3/                              The number in between 6ⁿ and 6ⁿ6
          d          lx[0r-]s.<.                Check which side we're on
                                3*ly+           Get the answer for x≥3
                                     d[6]s.0=.  Return 6 for x<3

1

C #, 142 octets

a=>{var c=(a+"").Length;return int.Parse(a<int.Parse(3+new string('6',c==1?2:(c==10?1:c)))?new string('6',c-1):new string('6',c==10?c-1:c));};

Il utilise le fait que nous devons passer au prochain numéro deamonique tous les 36666 ... sous une forme plus lisible:

var c = (a + "").Length; 
    return int.Parse(a < int.Parse(3 + new string('6', 
        c == 1 ? 2 : (c == 10 ? 1 : c))) 
        ? new string('6', c - 1) 
        : new string('6', c == 10 ? c - 1 : c));

2
Je pense que l'utilisation de l'arithmétique entière au lieu de String peut vous faire économiser beaucoup d'octets.
Leaky Nun

Eh bien, vous pouvez convertir un nombre en chaîne en c # simplement en y ajoutant une chaîne car il a un opérateur surchargé +, comme le montre ma réponse sur 102 octets .. int comme la question vient de nous demander de "sortir le numéro démoniaque le plus proche"
lee

1

braingasm , 15 octets

;3*11/z+[6:10/]

Utilisation de l'arithmétique de la solution Python d' Orlp :

;                   Read an integer from stdin
 3*11/              Multiply by 3 and divide by 11
      z+            If result is zero, add one
        [6:10/]     While not zero, print '6' and divide by 10

1

Je n'ai pas vu cette question dans le fil, et je suis tombé dessus par hasard. Voici ma réponse quand même:

JavaScript (ES6), 34 octets

n=>`${-~n*3/11|0}`.replace(/./g,6)

Ajoutez 1 octet pour une réponse numérique. Initialement basé sur cette réponse ESG non golfée (37 octets, déjà numérique):

n=>(10**(Math.log10(-~n*3/11)|0)*2-2)/3

De façon ennuyeuse, OP veut que 36 soit plus proche de 66 que de 6. Explication: 11/3 = 3.666 ..., divisant ainsi par ceci les échelles des gammes 7..36, 37..366, etc. aux gammes 1..9.9, 10 ..99.9 etc. Cela peut être résolu purement numériquement en prenant 2/3 de moins que la puissance immédiatement supérieure de 10, bien qu'il soit plus difficile de tronquer, de convertir en chaîne, puis de changer tous les caractères en chiffre 6. ( pas aussi ludique que cette réponse récursive vraiment intelligente.)


1

CJam, 25 octets

Pas aussi lent que la soumission de Jonathan Alan Jelly, mais nécessite de la mémoire O (n²) , où n est le nombre entré. Ouais.

ri)__{)'6*i}%f-_:z_:e<#=-

Ceci est équivalent au Python suivant:

num = int(input()) + 1                                      # CJam: ri)__
demondiffs = [int("6" * (i + 1)) - num for i in range(num)] # CJam: {)'6*i}%f-
absdiffs = [abs(i) for i in demondiffs]                     # CJam: _:z
mindex = absdiffs.index(min(absdiffs))                      # CJam: _:e<#
print(num - demondiffs[mindex])                             # CJam: =-

Solution alternative, 12 octets

ri)3*B/s,'6*

Ceci est une traduction de l'algorithme de orlp dans CJam.

Explication:

ri           e# Read integer:       | 36
  )          e# Increment:          | 37
   3*        e# Multiply by 3:      | 111
     B/      e# Divide by 0xB (11): | 10
       s     e# Convert to string:  | "10"
        ,    e# String length:      | 2
         '6  e# Push character '6': | 2 '6
           * e# Repeat character:   | "66"
e# Implicit output: 66

1

PHP, 49 octets

couper le personnage 6

for(;trim($x=$argn+$i,6)>"";)$i=($i<1)-$i;echo$x;

Essayez-le en ligne!

Au lieu de, trim($x=$argn+$i,6)>""vous pouvez utiliser une solution Regex !preg_match("#^6+$#",$x=$argn+$i)+11 octets ou une longueur de chaîne égale à la 6comparaison de comptage strlen($x=$argn+$i)-strspn($x,6)+10 octets.


1

LOLCODE 1.4, 471 octets

HAI 1.4
CAN HAS STRING?
I HAS A i
GIMMEH i
I HAS A l ITZ I IZ STRING'Z LEN YR i MKAY
I HAS A s ITZ "3"
IM IN YR a
BOTH SAEM I IZ STRING'Z LEN YR s MKAY AN l
O RLY?
YA RLY
GTFO
OIC
s R SMOOSH s AN 6
IM OUTTA YR l
I HAS A o
DIFFRINT i AN BIGGR of i AN 4
O RLY?
YA RLY
VISIBLE 6
NO WAI
BOTH SAEM i AN SMALLR of i AN s
O RLY?
YA RLY
o R DIFF OF l AN 1
NO WAI
o R l
OIC
I HAS A f
IM IN YR b UPPIN YR k TIL BOTH SAEM k AN o
f R SMOOSH f AN 6
IM OUTTA YR b
VISIBLE f
OIC
KTHXBYE

Sensationnel. Voici que Ungolfed and Explained:

HAI 1.4
CAN HAS STRING?
I HAS A input
GIMMEH input
I HAS A length ITZ I IZ STRING'Z LEN YR input MKAY BTW this is using the length function of the STRING library.
I HAS A sixes ITZ "3" BTW the average of for example [6...] and 6[6...] is 3[6...].
IM IN YR foreverloop BTW this loop fills the sixes variable.
    BOTH SAEM I IZ STRING'Z LEN YR sixes MKAY AN length # In LOLCODE, a statement containing only an expression assigns the implicit variable IT.
    O RLY? # Tests the current value in IT.
      YA RLY
        GTFO
    OIC
    sixes R SMOOSH sixes AN 6 BTW SMOOSH automatically casts things to YARN. It also does not need a MKAY unless there's something after it on the line.
IM OUTTA YR foreverloop
I HAS A outputlength
DIFFRINT input AN BIGGR of input AN 4 BTW LOLCODE doesn't have a built-in inequality operator. This just means input < 4
O RLY?
  YA RLY
    VISIBLE 6 BTW If it's less than 4, the algorithm of comparing to the nearest 3.6*10^n.
  NO WAI
    BOTH SAEM input AN SMALLR of input AN sixes BTW input<=sixes
    O RLY? BTW This if statement makes sure that if the input is less than 3.6*10^length, it goes to the previous place value's demon number.
      YA RLY
        outputlength R DIFF OF length AN 1
      NO WAI
        outputlength R length
    OIC
    I HAS A final
    IM IN YR forloop UPPIN YR iterator TIL BOTH SAEM iterator and outputlength
        final R SMOOSH final AN 6
    IM OUTTA YR forloop
    VISIBLE final
OIC
KTHXBYE

Encore wow. Voici quelques pseudojavascrython pour vous.

hello()
import string
var i
i=input()
var l=string.len(i)
var s="3"
while True:
  if(string.len(s)==l):
    break
  s=s+6
var o
if(i!=max(i,4)): # Basically if(i<4)
  print 6
else:
  if(i==min(i,s)): # Basically if(i<=s)
    o=l-1
  else:
    o=l
  var f
  for(var k=0;k<o;k++):
    f=f+6
  print(f)
exit()

Tu ne comprends toujours pas? Ce programme fondamentalement juste (en excluant les entrées 1-3) compare l’entrée à 3.6 * 10 ^ n, n étant la longueur de l’entrée. S'il est inférieur à ce nombre, le nombre de 6 est inférieur à la longueur. S'il est supérieur ou égal à ce nombre, le nombre de six est la longueur actuelle.

J'adorerais une aide au golf!


0

Haxe, 70 octets

function(x){x*=3;x/=11;do{Sys.print('6');}while((x=Std.int(x/10))>0);}

L'entrée doit être passée en tant que type Float alors qu'elle est un entier, sinon Haxe se plaindra d'essayer de diviser un entier (oui, haxe refusera de compiler si vous divisez un entier par quelque chose).

Identique à toutes les autres réponses. Multipliez par 3, divisez par 11, imprimez 1 6pour chaque chiffre.


0

Brainfuck, 315 octets

,+>+++[>>+<<-]>>[<<<[>+>+<<-]>>[<<+>>-]>-]<+++++++++++<[>>+<<-]>>[<[>>+>+<<<-]>>>[<<<+>>>-]<[>+<<-[>>[-]>+<<<-]>>>[<<<+>>>-]<[<-[<<<->>>[-]]+>-]<-]<<<+>>]<[-]+<[>-]>[<+>->]++++++[<+++++++++>-]<<<[-]++++++++++>[>.<[<<+>>-]<<[>[<<+<+>>>-]<<<[>>>+<<<-]>[<+>>-[<<[-]<+>>>-]<<<[>>>+<<<-]>[>-[>>>-<<<[-]]+<-]>-]>>>+<<]>>]

Exécutez-le ici . Sélectionnez une taille de cellule pouvant gérer des valeurs de 3 * (n + 1). Par conséquent, pour que tous les scénarios de test fonctionnent, sélectionnez 16. La mémoire dynamique (infinie) doit être activée pour que cela fonctionne. Cela permet à la bande de s’étendre vers la gauche. Pour saisir un entier, tapez l'entrée comme suit:\366 pour n = 366.

Ungolfed:

Utilise le même algorithme que cette solution . Les algorithmes utilisés pour chaque étape sont extraits de cette page . Tous les algorithmes utilisés ne sont pas wrappés, afin que le programme ne casse pas pour des entrées plus volumineuses.

,+ # n = n plus 1
>+++ # 3
[>>+<<-]>>[<<<[>+>+<<-]>>[<<+>>-]>-] # n = n*3
<+++++++++++ # 10
<[>>+<<-]>>[<[>>+>+<<<-]>>>[<<<+>>>-]<[>+<<-[>>[-]>+<<<-]>>>[<<<+>>>-]<[<-[<<<->>>[-]]+>-]<-]<<<+>>] # n = n/10
<[-]+<[>-]>[<+>->] # if (n == 0) { n = n plus 1 }
++++++[<+++++++++>-] # '6' (54)
<<<[-]++++++++++> # 10
[ # while (n above 0)
  >.< # print '6'
  [<<+>>-]<<[>[<<+<+>>>-]<<<[>>>+<<<-]>[<+>>-[<<[-]<+>>>-]<<<[>>>+<<<-]>[>-[>>>-<<<[-]]+<-]>-]>>>+<<]>> # n = n/10
]

Sûrement le n=n*3peut être joué au golf à quelque chose comme [->+++<]? Et l' algorithme divmod à diviser par 10?
Jo King

134 octets , ce qui pourrait être encore amélioré
Jo King

@JoKing Vous devez utiliser des algorithmes de non-wrapping pour prendre en charge les cas de test plus volumineux. Votre solution ne fonctionnera donc pas. Il y a une raison pour laquelle je n'ai pas utilisé TIO.
mbomb007

Oups, je vais enlever la partie d'emballage, qui n'était que le numéro. 140 octets (TIO car il est plus facile de donner le code) (EOF = 0)
Jo King



0

C #, 102 octets

string a(int j,int k=0)=>(j+"|"+(k=k==0?j:k)).Split('|').Where(s=>s.All(c=>c=='6')).Max()??a(j+1,k-1);

Un peu déçu par la longueur de ce document, je pouvais faire exactement la même chose que la réponse plus courte en Java, mais je ne le comprenais pas vraiment car je suis un développeur .NET stupide et stupide :)

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.