Der Titel setzt sich aus 'Sequence Index Digit Not' zusammen.
Herausforderung:
Bei einer gegebenen ganzen Zahl n
wird >= 0
die n
'te Zahl der folgenden Sequenz ausgegeben .
Hier sind die ersten 50 Elemente, über denen sich der (0-indizierte) Index befindet:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
1 0 3 2 5 4 7 6 9 8 22 20 30 24 23 26 25 28 27 32 11 33 10 14 13 16 15 18 17 31 12 29 19 21 50 40 41 42 44 45 35 36 37 51 38 39 52 53 55 56 34
Wie funktioniert diese Sequenz?
Die Zahl am Index n
muss die erste sein, mit der keine Ziffern gemeinsam sind n
, und ist für frühere Indizes noch nicht aufgetreten. Wenn wir also eine normale Sequenz wie diese betrachten, von 0-60
:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
Wir definieren die n
'ten Werte wie folgt:
0
: Die erste Ziffer (0
) enthält dieselbe Ziffer, daher suchen wir nach der nächsten Ziffer (1
), die nicht dieselbe Ziffer enthält. Alson=0
Ausgänge1
.1
: Die erste Ziffer (0
) enthält nicht dieselbe Ziffer, wird alson=1
ausgegeben0
.2
: Wir sind bereits auf0
und gestoßen1
, und die nächste Ziffer (2
) enthält dieselbe Ziffer. Deshalb suchen wir nach der nächsten Ziffer (3
), die nicht dieselbe Ziffer enthält. Alson=2
Ausgänge3
.- ...
10
: Wir sind bereits darauf gestoßen0-9
, also ist die nächste in der Reihe10
. Enthält10-19
die übereinstimmende Ziffer1
,20
enthält die übereinstimmende Ziffer0
,21
enthält die übereinstimmende Ziffer1
erneut,22
ist gültig,n=10
gibt also aus22
.- etc.
Herausforderungsregeln:
- Wenn Ihre Sprache 1-indiziert ist (oder Sie dies wünschen), können Sie die Sequenz um
3 2 5 4 7 ...
(Überspringen des1
atn=0
und des0
atn=1
) beginnen. - Der kleinste Index, den Sie unterstützen sollten, ist
25,000
. HINWEIS: Die Sequenz stoppt am Index1,023,456,788
, da der nächste Index in der Zeile alle 10 Ziffern enthält. - Sie können auch ein Array / eine Liste der gesamten Sequenz bis einschließlich Index ausgeben / zurückgeben,
n
wenn Sie dies möchten.
Allgemeine Regeln:
- Das ist Code-Golf , also gewinnt die kürzeste Antwort in Bytes.
Lassen Sie sich von Code-Golf-Sprachen nicht davon abhalten, Antworten mit Nicht-Codegolf-Sprachen zu veröffentlichen. Versuchen Sie, für jede Programmiersprache eine möglichst kurze Antwort zu finden. - Für Ihre Antwort gelten Standardregeln. Daher dürfen Sie STDIN / STDOUT, Funktionen / Methoden mit den richtigen Parametern und vollständige Programme vom Rückgabetyp verwenden. Ihr Anruf.
- Standardlücken sind verboten.
- Fügen Sie nach Möglichkeit einen Link mit einem Test für Ihren Code hinzu.
- Fügen Sie ggf. auch eine Erklärung hinzu.
Testfälle:
Diese Sequenz erzeugte tatsächlich Paare in Bezug auf Index und Ausgaben. Wenn n
Indexausgaben o
, o
Indexausgaben n
. Sie können also entweder links oder rechts eingeben, und die Ausgabe erfolgt auf der anderen Seite:
0 <-> 1 (this test case is optional)
2 <-> 3
10 <-> 22
12 <-> 30
34 <-> 50
89 <-> 100
111 <-> 200
112 <-> 300
199 <-> 322
2231 <-> 4456
9605 <-> 11118
19235 <-> 46000
23451 <-> 60668
25000 <-> 13674
Hier ist ein Pastebin der ersten 25.001 Testfälle, wenn Sie andere ausprobieren möchten.
Antworten:
Pyth , 18 Bytes
Probieren Sie es hier aus! oder Weitere Testfälle prüfen!
Beachten Sie, dass dies die gesamte Sequenz bis zum Index N zurückgibt, der Link jedoch nur die letzte Zahl zurückgibt, indem ein
e
(Ende) vorangestellt wird . Wenn Sie den von diesem Programm zurückgegebenen Rohwert sehen möchten, entfernen Sie ihn einfach .Wie es funktioniert
quelle
Python 2 ,
92918988 BytesProbieren Sie es online!
Druckt eine Liste der ersten
n+1
NummernAnderer Ansatz, der viel schneller ist:
Python 2 , 96 Bytes
Probieren Sie es online!
quelle
Haskell,
8069 BytesProbieren Sie es online!
Sehr langsam für groß
n
.Edit: @Laikoni hat 10 Bytes gespeichert. Vielen Dank!
quelle
APL (Dyalog) , 39 Bytes
Verwendet
⎕IO←0
.Probieren Sie es online!
Wie?
Rekursion.
0=⍵:1
- Raten Sie mal.~⍺∊0∇¨⍳⍵
- linkes arg (akku) ist noch nicht in vorigen ergebnissen enthalten∧⊃∧/≠/⍕¨⍺⍵
- und die Stringdarstellung des Akkusn
sind unterschiedlich:⍺
- dann den Akku zurückgeben.⍵∇⍨⍺+1
- Andernfalls Akkumulator inkrementieren und erneut verwenden.quelle
n=10
in TIO bereits eine Zeitüberschreitung.: S Das muss eine sehr leistungsintensive Operation sein, die Sie dort ausführen. Ist es die Rekursion, die dies verursacht, oder ist etwas anderes der Engpass?Python 3 , 92 Bytes
Probieren Sie es online!
Dies gibt alle Begriffe bis zum N- ten aus. Danke an Dennis für
-4-5 Bytes!quelle
Java (OpenJDK 8) ,
218217213210202200172171170168167 BytesIch kann nicht glauben, dass ich die
k
ganze Zeit nicht zurückgekehrt bin ...Probieren Sie es online!
quelle
for(char f:(""+k).toCharArray())
auffor(int f:(""+k).getBytes())
,r.substring(-~r.trim().lastIndexOf(32));
und zur.substring(r.lastIndexOf(32)-1)
.Los ,
217205 BytesAlternate Version (Programm statt ein Paket): Versuchen Sie es online!
Verbesserungen:
for
durch Mehrfachbelegung für entfernti,k
"fmt";
+fmt.Print
ist kürzer alsos.Stdout.WriteString
(Holdover abpackage main
wann os.Args benötigt wurde)quelle
25000
Testfall ausprobiere . :) Also nicht nur eine gültige Lösung, sondern auch eine relativ gute Leistung. +1 von mir! (PS: In Ihrem TIO-Link ist es das Argument, das Sie verwenden, Eingaben können entfernt / nicht verwendet werden.)JavaScript (ES6),
103 8881Bearbeiten überarbeitet einschließlich viele cleveren Ideen von @Neil
Startpunkt
Grundidee: Eine Schleife von 0 bis n und eine innere Schleife, die Werte überprüft, die immer noch nicht verwendet werden
Aktuelle Version besser lesbar
Prüfung
quelle
~s.search(d)
mit ders.match(d)
Arbeit?0
aufj++
, das Entfernen der++
von demj
es am vor und dann ausgehendj
von0
statt-1
.n=>eval("for(r=[j=i='0'];i<=n;)r[j]|[...''+j].some(d=>i.match(d))?j++:(i=++i+'',r[k=j]=1,j=0);k")
Oktave , 114 Bytes
Probieren Sie es online!
Vielen Dank an Kevin Cruijssen und Dlosc für den Charaktervergleich beim Golfen.
Ungolfed
Grundlegende Erklärung:
i
und eine für den hinzuzufügenden Wertj
i
Inkrementieren Sie jedes Mal weiter,j
wenn eine der folgenden Bedingungen erfüllt ist:j
wurde zuvor verwendet10
wird[1 0]
) mitint2str
. Vergleichen Sie dann die beiden Zahlen mitismember
(z. B.[1 0]
und[2 1]
würden zurückgeben[1 0]
) und prüfen Siennz
, ob Spalten übereinstimmen.Wenn keine der oben genannten Bedingungen erfüllt ist, haben Sie die nächste Nummer! An
o
die Ausgabematrix anhängenquelle
-'0'
. Aber wenn es einen Randfall gibt, an den wir beide nicht gedacht haben,-48
wäre dies eine kürzere Alternative. Auch beidessprintf('%d',...)
kann seinint2str(...)
.Perl 5 , 60 Bytes
59 Byte Code + 1 für
-p
.Probieren Sie es online! (Beinhaltet
-l
für visuelle Zwecke und$-=0;
zum Zurücksetzen jeder Iteration)quelle
Pip , 30 Bytes
29 Byte Code, +1 für
-p
Flag.Probieren Sie es online!
Gibt die gesamte Liste aus. Warnung: sehr ineffizient; das
2231
Eingabefall läuft seit über 35 Minuten auf meinem Laptop und ist immer noch nicht fertig.Erläuterung
quelle
Visual Basic .NET (.NET 4.5) ,
260259 Byte-1 Byte dank Kevin Cruijssen
Durchläuft die Sequenz und generiert frühere Terme, um sie später zu vergleichen. Dann iteriert die Zahl als Zeichenfolge und sucht nach Übereinstimmungen.
Missbrauch des VB.NET-Eingabesystems. Ist beispielsweise
j
eine Zeichenfolge, aber das Hinzufügen einer wird für mich in eine Ganzzahl umgewandelt. Ganzzahlen werden in Boolesche Werte konvertiert, wobei0
sichFalse
und der Rest in Booleschen Werten befindetTrue
.Probieren Sie es online!
quelle
If Not p.Contains(j)Then
genauso entfernen können, wie Sie esIf j.Contains(c)Then g=0
unten getan haben . AuchIf Not p.Contains(j)Then \n g=1 \n For Each c In i.ToString \n If j.Contains(c)Then g=0 \n Next \n If g Then Exit While \n End If
kann verkürzt werden durch Entferneng
und mitExit While
direkt in der for-Schleife:If Not p.Contains(j)Then \n For Each c In i.ToString \n If j.Contains(c)Then Exit While \n Next \n End If
, die werden werden 241 Bytes von den Blicken von ihm.Contains(c)Then
, ich habe es einfach verpasst. Ich mag, was Sie denken, aber ich benutzeg
als Sentinel, um zu sehen, ob die Zeichenfolge die Nummer enthält oder nicht. Ihr Link gibt die falschen Antworten, aber ich werde sehen, ob ich einen Teil der inneren Logik nach Ihren Vorstellungen überarbeiten kann.Gelee , 20 Bytes
Pyth schlägt Jelly. Gehen Sie Herr Xcoder!
Ein vollständiges Programm, das die Eingabe von STDIN und die Ausgabe im Listenformat mithilfe der Listendarstellung von Jelly * vornimmt. Verwendet die standardmäßige 0-basierte Indizierung.
* Listen mit einzelnen Elementen haben keine Umgebung
[]
, also0
Ausgänge1
, während1
Ausgänge[1, 0]
usw.Probieren Sie es online!
Wie?
quelle