แถวของตัวเลขธรรมชาติ


22

คำนิยาม

มีจำนวนอนันต์ของจำนวนธรรมชาติที่ต่อกัน (จำนวนเต็มบวกเริ่มต้นด้วย 1):

1234567891011121314151617181920212223...

ท้าทาย

  • เขียนโปรแกรมในภาษาใด ๆ ที่ยอมรับหมายเลขตำแหน่งเป็นอินพุตและเอาต์พุตหลักจากตำแหน่งนั้นในแถวที่กำหนดไว้ด้านบน
  • หมายเลขตำแหน่งคือจำนวนเต็มบวกขนาดโดยพลการ นั่นคือตำแหน่งแรกคือ 1 ให้ผลลัพธ์เอาต์พุตหลัก '1'
  • อินพุตเป็นทศนิยม (เช่น 13498573249827349823740000191) หรือสัญลักษณ์อิเล็กทรอนิกส์ (เช่น 1.2e789) ที่สอดคล้องกับจำนวนเต็มบวก
  • โปรแกรมต้องสิ้นสุดในเวลาที่เหมาะสม (10 วินาทีสำหรับพีซี / Mac สมัยใหม่) ให้ดัชนีที่มีขนาดใหญ่มากเป็นอินพุต (เช่น 1e123456 - นั่นคือ 1 ที่มี 123456 ศูนย์) ดังนั้นการวนซ้ำแบบง่ายจึงไม่เป็นที่ยอมรับ
  • โปรแกรมจะต้องยุติด้วยข้อผิดพลาดใน 1 วินาทีหากได้รับการป้อนข้อมูลที่ไม่ถูกต้องใด ๆ เช่น. 1.23e (ไม่ถูกต้อง) หรือ 1.23e1 (เท่ากับ 12.3 - ไม่ใช่จำนวนเต็ม)
  • คุณสามารถใช้ห้องสมุด BigNum สาธารณะเพื่อแยก / เก็บหมายเลขและทำการดำเนินการทางคณิตศาสตร์อย่างง่าย ๆ กับพวกเขา (+ - * / exp) ไม่มีการลงโทษแบบไบต์
  • รหัสที่สั้นที่สุดชนะ

TL; DR

  • อินพุต: จำนวนเต็ม bignum
  • ผลลัพธ์: ตัวเลขที่ตำแหน่งนั้นในแถวอนันต์ 123456789101112131415...

บางกรณีทดสอบการยอมรับ

ในสัญกรณ์ "อินพุต: เอาท์พุท" ทุกคนควรผ่านไป

  • 1: 1
  • 999: 9
  • 10,000,000: 7
  • 1e7: 7 (เหมือนกับแถวด้านบน)
  • 13498573249827349823740000191: 6
  • 1.1e10001: 5
  • 1e23456: 5
  • 1.23456e123456: 4
  • 1e1000000: 0
  • 1.23e: ข้อผิดพลาด (ไวยากรณ์ไม่ถูกต้อง)
  • 0: ข้อผิดพลาด (นอกขอบเขต)
  • 1.23e1: ข้อผิดพลาด (ไม่ใช่จำนวนเต็ม)

โบนัส!

เอาท์พุทตัวเลขตำแหน่งตัวเลขภายในจำนวนและจำนวนเอาท์พุทเอง ตัวอย่างเช่น:

  • 13498573249827349823740000191: 6 24 504062383738461516105596714
    • นั่นคือตัวเลข '6' ที่ตำแหน่ง 24 ของหมายเลข '50406238373846151610559 6 714'
  • 1e1000000: 0 61111 1000006111141666819445...933335777790000
    • ตัวเลข '0' ที่ตำแหน่ง 61111 ของตัวเลขยาว 999995 หลักฉันจะไม่รวมที่นี่

ถ้าคุณทำภารกิจโบนัสให้สมบูรณ์ให้คูณขนาดโค้ดของคุณด้วย 0.75

