Substing Champernowne terbalik

8

Constant Champernowne adalah bilangan irasional 0.1234567891011 ... memperpanjang ad infinum.

Kami telah melakukan pertanyaan tentang itu sebelumnya. Tetapi pertanyaan ini adalah tentang kebalikannya, yang dikenal sebagai Invers Champernowne Constant. Ini sekitar 8.10000007.

Diberikan string antara satu dan tiga digit (setiap string 3 digit muncul dalam 10.000 tempat desimal pertama) inklusif, berikan jumlah tempat desimal di bagian desimal dari Inverse Champernowne Constant yang mendahului penampilan pertama dari string tersebut.

Builtin yang melakukan ini secara langsung atau menghasilkan perkiraan salah satu dari konstanta ini dilarang, tetapi builtin untuk aritmatika presisi sewenang-wenang masih diizinkan.

Ini adalah kode golf, jadi program terpendek, dalam byte, menang.

Kasus uji:

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
sumber
1
Bisakah Anda memposting file 10.000 digit terbalik pertama Champernowne konstan?
orlp
@orlp gist.github.com/SuperJedi224/9c9adad78d872e4d568f hingga 10.000 tempat desimal (program Anda seharusnya hanya melihat bagian di sebelah kanan titik desimal)
SuperJedi224
Apakah hasilnya dapat berbasis 1?
Luis Mendo
@LuisMendo Spesifikasi saat ini menentukan berbasis 0
SuperJedi224

Jawaban:

3

MATL , 37 byte

Terima kasih kepada @AndrasDeak untuk bantuannya dengan vpafungsi Octsympy !

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

EDIT (11 Juni 2016): karena perubahan bahasa, ganti 0dengan Jdalam kode. Tautan di bawah ini termasuk modifikasi itu

Cobalah online!

Butuh beberapa saat di kompiler online (kurang dari 1 menit).

'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
sumber
2

Ruby, 69 67 byte

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

Nilai: 55 byte kode sumber + 12 untuk -rbigdecimal bendera.

Cukup mudah. Hanya bagian yang aneh adalah bahwa to_ssecara implisit dipanggil oleh #{}konstruksi BigDecimalpengembalian

0.81000000670 [...] 3036E1

jadi perlu untuk mengurangi 3 untuk mendapatkan indeks yang benar.

Gagang pintu
sumber
1

Python 2, 69 byte

lambda s:str(10**30000/int("".join(map(str,range(3000))))).index(s)-1
orlp
sumber
Ini tidak akan berfungsi untuk input "8".
negatif tujuh