乗法永続性


46

乗法永続性

  1. 数字のすべての数字を掛ける
  2. 1桁が残るまで繰り返します

Numberphileが説明したように:

  1. 277777788888899→2x7x7x7x7x7x7x8x8x8x8x8x8x9x9 = 4996238671872
  2. 4996238671872→4x9x9x6x2x3x8x6x7x1x8x7x2 = 438939648
  3. 438939648→4x3x8x9x3x9x6x4x8 = 4478976
  4. 4478976→4x4x7x8x9x7x6 = 338688
  5. 338688→3x3x8x6x8x8 = 27648
  6. 27648→2x7x6x4x8 = 2688
  7. 2688→2x6x8x8 = 768
  8. 768→7x6x8 = 336
  9. 336→3x3x6 = 54
  10. 54→5x4 = 20
  11. 20→2x0 = 0

ちなみに、これは現在のレコードです。つまり、最小数と最大数のステップです。

ゴルフ

入力として任意の整数を受け取り、入力自体から始めて1桁になるまで各ステップの結果を出力するプログラム。277777788888899の場合、出力は次のようになります。

277777788888899
4996238671872
438939648
4478976
338688
27648
2688
768
336
54
20
0

(ステップ数のカウントは、ユーザーの練習として残されています)。

その他の例

A003001から:

25
10
0

A003001からも:

68889
27648
2688
768
336
54
20
0

Numberphileビデオから:

327
42
8

そのため、Additive Persistenceについて質問がありましたがこれはMultiplicative Persistenceです。また、その質問は出力としてステップの数を要求しますが、中間結果を見ることに興味があります。


ボーナス:新しいレコードを見つける:最小数で最大のステップ数。警告:推測では、11が最大の可能性があります。
SQB

7
おそらく終わらないテストケースをさらに含める必要があります。0
アーナルド

この投稿をするために来た、それが既に存在することがわかった、gg
cat

1桁の有効な入力ですか?
dzaima

1
Numberphileのビデオで、Matt Parkerは、検索が数百桁まで行われたと述べています。
ハードスケール

回答:


7

ゼリー、4バイト

DP$Ƭ

オンラインでお試しください!

説明

D    | convert to decimal digits
 P   | take the product
  $  | previous two links as a monad
   Ƭ | loop until no change, collecting all intermediate results

ボーナスとして、指定された桁数の範囲で最大のステップ数を持つ数字を見つけるTIOがあります。TIOでもうまくスケーリングします。


15

TI-BASIC(TI-84)、30 32 31バイト

@SolomonUckoのおかげで-1バイト!

