没有人知道GAU编号


22

让我向您介绍GAU编号

GAU(1) = 1  
GAU(2) = 1122  
GAU(3) = 1122122333  
GAU(4) = 11221223331223334444  
GAU(6) = 11221223331223334444122333444455555122333444455555666666  
...  
GAU(10) = 11221223331223334444122333444455555122333444455555666666122333444455555666666777777712233344445555566666677777778888888812233344445555566666677777778888888899999999912233344445555566666677777778888888899999999910101010101010101010  

这个挑战非常简单!

给定整数n> 0,求出GAU(n)的位数

让我们使GAU(4)
采取以下步骤(直到达到4)并将它们连接起来

[1][122][122333][1223334444]   

您必须将每个数字写成它的值多次,但是每次必须从1开始计数

让我们尝试使GAU(5)
必须从1数到1

[1]   

然后从1到2(但每个数字重复其值的次数

[122]     

然后从1到3

[122333]   

然后从1到4

[1223334444]    

最后是1到5(这是最后一步,因为我们想找到GAU(5))

[122333444455555]     

现在我们执行所有这些步骤并将它们串联起来
,结果是GAU(5)

11221223331223334444122333444455555     

我们对这些GAU编号的位数感兴趣。

测试用例

输入⟼输出

n   ⟼ Length(GAU(n))

1   ⟼ 1  
2   ⟼ 4  
3   ⟼ 10  
10  ⟼ 230   
50  ⟼ 42190  
100 ⟼ 339240  
150 ⟼ 1295790  

这是一个挑战。
以字节为单位的最短代码将获胜。

如果您还有任何疑问,请告诉我。
我真的希望这里的每个人都了解这种魔术隐藏的复杂模式


4
GAU代表什么?
Leaky Nun

21
G代表GAU,A和U无缘无故

2
直到n = 9为止,长度都是四面体数字,但是超过了该数字,则多位数数字成为简单的封闭形式
Miff

仅供参考,您的测试用例说的n ⟼ Length(GUA(n))不是GAU(n)。
numbermaniac

2
@numbermaniac感谢您发现此问题。GUA编号完全不同。它们还没有被发明!

Answers:


14

SOGL V0.1211 10 8 7 5 个字节

∫∫l*+

在这里尝试!-期望在堆栈上的输入为空且输入框为空的情况下作为函数调用。
7字节替代方案,可从输入框获取输入:

0.∫∫l*+

在这里尝试!

0      push 0
 .     push the input
  ∫    iterate over a range 1..POP (input) inclusive, pusing the current number
   ∫    iterate over 1..POP (above loops number) inclusive, pusing the current number
    l    push that numbers length without popping the number
     *   multiply the length by the number
      +  add to the zero, or whatever it is now

push that numbers length without popping the number不错
郊区大佬埃里克(Erik the Outgolfer)'17


7

Brain-Flak,166字节

<>(((()()())({}){})())<>{({}[()]<({}({}<<>({}[()])((){[()](<()>)}{}){{}((((({})({})){}{}){}))<>(({}<({}())>){()<({}[({})])>}{})(<>)}{}<>>({}({})())))>)}{}({}<{}{}{}>)

在线尝试!

说明

<>(((()()())({}){})())<>           # Initialize second stack with 9 and 10
{({}[()]<                          # Do main loop n times:
  ({}
    ({}
      <
        <>({}[()])                 # Subtract 1 from counter to next power of 10
        ((){[()](<()>)}{}){        # If reached a power of 10 (say, 10^k):
          {}((((({})({})){}{}){})) # Multiply existing (10^k*0.9) by 10 and push twice
          <>                       # On first stack
          (
            ({}<({}())>)           # Increment length of numbers
            {()<({}[({})])>}{}     # Divide length of new set of numbers by this length
          )                        # Add together to get new set of numbers length
        (<>)}  
      {}<>>  
      ({}({})())                   # Add number length to number set length
    )                              # Add number set length to new segment length
  )                                # Add new segment length to total length
>)}                                # End main loop
{}({}<{}{}{}>)                     # Put result on stack by itself





3

外壳,7个字节

Σ∫mS*Lḣ

在线尝试!

取消高尔夫/解释

         -- implicit input N                        | 10
  m   ḣ  -- map the following function over [1..N]  | [1,2,3,4]
   S*L   --   multiply length of number by itself   | [1,2,3,4] (only important for numbers ≥ 10)
 ∫       -- prefix sums                             | [0,1,3,6,10]
Σ        -- sum                                     | 20

3

外壳,7个字节

ṁLṁṘNḣḣ

在线尝试!

说明

          Implicit input, e.g 4
      ḣ   Range from 1 to n                               [1,2,3,4]
     ḣ    Prefixes                                        [[],[1],[1,2],[1,2,3],[1,2,3,4]]
  ṁ       Map and then concatenate
   ṘN     Repeat each number in each list by its index    [[],[1],[1,2,2],[1,2,2,3,3,3],[1,2,2,3,3,3,4,4,4,4]]
                                                          [1,1,2,2,1,2,2,3,3,3,1,2,2,3,3,3,4,4,4,4]
ṁ         Map and then sum
 L        Length (of number: 10 -> 2)                     26

哦,另一个Husk解决方案:)发布我的时没有看到您提交的内容,相同的字节数,但是它们有足够的不同,所以我也将我的内容留在这里。
ბიმო



