Tìm số trong hằng số Champernowne


35

Giới thiệu

Trong cơ sở 10, hằng số Champernowne được xác định bằng cách ghép các biểu diễn của các số nguyên liên tiếp. Trong cơ sở 10: 0.1234567891011121314151617...vân vân.

Bạn có thể thấy rằng sự xuất hiện đầu tiên của 15bắt đầu ở 20thsố thập phân:

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

Sự xuất hiện đầu tiên của 45bắt đầu ở 4thsố thập phân:

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

Vì vậy, nhiệm vụ là dễ dàng. Cho một số nguyên không âm, xuất vị trí của số nguyên trong hằng số Champernowne.

Quy tắc

  • Bạn có thể cung cấp một chức năng hoặc một chương trình
  • Đây là , vì vậy bài nộp có số byte ít nhất sẽ thắng!

Các trường hợp thử nghiệm

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

Vị trí cao nhất chúng ta cần làm việc là gì? Chẳng hạn, con số sẽ là 987654321123456877654234354675.
Morgan Thrapp

@MorganThrapp Có lẽ tôi sẽ kiểm tra các số nguyên trong phạm vi 0 <= x <= 99, nhưng về mặt lý thuyết nó sẽ hoạt động cho các số nguyên cao hơn 99.
Adnan

Câu trả lời:



10

LabVIEW, 29 LabVIEW Nguyên thủy

Điều này sử dụng chuỗi cho bây giờ. Nó khớp với đầu vào dưới dạng mẫu và xuất ra offset - (chiều dài đầu vào -1).


6

Javascript, 57 byte

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

Đã lưu 1 byte nhờ Conor O'Brien.


Tôi nghĩ rằng bạn có thể di chuyển y=một phần để y=b=" "; tăng một không gian giống như tăng không. ( a=prompt(y=b=" ");...)
Conor O'Brien

1
@ CᴏɴᴏʀO'Bʀɪᴇɴ Đẹp tìm.
SuperJedi224

4

Haskell, 62 byte

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

Ví dụ sử dụng: (#(show=<<[1..])).show $ 2930-> 48.

Cách thức hoạt động: a # btìm vị trí abên trong b: if alà tiền tố của sự btrở lại 1, khác thêm 1vào một cuộc gọi đệ quy với a # tail b. Hàm pointfree (#(show=<<[1..])).showmong đợi một đối số (không tên) nvà các cuộc gọi show n # show=<<[1..].

Hàm subIndexnày cũng sẽ thực hiện công việc của #, nhưng yêu cầu import Data.List.Utilskhông trả hết.


Tôi không nghĩ rằng bạn cần.show
Wheat Wizard


4

Ruby, 28

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

Bao gồm 0 ở đầu để các kết quả khớp được lập chỉ mục 1, nhưng sử dụng \Bđể yêu cầu rằng kết quả khớp không nằm ở đầu chuỗi.


4

Japt, 11 byte

Điều này ban đầu đánh bại Pyth, nhưng rõ ràng nó không hoạt động cho đầu vào 0.

1+1oU+B ¬bU

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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

Tại sao phần "Làm thế nào nó hoạt động" của bạn chứa một qtrong mã và không phải là biểu tượng phủ định logic ¬?
Gây tử vong

@Firthize ¬là một phím tắt cho (đó là khoảng trắng qsau). Điều này dường như thường là một điểm gây nhầm lẫn, vì vậy tôi đã xếp hàng phiên bản ngắn hơn với phiên bản đầy đủ.
Sản xuất ETH

3

Lua, 54 byte

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

Lưu ý: Hiện tại chương trình này in cả lần xuất hiện đầu tiên của char đầu tiên của chuỗi và điểm kết thúc. Nếu điều này không được phép, nó sẽ tốn thêm một vài byte. Tôi muốn kiến ​​nghị cho một phần thưởng vì chương trình của tôi in ra cả vị trí đầu tiên và vị trí cuối cùng của số đầu vào.


1
Bạn có nghĩa là các chỉ số bắt đầu và chỉ số kết thúc cho lần xuất hiện đầu tiên của số? Bởi vì về mặt lý thuyết, con số sẽ ở đó vô số lần.
Rɪᴋᴇʀ

Vâng, bắt đầu và kết thúc cho lần xuất hiện đầu tiên.
Nikolai97

3

MATL , 22 byte

it10+:Yst' '=~)wYsXf1)

