Inverse Champernowne-Teilstrings

8

Die Champernowne-Konstante ist die irrationale Zahl 0.1234567891011 ... die sich ad infinum erstreckt.

Wir haben schon einmal eine Frage dazu gestellt. Bei dieser Frage handelt es sich jedoch um eine wechselseitige Frage, die als Inverse Champernowne-Konstante bekannt ist. Dies ist ungefähr 8.10000007.

Geben Sie bei einer Zeichenfolge zwischen einer und drei Stellen (jede dreistellige Zeichenfolge erscheint innerhalb der ersten 10.000 Dezimalstellen) einschließlich die Anzahl der Dezimalstellen im Dezimalteil der inversen Champernowne-Konstante an, die dem ersten Auftreten dieser Zeichenfolge vorausgehen.

Builtins, die dies direkt ausführen oder Annäherungen an eine dieser Konstanten generieren, sind verboten, aber Builtins für Arithmetik mit beliebiger Genauigkeit sind weiterhin zulässig.

Dies ist Code Golf, also gewinnt das kürzeste Programm in Bytes.

Testfälle:

1 0
2 52
3 13
4 29
5 36
6 7
7 8
8 27
9 23
10 0
100 0
998 187
999 67
01 321
001 689
010 418
SuperJedi224
quelle
1
Könnten Sie eine Datei mit den ersten 10.000 inversen konstanten Champernowne-Ziffern veröffentlichen?
Orlp
@orlp gist.github.com/SuperJedi224/9c9adad78d872e4d568f bis 10.000 Dezimalstellen (Ihr Programm sollte nur den Teil rechts vom Dezimalpunkt betrachten)
SuperJedi224
Kann das Ergebnis 1-basiert sein?
Luis Mendo
@ LuisMendo Die Spezifikationen schreiben derzeit 0-basiert vor
SuperJedi224

Antworten:

3

MATL , 37 Bytes

Vielen Dank an @AndrasDeak für seine Hilfe bei der vpaFunktion von Octsympy !

'1/'1e4:"@V]N$h1e4H$Y$t32>)I0h)jXf1)q

BEARBEITEN (11. Juni 2016): Aufgrund von Änderungen in der Sprache im Code 0durch ersetzen J. Der folgende Link enthält diese Änderung

Probieren Sie es online aus!

Im Online-Compiler dauert es eine Weile (weniger als 1 Minute).

'1/'        % literal string
1e4:        % array [1,2,...,1e4]
"           % for each number in that array
  @V        % push number and convert to string
]           % end loop
N$h         % concatenate all strings
1e4H$Y$     % compute 1/123456789101112... as a string with 1e4 significant digits
t32>)       % remove unwanted spaces and newlines in the output string
I0h)        % remove the first two characters ('8.')
j           % input string
Xf          % find indices of occurrences of input string within computed string
1)          % take first index
q           % subtract 1
Luis Mendo
quelle
2

Ruby, 69 67 Bytes

->x{"#{1/BigDecimal.new(?.+[*1..9999]*'')}".index(x)-3}

Punktzahl: 55 Quellcode-Bytes + 12 für das -rbigdecimalFlag.

Ziemlich einfach. Einziger seltsamer Teil ist, dass das to_simplizit von der #{}Konstruktion auf BigDecimalRenditen aufgerufen wird

0.81000000670 [...] 3036E1

Daher muss 3 subtrahiert werden, um den richtigen Index zu erhalten.

Türknauf
quelle
1

Python 2, 69 Bytes

lambda s:str(10**30000/int("".join(map(str,range(3000))))).index(s)-1
orlp
quelle
Dies funktioniert nicht bei einer Eingabe von "8".
negative sieben