เครดิต

งานนี้ได้รับจากหนึ่งในการชุมนุม devclub.eu ในปี 2012 โดยไม่ต้องการจำนวนมาก ดังนั้นคำตอบส่วนใหญ่ที่ส่งมาคือลูปเล็กน้อย

มีความสุข!


ฉันไม่เข้าใจว่าสิ่งที่ท้าทายคืออะไร เราควรที่จะรับอินพุตและส่งออกตัวเลขที่ตำแหน่งนั้นหรือไม่?
The_Basset_Hound

1
นี่คือOEIS ลำดับ 33307
Tyilo

2
@vihan การใช้ห้องสมุด bignum สาธารณะเป็นที่ยอมรับ ไม่มีโทษ แน่นอนว่าการรวมวิธีแก้ไขปัญหาลงในห้องสมุดและการใช้งานห้องสมุดในหนึ่งซับกำลังพิจารณาถึงการโกง ใช้สามัญสำนึกที่นี่
metalim

1
แค่ต้องการแสดงโซลูชัน F # ที่รัดกุมอย่างน่าประหลาดใจด้วยการตอกบัตรที่ 44 ไบต์ จริงอยู่มันสามารถจัดการดัชนีได้สูงสุด 2 ^ 31-1 เท่านั้น (และยังคงพยายามคำนวณค่าดังกล่าวขณะที่ฉันเขียนสิ่งนี้) ฉันไม่ได้โพสต์สิ่งนี้เพราะมันทำลายกฎจริงๆ แต่ฉันบอกว่ามันค่อนข้างดีสำหรับ F #!
Jwosty

7
ข้อกำหนดในการจัดการอินพุตเช่น1.23456e123456ลงโทษภาษาที่ไม่สามารถประมวลผลค่านั้นได้โดยพลการและต้องการให้พวกเขาทำการประมวลผลสตริงที่เป็นวงสัมผัสกับความท้าทาย
xnor

คำตอบ:


12

CJam , 78 ไบต์