Lấy đầu vào ( i), tạo vectơ 1 thành đầu vào + 10 ( 10+:), chuyển đổi vectơ thành một chuỗi ( Ys) và xóa các khoảng trắng, điều này gây đau đớn, ( t' '=~)). Sau đó, chuyển đổi đầu vào thành một chuỗi ( Ys), tìm vị trí của chuỗi đầu vào trong chuỗi số ( Xf) và lấy vị trí đầu tiên ( 1)). Các twđang thao túng ngăn xếp (tương ứng trùng lặp và trao đổi).


3

PowerShell, 39 44 byte

[Chỉnh sửa: giả định của tôi không giữ, xây dựng một mảng từ 1-0 không tìm thấy 0 ở vị trí 11. Thay vào đó, hãy xây dựng từ 1-x + 10 để xử lý 0, bây giờ là 44 byte]

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

Bạn sẽ luôn tìm thấy x khi xây dựng một chuỗi hằng số Champernowne tại điểm mới nhất khi bạn thêm x vào cuối, vì vậy một mảng từ 1-x sẽ luôn có câu trả lời trong đó. Câu hỏi trở thành "nó có xảy ra sớm hơn không?" . Mã này

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

e.g.

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

tạo ra một dãy số, đưa nó thành một chuỗi và tìm kiếm tham số bên trong nó. Vì PowerShell là một vỏ hướng đối tượng, tham số thực sự là một [int]kiểu, vì vậy cố gắng lưu hai ký tự .IndexOf($i)sẽ tìm kiếm chuỗi cho một số nguyên và không tìm thấy gì. Đó là lý do tại sao tôi sử dụng phép nội suy chuỗi "$i".


1
Cách làm thông minh. Thất vọng rằng .IndexOf()rõ ràng có ưu tiên hoạt động cao hơn so với unary -joinbuộc parens và báo giá. : - /
admBorkBork

3

MATL (phát hành 1.0.1), 22 byte

iXK10+:"@Ys]N$hKYsXf1)

Thí dụ

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

Giải trình

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 (phát hành 20.8.0), 16 byte (thách thức ngôn ngữ postdates)

Tín dụng cho @Giuseppe cho phiên bản chương trình này (sửa đổi một chút)

10+:"@V]&hGVXf1)

Hãy thử trực tuyến!

Giải trình

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

Tôi không nghĩ điều này xử lý 0 :(
David

@David Bây giờ thì có. Cảm ơn đã chú ý! Nó chỉ có giá 3 byte :-)
Luis Mendo

bây giờ clipboard đó Gchứa đầu vào (và đầu vào ẩn), tôi đoán câu trả lời này có thể được rút ngắn khá nhiều, và tất cả Yscần phải thay đổi thành Vanyway; Tôi đã đưa ra 10+:"@Vv]!GVXf1)16 byte.
Giuseppe

@Giuseppe Cảm ơn bạn đã ủng hộ! Được cập nhật, với khoản tín dụng đáo hạn (và với ghi chú "ngôn ngữ hoãn lại ngôn ngữ"; tôi không phải là người hâm mộ quy tắc mới )
Luis Mendo

Tôi không bận tâm đến quy tắc đó quá nhiều ( mặc dù những lá cờ khiến tôi phát điên); Tôi chủ yếu bình luận ở đây vì tôi nhận thấy Yscần phải thay đổi Vđể sử dụng trong phiên bản cập nhật nhất của trình thông dịch. Tôi luôn ấn tượng với bao nhiêu ngôn ngữ đã được cải thiện!
Giuseppe

2

PowerShell, 54 50 byte

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

Cảm ơn TessellatingHeckler cho ý tưởng hoán đổi whilevòng lặp cho một forvòng lặp.

Thực hiện thông qua một forvòng lặp. Cũng như các ngôn ngữ khác, câu lệnh đầu tiên trong vòng lặp có thể xây dựng các biến và phép gán, do đó, câu lệnh này bắt đầu $cbằng chỉ chuỗi trống ''để chúng tôi có chỉ mục không của chuỗi xếp hàng với chỉ mục thập phân của thử thách. Sau đó, chúng ta đang ở trong một vòng lặp kiểm tra xem $ccó số nguyên đầu vào ( $args) ở đâu đó bên trong nó hay không (nghĩa là kể từ khi .IndexOf()trả về-1 nếu chuỗi không được tìm thấy, chúng ta thêm một vào đó ( 0) chứ không phải nó ( $TRUE) để tiếp tục vòng lặp). Nếu nó không được tìm thấy, chúng tôi thêm vào $ibiến đếm tăng trước của chúng tôi , sau đó kiểm tra lại chuỗi. Khi chuỗi được tìm thấy, .IndexOf()sẽ trả về giá trị dương, không phải là chuỗi$FALSE, thoát ra khỏi vòng lặp. Cuối cùng, chúng tôi xuất chỉ mục với $x.


