Temukan nomor dalam konstanta Champernowne


35

pengantar

Dalam basis 10, konstanta Champernowne didefinisikan dengan menggabungkan representasi bilangan bulat berturut-turut. Di base 10: 0.1234567891011121314151617...dan seterusnya.

Anda dapat melihat bahwa penampilan pertama 15dimulai pada 20thdesimal:

  Position
  0000000001111111111222222222233333333334444444444555555555566666666
  1234567890123456789012345678901234567890123456789012345678901234567
                     ^
0.1234567891011121314151617181920212223242526272829303132333435363738...
                     ^^
                     15 = position 20

Tampilan pertama 45dimulai pada 4thdesimal:

  Position
  0000000001111111111222222222233333333334444444444555555555566666666
  1234567890123456789012345678901234567890123456789012345678901234567
     ^               
0.1234567891011121314151617181920212223242526272829303132333435363738...
     ^^
     45 = position 4

Jadi, tugasnya mudah. Dengan bilangan bulat non-negatif, output posisi bilangan bulat dalam konstanta Champernowne.

Aturan

  • Anda dapat menyediakan fungsi atau program
  • Ini adalah , jadi pengiriman dengan jumlah byte paling sedikit menang!

Uji kasus

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

Untuk apa posisi tertinggi yang kita butuhkan? Misalnya, apakah jumlahnya akan menjadi 987654321123456877654234354675.
Morgan Thrapp

@MorganThrapp saya mungkin akan menguji bilangan bulat dalam kisaran 0 <= x <= 99, tetapi secara teoritis harus bekerja untuk bilangan bulat lebih tinggi dari 99.
Adnan

Jawaban:



10

LabVIEW, 29 Primview LabVIEW

Ini menggunakan string untuk saat ini. Ini cocok dengan input sebagai pola dan output offset - (panjang input -1).


6

Javascript, 57 byte

a=prompt();for(y=b=" ";y<a+11;)b+=++y;alert(b.indexOf(a))

Disimpan 1 byte berkat Conor O'Brien.


Saya pikir Anda dapat memindahkan y=bagian ke y=b=" "; menambah ruang seperti menambah nol. ( a=prompt(y=b=" ");...)
Conor O'Brien

1
@ CᴏɴᴏʀO'Bʀɪᴇɴ Temuan yang bagus.
SuperJedi224

4

Haskell, 62 byte

a#b|and$zipWith(==)a b=1|1<2=1+a#tail b 
(#(show=<<[1..])).show

Contoh penggunaan: (#(show=<<[1..])).show $ 2930-> 48.

Cara kerjanya: a # bmenemukan posisi di adalam b: jika aawalan bpengembalian 1, tambahkan 1ke panggilan rekursif dengan a # tail b. Fungsi pointfree (#(show=<<[1..])).showmengharapkan argumen ndan panggilan (tanpa nama) show n # show=<<[1..].

Fungsi subIndexjuga akan melakukan pekerjaan #, tetapi yang diperlukan import Data.List.Utilstidak membuahkan hasil.


Saya rasa Anda tidak perlu.show
Wheat Wizard


4

Ruby, 28

->n{[*0..n+10]*''=~/\B#{n}/}

Termasuk 0 di awal sehingga pencocokan 1-diindeks, tetapi digunakan \Buntuk mengharuskan kecocokan tidak di awal string.


4

Japt, 11 byte

Ini awalnya mengalahkan Pyth, tetapi tampaknya itu tidak berhasil untuk input 0.

1+1oU+B ¬bU

Cobalah online!

Bagaimana itu bekerja

1+1oU+B ¬ bU
1+1oU+B q bU  // Implicit: U = input integer
  1oU+B       // Generate the range [0, U+11).
        q bU  // Join and take the index of U.
1+            // Add one to get the correct result.
              // Implicit: output last expression

Mengapa bagian "Cara kerjanya" Anda berisi qdalam kode dan bukan simbol negasi logis ¬?
Fatalkan

@Fatalize ¬adalah jalan pintas untuk (itu qdengan ruang berikut). Ini sepertinya sering menjadi titik kebingungan, jadi saya sudah berbaris versi yang lebih pendek dengan yang penuh.
ETHproductions

3

Lua, 54 Bytes

s=""for i=1,1e4 do s=s..i end print(s:find(io.read()))

Catatan: Saat ini program ini mencetak kemunculan pertama dari karakter pertama dari string, dan titik di mana ia berakhir. Jika ini tidak diizinkan, akan dikenakan biaya beberapa byte lagi. Saya ingin mengajukan permohonan bonus karena program saya mencetak posisi pertama dan posisi terakhir dari nomor input.


1
Apakah maksud Anda indeks awal dan indeks akhir untuk kemunculan pertama nomor tersebut? Karena secara teoritis jumlahnya akan ada di sana dalam jumlah tak terbatas.
R

Ya, mulai dan akhiri untuk kejadian pertama.
Nikolai97

3

MATL , 22 byte

it10+:Yst' '=~)wYsXf1)

Ambil input ( i), buat vektor 1 menjadi input + 10 ( 10+:), ubah vektor menjadi string ( Ys), dan hapus spasi yang menyakitkan, ( t' '=~)). Kemudian, konversikan input ke string ( Ys), temukan di mana string input berada di string angka ( Xf) dan ambil lokasi pertama ( 1)). The t's dan w' s memanipulasi stack (duplikat dan swap, masing-masing).


