Hàng số tự nhiên


22

Định nghĩa

Có vô số các số tự nhiên được nối (số nguyên dương, bắt đầu bằng 1):

1234567891011121314151617181920212223...

Thử thách

  • Viết chương trình bằng bất kỳ ngôn ngữ nào, chấp nhận số vị trí làm đầu vào và xuất chữ số từ vị trí đó trong hàng được xác định ở trên.
  • Số vị trí là số nguyên dương kích thước tùy ý. Đó là vị trí đầu tiên là 1, mang lại chữ số đầu ra '1'
  • Đầu vào là số thập phân (ví dụ: 13498573249827349823740000191) hoặc ký hiệu điện tử (ví dụ: 1.2e789) tương ứng với số nguyên dương.
  • Chương trình phải kết thúc trong thời gian hợp lý (10 giây trên PC / Mac hiện đại), với chỉ số rất lớn làm đầu vào (ví dụ: 1e123456 - tức là 1 với 123456 số 0). Vì thế, vòng lặp đơn giản không được chấp nhận.
  • Chương trình phải chấm dứt với một lỗi trong 1 giây, nếu có bất kỳ đầu vào không hợp lệ. Ví dụ. 1.23e (không hợp lệ) hoặc 1.23e1 (bằng 12.3 - không phải là số nguyên)
  • Bạn có thể sử dụng thư viện BigNum công cộng để phân tích / lưu trữ số và thực hiện các phép toán đơn giản trên chúng (+ - * / exp). Không áp dụng hình phạt byte.
  • Mã ngắn nhất sẽ thắng.

TL; DR

  • Đầu vào: số nguyên bignum
  • Đầu ra: chữ số tại vị trí đó trong hàng vô hạn 123456789101112131415...

Một số trường hợp kiểm tra chấp nhận

trong ký hiệu "Đầu vào: Đầu ra". Tất cả nên vượt qua.

  • 1: 1
  • 999: 9
  • 10000000: 7
  • 1e7: 7 (giống như hàng trên)
  • 13498573249827349823740000191: 6
  • 1.1e10001: 5
  • 1e23456: 5
  • 1.23456e123456: 4
  • 1e1000000: 0
  • 1.23e: lỗi (cú pháp không hợp lệ)
  • 0: lỗi (ngoài giới hạn)
  • 1.23e1: lỗi (không phải là số nguyên)

Tiền thưởng!

Số vị trí chữ số đầu ra bên trong số, và số đầu ra chính nó. Ví dụ:

  • 13498573249827349823740000191: 6 24 504062383738461516105596714
    • Đó là chữ số '6' ở vị trí 24 của số '50406238373846151610559 6 714'
  • 1e1000000: 0 61111 1000006111141666819445...933335777790000
    • Chữ số '0' ở vị trí 61111 trong số 999995 chữ số dài Tôi sẽ không bao gồm ở đây.

Nếu bạn hoàn thành nhiệm vụ tiền thưởng, hãy nhân kích thước mã của bạn với 0,75

tín dụng

Nhiệm vụ này đã được đưa ra tại một trong những cuộc tụ tập của dev club.eu vào năm 2012, mà không yêu cầu số lượng lớn. Do đó, hầu hết các câu trả lời được gửi là các vòng lặp nhỏ.

Chúc vui vẻ!


Tôi thực sự không nhận được những thách thức là gì. Chúng ta có nên lấy số đầu vào và đầu ra ở vị trí đó không?
The_Basset_Hound


2
@vihan Sử dụng một số thư viện bignum công cộng là chấp nhận được. Không bị phạt. Tất nhiên bao gồm giải pháp vào thư viện và sử dụng thư viện trong một lớp lót đang xem xét gian lận. Tâm lý chung áp dụng ở đây.
metalim

1
Chỉ muốn thể hiện một giải pháp F # ngắn gọn đáng ngạc nhiên , với tốc độ 44 byte. Cấp, nó chỉ có thể xử lý các chỉ số tối đa 2 ^ 31-1 (và nó vẫn đang cố gắng tính giá trị đó khi tôi viết này). Tôi không đăng bài này mặc dù nó thực sự vi phạm các quy tắc, nhưng tôi nói nó khá tốt cho F #!
Jwosty

7
Các yêu cầu để xử lý các đầu vào như 1.23456e123456tự ý trừng phạt các ngôn ngữ không thể xử lý các giá trị đó một cách tự nhiên và yêu cầu chúng thực hiện xử lý chuỗi tiếp tuyến với thách thức.
xnor

Câu trả lời:


12

CJam , 78 byte

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=

Chương trình dài 104 byte và đủ điều kiện nhận thưởng.

Các dòng mới là hoàn toàn mỹ phẩm. Dòng đầu tiên phân tích cú pháp đầu vào, dòng thứ hai tạo đầu ra.

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

Ý kiến

Đối với bất kỳ số nguyên dương k nào , có các số nguyên dương 9 × 10 k-1 có chính xác k chữ số (không tính các số 0 đứng đầu). Do đó, nếu chúng ta ghép tất cả chúng, chúng ta có được số nguyên 9 × n × 10 k-1 .

Bây giờ, nối tất cả các số nguyên có n chữ số trở xuống sẽ mang lại một số nguyên

công thức

chữ số.

Đối với một đầu vào q đã cho , chúng tôi thử xác định n cao nhất sao cho biểu thức trên nhỏ hơn q . Chúng tôi đặt n: = ⌈log 10 q⌉ - 1 , sau đó n: = log 10 q⌉ - 2 , v.v. cho đến khi biểu thức mong muốn trở nên nhỏ hơn q , trừ biểu thức kết quả từ q (thu được r ) và lưu lần cuối giá trị của n tính bằng l .

r nay quy định các chỉ số trong nối của tất cả các số nguyên dương của l + 1 chữ số, có nghĩa là đầu ra mong muốn là r% (l + 1) lần thứ chữ số của r / (l + 1) thứ nguyên của l + 1 chữ số.

Mã (phân tích cú pháp đầu vào)

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.

Mã (tạo đầu ra)

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

Điều này khá nhanh, một lần lặp trên mỗi chữ số của số có chứa vị trí mong muốn. Tôi chắc chắn rằng nó có thể được chơi golf nhiều hơn nữa, nó khá thô như vậy.

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

Đưa ra vị trí là đầu vào, đầu ra là:

<digit> <position> <full number>

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


@Dennis Làm việc với tất cả các đầu vào ngay bây giờ :)
Andrea Biondo

Điều này vẫn không gây ra lỗi (như nó nên) cho 1.23e1. Tuy nhiên, nó bị lỗi 1.23456e123456vì đầu vào không thể được biểu thị bằng Double. Ngoài ra, các trường hợp thử nghiệm cuối cùng mất 3 phút.
Dennis

2
@Dennis Bây giờ phát sinh lỗi. Đối với trường hợp thử nghiệm lớn ... Chết tiệt. Tôi có thể phải viết lại toàn bộ.
Andrea Biondo
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.