While Ans>9:Disp Ans:prod(int(10fPart(Ans10^(seq(-X-1,X,0,log(Ans:End:Ans

入力はですAns
出力はチャレンジ要求として表示されます。Ans最後のステップを印刷するには、末尾が必要です。

私はこの式を自分で考えたのではなく、ここでそれを見つけて、より適切に挑戦に合うように修正しました。

編集: 課題を読み直すと、製品が1桁の場合、プログラムを終了する必要があることに気付きました。したがって、これを説明するために2バイトが追加されました。

例:

24456756
        24456756
prgmCDGF8
        24456756
          201600
               0
11112
           11112
prgmCDGF8
           11112
               2

説明:

While Ans>9               ;loop until the product is one digit
Disp Ans                  ;display the current product
prod(                     ;get the product of...
 int(                     ; the integer part of...
  10fPart(                ; ten times the fractional part of...
  Ans                     ; each element in the following list times the
                          ;  current product
  10^(                    ; multiplied by the list generated by using each
                          ;  element of the following list as an exponent
                          ;  for 10^n
   seq(-X-1),X,0,log(Ans  ; generate a list of exponents from -1 to -L where
                          ;  L = the length of the current product
End
Ans                       ;leave the final product in "Ans" and implicitly
                          ; print it

Visual Model:
Ansから始まります125673
このモデルは、数字の乗算の背後にあるロジックのみを対象としています。他のすべてが理解しやすいです。

seq(-X-1,X,0,log(Ans  =>  seq(-X-1,X,0,5.0992
   {-1 -2 -3 -4 -5 -6}
10^(...
   {.1 .01 .001 1E-4 1E-5 1E-6}
Ans...
   {12567.3 1256.73 125.673 12.5673 1.25673 .125673}
fPart(...
   {.3 .73 .673 .5673 .25673 .125673}
10...
   {3 7.3 6.73 5.673 2.5673 1.25673}
int(...
   {3 7 6 5 2 1}
   (the digits of the number, reversed)
prod(...
   1260
   (process is repeated again)

seq(-X-1,X,0,log(Ans  =>  seq(-X-1,X,0,3.1004
   {-1 -2 -3 -4}
10^(...
   {.1 .01 .001 1E-4}
Ans...
   {126 12.6 1.26 .126}
fPart(...
   {0 .6 .26 .126}
10...
   {0 6 2.6 1.26}
int(...
   {0 6 2 1}
prod(...
   0
   (product is less than 10.  loop ends)

ノート:

TI-BASICはトークン化された言語です。文字数がバイト数と等しくありませ

10^(、この1バイトのトークンが

このプログラムは、TI計算機の10進精度の制限のため、14桁を超える整数を持つ正しい製品シーケンスを提供しません。


10^(外に移動seq(して閉じ括弧を省略して、バイトを保存できますか?
ソロモンウコ

はい、そう信じています!
タウ

11

K(ngn / k)、9バイト

{*/.'$x}\

オンラインでお試しください!

{ }\ シーケンスが収束するまで中括弧で関数を適用し続けます

$x 引数を文字列(文字のリスト)としてフォーマットします

.'それぞれを評価します(kの他の方言にはコロンが必要です、.:'

*/ 倍以上、すなわち製品









5

PowerShell、54バイト

for($a=$args;$a-gt9){$a;$a=("$a"|% t*y)-join"*"|iex}$a

オンラインでお試しください!


最初に入力引数を書き込み、次にそれを文字列に変換し、文字配列にパイプする反復メソッド。この配列は、単一のアスタリスクで結合され、呼び出し式エイリアスを持つコマンドとして実行されます。これにより、開始番号が0より大きい最後の番号(指定されたテストシナリオでは20)まで書き込まれるため、出力の最後に最後を追加$aします。



5

PHP、63バイト

<?=$n=$argn;while($n>9)echo"
",$n=array_product(str_split($n));

反復バージョン。php -nFからの入力で呼び出しますSTDIN

オンラインでお試しください!

PHP72 71バイト

function h($n){echo"$n
",($n=array_product(str_split($n)))>9?h($n):$n;}

オンラインでお試しください!

関数としての再帰バージョン。

入力:277777788888899

277777788888899
4996238671872
438939648
4478976
338688
27648
2688
768
336
54
20
0

入力:23

23
6

5

パイソン261の 62 59バイト

def f(n):print n;n>9and f(reduce(int.__mul__,map(int,`n`)))

オンラインでお試しください!

-3バイト、ジョナサンアランのおかげ


最後の反復で0で終了しない入力では機能しません。たとえば、23
無知の

int.__mul__3バイト未満であるlambda a,b:a*b
ジョナサン・アラン

@JonathanAllanありがとう!私はそのようなものがなければならないと知っていました
TFeld

に変更f(reduce(int.__mul__,map(int,`n`)))f(eval('*'.join(`n`)))て、13バイトを節約します。
mypetlion

@mypetlion ...私はすでに別の投稿でそれをしました。
ジョナサンアラン


5

MathGolf9 10バイト

h(ôo▒ε*h(→

オンラインでお試しください!

現在は、1桁の入力を正しく処理します。完全ではありませんが、少なくとも正しいです。

説明

h(            check length of input number and decrease by 1
  ö       →   while true with pop using the next 6 operators
   p          print with newline
    ▒         split to list of chars/digits
     ε*       reduce list by multiplication
       h(     length of TOS without popping, subtracted by 1 (exits when len(TOS) == 1)

1桁の入力の出力は、コメントの中で明確にされた数字の1つのコピーである必要があります
dzaima

@dzaima私はそれを調べ、解決したら答えを更新します
maxb




4

APL(NARS)、19文字、38バイト

{⍵≤9:⍵⋄∇×/⍎¨⍕⍵⊣⎕←⍵}

テスト:

   f←{⍵≤9:⍵⋄∇×/⍎¨⍕⍵⊣⎕←⍵}
   f 23     
23
6
   f 27648     
27648
2688
768
336
54
20
0




4

ジャプト -R、9バイト

ひどく非効率的- 最初のテストケースを実行しようとしないでください

_ì ×}hN â

それを試してみてください

_ì ×}hN â     :Implicit input of integer U
      N       :Starting with the array of inputs (i.e., [U])
     h        :Do the following U times, pushing the result to N each time
_             :Take the last element in N and pass it through the following function
 ì            :  Convert to digit array
   ×          :  Reduce by multiplication
    }         :End function
        â     :Deduplicate N
              :Implicitly join with newlines and output


3

JavaScript(Babelノード)、46バイト

f=a=>a>9?[a,...f(eval([...a+''].join`*`))]:[a]

オンラインでお試しください!


JavaScript(Babelノード)、44バイト

入力を文字列として取得できる場合

f=a=>a>9?[a,...f(''+eval([...a].join`*`))]:a

オンラインでお試しください!


@Arnauldはい、間違ったコードを編集して追加しました。私はまだ配列の代わりに文字列のみを使用して何かを探しています
ルイス・フェリペ・デ・イエス・ムニョス

3

PowerShell64 59バイト

for($a="$args";9-lt$a){$a;$a="$(($a|% t*y)-join'*'|iex)"}$a

オンラインでお試しください!

反復法。入力を受け取ってに格納し、の長さが2以上である限り(つまり、より大きい)ループに$a入りforます。ループ我々出力内部し、それを変換し、それを再計算oCharArraを、一緒にそれをINGの、および次いで(ショートと類似します)。ループを抜けると、1桁の数字が残っているので、$a9$atyjoin*iexInvoke-Expressioneval$a、再びパイプラインに配置します。

KGlasierのおかげで-5バイト。


5バイトを節約する9-lt$a代わりに、比較を使用でき$a.length-1ます。そして、もしあなたがずっとベースのストリングに行かなかったなら、まともなチャンクを切り落とすことができました。必要に応じ、私のPowerShellの試みをチェックしください!
KGlasier

3

、13バイト

θW⊖Lθ«≔IΠθθ⸿θ

オンラインでお試しください!リンクは、コードの詳細バージョンです。説明:

θ

入力を初めて印刷します。

W⊖Lθ«

入力の長さが1でないときに繰り返します。

≔IΠθθ

入力を文字列にキャストするデジタル製品に置き換えます。

⸿θ

入力を新しい行に印刷します。


3

網膜、24バイト

.+~(\`

.
$&$*
^
.+¶$$.(

オンラインでお試しください!説明:

.+~(\`

変更が停止するまで、すべてのループの開始時に独自の行に現在の値を印刷し、変更されていない値を2回印刷しないでください。各ループの最後で現在の値を評価します。

.
$&$*

*各桁の後にを追加します。

^
.+¶$$.(

入力をデジタル製品に評価する式に変換します。

記録のために、Retinaはこれを1行(25バイト)で実行できます。

.+"¶"<~[".+¶$.("|'*]'*L`.

3

C(gcc)、58バイト

f(n,t){for(;n=printf("%d\n",t=n)>2;)for(;n*=t%10,t/=10;);}

オンラインでお試しください!

反復アプローチでは、1バイト短くなります。

f(n,t){
    for(;n=printf("%d\n",t=n)   //print and update current number
            >2;)                //until only one digit is printed
        for(;n*=t%10,t/=10;);   //n*= product of digits of t (step)
}

C(gcc)61 59バイト(再帰的)

f(n){printf("%d\n",n)>2&&f(p(n));}p(n){n=n?n%10*p(n/10):1;}

オンラインでお試しください!

再帰は、印刷とステップの両方の反復よりも短いようです...

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