ค้นหาตัวเลขในค่าคงที่ Champernowne


35

บทนำ

ในฐาน 10 ค่าคงที่ของ Champernowne ถูกกำหนดโดยการเชื่อมโยงการแทนค่าของจำนวนเต็มต่อเนื่อง ในฐาน 10: 0.1234567891011121314151617...และต่อ ๆ ไป

คุณจะเห็นว่าการปรากฏตัวครั้งแรกของการ15เริ่มต้นที่20thทศนิยม:

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

การปรากฏตัวครั้งแรกของการ45เริ่มต้นที่4thทศนิยม:

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

ดังนั้นงานง่าย ให้เป็นจำนวนเต็มไม่ลบส่งออกตำแหน่งของจำนวนเต็มในค่าคงที่ Champernowne

กฎระเบียบ

  • คุณอาจมีฟังก์ชั่นหรือโปรแกรม
  • นี่คือดังนั้นการส่งที่มีจำนวนไบต์น้อยที่สุดจะชนะ!

กรณีทดสอบ

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

ตำแหน่งสูงสุดที่เราต้องทำงานคืออะไร เช่นจำนวนจะเป็น 987654321123456877654234354675
Morgan Thrapp

@MorganThrapp ฉันจะอาจจำนวนเต็มทดสอบในช่วง0 <= x <= 99แต่มันควรจะเป็นในทางทฤษฎี99การทำงานสำหรับจำนวนเต็มสูงกว่า
Adnan

คำตอบ:


8

Pyth, 10

