Un nombre indéfinissable est un nombre qui est divisible par sept ou dont sept est l'un des chiffres. Un jeu pour enfants doit compter en sautant des nombres indicibles
1 2 3 4 5 6 ( ) 8 9 10 11 12 13 ( ) 15 16 ( ) 18 ...
La version du jeu de Cantor est la séquence définie en remplissant de manière récursive la séquence "1 2 3 4 5 6 () 8 ..." dans les espaces () ci-dessus.
1 2 3 4 5 6 1 8 9 10 11 12 13 2 15 16 3 18 19 20 4 22 23 24 25 26 5 6 29 30 31 32 33 34 1 36 8 38 ...
Imprimer / éditer au moins les 7 premiers ^ ^ 7 numéros du jeu de nombres indicibles de Cantor ...
Bien que la définition soit donnée de manière récursive, vous n'êtes pas obligé d'utiliser la récursion dans le code.
C'est du code-golf , alors le programme avec le plus petit nombre d'octets gagne!
Remarque: la somme des nombres de 1 à 7 ^ 7 correspond à 203511962727. Les 10 derniers chiffres de cette plage sont 823534 823535 221563 108068 823538 823539 823540 823541 823542 221565.
Dump Pastebin des 1000 premières itérées: http://pastebin.com/Ksiu9Svf
Réponses:
Pyth ,
252322 octetsMerci à @Maltysen pour -2 octets
Un programme qui imprime un flux infini.
Essayez-le en ligne! (Sortie rincée par intervalles et expire au bout d'une minute)
Comment ça fonctionne
la source
7
c'est primordial, donc la divisibilité est possible en vérifiant la factorisation en premier, ce qui cadre bien avec l'autre vérificationPython 2,
77757470 octetsMerci à @MartinEnder pour suggérer la limite
9e5
qui Ende r d à travailler après un changement.Merci à @mschauer pour avoir suggéré un flux infini, économisant 4 octets.
C'est un générateur qui produit un flot infini de nombres.
la source
if n%7<1or'7'in`n`else n
pourrait être légèrement plus rapide (même nombre d'octets), carn%7<1
est plus rapide que de vérifier la chaîne, etor
court-circuiter. C'est dommage que çayield[n,next(i)][n%7<1or'7'in`n`]
ne marche pas.Perl,
47464139 octets5 octets sauvegardés grâce à @Dada
Essayez-le en ligne! TIO Nexus, maintenant avec le support Perl! Cela tronquera la sortie après un certain point, mais si vous avez installé Perl, vous pouvez l'exécuter localement pour produire la sortie complète.
Le code utilise quelques bizarreries étranges de la syntaxe de Perl, je vais donc expliquer comment cela fonctionne ci-dessous.
Répartition du code:
la source
say$a[@a]=$_=...
gagner 2 octets si je ne me trompe pas.$_
, cela me fait gagner 5 octets. Merci!PHP,
80 (Wahooka) 5754 octetsBien que l'idée vienne de Wahooka. Je pense que ma version est suffisamment différente pour en faire une réponse personnelle:
la source
Haskell,
67 à66 octetsf
est une liste infinie des nombres.Essayez-le en ligne!
f
commence une nouvelle itération avec1
un index dont le nombre à choisir est 0. Chaque fois qu'il y a un espace, nous prenons une nouvelle itération, sélectionnons sonith
élément et continuons l'itération en cours aveci+1
. S'il n'y a pas d'écart, on prend le nombre actuelx
et on continue sans augmenteri
.Edit: -1 octet grâce à @BMO.
la source
MATL ,
26 à25 octetsEssayez-le en ligne! with
9e5
replace by9e4
, de sorte que le temps d'exécution maximal et la taille de sortie du compilateur en ligne ne soient pas dépassés.Comment ça fonctionne
Cela utilise l'itération au lieu de la récursivité. (En fait, MATL n'a pas de récursivité).
Un tableau de nombres de
1
à9e5
est d'abord généré (c'est suffisant, car9e5
dépasse7^7
). Ensuite, les chiffres qui sont des multiples de7
ou ont7
comme chiffres sont identifiés, et remplacé par1
,2
... Le processus est répété jusqu'à ce qu'il n'y a pas de chiffres qui ont besoin d'être remplacés.la source
Tcl , 121 octets
La solution triviale utilisant la boucle infinie, rien de fantaisie ..
Ungolfed:
la source
incr
. Et si tcl version> = 8.6,incr
la première itération suppose l’incrémentation d’une nouvelle variable de0
à1
si cette variable n’a pas été définie auparavant; afin que vous puissiez vous débarrasser des deux premièresset
instructions.PHP,
10680 octetsMerci Ismael Miguel pour l’aide fournie avec la solution ternaire et le code de boucle plus court utilisé pour pendant au lieu de.
Impossible de vérifier les dernières parties de la séquence complète en raison de la durée d'exécution maximale de 30 secondes de PhpFiddle. Semble fonctionner au moins 1K en fonction de la sortie d’échantillon fournie par l’OP.
Le golf:
Version golfée originale :
la source
for($n=1;;$n++)echo$a[]=!(strpos($n,7)>-1||$n%7==0)?"$n ":array_shift($a)." ";
Je ne connais pas le nombre d'octets, mais je suis sûr qu'il est bien inférieur à 106 octets. Essayez-le et voyez si cela fonctionne.for($n=1;;$n++)echo$a[]=strpos($n,"7")>-1||$n%7==0?array_shift($a)." ":"$n ";
. Je ne sais pas si vous pouvez remplacer$n%7==0
par!$n%7
mais cela vaut la peine d'essayer.for(;;)echo$a[]=strpos(++$n,55)<-1&&$n%7?"$n ":$a[++$b-1];
(58 octets).++$b-1
parce que$a[null] === null
Julia, 62 octets
Rien d'extraordinaire. Utilise que la séquence dans les espaces vides est la séquence elle-même. Effectue des copies de matrice excessives pour sauvegarder certains octets.
la source
Perl 6 ,
74 57 5453 octetsL'essayer
Étendu:
Tester:
la source
~7
au lieu de'7'
.Ceylan, 202 octets
Ce n'est pas une fonction, mais une déclaration d'objet implémentant une séquence infinie (Iterable). L'objet peut être imprimé directement,
print(u)
génère ceci:{ 1, 2, 3, 4, 5, 6, 1, 8, 9, 10, 11, 12, 13, 2, 15, 16, 3, 18, 19, 20, 4, 22, 23, 24, 25, 26, 5, 6, 29, 30, ... }
Pour imprimer plus, utilisez
printAll(u)
. Le code suivant utilise des nouvelles lignes et imprime également la somme (et les 30 premiers éléments illustrés ci-dessus):Voici la version non-golfée et commentée:
la source
Ruby, 80 octets
l=->x{x%7==0||x.to_s[/7/]};a=(1..100);b=a.reject &l p a.map{|x|!l[x]?x:b.shift}
Première soumission, je suis sûr que cela peut être amélioré :)
la source
34
(ce qui est8
actuellement) devrait être7
, mais comme il7
s'agit d'un nombre indiciable, le programme doit commencer une troisième itération et imprimer à la place1
.Dyalog APL , 39 octets
{(⍵⍴⍨⍴i)@(i←⍸('7'∊¨⍕¨⍵)∨0=7|⍵)⊢⍵}⍣≡⍳7*7
⍳7*7
est 1 2 3 ... 7 7{ }⍣≡
est l' opérateur du point fixe - applique une fonction plusieurs fois jusqu'à ce que le résultat se stabiliseA@I⊢B
modifier l' opérateur - remplacer les éléments à des indicesI
dansB
desA
0=7|⍵
masque de bits pour où l'argument est divisible par 7'7'∊¨⍕¨⍵
masque binaire pour lequel la mise en forme décimale de l'argument contient un 7∨
ou⍸
à quels indices l'un ou l'autre des masques ci-dessus est-il vrai?i←
affecter ài
⍵⍴⍨⍴i
remodeler l'argument pour le nombre d'éléments dansi
la source
C
157155 octetsCela semble correct, je n'ai pas pris la peine de vérifier complètement. Va jusqu'à 999999, ce qui est apparemment assez grand.
Version non-golfée:
Version partiellement golfée:
la source
else
?(r=0)
plupart du temps. Mais certains compilateurs sont difficiles. Je suis trop paresseux pour vérifier les spécifications en ce moment.R, 86 octets
Utilise la vérité de R intégrée
T
(initialisée àTRUE
/1
) pour compter les nombres de la séquence et la valeur FalsyF
(initialisée àFALSE
/0
) pour compter les indéfinissables. En dehors de cela, le programme vérifie simplement si chaque nombre est divisible par sept ou s'il contient le nombre.la source
7%in%el(strsplit(c(T,""),""))
par55%in%utf8ToInt(paste(T))
? (non testé)C - 115 octets
EDIT: Merci à @mschauer qui a fait remarquer que j'avais raté certaines choses.
la source
Javascript, 80 octets
Puisqu'il existe seulement des exigences minimales mais pas des exigences maximales, cette solution continue à produire indéfiniment.
Pour vérifier que l'algorithme est correct, vous pouvez exécuter le même code en n'imprimant que les 10 derniers chiffres et la somme:
la source
Mathematica, 82 octets
la source
JavaScript 81 octets
Original (98 octets)
Golfé
la source
p=console.log;for(c=0,i=1;i<=Math.pow(7,7);i++)/7/.test(i)||i%7==0?(6==c?c=1:c++,p(c)):p(i);
?9e5
au lieu deMath.pow(7,7)
, puisque le défi disait:Print/output AT LEAST the first 7^7
34 1 36 **8** 38
. Mais pour ce que ça vaut la peine, la version actuelle pourrait être un peu plus golfed:for(c=i=0;++i<9e5;)console.log(!/7/.test(i)&&i%7?i:c++%6+1)
.Befunge, 100 ou 156 octets
Cette première version est la plus portable des deux, se limitant aux cellules de mémoire 7 bits, ce que vous obtenez dans l'interpréteur de référence.
La deuxième version ne fonctionne qu'avec les interpréteurs dotés de cellules de mémoire 32 bits et n'est donc pas strictement Befunge standard, mais cela nous permet de stocker des valeurs plus importantes en mémoire sans avoir à les diviser en plusieurs cellules.
Dans les deux cas, le programme fonctionne indéfiniment, mais la première version dépassera la barre des 2 millions, tandis que la seconde version devrait atteindre la valeur maximale en int (environ 2 milliards).
Vous pouvez essayer en ligne , mais vous devrez arrêter le processus pour l'empêcher d'essayer de s'exécuter pour toujours.
la source
Clojure, 130 octets
Réduire de base, en gardant une trace du contenu du vecteur de résultat et du nombre de valeurs ignorées. Le dernier
0
prend le premier élément du réduit[r s]
,rest
supprime le premier élément du résultat indexé par 0.la source
Perl6, 41 octets
la source
Tcl , 64 octets
Essayez-le en ligne!
la source
JavaScript, 64 octets
la source
console.log
) réponses JavaScript, il s’agit de 70 octetsJapt , 25 octets
Testez la somme et les 10 derniers éléments.
Génère les premiers 1 000 000 entrées de la séquence et les imprime. Un million est le nombre le plus court sur
7**7 == 823543
Japt.Le retour à la ligne final est significatif car il active l’affectation implicite à
U
.La génération de la liste ne prend qu’en une seconde environ, mais la sortie de l’ensemble du tableau risque de bloquer votre navigateur.
Déballé et comment ça marche
Utilise la propriété selon laquelle la définition récursive peut être résolue en examinant la séquence déjà générée.
la source