3

PowerShell, 39 44 byte

[Sunting: asumsi saya tidak berlaku, membangun array dari 1-0 tidak menemukan 0 di tempat 11. Sebaliknya, membangun dari 1-x + 10 untuk menangani 0 juga, sekarang 44 byte]

param($i)(1..($i+10)-join'').IndexOf("$i")+1

Anda akan selalu menemukan x saat membuat string konstanta Champernowne pada titik terakhir saat Anda menambahkan x di akhir, sehingga array dari 1-x akan selalu memiliki jawabannya. Pertanyaannya menjadi "apakah itu terjadi lebih cepat dari itu?" . Kode ini

param($i)(1..$i-join'').IndexOf("$i")+1

e.g.

PS C:\Temp> .\Champer.ps1 20
30

menghasilkan rentang angka, melemparkannya ke string, dan mencari parameter di dalamnya. Karena PowerShell adalah shell berorientasi objek, parameter sebenarnya adalah [int]tipe, jadi mencoba menyimpan dua karakter .IndexOf($i)akan mencari string untuk integer dan tidak menemukan apa pun. Itu sebabnya saya menggunakan interpolasi string "$i".


1
Cara cerdas melakukannya. Frustasi yang .IndexOf()ternyata memiliki preferensi operasi lebih tinggi daripada unary -joinmemaksa parens dan penawaran. : - /
AdmBorkBork

3

MATL (rilis 1.0.1), 22 byte

iXK10+:"@Ys]N$hKYsXf1)

Contoh

>> matl iXK10+:"@Ys]N$hKYsXf1)
> 333
56

Penjelasan

i       % Input
XK      % Copy to clipboard K            
10+     % Add 10. This is needed in case input is 0
:       % Vector of equally spaced values, starting from 1
"       % For each
  @Ys   %   For loop variable as a string
]       % End                            
N$h     % Horizontal concatenation of all stack contents
KYs     % Paste from clipboard K (input number) and convert to string
Xf      % Find one string within another 
1)      % First value

MATL (rilis 20.8.0), 16 byte (tantangan tanggal bahasa)

Kredit ke @Giuseppe untuk versi program ini (sedikit dimodifikasi)

10+:"@V]&hGVXf1)

Cobalah online!

Penjelasan

10+     % Implicit Input. Add 10. This is needed in case input is 0 
:       % Vector of equally spaced values, starting from 1
"       % For each
  @V    %   For loop variable as a string 
]       % End
&h      % Horizontal concatenation of all stack contents
GV      % Paste from automatic clipboard G (input number) and convert to string
Xf      % Find one string within another 
1)      % First value

Saya tidak berpikir ini menangani 0 :(
David

@ David Sekarang ya. Terima kasih telah memperhatikan! Harganya hanya 3 byte :-)
Luis Mendo

