总和直到平方


11

给定任意整数x> 0和任意基数y> 3。

  1. 将x的所有数字加起来(如果写在设置的基数中)。
  2. 将此乘以最高位数(始终为base -1)。
  3. 重复直到该值是 (y - 1) ^ 2

搜索的是迭代次数和步骤数。

范例1:

x= 739
y= 7
searched: (7 - 1) ^ 2 = 36

based: (b7)2104
sum: (dec)7
mul: (dec)42

based: (b7)60
sum: (dec)6
mul: (dec)36

2 steps needed -> answer is [2, 739, 42, 36] or [739, 42, 36, 2]

范例2:

x = 1712
y = 19
s: 324

step1: 1712 -> 360
step2:  360 -> 648
step3:  648 -> 324

3 steps needed -> answer is [3, 1712, 360, 648, 324] or [1712, 360, 648, 324, 3]

特殊:
在某些情况下(某些组合的底数为3),您将无法(y - 1) ^ 2喜欢x = 53y = 3。因此,该值y必须大于3,您可以忽略它。

迭代次数必须是第一个或最后一个值

这是最低字节数获胜。


要求答案中的步骤数似乎是对该问题不必要补充。我的解决方案必须添加21个字节做什么额为找到一个列表的长度和减去1
ngenisis

@ngenisis仅按输出顺序排列,但忽略了该方法(数组,堆栈,delim。字符串,多个字符串...)。跟踪2种不同的事物(最终价值和计数)可以避免“盲目”收集价值(或多或少),这对我来说是一个很好的补充。也许另一种方法将在计算时需要再增加5个字节,但在计数部分会节省8个字节(这里只是随机数)。
Dirk Reichel

Answers:


4

果冻14 13 字节

循环时通过打印来获得-1字节(替换链分隔µ和并置;

Ṅb⁹S×⁹’¤µÐĿL’

TryItOnline!

怎么样?

Ṅb⁹S×⁹’¤µÐĿL’ - Main link: x, y
        µÐĿ   - loop monadically until results are no longer unique and collect
Ṅ             - print z (initially x), then result of previous loop and return z
  ⁹           -     right argument (y, even though monadic)
 b            -     left to base right
   S          -     sum (the result was a list of base y digits)
       ¤      -     nilad followed by link(s) as a nilad
     ⁹’       -         y decremented
    ×         -     multiply
           L  - length(z)
            ’ - decrement
              - implicit print

备选方案13 byter将循环的每个输入加一个换行符()打印,最后隐式打印所收集结果的递减计数,从而消除了对单链分离(µ)和串联(;)的需要。


1
由于没有设置“输出格式”的要求。只要顺序良好,就可以算出多个输出。这样,13字节的答案是有效的。
Dirk Reichel

太酷了,我不确定,感谢您告诉我!
乔纳森·艾伦

4

Perl 6,60个字节

{$/=[$^x,*.polymod($^y xx*).sum*($y-1)...($y-1)²];$/-1,|$/}

展开:

{    # bare block lambda with placeholder parameters 「$x」 「$y」

  $/ = [          # store in 「$/」 ( so that we don't have to declare it )

    # generate a sequence

    $^x,          # declare first parameter, and seed sequence generator

    # Whatever lambda

    *\            # the parameter to this lambda

    .polymod(     # broken down with a list of moduli

      $^y         # declare second parameter of the outer block lambda
      xx *        # an infinite list of copies of it

    )
    .sum
    *
    ( $y - 1 )

    # end of Whatever lambda

    ...           # repeat until it reaches

    ( $y - 1 
  ];

  # returns
  $/ - 1,         # count of values minus one
  |$/             # Slip 「|」 the list into the result
}

用法:

# store it in the lexical namespace so that it is easier to understand
my &code = {$/=[$^x,*.polymod($^y xx*).sum*($y-1)...($y-1)²];$/-1,|$/}

say code  739,  7; # (2 739 42 36)
say code 1712, 19; # (3 1712 360 648 324)

4

C,116个 113字节

-3个字节,用于每次重新计算平方

s,t,i;f(x,y){s=y-(i=1);while(x-s*s){t=0;++i;printf("%d ",x);while(x)t+=x%y,x/=y;x=t*y-t;}printf("%d %d ",x,i-1);}

脱胶和用法:

s,t,i;
f(x,y){
 s=y-(i=1);
 while(x-s*s){
  t=0;
  ++i;
  printf("%d ",x);
  while(x)
   t+=x%y,    //add the base y digit
   x/=y;      //shift x to the right by base y
  x=t*y-t;
 }
 printf("%d %d ",x,i-1);
}

main(){
 f(739,7);puts("");
 f(1712,19);puts("");
}

4

JavaScript(ES6),97 91 84 82字节

f=(n,b,k=1,c=b-1)=>[n,(s=(B=n=>n%b*c+(n>b&&B(n/b|0)))(n))-c*c?f(s,b,k+1):[s,k]]+''

测试用例


4

果冻,16字节

我想无论如何我都会张贴这个,即使它在我编写时被打败了,因为它是一种截然不同的算法,并且编写起来很有趣。(ÐĿ尽管知道可能会导致比此解决方案更短的解决方案,但我无法弄清楚如何从文档中解析出来并不得不放弃它。)

ṄbS×⁹’¤ß<’¥n⁸$?‘

在线尝试!

说明:

ṄbS×⁹’¤ß<’¥n⁸$?‘
Ṅ                 Output {the first argument} and a newline
 b                Convert to base {the second argument}
  S               Sum digits
    ⁹’¤           {the second argument} minus 1, parsed as a group
   ×              Multiply
           n⁸$    {the current value} ≠ {the first argument}, parsed as a group
              ?   If that's true:
       ß          then run the whole program recursively
        <’¥       else run (lambda a,b: (a<b)-1)
               ‘  Increment the result

使用<’¥基本上是一种编写dyad(带有两个参数的链接)的简短方法,它总是返回-1(因为我们知道答案永远不会小于基数)。在递归运行和整个程序递归之间进行选择,可以让我们确定何时停止循环。然后,当堆栈在递归结束时展开时,我们将继续增加-1以确定有多少步。


2

MATL,25 21字节

@Luis节省了4个字节

XJx`tJYA!UsJq*tJqU-}@

在线尝试!

说明

XJ      % Implicitly grab the first input and store in clipboard J
x       % Delete this from the stack
`       % Do...while loop
  t     % Duplicate last element on stack (implicitly grabs second input)
  JYA   % Convert this number to the specified base
  !Us   % Sum the digits
  Jq*   % Multiply by the largest number in this base
  t     % Duplicate this value
  JqU   % Compute (base - 1) ^ 2
  -     % Subtract the two. Evaluates to TRUE if they are not equal
}       % When they are finally equal
@       % Push the number of iterations
        % Implicitly display the stack contents

@LuisMendo固定!
Suever,2016年

1

Mathematica,80个字节

(s=FixedPointList[x(#2-1)(Plus@@x~IntegerDigits~#2),#];s[[-1]]=Length@s-2;s)&

U+F4A1用于表示的私人使用字符\[Function]。如果答案中不需要步骤数,则可以用60个字节来完成:

Most@FixedPointList[x(#2-1)(Plus@@x~IntegerDigits~#2),#]&
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.