3

CJam,20个字节

q~),(\{),{_s,*+}*+}%

在线尝试!

该数字在“输入”字段中传递。

取消解释:(示例输入= 2)

q~),(\{),{_s,*+}*+}%                                             | Stack:
q                     read input as string                       | "2"
 ~                    eval input (add it to stack as integer)    | 2
  )                   add 1                                      | 3
   ,                  range (convert to array with values 0...N) | [0, 1, 2]
    (                 pop first item of array                    | [1, 2] 0
     \                swap top two values of stack               | 0 [1, 2]
      {           }   for each item in array...                  | 0 1
       )              add 1                                      | 0 2
        ,             range (convert to array with values 0...N) | 0 [0, 1]
         {     }      for every element in the array...          | 0 0
          _           duplicate                                  | 0 0 0
           s          convert to string                          | 0 0 "0"
            ,         get length of string                       | 0 0 1
             *        multiply                                   | 0 0
              +       add                                        | 0 1
                *     fold                                       | 0 1
                 +    add                                        | 1
                   %  repeat                                     | 4

当解释时,这似乎很难。


2

J,24个字节

[:+/[:+/\[:(*#@":"0)1+i.

类似dzaima的APL答案的高级方法,翻译成J,不同的是我们先将数字变成字符串而不是取对数来计算数字的长度,然后使用J的钩子将该数字与数字本身相乘: (*#@":"0)。之后,这只是扫描总和。

在线尝试!


1
1(#.]*#\*#\.)1#@":@+i.也适用于22字节
英里

@miles很聪明-我花了一点时间才弄清楚。用J编程已有多长时间了?
约拿(Jonah)

我加入了代码高尔夫后不久。我实际上并没有使用它编写任何真实的程序,因为我不知道能够读取它,但是我现在确实将其用作高级桌面计算器,并且通常总是打开一个窗口来计算某些东西。
英里

2

R,39个字节

function(n)sum(nchar(rep(1:n,n:1*1:n)))

验证所有测试用例!

简单的算法;我观察到,因为大多数一样,对于i1:ni反复i*(n-i+1)多次。因此,我创建了该向量,计算每个向量中的字符数,并对它们求和。


1

Python 2,51 50字节

lambda n:sum(~k*(k-n)*len(`k+1`)for k in range(n))

@LeakyNun为什么?我自己制定了这个答案。我什至没有检查其他答案。
Orlp

1
这甚至都没有输出正确的答案,n = 1时给出0,n = 2时给出3,n = 3时给出14
Halvard Hummel

@HalvardHummel糟糕,弄乱了一个标志,却忘记了+1。立即修复。
orlp

我看到您终于了解了模式!有没有办法在线测试您的代码,或者其他的Python 2答案也涵盖了这一点?

1

JavaScript(ES6),50 42字节

更新:现在基本上是其他答案在做什么的港口。

f=(n,i=1)=>n&&`${n}`.length*n*i+f(n-1,i+1)

测试用例


1

Mathematica,66个字节

Tr[1^(f=Flatten)[IntegerDigits/@f@(a=Array)[a[#~Table~#&,#]&,#]]]&


1

实际上,13个字节

R♂R♂i⌠;n⌡Mεjl

在线尝试!

说明:

R♂R♂i⌠;n⌡Mεjl
R              range(1, n+1)
 ♂R            range(1, x+1) for x in previous
   ♂i          flatten into 1D list
     ⌠;n⌡M     for x in list:
      ;n       repeat x x times
          εj   concatenate to string
            l  length

1

Japt12 11 10 9字节

õõÈ*sÊÃxx

试试看测试从1到150的所有数字


说明

整数的隐式输入U

õõ

生成一个从1到整数的整数数组,U然后生成一个从1到每个整数的子数组。

È   Ã

通过函数传递每个子数组的元素。

*sÊ

将当前元素转换为字符串(s),获取其长度(Ê),然后乘以该元素。

xx

在对每个子数组进行相同操作后,通过加法来减少主数组。


1

JQ 1.582 49 43个字节

[range(.)+1|range(.)+1|"\(.)"*.|length]|add

展开式

[   range(.)+1        # for i=1 to N
  | range(.)+1        # for j=1 to i
  | "\(.)"*.          # "j" copied j times
  | length            # convert to length
] | add               # add lengths

样品运行

$ jq -Mr '[range(.)+1|range(.)+1|"\(.)"*.|length]|add' <<< "150"
1295790

在线尝试!jqplay.org


1

堆叠,28字节

[~>[~>[:rep]"!]"!flat''#`#']

在线尝试!

有人可能会问:“别名什么时候不可读?” 如果还没有结束,那么您对“可读性”的定义就非常宽松。

说明

[~>[~>[:rep]"!]"!flat''#`#']    input: N
 ~>[          ]"!               for each number K from 1 to N
    ~>[    ]"!                  for each number J from 1 to K
       :rep                     repeat J J times
                 flat           flatten the resultant array
                     ''#`       join by the empty string
                         #'     get the length of said string


1

C#(.NET Core)94 80 74字节

n=>{int b=0,a=0,i;while(a++<n)for(i=0;i++<a;)b+=(i+"").Length*i;return b;}

在线尝试!

我希望找到一个直接的解决方案,例如@ kamoroso94的答案开始了,但是由于我花了太多时间而放弃了。可能有一种方法可以做到,但是公式需要针对每个幅度步长进行调整。

致谢

@someone节省了14个字节

@Kevin Cruijssen节省了6个字节


1
n=>{int b=0,a=0,i;for(;a++<n;)for(i=0;i++<a;)b+=i.ToString().Length*i;return b;} 在线尝试!80字节和性能。
我的代词是monicareinstate

1
i.ToString()可以(i+"")节省更多的字节。
凯文·克鲁伊森

1

MATL,15字节

:ttP*Y"10&YlQks

在线尝试!

说明:

:                range 1:input (implicit input)
 tt              duplicate twice
   P             reverse
    *            multiply elementwise
     Y"          runlength decoding
       10&Yl     log10
            Qk   increment and floor
              s  sum (implicit output)

该对数很昂贵:-)您可以通过转换为字符串,删除空格和长度来替换它::ttP*Y"VXzn
Luis Mendo

1

Perl 6、36字节

{[+] 1..*Z*($_...1).map:{.chars*$_}}

测试一下

展开:

{  # bare block lambda with implicit parameter 「$_」

  [+]               # reduce the following using &infix:«+»

    1 .. *          # Range from 1 to infinity

    Z*              # zip using &infix:«*»

    ( $_ ... 1 )    # sequence from the input down to 1
    .map:           # for each one
    { .chars * $_ } # multiply the number of digits with itself
}

1

木炭18 14字节

IΣE⊕NΣE⊕ι×λLIλ

在线尝试!链接是详细版本的代码。编辑:使用Sum保存了我4个字节。说明:

  E⊕N           Map from 0 to the input (loop variable i)
      E⊕ι       Map from 0 to i (loop variable l)
            Iλ  Cast l to string
           L    Take the length
         ×λ     Multiply by l
     Σ          Sum the results
 Σ              Sum the results
I               Cast to string
                Implicitly print

:| 给定字符串参数时,求和求和字符串中的数字
ASCII码,仅ASCII

@ ASCII-only不是,它只是打印一个Σ...
Neil

@仅ASCII另外,我能做Sum的仍然是18个字节:Print(Cast(Sum(Map(InclusiveRange(1, InputNumber()), Sum(Map(InclusiveRange(1, i), Times(l, Length(Cast(l)))))))));
Neil


仅@ASCII,我尝试了乘积的总和,但这是17个字节:≔⊕NθIΣEθ×⁻θι×ιLIι。但是,使用Incremented而不是InclusiveRange剃掉我以前的评论4个字节!
尼尔


1

[Dyalog APL],22个 20字节

{+/≢¨⍕¨↑,/(/⍨¨⍳¨⍳⍵)}

在线尝试!

说明:

{+/≢¨⍕¨↑,/(/⍨¨⍳¨⍳⍵)}
{                  } anonymous function with right argument named 
                ⍳⍵   range 1 to right arg
              ⍳¨     for each, range 1 to it
             ¨       for each
           /⍨          for each item, repeat right arg left arg times
          (       )  take that and
        ,/           join the sub-arrays together
                    convert from a nested array to a simple array (or something like that, I don't quite understand it :p)
     ⍕¨              convert each number to a char-array (aka string version)
   ≢¨                get length of each
 +/                  sum that together

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.