Squareまでの合計桁


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、for x = 53やを気に入ることができませんy = 3。このためy、3より大きくする必要があり、これは無視できます。

反復回数は、最初または最後の値である必要があります

これは、最低バイト数勝利です。


答えのステップ数を要求することは、問題への不必要な追加のように思われます。私の解決策は、リストの長さを見つけて1を引くことを行うために21バイトを追加する必要がありました。
ngenisis16年

@ngenisは出力の順序だけを使用しますが、メソッド(配列、スタック、区切り文字列、複数の文字列など)は無視します。2つの異なるもの(最終的な値とカウント)を追跡することは、値の(盲目的な)収集(多かれ少なかれ)を避け、私の目には良い追加です。別のアプローチでは、計算でさらに5バイト必要ですが、カウント部分で8バイト節約できます(ここでは乱数のみ)。
ダークレイチェル

回答:


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バイトの回答は有効です。
ダークレイチェル

クール、私は確信できませんでした、私に知らせてくれてありがとう!
ジョナサンアラン

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

ゼリー、16バイト

とにかくこれを投稿するつもりです。たとえそれが私が書いている間にbeatられたとしても、それは著しく異なるアルゴリズムであり、書くのが面白かったからです。(ÐĿドキュメントからどのように解析されたのかわかりませんでしたが、おそらくこれよりも短いソリューションにつながることを知っていたにもかかわらず、あきらめなければなりませんでした。)

Ṅ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

の使用<’¥は、基本的に、常に-1を返すダイアド(2つの引数を持つリンク)を書くための簡単な方法です(答えがベースより小さくなることはないため)。再帰的に実行するか、プログラム全体を再帰的に実行するかを選択すると、ループを停止するタイミングを決定できます。次に、再帰の終わりにスタックが巻き戻されると、-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 Fixed!
Suever

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),#]&
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.