Einführung
In der Basis 10 wird die Champernowne-Konstante durch Verketten von Darstellungen aufeinanderfolgender ganzer Zahlen definiert. In Basis 10: 0.1234567891011121314151617...
und so weiter.
Sie können sehen, dass das erste Auftreten von 15
mit der 20th
Dezimalstelle beginnt :
Position
0000000001111111111222222222233333333334444444444555555555566666666
1234567890123456789012345678901234567890123456789012345678901234567
^
0.1234567891011121314151617181920212223242526272829303132333435363738...
^^
15 = position 20
Das erste Auftreten von 45
beginnt mit der 4th
Dezimalstelle:
Position
0000000001111111111222222222233333333334444444444555555555566666666
1234567890123456789012345678901234567890123456789012345678901234567
^
0.1234567891011121314151617181920212223242526272829303132333435363738...
^^
45 = position 4
Die Aufgabe ist also einfach. Bei einer nicht negativen Ganzzahl wird die Position der Ganzzahl in der Champernowne-Konstante ausgegeben.
Regeln
- Sie können eine Funktion oder ein Programm bereitstellen
- Das ist Code-Golf , also gewinnt die Einsendung mit der geringsten Anzahl von Bytes!
Testfälle
Input: 20
Output: 30
Input: 333
Output: 56
Input: 0
Output: 11 (note that the 0 before the decimal point is ignored)
Input: 2930
Output: 48
0 <= x <= 99
, aber es sollte theoretisch für Ganzzahlen funktionieren, die höher sind als99
.Antworten:
Pyth, 10
Verkettet die ersten
input + 10
Zahlen und findet dann den 0-basierten Index plus eins. Die zusätzlichen zehn werden nur für 0 benötigt.Test Suite
quelle
2015-12-17 15:01:23Z
oder so?LabVIEW, 29 LabVIEW-Grundelemente
Hier werden vorerst Zeichenfolgen verwendet. Es gleicht die Eingabe als Muster ab und gibt den Offset aus - (Eingabelänge -1).
quelle
Javascript, 57 Bytes
Dank Conor O'Brien 1 Byte gespeichert.
quelle
y=
Teil auf die verschiebeny=b=" "
; Das Inkrementieren eines Leerzeichens entspricht dem Inkrementieren von Null. (a=prompt(y=b=" ");...
)Haskell, 62 Bytes
Anwendungsbeispiel:
(#(show=<<[1..])).show $ 2930
->48
.So funktioniert es:
a # b
Findet die Position vona
innerhalbb
: Wenna
das Präfix vonb
return ist1
, fügen Sie1
es einem rekursiven Aufruf mit hinzua # tail b
. Die pointfree-Funktion(#(show=<<[1..])).show
erwartet ein (unbenanntes) Argumentn
und ruft aufshow n # show=<<[1..]
.Die Funktion
subIndex
würde auch die Arbeit erledigen#
, aber das erforderlicheimport Data.List.Utils
zahlt sich nicht aus.quelle
.show
Rubin, 28
Fügt am Anfang eine 0 ein, damit Übereinstimmungen mit 1 indiziert werden, setzt
\B
jedoch voraus, dass die Übereinstimmung nicht am Anfang der Zeichenfolge steht.quelle
Japt, 11 Bytes
Dies schlug ursprünglich Pyth, aber anscheinend funktionierte es nicht für die Eingabe
0
.Probieren Sie es online!
Wie es funktioniert
quelle
q
im Code und nicht das logische Negationssymbol¬
?¬
ist eine Abkürzung fürq
(das istq
mit einem folgenden Leerzeichen). Dies scheint oft ein Punkt der Verwirrung zu sein, daher habe ich die kürzere Version mit der vollständigen Version abgeglichen.Lua, 54 Bytes
Hinweis:
Derzeit gibt dieses Programm sowohl das erste Vorkommen des ersten Zeichens der Zeichenfolge als auch den Punkt aus, an dem es endet. Wenn dies nicht erlaubt ist, kostet es ein paar Bytes mehr.Ich möchte einen Bonus beantragen, da mein Programm sowohl die erste als auch die letzte Position der eingegebenen Nummer ausgibt.quelle
MATL , 22 Bytes
Nehmen Sie die Eingabe (
i
), setzen Sie den Vektor 1 auf Eingabe + 10 (10+:
), konvertieren Sie den Vektor in eine Zeichenfolge (Ys
) und entfernen Sie die schmerzhaften Leerzeichen (t' '=~)
). Konvertieren Sie dann die Eingabe in eine Zeichenfolge (Ys
), suchen Sie, wo sich die Eingabezeichenfolge in der Zeichenfolge von Zahlen (Xf
) befindet, und nehmen Sie die erste Position (1)
). Diet
's undw
' s manipulieren den Stack (duplizieren bzw. tauschen).quelle
PowerShell,
3944 Bytes[Edit: Meine Annahme ist falsch. Wenn Sie ein Array von 1-0 erstellen, wird an Position 11 keine 0 gefunden. Erstellen Sie stattdessen von 1-x + 10, um auch 0, jetzt 44 Byte, zu verarbeiten.]
Sie werden immer x finden, wenn Sie eine Zeichenfolge der Champernowne-Konstante zum letzten Zeitpunkt erstellen, wenn Sie x zum Ende hinzufügen , sodass ein Array von 1-x immer die Antwort enthält. Die Frage lautet: "Tritt sie früher auf?" . Dieser Code
generiert einen Zahlenbereich, wandelt ihn in einen String um und sucht nach dem darin enthaltenen Parameter. Da PowerShell eine objektorientierte Shell ist, ist der Parameter eigentlich ein
[int]
Typ. Wenn Sie also versuchen, zwei Zeichen mit zu speichern, wird.IndexOf($i)
die Zeichenfolge nach einer Ganzzahl durchsucht und es wird nichts gefunden. Deshalb verwende ich die String-Interpolation"$i"
.quelle
.IndexOf()
offenbar eine höhere betriebliche Präferenz hat als das unitäre-join
Erzwingen von Parens und Zitaten. : - /MATL (Release 1.0.1), 22 Byte
Beispiel
Erläuterung
MATL (Release 20.8.0), 16 Bytes (Sprachnachbereitung)
Dank an @ Giuseppe für diese Version des Programms (leicht modifiziert)
Probieren Sie es online!
Erläuterung
quelle
G
die Eingabe (und implizite Eingabe) enthält, kann diese Antwort vermutlich um einiges gekürzt werden, und allesYs
, was geändert werden muss,V
muss auf jeden Fall . Ich habe mir10+:"@Vv]!GVXf1)
16 Bytes ausgedacht.Ys
dieV
Verwendung der aktuellsten Version des Interpreters geändert werden muss . Ich bin immer wieder beeindruckt, wie sehr sich die Sprache verbessert hat!Power Shell,
5450 BytesDank an TessellatingHeckler für die Idee, die
while
Schleife gegen einefor
Schleife auszutauschen.Wird über eine
for
Schleife ausgeführt. Wie bei anderen Sprachen kann die erste Anweisung in der Schleife Variablen und Zuweisungen erstellen. Dies beginnt also mit$c
der leeren Zeichenfolge,''
sodass die Zeichenfolge mit der dezimalen Indizierung der Challenge auf Null gesetzt wird. Wir sind dann in einer Schleife , die überprüft , ob$c
die Eingabe integer hat ($args
) irgendwo in ihm (dh, da.IndexOf()
kehrt ,-1
wenn die Zeichenfolge nicht gefunden wird, fügen wir ein zu , dass (0
) und nicht ($TRUE
) die Schleife fortgesetzt). Wenn es nicht gefunden wird, fügen wir unsere vorab inkrementierte$i
Zählervariable hinzu und überprüfen die Zeichenfolge erneut. Sobald die Zeichenfolge gefunden wurde,.IndexOf()
wird ein positiver Wert zurückgegeben, dessen nicht$FALSE
, bricht aus der Schleife aus. Zuletzt geben wir den Index mit aus$x
.quelle
for
Schleife ...for($c='.';($x=$c.IndexOf("$args"))-lt0;$c+=++$i){}$x
und speichern Sie 1 Zeichen. Da die meisten IndexOf-Aufrufe -1 zurückgeben, fügen Sie eins hinzu und boolean! Wirf es für einen kürzeren Test. Aber dazu braucht man Eltern. Leere $ c und +1 in bestehenden Parens, Bonus ist kürzer.for($c='';!($x=$c.IndexOf("$args")+1);$c+=++$i){}$x
51 Bytes. (aber ich habe mein 39-Byte-eins als eigene Antwort gepostet, weil es ein völlig anderer Ansatz ist: P).$c
Verkettung in die Schleife verschoben, um ein Semikolon zu spielen. Jetzt um 50.JavaScript (ES6), 40 Byte
Verwendet die rekursive Funktion
f
, um Schleifen zu vermeiden. Die Suchmethode funktioniert genauso,indexOf
außer dass RegExp als Parameter verwendet wird, was für diese Herausforderung irrelevant ist.Das Hinzufügen von a
" "
für denn=0
Fall (Null ist in JS falsch) erzwingt das+
Ausführen einer Zeichenfolgenverkettung anstelle des Hinzufügens und korrigiert die auf Null basierende Indizierung.quelle
Python 3, 54.
quelle
CJam, 11 Bytes
Teste es hier.
Ich finde die Position von
N
in der Zeichenfolge01234...N
, um die 1-basierte Indizierung zu berücksichtigen. Zum Schluss fixiere ich0
mit 11 durch logisches ODER.quelle
Im Ernst, 13 Bytes
Übernimmt die Eingabe als Ganzzahl. Enthält nicht druckbare Dateien, also hexdump:
Probieren Sie es online aus
Erläuterung:
quelle
13 Zeichen / 22 Bytes
Try it here (Firefox only).
quelle
k4, 21 Bytes
Gleiches Algo wie alle anderen - verketten
[1..10+x]
als Zeichenfolge , nach x als Zeichenfolge suchen, in eine einseitige Indizierung konvertieren und den ersten Treffer zurückgeben.Überprüfen der Testfälle:
quelle
Mathematica, 101 Bytes
quelle
Haskell ,
827355 BytesAus dem Duplikat migriert
Probieren Sie es online!
Erläuterung
Zuerst definieren wir
!
.x!b
schneidetb
auf den ersten Auftritt von abx
. Dies geschieht, indem überprüft wird, obb
mitx
(or$zipWith(==)x b
) begonnenx
wird, und ansonsten eine Zeichenfolge nach unten verschoben wird. Dann definieren wir unsere Hauptfunktion. Unsere Hauptfunktion ist eine punktfreie Funktion, die die Konstante (show=<<[1..]
) auf das erste Auftreten von abschneidetx
. Dies dauertx
als Zeichenfolge.quelle
05AB1E , 6 Bytes (nicht konkurrierend)
Probieren Sie es online!
quelle
JavaScript (ES6),
503938 ByteVersuch es
quelle
Gelee , 5 Bytes
Probieren Sie es online!
quelle
Stax , 6 Bytes
Führen Sie es aus und debuggen Sie es
quelle
Perl 6 , 26 Bytes
Probieren Sie es online!
Findet den Index des Elements im verketteten Bereich von 0 bis zu diesem Element oder
11
wenn die Zahl eine Null istquelle
Perl 5 , 42 + 1 (-p) = 43 Bytes
Probieren Sie es online!
Erläuterung
quelle
Perl 6 / Rakudo 29 Bytes
Definiert eine Funktion mit einem Eingang ($ ^ a). Rufen Sie also an:
Anhängen
$
einer anonymen Variablen, die erhöht wird,$++
bis die Eingabe$^a
gefunden wurde, und dann die Anzahl der Zeichen davor zählt. Das Erfordernis von mindestens 1 Zeichen, bevor es.+
im regulären Ausdruck verwendet wird, schließt den Fall 0-> 0 sinnvollerweise ausquelle
J, 30 Bytes
Könnte wahrscheinlich ein bisschen tiefer liegen, insbesondere bei der Verkettung der ersten n + 10 Ganzzahlen.
Erläuterung:
Beachten Sie, dass dies 0-indiziert ist. Beispiele:
quelle
Schale , 6 Bytes
Probieren Sie es online!
quelle