自然数の列


22

定義

連結された自然数(1から始まる正の整数)の無限の行があります。

1234567891011121314151617181920212223...

チャレンジ

  • 入力として位置番号を受け入れ、上記で定義された行のその位置から数字を出力する任意の言語でプログラムを作成します。
  • 位置番号は、任意のサイズの正の整数です。つまり、最初の位置は1であり、出力数字「1」が生成されます。
  • 入力は、10進数(例:13498573249827349823740000191)、または正の整数に対応するe表記(例:1.2e789)のいずれかです。
  • 非常に大きなインデックスを入力として指定すると、プログラムは妥当な時間(最新のPC / Macでは10秒)で終了する必要があります(たとえば、1e123456-123456ゼロの1)。したがって、単純な反復ループは受け入れられません。
  • 無効な入力が与えられた場合、プログラムは1秒以内にエラーで終了する必要があります。例えば。1.23e(無効)、または1.23e1(12.3に等しい-整数ではない)
  • パブリックBigNumライブラリを使用して数値を解析/保存し、それらに対して単純な数学演算を実行しても問題ありません(+-* / exp)。バイトペナルティは適用されません。
  • 最短のコードが優先されます。

TL; DR

  • 入力:bignum整数
  • 出力:無限行のその位置の数字 123456789101112131415...

いくつかの受け入れテストケース

「入力:出力」という表記で。それらはすべて合格するはずです。

  • 1:1
  • 999:9
  • 10000000:7
  • 1e7:7(上記の行と同じ)
  • 13498573249827349823740000191:6
  • 1.1e10001:5
  • 1e23456:5
  • 1.23456e123456:4
  • 1e1000000:0
  • 1.23e:エラー(無効な構文)
  • 0:エラー(範囲外)
  • 1.23e1:エラー(整数ではない)

ボーナス!

数字内の桁位置番号を出力し、数字自体を出力します。例えば:

  • 13498573249827349823740000191: 6 24 504062383738461516105596714
    • 番号「50406238373846151610559 6 714」の位置24の数字「6」です。
  • 1e1000000: 0 61111 1000006111141666819445...933335777790000
    • 999995桁の長い数字の位置61111の数字「0」ここには含めません。

ボーナスタスクを実行する場合、コードのサイズに0.75を掛けます

クレジット

このタスクは、2012年のdevclub.euの集まりの1つで、多数の要件なしで行われました。したがって、提出された回答のほとんどは些細なループでした。

楽しむ!


私は本当に挑戦が何であるかわかりません。その位置で数値を入力および出力する必要がありますか?
The_Basset_Hound

1
これは、OEISシーケンス33307です。
ティロ

2
@vihanいくつかのパブリックbignumライブラリを使用してもかまいません。ペナルティなし。もちろん、ソリューションをライブラリに組み込み、ライブラリをワンライナーで使用することは、不正行為を検討しています。ここには常識が当てはまります。
-metalim

1
驚くほど簡潔なF#ソリューションを披露したかっただけで、44バイトで記録しました。確かに、それは2 ^ 31-1までのインデックスしか処理できません(これを書いているときにその値を計算しようとしています)。ただし、実際にはルールに違反するため、これを投稿していませんが、F#にはかなり良いと言えます!
ジョスティ

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バイトで、ボーナスの資格があります。

改行は純粋に化粧品です。最初の行は入力を解析し、2行目は出力を生成します。

オンラインでお試しください!

アイディア

正の整数kには、正確にk桁の9×10 k-1個の正の整数があります(先行ゼロはカウントしません)。したがって、すべてを連結すると、9×n×10 k-1の整数が得られます。

ここで、n桁以下の整数をすべて連結すると、次の整数が得られます。

式

桁。

与えられた入力qに対して、上記の式がqより小さいように最高のnを決定しようとします。我々が設定され、N =⌈log 10 q⌉-1は、N =⌈log 10 q⌉-2などの所望の発現がより小さくなるまで、Q、から得られた発現減算Qを(得、R)、最後に保存値がNL

rは今の全ての正の整数の連結でインデックスを指定し、L + 1つの所望の出力であることをその手段と、数字のR%(L + 1)番目の桁R /(L + 1)番目の整数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

これは非常に高速で、目的の位置を含む数字の桁ごとに1回反復されます。それはもっともっとゴルフできると確信しています。

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すべての入力を今すぐ操作:)
アンドレア

これでも、エラーが発生することはありません1.23e1。ただし、1.23456e123456入力はDoubleで表すことができないため、エラーが発生します。また、最後のテストケースには3分かかります。
デニス

2
@Dennisはエラーを発生させます。大きなテストケースについては...くそー。全体を書き直す必要があるかもしれません。
アンドレアビオンド
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.