这个构造数字的启动器是什么?


14

许多编程语言通过将数字“连接”到现有数字的末尾来构造大整数。例如,迷宫Adapt。通过将数字连接到末尾,我的意思是,如果现有数字为45,并且数字为7,则结果数字为457(45×10+7)

构造的数目是可以通过使用单个数字的倍数来构建这样的数:1,2,3,4,5,6,7,8,9 AKA在这9个序列中的一个元素:

1,12,123,1234,12345,
2,24,246,2468,24690,
3,36,369,3702,37035,
4,48,492,4936,49380,
5,60,615,6170,61725,
6,72,738,7404,74070,
7,84,861,8638,86415,
8,96,984,9872,98760,
9,108,1107,11106,111105,

为了提供如何构造序列的示例,以下a=3的序列在构造中的方式:

u1=a=3=3u2=10×u1+2×a=30+6=36u3=10×u2+3×a=360+9=369u4=10×u3+4×a=3690+12=3702u5=10×u4+5×a=37020+15=37035u6=10×u5+6×a=370350+18=370368
u33=10×u32+33×a=37260+99=37359u34=10×u33+34×a=37359+102=373692

u33u34包括以证明当n×a100。一个很大的数字点缀出空间。

仍然不清楚如何构建这些序列,因此这里有两种不同的理解方式:

  • 每个序列都从一位开始。通过取该数字的下一个倍数,将前一项乘以10并乘以倍数,可以找到下一项。按顺序来讲:

    un=10×un1+n×a,u1=a

    其中a是一位数字(1个9


  • 序列中任意点的9元素中的每个元素(例如,n=3)都是12319的倍数,其中123un+1=10×un+ñ 1个12123123456789123456790012345679011

    因此,第一个值是1个×1个2389,第二是12×1个2389,第三123×1个2389

您的任务是将一个构造的数字用作输入,并输出用于构造它的初始数字。您可以假设输入将始终是一个构造数字,并且将大于0。它可能是一个数字,它会映射回自身。

您可以以任何合理的方式进行输入,包括以数字列表,字符串等形式。以一元或您选择的任何其他基数进行输入(尽管不建议)。

这是一个因此最短的代码胜出!

测试用例

       u_n        => a
 37035            => 3
 6172839506165    => 5
 5                => 5
 246913580244     => 2
 987654312        => 8
 61728395061720   => 5
 1111104          => 9
 11111103         => 9
 111111102        => 9
 2469134          => 2
 98760            => 8
 8641975308641962 => 7

或作为两个列表:

[37035, 6172839506165, 5, 246913580244, 987654312, 61728395061720, 1111104, 11111103, 111111102, 2469134, 98760, 8641975308641962]
[3, 5, 5, 2, 8, 5, 9, 9, 9, 2, 8, 7]

当我发布此挑战时,我没有意识到可以使用格里米答案中的方法来简化它,因此,对于使用更数学方法而非数字的答案非常感兴趣。技巧(显然,所有有效答案都同样有效,正是我所希望看到的)。


沙盒发布。如果有人想挑战一下,我在Jelly有9字节的解决方案。
Caird coinheringaahing

Answers:


26

05AB1E7 5 4字节

>9*н

在线尝试!

>            # input + 1
 9*          # * 9
   н         # take the first digit

6
嗯,如果可以轻松简化的话,这对这个挑战而言并不是好兆头
caird coinheringaahing

9
您有大约1字节的代码可用于800字节的挑战说明。:p
Arnauld

1
您如何提出解决方案,为什么正确?
乔尔

7
@Joel以a开头的序列的第(n-1)个项是a * (((10**n - 1) / 9 - n) / 9)。将该数字乘以9并相加a*n,得到 a * ((10**n - 1) / 9)的数字又是n次。事实证明,a*n对于n = 1,加9而不是功,对于n较大,在指数增长旁边的常数差可以忽略不计。
Grimmy

3
@Grimy非常感谢您的解释。也许您可以将其放入您的帖子中。
乔尔

3

数学高尔夫,6个字节

)9*▒├Þ

在线尝试!

不幸的是,headMathGolf中没有任何操作,因此我必须设法▒├Þ转换为字符串,从左侧弹出并丢弃除堆栈顶部以外的所有内容。





2

木炭,7个字节

§I×⁹⊕N⁰

在线尝试!链接是详细版本的代码。@Grimy的方法当然。这是一种27字节的数学方法:

NθW¬№Eχ×κ↨υχθ⊞υLυI⌕Eχ×ι↨υχθ

在线尝试!链接是详细版本的代码。输入无效时崩溃。说明:

Nθ

输入构造编号。

W¬№Eχ×κ↨υχθ

将列表解释为以10为底的数字,将所有数字乘以从09,然后查看是否出现构造的数字。

⊞υLυ

将列表的长度推到自身。因此,列表的形式为[0, 1, 2, ..., n]

I⌕Eχ×ι↨υχθ

重新创建构造的数字,但是这次找到并输出输入数字出现的索引。