Lý tưởng cho một forvòng lặp cổ điển ... for($c='.';($x=$c.IndexOf("$args"))-lt0;$c+=++$i){}$xvà lưu 1 ký tự. Vì hầu hết các cuộc gọi IndexOf sẽ trả về -1, hãy thêm một cuộc gọi vào đó và boolean! đúc nó, cho một bài kiểm tra ngắn hơn. Nhưng bạn cần parens để làm điều đó. Làm trống $ c và +1 bên trong các parens hiện có, phần thưởng sẽ ngắn hơn. for($c='';!($x=$c.IndexOf("$args")+1);$c+=++$i){}$x51 byte. (nhưng tôi đã đăng 39 byte của mình dưới dạng câu trả lời của riêng mình vì đó là một cách tiếp cận hoàn toàn khác: P).
TessellatingHeckler

1
@TessellatingHeckler Cách tốt để viết lại vòng lặp - cảm ơn! Tôi di chuyển phần $cnối vào vòng lặp để đánh dấu chấm phẩy. Bây giờ là 50.
admBorkBork

2

JavaScript (ES6), 40 byte

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

Sử dụng hàm đệ quy fđể tránh các vòng lặp. các tìm kiếm phương pháp hoạt động giống như indexOfngoại trừ việc nó mất một RegExp như một tham số, đó là không thích hợp cho thách thức này.

Thêm một " "cho n=0trường hợp (zero là falsy trong JS) cưỡng ép những +để thực hiện nối chuỗi thay vì bổ sung, sửa chữa và cho chỉ mục zero-based.



1

CJam, 11 byte

r_i),s\#Be|

Kiểm tra nó ở đây.

Tôi đang tìm vị trí của Nchuỗi 01234...Nđể tính toán cho việc lập chỉ mục dựa trên 1. Cuối cùng tôi sửa 0bằng cách áp dụng logic HOẶC với 11.


1

Nghiêm túc, 13 byte

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

Lấy đầu vào là một số nguyên. Chứa không thể in được, do đó hexdump:

0c3bf739752b526024604de4a1

Dùng thử trực tuyến

Giải trình:

;≈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}

Cùng một người như mọi người khác, concatenate [1..10+x] thành chuỗi, tìm kiếm x dưới dạng chuỗi, chuyển đổi sang lập chỉ mục một lần, trả về lần truy cập đầu tiên.

Kiểm tra các trường hợp kiểm tra:

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

1

Toán học, 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

Di chuyển từ bản sao

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

Hãy thử trực tuyến!

Giải trình

Đầu tiên chúng tôi xác định !. x!bcắt ngắn bđể xuất hiện đầu tiên của x. Nó thực hiện điều này bằng cách kiểm tra nếu bbắt đầu bằng x( or$zipWith(==)x b) trả về xnếu có và di chuyển xuống chuỗi khác. Sau đó, chúng tôi xác định chức năng chính của chúng tôi. Hàm chính của chúng ta là một hàm không có điểm lấy hằng số ( show=<<[1..]) và cắt nó thành hình đầu tiên x. Điều này mất xnhư một chuỗi.



1

JavaScript (ES6), 50 39 38 byte

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

Thử nó

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>





0

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

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

Hãy thử trực tuyến!

Giải trình

(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}

Xác định hàm với một đầu vào ($ ^ a). Gọi như vậy:

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

Nối thêm $, một biến ẩn danh, tăng dần $++cho đến khi $^atìm thấy đầu vào , sau đó đếm số ký tự trước nó. Yêu cầu ít nhất 1 char trước nó .+trong regex một cách hữu ích loại trừ trường hợp 0-> 0


0

J, 30 byte

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

Có lẽ có thể bị đánh gôn nhiều hơn một chút, đặc biệt là ghép các số nguyên n + 10 đầu tiên.

Giải trình:

{.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

Lưu ý rằng đây là 0 chỉ mục. Ví dụ:

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.