自然数行


22

定义

有无穷级数的连接自然数(以1开头的正整数):

1234567891011121314151617181920212223...

挑战

  • 以任何语言编写程序,该程序接受位置编号作为输入,并从上面定义的行中的该位置输出数字。
  • 位置编号是任意大小的正整数。那是第一个位置是1,产生输出数字“ 1”
  • 输入可以是十进制数(例如13498573249827349823740000191),也可以是对应于正整数的e表示法(例如1.2e789)。
  • 程序必须在合理的时间内(在现代PC / Mac上为10秒)结束,并给出非常大的索引作为输入(例如1e123456-即1表示123456为零)。因此,简单的迭代循环是不可接受的。
  • 如果输入无效,程序必须在1 s内以错误终止。例如。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一次聚会上完成的,没有大量要求。因此,提交的大多数答案都是琐碎的循环。

玩得开心!


我真的不明白挑战是什么。我们应该在那个位置输入并输出数字吗?
The_Basset_Hound 2015年


2
@vihan使用某些公共bignum库是可以接受的。没有惩罚。当然,将解决方案包括到库中并以单行方式使用库正在考虑作弊。常识在这里适用。
metalim 2015年

1
只是想展示一个令人惊讶的简洁F#解决方案,时钟为44字节。当然,它只能处理不超过2 ^ 31-1的索引(并且在我编写此代码时,它仍在尝试计算该值)。我没有发布此消息,因为它确实违反了规则,但是我想说它对F#来说相当不错!
Jwosty 2015年

7
处理输入的要求(如1.23456e123456任意处理)会惩罚无法本地处理此类值的语言,并要求它们进行与挑战相切的字符串处理。
xnor 2015年

Answers:


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位的正整数(不计算前导零)。因此,如果我们将它们全部连接起来,我们将获得9×n×10 k-1的整数。

现在,将n个或更少位数的所有整数连接起来,得到的整数为

式

数字。

对于给定的输入q,我们尝试确定最高n,使上述表达式小于q。我们设置N:=⌈log 10 q⌉-1 ,N:=⌈log 10 q⌉-2 ,等等,直到期望的表达变得小于q,减去从所得表达q(产生- [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

这是非常快的,包含所需位置的数字的每位数字进行一次迭代。我敢肯定它可以打更多的球,因为它确实很粗糙。

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.