hxjkS+QT`Q

เชื่อมต่อinput + 10หมายเลขแรกจากนั้นค้นหาดัชนี 0 ที่เป็นบวกบวกหนึ่ง .. สิบพิเศษนั้นจำเป็นสำหรับ 0 เท่านั้น

ชุดทดสอบ


ฉันคิดว่ามีการใช้งานอินพุตโดยนัยก่อนหน้า2015-12-17 15:01:23Zหรือบางอย่าง
Erik the Outgolfer

@EriktheOutgolfer มันถูกเพิ่มเข้ามาในปี 2016: github.com/isaacg1/pyth/commit/…
FryAmTheEggman

10

LabVIEW, 29 LabVIEW Primitives

สิ่งนี้ใช้สตริงตอนนี้ มันจับคู่อินพุตเป็นรูปแบบและส่งออกออฟเซ็ต - (อินพุตยาว -1)


6

Javascript, 57 ไบต์

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

บันทึก 1 ไบต์ขอบคุณ Conor O'Brien


ฉันคิดว่าคุณสามารถย้ายy=ส่วนนั้นไปที่y=b=" "; การเพิ่มช่องว่างเหมือนกับการเพิ่มศูนย์ ( a=prompt(y=b=" ");...)
Conor O'Brien

1
@ CᴏɴᴏʀO'Bʀɪᴇɴหาเจอ
SuperJedi224

4

Haskell, 62 ไบต์

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

ตัวอย่างการใช้งาน: ->(#(show=<<[1..])).show $ 293048

วิธีการทำงาน: a # bพบตำแหน่งของaภายในb: ถ้าaเป็นคำนำหน้าของbผลตอบแทน1อื่นเพิ่ม1ไปยังโทร recursive a # tail bกับ ฟังก์ชั่น pointfree (#(show=<<[1..])).showคาดว่า (ไม่มีชื่อ) อาร์กิวเมนต์และบริการโทรnshow n # show=<<[1..]

ฟังก์ชั่นsubIndexก็จะทำงานเช่น#กัน แต่สิ่งที่ต้องการimport Data.List.Utilsไม่ได้ผล


ฉันไม่คิดว่าคุณต้องการ.show
Wheat Wizard


4

ทับทิม, 28

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

รวม 0 ที่จุดเริ่มต้นเพื่อให้การจับคู่นั้นมีการจัดทำดัชนีไว้ 1 รายการ แต่ใช้\Bเพื่อกำหนดให้การแข่งขันไม่อยู่ที่จุดเริ่มต้นของสตริง


4

Japt, 11 ไบต์

นี้ได้รับการตีเดิม Pyth 0แต่เห็นได้ชัดว่ามันไม่ได้ทำงานสำหรับการป้อนข้อมูล

1+1oU+B ¬bU

ลองออนไลน์!

มันทำงานอย่างไร

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

ทำไม "วิธีการทำงาน" ส่วนของคุณมีqในรหัสและไม่สัญลักษณ์ปฏิเสธตรรกะ¬?
ลดขนาด

@Falize ¬เป็นทางลัดสำหรับ(ที่qมีช่องว่างต่อไปนี้) ดูเหมือนว่าจะเป็นจุดที่ทำให้เกิดความสับสนบ่อยครั้งดังนั้นฉันจึงจัดเรียงเวอร์ชั่นที่สั้นกว่ากับเวอร์ชั่นเต็ม
ETHproductions

3

Lua, 54 ไบต์

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

หมายเหตุ: ปัจจุบันโปรแกรมนี้พิมพ์ทั้งการเกิดครั้งแรกของอักขระตัวแรกของสตริงและจุดที่มันสิ้นสุด หากไม่ได้รับอนุญาตจะมีค่าใช้จ่ายเพิ่มอีกสองสามไบต์ ฉันต้องการยื่นขอโบนัสเพราะโปรแกรมของฉันพิมพ์ทั้งตำแหน่งแรกและตำแหน่งสุดท้ายของหมายเลขอินพุต


1
คุณหมายถึงดัชนีเริ่มต้นและดัชนีสิ้นสุดสำหรับการปรากฏครั้งแรกของตัวเลขหรือไม่ เนื่องจากในทางทฤษฎีจำนวนจะมีจำนวนครั้งที่ไม่สิ้นสุด
Rɪᴋᴇʀ

ใช่เริ่มต้นและสิ้นสุดสำหรับเหตุการณ์แรก
Nikolai97

3

MATL , 22 ไบต์

it10+:Yst' '=~)wYsXf1)

ใช้อินพุต ( i) ทำให้เวกเตอร์ 1 เป็นอินพุต + 10 ( 10+:) แปลงเวกเตอร์เป็นสตริง ( Ys) และลบช่องว่างที่เจ็บปวด ( t' '=~)) จากนั้นแปลงอินพุตเป็นสตริง ( Ys) ค้นหาว่าสตริงอินพุตอยู่ในสตริงตัวเลข ( Xf) และรับตำแหน่งแรก ( 1)) t'และw' s จะจัดการสแต็ค (ซ้ำและสลับตามลำดับ)


3

PowerShell ขนาด39 44 ไบต์

[แก้ไข: การสันนิษฐานของฉันไม่ได้สร้างอาร์เรย์จาก 1-0 ไม่พบ 0 ที่ 11 แทนสร้างจาก 1-x + 10 เพื่อจัดการ 0 เช่นกันตอนนี้ 44 ไบต์]

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

คุณจะพบxเมื่อสร้างสตริงของค่าคงที่ของ Champernowne ที่จุดล่าสุดเมื่อคุณเพิ่มxลงบนจุดสิ้นสุดดังนั้นอาร์เรย์จาก 1-x จะมีคำตอบอยู่เสมอ คำถามกลายเป็น"มันเกิดขึ้นเร็วกว่านี้ไหม?" . รหัสนี้

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

e.g.

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

สร้างช่วงของตัวเลขปลดเปลื้องมันไปยังสตริงและค้นหาพารามิเตอร์ที่อยู่ภายใน เนื่องจาก PowerShell เป็นเชลล์เชิงวัตถุพารามิเตอร์จึงเป็น[int]ชนิดดังนั้นพยายามบันทึกอักขระสองตัวด้วย.IndexOf($i)จะค้นหาสตริงสำหรับจำนวนเต็มและค้นหาอะไร "$i"นั่นเป็นเหตุผลที่ผมใช้สตริงแก้ไข


1
วิธีที่ชาญฉลาดในการทำมัน น่าผิดหวังที่.IndexOf()เห็นได้ชัดว่ามีการตั้งค่าการทำงานสูงกว่า unary -joinบังคับให้ parens และเครื่องหมายคำพูด : - /
AdmBorkBork

3

MATL (ปล่อย 1.0.1), 22 ไบต์

iXK10+:"@Ys]N$hKYsXf1)

ตัวอย่าง

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

คำอธิบาย

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 (ปล่อย 20.8.0) 16 ไบต์ (postdates ภาษาท้าทาย)

มอบเครดิตให้ @Giuseppe สำหรับโปรแกรมรุ่นนี้ (แก้ไขเล็กน้อย)

10+:"@V]&hGVXf1)

ลองออนไลน์!

คำอธิบาย

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

ฉันไม่คิดว่านี่จะจัดการได้ 0 :(
David

@ David ตอนนี้มันทำ ขอบคุณที่สังเกต! ราคาเพียง 3 ไบต์ :-)
Luis Mendo

ตอนนี้คลิปบอร์ดนั้นGมีอินพุต (และอินพุตโดยนัย) ฉันเดาว่าคำตอบนี้สั้นลงได้มากและทุกความYsต้องการที่จะเปลี่ยนเป็นยังVไง ฉันมากับ10+:"@Vv]!GVXf1)16 ไบต์
Giuseppe

@iuseppe ขอบคุณสำหรับการเฮฮา! อัปเดตด้วยเครดิตที่ครบกำหนด (และด้วย "ภาษา postdates challange" หมายเหตุ; ฉันไม่ใช่แฟนตัวยงของกฎใหม่ )
Luis Mendo

ฉันไม่รังเกียจที่กฎมาก ( ธงหนึ่งทำให้ฉันบ้า แต่); ฉันส่วนใหญ่แสดงความคิดเห็นที่นี่เนื่องจากฉันสังเกตเห็นว่าYsจำเป็นต้องเปลี่ยนVเป็นการใช้ในล่ามรุ่นล่าสุด ฉันประทับใจเสมอกับการพัฒนาภาษา!
จูเซปเป้

2

PowerShell, 54 50 ไบต์

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

ขอบคุณTessellatingHecklerสำหรับแนวคิดในการสลับwhileลูปสำหรับforลูป

ดำเนินการผ่านforลูป เช่นเดียวกับภาษาอื่น ๆ คำสั่งแรกในลูปสามารถสร้างตัวแปรและการกำหนดค่าได้ดังนั้นสิ่งนี้เริ่มต้นด้วย$cเพียงแค่สตริงที่ว่างเปล่า''เพื่อให้เรามีการทำดัชนีศูนย์ของสตริงที่เรียงรายไปด้วยการทำดัชนีทศนิยมของความท้าทาย เราอยู่ในลูปที่ตรวจสอบว่า$cมีจำนวนเต็มอินพุท ( $args) อยู่ที่ไหนภายใน (เช่นถ้า.IndexOf()ส่งคืน-1หากไม่พบสตริงเราเพิ่มหนึ่งในนั้น ( 0) และไม่ใช่ ( $TRUE) เพื่อดำเนินการต่อลูป) หากไม่พบเราเพิ่ม$iตัวแปรตัวนับที่เพิ่มขึ้นล่วงหน้าแล้วตรวจสอบสตริง เมื่อพบสตริงแล้ว.IndexOf()จะส่งคืนค่าบวกซึ่งจะไม่เท่ากับ$FALSEแยกออกจากวง $xสุดท้ายเราส่งออกดัชนีด้วย


เหมาะอย่างยิ่งสำหรับforวงคลาสสิก... for($c='.';($x=$c.IndexOf("$args"))-lt0;$c+=++$i){}$xและบันทึก 1 ตัวละคร เนื่องจากการเรียก IndexOf ส่วนใหญ่จะคืนค่า -1 ให้เพิ่มหนึ่งรายการและบูลีน! โยนมันสำหรับการทดสอบสั้นลง แต่คุณต้อง parens ทำเช่นนั้น ล้าง $ c และ +1 ภายใน parens ที่มีอยู่โบนัสจะสั้นกว่า for($c='';!($x=$c.IndexOf("$args")+1);$c+=++$i){}$x51 ไบต์ (แต่ฉันโพสต์ 39 byte ของฉันเป็นคำตอบของตัวเองเพราะมันเป็นวิธีที่แตกต่างอย่างสิ้นเชิง: P)
TessellatingHeckler

1
@TessellatingHeckler วิธีที่ดีในการเขียนห่วง - ขอบคุณ! ฉันย้ายการ$cเรียงต่อกันเป็นวงเพื่อเล่นกอล์ฟอัฒภาค ตอนที่ 50
AdmBorkBork

2

JavaScript (ES6), 40 ไบต์

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

ใช้ฟังก์ชั่นวนซ้ำfเพื่อหลีกเลี่ยงการวนซ้ำ ค้นหาวิธีการทำงานเช่นเดียวกับindexOfยกเว้นว่ามันจะใช้เวลานิพจน์ทั่วไปเป็นพารามิเตอร์ซึ่งเป็นที่ไม่เกี่ยวข้องสำหรับความท้าทายนี้

การเพิ่ม" "สำหรับn=0กรณี (ศูนย์เป็นเท็จใน JS) coerces +เพื่อทำการเรียงต่อกันสตริงแทนการเพิ่มและแก้ไขสำหรับการทำดัชนี zero-based



1

CJam, 11 ไบต์

r_i),s\#Be|

ทดสอบที่นี่

ฉันกำลังค้นหาตำแหน่งของNสตริง01234...Nเพื่อบัญชีการจัดทำดัชนีแบบ 1 ในที่สุดฉันก็แก้ไขได้0โดยใช้ตรรกะ OR กับ 11


1

อย่างจริงจัง 13 ไบต์

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

รับอินพุตเป็นจำนวนเต็ม มี unprintables ดังนั้น hexdump:

0c3bf739752b526024604de4a1

ลองออนไลน์

คำอธิบาย:

;≈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 ไบต์

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

เช่นเดียวกับคนอื่น ๆ เชื่อมกัน[1..10+x]เป็นสตริงค้นหา x เป็นสตริงแปลงเป็นการสร้างดัชนีแบบฐานเดียวคืนค่า Hit แรก

ตรวจสอบกรณีทดสอบ:

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


1

Haskell , 82 73 55 ไบต์

ย้ายจากที่ซ้ำกัน

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

ลองออนไลน์!

คำอธิบาย

!ครั้งแรกที่เรากำหนด x!bตัดทอนการปรากฏตัวครั้งแรกของb xมันทำได้โดยการตรวจสอบว่าbเริ่มต้นด้วยx( or$zipWith(==)x b) กลับxถ้ามันและย้ายหนึ่งลงสตริงมิฉะนั้น จากนั้นเราจะกำหนดฟังก์ชั่นหลักของเรา ฟังก์ชั่นหลักของเราคือฟังก์ชั่นจุดฟรีที่ใช้เวลาคงที่ ( show=<<[1..]) xและตัดทอนมันไปปรากฏตัวครั้งแรกของ สิ่งนี้ใช้xเป็นสตริง







0

Perl 5 , 42 + 1 (-p) = 43 ไบต์

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

ลองออนไลน์!

คำอธิบาย

(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 ไบต์

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

กำหนดฟังก์ชั่นด้วยหนึ่งอินพุต ($ ^ a) โทรหา:

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

การผนวก$เป็นตัวแปรที่ไม่ระบุตัวตนการเพิ่มขึ้น$++จนกระทั่ง$^aพบอินพุตจากนั้นนับจำนวนตัวอักษรก่อนหน้า ต้องการอย่างน้อย 1 ถ่านก่อนที่มันจะ.+อยู่ใน regex ที่เป็นประโยชน์ไม่รวมกรณี 0-> 0


0

J, 30 ไบต์

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

อาจจะสามารถเล่นกอล์ฟได้มากขึ้นโดยเฉพาะในการต่อเชื่อมจำนวนเต็ม n + 10 ตัวแรก

คำอธิบาย:

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

โปรดทราบว่านี่เป็นดัชนี 0 ตัวอย่าง:

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.