sekarang clipboard Gberisi input (dan input tersirat), saya kira jawaban ini dapat dipersingkat dengan cukup banyak, dan semua Yskebutuhan harus diubah menjadi V; Saya datang dengan 10+:"@Vv]!GVXf1)16 byte.
Giuseppe

@Giuseppe Terima kasih atas bantuannya! Diperbarui, dengan kredit jatuh tempo (dan dengan catatan "bahasa pascabintang tantangan"; Saya bukan penggemar berat aturan baru )
Luis Mendo

Saya tidak keberatan aturan itu begitu banyak ( bendera yang membuat saya gila, meskipun); Saya kebanyakan berkomentar di sini karena saya perhatikan bahwa Ysperlu diubah Vuntuk digunakan dalam versi penerjemah yang paling mutakhir. Saya selalu terkesan dengan betapa bahasanya telah meningkat!
Giuseppe

2

PowerShell, 54 50 Bytes

for($c='';!($x=$c.IndexOf("$args")+1)){$c+=++$i}$x

Terima kasih kepada TessellatingHeckler untuk gagasan bertukar whileloop untuk forloop.

Jalankan melalui forloop. Seperti bahasa lain, pernyataan pertama dalam loop dapat membangun variabel dan tugas, jadi ini dimulai dengan $csama dengan hanya string kosong ''sehingga kita memiliki pengindeksan nol string yang berbaris dengan pengindeksan desimal dari tantangan. Kami kemudian berada dalam satu loop yang memeriksa apakah $cmemiliki integer input ( $args) di suatu tempat di dalamnya (yaitu, karena .IndexOf()mengembalikan -1jika string tidak ditemukan, kami menambahkan satu ke itu ( 0) dan bukan itu ( $TRUE) untuk melanjutkan loop). Jika tidak ditemukan, kami menambahkan $ivariabel penghitung yang ditambahkan sebelumnya, kemudian periksa kembali string. Setelah string ditemukan,,.IndexOf() akan mengembalikan nilai positif, yang bukan darinya$FALSE, keluar dari loop. Akhirnya, kami menampilkan indeks dengan $x.


Ideal untuk forloop klasik ... for($c='.';($x=$c.IndexOf("$args"))-lt0;$c+=++$i){}$xdan simpan 1 karakter. Karena sebagian besar panggilan IndexOf akan mengembalikan -1, tambahkan satu untuk itu dan boolean! cor, untuk tes yang lebih pendek. Tetapi Anda perlu orangtua untuk melakukan itu. Kosong $ c dan +1 di dalam parens yang ada, bonus lebih pendek. for($c='';!($x=$c.IndexOf("$args")+1);$c+=++$i){}$x51 byte. (tapi saya memposting 39 byte saya sebagai jawaban sendiri karena itu pendekatan yang sama sekali berbeda: P).
TessellatingHeckler

1
@TessellatingHeckler Cara yang bagus untuk menulis ulang loop - terima kasih! Saya memindahkan $crangkaian ke loop untuk golf titik koma. Sekarang jam 50.
AdmBorkBork

2

JavaScript (ES6), 40 byte

x=>(f=n=>n?f(n-1)+n:" ")(x+11).search(x)

Menggunakan fungsi rekursif funtuk menghindari loop. The pencarian metode bekerja sama dengan indexOfkecuali bahwa dibutuhkan regexp sebagai parameter, yang tidak relevan untuk tantangan ini.

Menambahkan " "untuk n=0kasing (nol adalah falsy di JS) memaksa +untuk melakukan penggabungan string bukan penambahan, dan mengoreksi pengindeksan berbasis nol.



1

CJam, 11 byte

r_i),s\#Be|

Uji di sini.

Saya menemukan posisi Ndalam string 01234...Nuntuk menghitung pengindeksan berbasis 1. Akhirnya saya perbaiki 0dengan menerapkan logika OR dengan 11.


1

Serius, 13 byte

;≈9u+R`$`MΣí

Mengambil input sebagai integer. Berisi unsintables, jadi hexdump:

0c3bf739752b526024604de4a1

Cobalah online