2

空白,108字节

[S S S N
_Push_0][S N
S _Duplicate_0][T   N
T   T   _Read_STDIN_as_integer][T   T   T   _Retrieve_input][S S S T    N
_Push_1][T  S S S _Add][S S S T S S T   N
_Push_9][T  S S N
_Multiply][S S S T  N
_Push_1][N
S S N
_Create_Label_LOOP][S S S T S T S N
_Push_10][T S S N
_Multiply][S N
S _Duplicate][S T   S S S T S N
_Copy_0-based_2nd]S N
T   Swap_top_two][T S S T   _Subtract][N
T   T   S N
_If_neg_jump_to_Label_PRINT][N
S N
N
_Jump_to_Label_LOOP][N
S S S N
_Create_Label_PRINT][S S S T    S T S N
_Push_10][T S T S _Integer_divide][T    S T S _Integer_divide][T    N
S T _Output_top_as_number]

字母S(空格),T(制表符)和N(换行符)仅作为突出显示而添加。
[..._some_action]仅作为说明添加。

@Grimy的05AB1E答案的端口,除了我没有内置函数来获取第一个数字。;)

在线尝试(仅使用空格,制表符和换行符)。

伪代码中的解释:

Integer i = STDIN as integer
i = i + 1
i = i * 9
Integer t = 1
Start LOOP:
  t = t * 10
  If(i - t < 0):
    Call function PRINT
  Go to next iteration of LOOP

function PRINT:
  t = t / 10
  i = i / t    (NOTE: Whitespace only has integer-division)
  Print i as integer to STDOUT

2

Python 3,22字节

lambda i:str(-~i*9)[0]

在线尝试!

格里米港的05AB1E答案


Python 3,74个字节

f=lambda i,j=1,k=2,l=1:l*(i==j)or f(i,*(10*j+k*l,l+1,k+1,2,l,l+1)[i<j::2])

在线尝试!

说明

递归函数。在每个数字的顺序进行迭代l,开始1。如果输入i等于当前迭代jl则返回相应的数字。否则,如果j序列中的当前值超过输入值i,它将递增该数字l并重新开始。参数k用于增加乘法因子。


1

JavaScript(ES6), 16  15字节

感谢@Grimy解除了我以前版本中的32位约束。

利用格里米的魔咒。将输入作为字符串。

n=>(n*9+9+n)[0]

在线尝试!


JavaScript(ES6),53个字节

天真的蛮力方法。

n=>(g=(k,x=i=0)=>x>n?g(k+1):x<n?g(k,++i*k+10*x):k)(1)

在线尝试!


-~n*9可以是n*9+9,这是相同的字节数,但是如果我理解正确的话,应该摆脱32位的限制。
Grimmy

蛮力作用于a> = 10,例如14808
Nahuel Fouilleul

1
@NahuelFouilleul如果我们考虑a> = 10,则答案不再是唯一的(14808可以是a = 12的第四项,也可以是a = 14808的第一项)。如果允许输出任何一个,则n=>n适用于所有输入。
Grimmy

1

Java 8,23字节

n->(n*9+9+"").charAt(0)

@Grimy的05AB1E端口的答案,所以请确保对他投票

在线尝试。

但是因为我有点不喜欢@cairdCoinheringaahing,所以这里是一种蛮力的方法,它提供了更多的负担(83个字节):

n->{long r=n,a=0,u,k;for(;++a<10;r=u>n?r:a)for(k=2,u=a;u<n;)u=u*10+k++*a;return r;}

在线尝试。

说明:

n->{                 // Method with long as both parameter and return-type
  long r=n,          //  Result, starting at the input in case it's already a single digit
       a=0,          //  The digit to start the sequence with
       u,            //  The last number of the sequence we're building for digit a
       k;            //  Multiplier which increments each iteration
  for(;++a<10;       //  Loop in the range [1,9] (over each digit):
      r=u>n?         //    After ever iteration: if `u` is larger than the input:
            r        //     Keep the result the same
           :         //    Else:
            a)       //     Change the result to `a`
    for(k=2,         //   Reset `k` to 2
        u=a;         //   Reset `u` to the current digit `a`
        u<n;)        //   Inner loop as long as `u` is smaller than the input
      u=             //    Change `u` to:
        u*10         //     10 times the current `u`
            +k++*a;  //     With `k` multiplied by `a` added
                     //     (after which `k` increases by 1 with `k++`)
  return r;}         //  And after we iterated over each digit, return the result




0

-rr,4字节

⑨9*÷

在线尝试!

当然,使用与05AB1E答案相同的方法。也使用新的-rr(反转和原始打印)标志。

转译至:

from KegLib import *
from Stackd import Stack
stack = Stack()
printed = False
increment(stack)
integer(stack, 9)
maths(stack, '*')
item_split(stack)
if not printed:
    reverse(stack)
    raw(stack)

0

,30字节

只是大多数答案的一部分。

Fn.new{|i|(i*9+9).toString[0]}

在线尝试!

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.