r_A,s-" e . .e"S/\a#[SSS"'./~'e/~i1$,-'e\]s"0]=~~_i:Q\Q=Qg&/
s,:L{;QAL(:L#9L*(*)9/-_1<}g(L)md_)p\AL#+_ps=

โปรแกรมมีความยาว 104 ไบต์และมีสิทธิ์รับโบนัส

บรรทัดใหม่คือเครื่องสำอางล้วนๆ บรรทัดแรกแยกวิเคราะห์อินพุตข้อมูลที่สองสร้างเอาต์พุต

ลองออนไลน์!

ความคิด

สำหรับเลขจำนวนเต็มบวกใด ๆkมีจำนวนเต็มบวก9 × 10 k-1 ที่มีตัวเลขkแน่นอน(ไม่นับเลขศูนย์นำหน้า) ดังนั้นถ้าเรา concatenate ทั้งหมดของพวกเขาเราได้รับจำนวนเต็มของ9 × n × 10 k-1

ตอนนี้การเชื่อมต่อจำนวนเต็มทั้งหมดของnหรือตัวเลขที่น้อยกว่าจะทำให้ได้จำนวนเต็ม

สูตร

ตัวเลข

สำหรับการป้อนข้อมูลให้คิวเราพยายามตรวจสอบสูงสุดnดังกล่าวว่าการแสดงออกดังกล่าวข้างต้นมีขนาดเล็กกว่าQ เราตั้งค่าn: = ⌈log 10 q⌉-1 , จากนั้นn: = ⌈log 10 q⌉-2 , ฯลฯ จนกระทั่งนิพจน์ที่ต้องการมีขนาดเล็กกว่าq , ลบนิพจน์ผลลัพธ์จากq (ให้ผลr ) และบันทึกสุดท้าย ค่าของnในลิตร

rตอนนี้ระบุดัชนีในการต่อกันของจำนวนเต็มบวกทั้งหมดของl + 1หลักซึ่งหมายความว่าผลลัพธ์ที่ต้องการคือr% (l + 1)ตัวเลขหลักที่thของr / (l + 1)จำนวนเต็มที่thของl + 1ตัวเลข

รหัส (การแยกวิเคราะห์อินพุต)

r_          e# Read from STDIN and duplicate.
A,s-        e# Remove all digits.
" e . .e"S/ e# Push ["" "e" "." ".e"].
\a#         e# Compute the index of the non-digit part in this array.

[SSS"'./~'e/~i1$,-'e\]s"0]

            e# Each element corresponds to a form of input parsing:
            e#   0 (only digits): noop
            e#   1 (digits and one 'e'): noop
            e#   2 (digits and one '.'): noop
            e#   3 (digits, one '.' then one 'e'):
            e#     './~    Split at dots and dump the chunks on the stack.
            e#     'e/~    Split the and chunks at e's and dump.
            e#     i       Cast the last chunk (exponent) to integer.
            e#     1$      Copy the chunk between '.' and 'e' (fractional part).
            e#     ,-      Subtract its length from the exponent.
            e#     'e\     Place an 'e' between fractional part and exponent.
            e#     ]s      Collect everything in a string.
            e#   -1 (none of the above): push 0

~           e# For s string, this evaluates. For 0, it pushes -1.
~           e# For s string, this evaluates. For -1, it pushes 0.
            e# Causes a runtime exception for some sorts of invalid input.
_i:Q        e# Push a copy, cast to Long and save in Q.
\Q=         e# Check if Q is numerically equal to the original.
Qg          e# Compute the sign of Q.
&           e# Logical AND. Pushes 1 for valid input, 0 otherwise.
/           e# Divide by Q the resulting Boolean.
            e# Causes an arithmetic exception for invalid input.

รหัส (การสร้างผลลัพธ์)

s,:L     e# Compute the number of digits of Q and save in L.
{        e# Do:
  ;      e#   Discard the integer on the stack.
  Q      e#   Push Q.
  AL(:L# e#   Push 10^(L=-1).
  9L*(   e#   Push 9L-1.
  *)     e#   Multiply and increment.
  9/     e#   Divide by 9.
  -      e#   Subtract from Q.
  _1<    e#   Check if the difference is non-positive.
}g       e# If so, repeat the loop.
(        e# Subtract 1 to account for 1-based indexing.
L)md     e# Push quotient and residue of the division by L+1.
_)p      e# Copy, increment (for 1-based indexing) and print.
\AL#+    e# Add 10^L to the quotient.
_p       e# Print a copy.
s        e# Convert to string.
2$=      e# Retrieve the character that corresponds to the residue.

5

CJam, 75 * 0.75 = 56.25

นี่ค่อนข้างเร็วหนึ่งรอบต่อหนึ่งหลักของตัวเลขที่มีตำแหน่งที่ต้องการ ฉันแน่ใจว่ามันสามารถตีกอล์ฟได้มากขึ้นมันค่อนข้างหยาบเหมือนเดิม

q~_i_@<{0/}&:V9{VT>}{T:U;_X*T+:T;A*X):X;}w;U-(_X(:X/\X%10X(#@+s_2$\=S+@)S+@

ให้ตำแหน่งเป็นอินพุตเอาต์พุตคือ:

<digit> <position> <full number>

ลองมันออนไลน์


@Dennis กำลังทำงานกับอินพุตทั้งหมดในตอนนี้ :)
Andrea Biondo

ยังคงนี้ไม่ได้ยกข้อผิดพลาด (ตามที่ควร) 1.23e1สำหรับ อย่างไรก็ตามมันมีข้อผิดพลาดสำหรับ1.23456e123456เนื่องจากอินพุตไม่สามารถแสดงโดย Double นอกจากนี้กรณีทดสอบล่าสุดใช้เวลา 3 นาที
เดนนิส

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