Penjelasan:

;≈9u+R`$`MΣí
<form feed>   push str(input)
;≈9u+R        dupe, push [1,...,input+10]
      `$`MΣ   string concatenation of list
           í  get index of input


1

k4, 21 byte

{*1+(,/$1+!10+x)ss$x}

Sama seperti orang lain — digabungkan [1..10+x] sebagai string, cari x sebagai string, konversikan ke pengindeksan berbasis satu, kembalikan hit pertama.

Memeriksa kasus uji:

  &/20 4 30 56 11 48={*1+(,/$1+!10+x)ss$x}'15 45 20 333 0 2930
1b

1

Mathematica, 101 byte

(If[#==0,11,m=Min@SequencePosition[s=Flatten[(K=IntegerDigits)/@Range[0,#]],K@#];Length@s[[;;m-1]]])&

1

Haskell , 82 73 55 byte

Bermigrasi dari duplikat

x!b|or$zipWith(==)x b=0
x!(_:b)=1+x!b
(!(show=<<[1..]))

Cobalah online!

Penjelasan

Pertama kita mendefinisikan !. x!bterpotong bke penampilan pertama x. Itu melakukan ini dengan memeriksa apakah bdimulai dengan x( or$zipWith(==)x b) mengembalikan xjika itu terjadi dan memindahkan satu ke bawah string sebaliknya. Kemudian kita mendefinisikan fungsi utama kita. Fungsi utama kami adalah fungsi titik-bebas yang mengambil konstanta ( show=<<[1..]) dan memotongnya ke tampilan pertama x. Ini diambil xsebagai string.



1

JavaScript (ES6), 50 39 38 byte

x=s=``
f=n=>-~s.search(n)||f(n,s+=++x)

Cobalah

x=s=``
f=n=>-~s.search(n)||f(n,s+=++x)
o.innerText=f(i.value=15);oninput=_=>o.innerText=f(+i.value)
<input id=i type=number><pre id=o></pre>




1

Perl 6 , 26 byte

{[~](0..$_).index($_)||11}

Cobalah online!

Menemukan indeks elemen dalam rentang gabungan dari 0 ke elemen itu, atau 11jika angka tersebut nol


0

Perl 5 , 42 + 1 (-p) = 43 byte

(join'',0..$_+10)=~/^(0.*?)$_/;$_=length$1

Cobalah online!

Penjelasan

(join'',0..$_+10)   #concatenate all of the numbers from 0 to 10 over the input
=~/^(0.*?)$_/;      #skip the first 0, then find the input
$_=length$1         #the length of the string preceding the input is the answer

0

Perl 6 / Rakudo 29 byte

{$_~=$++until /(.+)$^a/;$0.chars}

Menentukan fungsi dengan satu input ($ ^ a). Sebut demikian:

say {$_~=$++until /(.+)$^a/;$0.chars}(333)
> 56

Menambahkan $, variabel anonim, bertambah $++hingga input $^aditemukan, dan kemudian menghitung jumlah karakter sebelum itu. Diperlukan setidaknya 1 char sebelum .+di regex tidak termasuk case 0-> 0


0

J, 30 Bytes

{.I.(":E.[:}.' '-.~":@i.@+&11)

Mungkin bisa diturunkan sedikit lebih banyak, khususnya dalam menggabungkan bilangan bulat pertama n + 10.

Penjelasan:

{.I.(":E.[:}.' '-.~":@i.@+&11)
                      i.@+&11   | Integers 0 to n+10
                   ":@          | Format list to string
             ' '-.~             | Strip spaces
           }.                   | Behead (remove leading 0)
         [:                     | Cap (previous verbs executed in order, not as a fork)
     ":E.                       | Find matches to the string n (returns a boolean vector)
  I.                            | Indexes of 1s
{.                              | Take only the first

Perhatikan bahwa ini diindeks 0. Contoh:

    {.I.(":E.[:}.' '-.~":@i.@+&11) 1
0
    {.I.(":E.[:}.' '-.~":@i.@+&11) 0
10
    {.I.(":E.[:}.' '-.~":@i.@+&11) 333
55

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.