Eine unaussprechliche Zahl ist eine Zahl, die durch sieben teilbar ist oder sieben als eine ihrer Ziffern hat. Ein Kinderspiel ist es, unaussprechliche Zahlen zu zählen
1 2 3 4 5 6 ( ) 8 9 10 11 12 13 ( ) 15 16 ( ) 18 ...
Cantors Version des Spiels ist die Sequenz, die durch rekursives Einfügen der Sequenz "1 2 3 4 5 6 () 8 ..." in die obigen Lücken () definiert wird.
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 ...
Mindestens die ersten 7 ^ 7-Nummern von Cantors unaussprechlichem Zahlenspiel drucken / ausgeben ...
Während die Definition rekursiv angegeben wird, müssen Sie im Code keine Rekursion verwenden.
Das ist Code-Golf , also gewinnt das Programm mit der kürzesten Byteanzahl!
Hinweis: Die Summe der Zahlen in 1 bis 7 ^ 7 ist 203511962727. Die letzten 10 Zahlen in diesem Bereich sind 823534 823535 221563 108068 823538 823539 823540 823541 823542 221565.
Pastebin-Dump der ersten 1000 Iterationen: http://pastebin.com/Ksiu9Svf
Antworten:
Pyth ,
252322 BytesDanke an @Maltysen für -2 Bytes
Ein Programm, das einen unendlichen Stream ausgibt.
Probieren Sie es online! (Ausgabe wird in Intervallen gespült und läuft nach 1 Minute ab)
Wie es funktioniert
quelle
7
Primzahl ist, also kann die Teilbarkeit durch Überprüfen der Primzahlfaktorisierung erfolgen, was gut zu dem anderen Scheck passtPython 2,
77757470 BytesDank @MartinEnder für das Vorschlagen der Grenze von
9e5
dem Ende r nach einer Änderung Arbeits d auf.Vielen Dank an @mschauer für die Empfehlung eines unendlichen Streams, der 4 Bytes einspart.
Dies ist ein Generator, der einen unendlichen Strom von Zahlen liefert.
quelle
if n%7<1or'7'in`n`else n
ist möglicherweise etwas schneller (gleiche Byteanzahl), da diesn%7<1
schneller ist als das Überprüfen der Zeichenfolge und einenor
Kurzschluss verursacht. Schade, dassyield[n,next(i)][n%7<1or'7'in`n`]
das nicht geht.Perl,
47464139 Bytes5 Bytes dank @Dada gespart
Probieren Sie es online! TIO Nexus, jetzt mit Perl-Unterstützung! Dadurch wird die Ausgabe nach einem bestimmten Zeitpunkt abgeschnitten. Wenn Sie jedoch Perl installiert haben, können Sie es lokal ausführen, um die vollständige Ausgabe zu erhalten.
Der Code verwendet einige seltsame Macken der Perl-Syntax, daher werde ich im Folgenden auf die Funktionsweise eingehen.
Code-Aufschlüsselung:
quelle
say$a[@a]=$_=...
2 Bytes zu gewinnen, wenn ich mich nicht irre.$_
rettet, spart es mir 5 Bytes. Vielen Dank!PHP,
80 (Wahooka) 5754 BytesWährend die Idee von Wahooka ist. Ich denke, meine Version ist anders genug, um eine eigene Antwort zu geben:
quelle
Haskell,
6766 Bytesf
ist eine unendliche Liste der Zahlen.Probieren Sie es online!
f
Startet eine neue Iteration mit1
und gibt einen Index an, für den eine Zahl von 0 ausgewählt werden soll. Wenn eine Lücke vorhanden ist, nehmen wir eine neue Iteration und wählen ihrith
Element aus und setzen die aktuelle Iteration mit forti+1
. Wenn es keine Lücke gibt, nehmen wir die aktuelle Zahlx
und fahren fort, ohne zuzunehmeni
.Edit: -1 Byte dank @BMO.
quelle
MATL ,
2625 BytesProbieren Sie es online! wird durch
9e5
ersetzt9e4
, damit die maximale Laufzeit und Ausgabegröße des Online-Compilers nicht überschritten wird.Wie es funktioniert
Dies verwendet Iteration anstelle von Rekursion. (In der Tat hat MATL keine Rekursion).
Zuerst wird ein Array von Zahlen von
1
bis9e5
generiert (dies reicht aus, weil es9e5
überschreitet7^7
). Dann Zahlen , die ein Vielfaches von sind7
oder haben7
als Ziffer identifiziert werden , und ersetzt durch1
,2
... Der Prozess wird wiederholt, bis es keine Zahlen, die ersetzt werden müssen.quelle
Tcl , 121 Bytes
Die triviale Lösung mit Endlosschleife, nichts Besonderes ..
Ungolfed:
quelle
incr
. Und wenn tcl version> = 8.6 ist, wird beiincr
der ersten Iteration ein Inkrement einer neuen Variablen von0
bis angenommen,1
wenn diese Variable zuvor nicht festgelegt wurde. So können Sie die ersten beidenset
Anweisungen loswerden .PHP,
10680 BytesVielen Dank an Ismael Miguel für die Hilfe bei der ternären Lösung und der kürzeren Verwendung von Loop-Code für eine Weile.
Die letzten Teile der vollständigen Sequenz konnten aufgrund der maximalen Laufzeit von 30 Sekunden von PhpFiddle nicht überprüft werden. Scheint auf der Grundlage der vom OP bereitgestellten Beispielausgabe mindestens bis zu 1 KB zu funktionieren.
Golf:
Original Golfversion :
quelle
for($n=1;;$n++)echo$a[]=!(strpos($n,7)>-1||$n%7==0)?"$n ":array_shift($a)." ";
Ich kenne die Byteanzahl nicht, aber ich bin sicher, dass sie viel niedriger als 106 Bytes ist. Probieren Sie es aus und sehen Sie, ob es funktioniert.for($n=1;;$n++)echo$a[]=strpos($n,"7")>-1||$n%7==0?array_shift($a)." ":"$n ";
. Ich bin mir nicht sicher , ob Sie ersetzen$n%7==0
mit ,!$n%7
aber es ist einen Versuch wert.for(;;)echo$a[]=strpos(++$n,55)<-1&&$n%7?"$n ":$a[++$b-1];
(58 Byte).++$b-1
weil$a[null] === null
Julia, 62 Bytes
Nichts Besonderes. Verwendet, dass die Sequenz innerhalb der Lücken die Sequenz selbst ist. Erstellt übermäßige Array-Kopien, um einige Bytes zu sparen.
quelle
Perl 6 ,
74 57 5453 BytesVersuch es
Erweitert:
Prüfung:
quelle
~7
statt sagst'7'
.Ceylon, 202 Bytes
Dies ist keine Funktion, sondern eine Objektdeklaration, die eine unendliche Folge (Iterable) implementiert. Das Objekt kann direkt gedruckt werden,
print(u)
gibt dies aus:{ 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, ... }
Verwenden Sie, um mehr zu drucken
printAll(u)
. Der folgende Code verwendet Zeilenumbrüche und gibt auch die Summe (und die ersten 30 oben gezeigten Elemente) aus:Hier ist die ungolfed und kommentierte Version:
quelle
Ruby, 80 Bytes
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}
Erste Einreichung, ich bin sicher, es kann verbessert werden :)
quelle
34
(die8
aktuell ist) sollte sein7
, aber da7
es sich um eine nicht sprechbare Nummer handelt, sollte das Programm eine dritte Iteration starten und stattdessen drucken1
.Dyalog APL , 39 Bytes
{(⍵⍴⍨⍴i)@(i←⍸('7'∊¨⍕¨⍵)∨0=7|⍵)⊢⍵}⍣≡⍳7*7
⍳7*7
ist 1 2 3 ... 7 7{ }⍣≡
ist der Festpunktoperator - Wenden Sie eine Funktion so oft an, bis sich das Ergebnis stabilisiertA@I⊢B
Operator ändern - Ersetzen Sie die Elemente bei IndizesI
inB
mitA
0=7|⍵
Bitmaske für den Fall, dass das Argument durch 7 teilbar ist'7'∊¨⍕¨⍵
Bitmaske, bei der die Dezimalformatierung des Arguments eine 7 enthält∨
oder⍸
Bei welchen Indizes ist eine der obigen Bitmasken wahr?i←
zuweiseni
⍵⍴⍨⍴i
Verändern Sie das Argument in die Anzahl der Elemente ini
quelle
C
157155 BytesEs sieht richtig aus, ich habe mich nicht darum gekümmert, alles zu überprüfen. Geht bis zu 999999, was anscheinend groß genug ist.
Ungolfed-Version:
Teilgolf-Version:
quelle
else
?(r=0)
meiste Zeit auch technisch nicht . Aber einige Compiler sind wählerisch. Ich bin zu faul, um die Spezifikation jetzt zu überprüfen.R, 86 Bytes
Verwendet Rs Truthy
T
(initialisiert aufTRUE
/1
), um die Zahlen in der Sequenz zu zählen, und den Falsy-WertF
(initialisiert aufFALSE
/0
), um die unspeakables zu zählen. Ansonsten prüft das Programm einfach, ob jede Zahl durch sieben teilbar ist oder die Zahl enthält.quelle
7%in%el(strsplit(c(T,""),""))
durch55%in%utf8ToInt(paste(T))
? (nicht getestet)C - 115 Bytes
EDIT: Danke an @mschauer, der darauf hingewiesen hat, dass ich einige Dinge verpasst habe.
quelle
Javascript, 80 Bytes
Da es nur minimale, aber keine maximalen Anforderungen gibt, wird diese Lösung weiterhin auf unbestimmte Zeit ausgegeben.
Um zu überprüfen, ob der Algorithmus korrekt ist, können Sie denselben Code ausführen und nur die letzten 10 Zahlen und die Summe drucken:
quelle
Mathematica, 82 Bytes
quelle
JavaScript 81 Bytes
Original (98 Bytes)
Golf gespielt
quelle
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
stattMath.pow(7,7)
, da die Herausforderung , sagte:Print/output AT LEAST the first 7^7
34 1 36 **8** 38
. Aber für das, was es wert ist , könnte die aktuelle Version einige weitere golfed werden:for(c=i=0;++i<9e5;)console.log(!/7/.test(i)&&i%7?i:c++%6+1)
.Befunge, 100 oder 156 Bytes
Diese erste Version ist die portablere der beiden und beschränkt sich auf 7-Bit-Speicherzellen, die Sie im Referenzinterpreter erhalten.
Die zweite Version funktioniert nur mit Interpretern, die 32-Bit-Speicherzellen haben, und ist daher nicht der Standard für Befunge. Dadurch können wir jedoch größere Werte im Speicher speichern, ohne sie auf mehrere Zellen aufteilen zu müssen.
In beiden Fällen wird das Programm auf unbestimmte Zeit ausgeführt, aber die erste Version überschreitet die 2-Millionen-Marke, während die zweite Version den maximalen int-Wert (ca. 2 Milliarden) erreichen sollte.
Sie können es online testen , aber Sie müssen den Prozess beenden, um zu verhindern, dass er für immer ausgeführt wird.
quelle
Clojure, 130 Bytes
Grundlegendes Reduzieren, Verfolgen des Inhalts des Ergebnisvektors und Überspringen von Werten. Das letzte
0
nimmt das erste Element des reduzierten[r s]
,rest
löscht das erste Element des 0-indizierten Ergebnisses.quelle
Perl6, 41 Bytes
quelle
Tcl , 64 Bytes
Probieren Sie es online!
quelle
JavaScript, 64 Byte
quelle
console.log
) JavaScript-Antworten, es ist 70 BytesJapt , 25 Bytes
Testen Sie die Summe und die letzten 10 Elemente.
Erzeugt die ersten 1.000.000 Einträge der Sequenz und druckt sie aus. Eine Million ist die kürzeste Zahl
7**7 == 823543
in Japt.Der abschließende Zeilenumbruch ist signifikant, da er die implizite Zuordnung zu aktiviert
U
.Das Generieren der Liste dauert nur etwa eine Sekunde, aber das Ausgeben des gesamten Arrays lässt Ihren Browser wahrscheinlich hängen.
Ausgepackt und wie es funktioniert
Verwendet die Eigenschaft, dass die rekursive Definition aufgelöst werden kann, indem die bereits generierte Sequenz betrachtet wird.
quelle