クズネツォフのシーケンス


18

クズネツォフのシーケンス

(I made the name up, don't bother with Wikipedia or Google)

任意の数を与えて、数の逆を表しn > 0ましょう。最終結果がゼロになるまで反復し、以下の操作を実行して、再帰または選択した方法論を使用して各反復の結果を関数に戻します。rn

  • もしr > n結果はその繰り返しのためにr % n
  • もしn > r結果はその繰り返しのためにn % r
  • n % r = 0またはの場合r % n = 0、反復を終了します。

各実行の中間結果を取得し、最終的な答えのために配列に保存します。初期番号nはシーケンスの一部ではなく、0; もありません。例は、すべてをもう少し明確にする必要があります。

の例を見てみましょうn=32452345

54325423 % 32452345 = 21873078 # r > n, uses r % n
87037812 % 21873078 = 21418578 # r > n, uses r % n
87581412 % 21418578 = 1907100  # r > n, uses r % n
1907100 % 17091 = 9999         # n > r, uses n % r
9999 % 9999 = 0                # r % n = n % r = 0, terminated

Result: [21873078, 21418578, 1907100, 9999]     

別の例n=12345678

87654321 % 12345678 = 1234575 # r > n, uses r % n
5754321 % 1234575 = 816021    # r > n, uses r % n
816021 % 120618 = 92313       # n > r, uses n % r
92313 % 31329 = 29655         # n > r, uses n % r
55692 % 29655 = 26037         # r > n, uses r % n
73062 % 26037 = 20988         # r > n, uses r % n
88902 % 20988 = 4950          # r > n, uses r % n
4950 % 594 = 198              # n > r, uses n % r
891 % 198 = 99                # r > n, uses r % n
99 % 99 = 0                   # r % n = n % r = 0, terminated

Result: [1234575, 816021, 92313, 29655, 26037, 20988, 4950, 198, 99]

最後の例n=11000

11000 % 11 = 0 # n % r = 0, terminated

Result: []

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


2
計算が行われたときに結果を出力できますか、それとも配列を構築する必要がありますか?
FlipTack

あなたは、出力formart選択することができますので、私は、出力ルールが適用されるデフォルトを想定したい(配列を、表示された数字は、スペースで区切って、...)
ルイス・Mendo

@ Flp.Tkc必要な数字が表示されている限り、出力を制限しません。
魔法のタコUr

2
数字の「逆」は、特定のベースに関してのみ意味があることに注意してください。
デビッドコンラッド

1
@ Sp3000のような; ただし、繰り返しごとに逆にする必要があります。2つではなく1つの数値のみを計算に通し、2番目の数値を常に1番目の数値と逆にします。
tomsmeding

回答:



6

PowerShell v2 +、89バイト

param($n)for(){$r=-join"$n"["$n".length..0];if(!($n=(($r%$n),($n%$r))[$n-gt$r])){exit}$n}

反復ソリューション。配列を逆にする簡単な方法がないため、長いので、文字列化し、逆方向にインデックスを付けてに格納し$rます。次に、適切なモジュロを引き出して$n次のラウンドのために再格納するための疑似三項。しかし、結果は手段があること、ゼロの場合!($n...)となります$trueので、我々は、exit代わりに$n。数値はパイプラインに残され、(暗黙的に)配列として返されますが、カプセル化パイプラインまたは結果を変数に保存することなく、デフォルトでWrite-Outputは改行が挿入されます。

オンラインでお試しください!(はい、真剣です。)
PowerShellがTIOになりました!PowerShellはスタートアップにとっての獣なので、1〜2秒はやる必要があります、ブラウザーでPowerShellコードを確認できるようになりました。


ああ、同じアプローチで私をbeatりました。いいね!
ブリアンティスト16

6

Perl、43 38 + 1 = 39バイト

-nフラグで実行

say while$_=($;=reverse)>$_?$;%$_:$_%$

オンラインでお試しください! 空でない2つの例を含みます。

説明表

-n:プログラム全体をでラップしwhile(<>){ ... ;}ます。これにより、上記のコードは次の行に変わりますwhile(<>){say while$_=($;=reverse)>$_?$;%$_:$_%$;}。セミコロンが末尾$に追加されているため、変数のインスタンスになります$;whileループの状態では、<>入力の1行を自動的に読み取り、$_変数に保存します。それでは、外側のwhileループ内でインタープリターが読み取る内容を見てみましょう。

say while$_=($;=reverse)>$_?$;%$_:$_%$;
[op][mod][         condition          ]     #While is acting as a statement modifier.
                                            #It evaluates the operation as long as the condition is truthy.
            ($;=reverse)>$_?$;%$_:$_%$;     #The meat of the program: a ternary operation
            ($;=reverse)                    #The reverse function takes $_ as a parameter by default, and reverses the value.
                                            #The value returned by reverse is stored in the variable $;
                        >$_                 #A condition asking if $% is greater than $_.  Condition of the ternary operation
                           ?$;%$_           #If true, then return $; modulo $_
                                 :$_%$;     #If false, return $_ modulo $;
         $_=                                #Assign the result of the ternary operation back into $_
                                            #If $_ is non-zero, then the condition is true, and while will evaluate the operation
say                                         #Implicitly takes the $_ variable as parameter, and outputs its contents

後世のために保存された元のコード:43 + 1 = 44バイト

say$_=$%>$_?$%%$_:$_%$%while$_-($%=reverse)

$%>$_?$%%$_:$_%$%$%この行のためだけに変数を意図的に選択しましたか?
tomsmeding

ほとんど-また、whileステートメントの前の最後の文字に英数字以外の文字を使用して1バイトを節約するため、空白は不要です。それ以外-かなり、ええ
ガブリエルベナミー

5

Pyth、13 12バイト

t.u|%F_S,s_`

@TheBikingVikingに感謝します。

オンラインで試す:デモンストレーション

私の古いコード:

W
W=Q%F_S,s_`

オンラインで試す:デモンストレーション

説明:

t.u|%F_S,s_`NNNQ  implicit Ns and Q at the end
               Q  start with N = Q (Q = input number)
        ,         create a pair with the numbers
         s_`N        convert N to string -> reverse-> convert to int
             N       and N
       S          sort
      _           reverse
    %F            fold by modulo
   |          N   or N (if the result is zero use N instead to stop)
 .u               apply this ^ procedure until a value repeats
                  print all intermediate values
 t                except the first one (the original number)

12バイト:t.u|%F_S,s_<backtick>テスト
TheBikingViking 16

1
@TheBikingVikingありがとう、それは本当に賢い。
寂部16

4

ゼリー15 14 13 バイト

,ṚḌṢṚ%/
ÇÇпḊ

TryItOnline

どうやって?

,ṚḌṢṚ%/ - Link 1, iterative procedure: n
,       - pair n with
 Ṛ      - reverse n
  Ḍ     - undecimal (int of digit list)
   Ṣ    - sort
    Ṛ   - reverse
     %/ - reduce with mod

ÇÇпḊ - Main link: n
  п  - collect while
 Ç    - last link as a monad is truthy
Ç     -     last link as a monad
    Ḋ - dequeue (remove the input from the head of the resulting list)

4

ゼリー13 12バイト

,ṚḌṢṚ%/Ṅß$Ṡ¡

これは、STDOUTに出力される単項リンク/関数です。

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

使い方

,ṚḌṢṚ%/Ṅß$Ṡ¡  Monadic link. Argument: n

,Ṛ            Pair n and its reversed digit list.
  Ḍ           Convert the digit list into an integer.
   ṢṚ         Sort and reverse.
     %/       Reduce by modulo. Result: m
          Ṡ¡  Do sign(m) times:
       Ṅß$    Print with a newline and call the link recursively.

フッターは何のためですか?削除すると、コードは後続の0を出力するようです
ルイスメンドー

そのとおりです。0は、それが破棄されていない場合、インタープリターが印刷関数の戻り値です。このメタディスカッションに従って、それは許可されています。
デニス

4

Python 2、92 87 81 73 61バイト

再帰的ソリューション:

def f(n):
    r=int(`n`[::-1]);x=min(r%n,n%r)
    if x:print x;f(x)

オンラインで試す

反復ソリューション:(61バイトも)

n=input()
while n:r=int(`n`[::-1]);n=min(r%n,n%r);print n/n*n

オンラインで試す


私があなたに与えた反復的な解決策は実際には59バイトですが、それが入力を出力するので有効かどうかはわかりません。もしそうなら、あなたはするだけで2バイトのゴルフをすることができますwhile n:。それ以外の場合は、61バイトで実行できます
FlipTack 16

3

MATL、16バイト

`tVPUhSPZ}\tt]xx

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

説明

`         % Do...while
  t       %   Duplicate. Takes input implicitly in the first iteration
  VPU     %   Transform the number at the top of the stack by reversing its digits
  hSPZ}   %   Concatenate the two numbers into an array, sort, reverse, split the
          %   array: this moves the smaller number to the top
  \       %   Modulo
  t       %   Duplicate. The original copy is left on the stack for displaying, 
          %   and the duplicate will be used for computing the next number
  t       %   Duplicate. This copy will be used as loop condition: exit if 0
]         % End
xx        % Delete the two zeros at the top. Implicitly display rest of the stack

2

PHP、78バイト

function a($n){while(($r=strrev($n))&&($n=$r>$n?$r%$n:$n%$r)!=0){echo$n.' ';}}

2

バッチ、140バイト

@echo off
set/pn=
:l
set/am=n,l=0
:r
set/al=l*10+m%%10,m/=10
if %m% gtr 0 goto r
set/an=l%%n%%l+n%%l%%n
if %n% gtr 0 echo %n%&goto l

STDINで入力を受け取り、シーケンスを別々の行に出力します。それは(引用したにも関わらず簡単ですので、バッチは、条件文(やや冗長である)が、無条件式を持っている%計算に複数可)r%n%r(に等しいr%n場合n<rまたはゼロの場合n>r)とn%r%n(に等しいn%r場合n>rまたはゼロの場合n<r)、およびアドオンそれらを一緒に。


2

Mathematica、68バイト

おかげでグレッグ・マーティン、私は使用を示唆しているためFixedPointListではなくNestWhileList

FixedPointList[Mod[(r=IntegerReverse@#)~Max~#,r~Min~#]&,#][[2;;-4]]&

元のソリューションを取得できる最短の長FixedPointListさは73バイトでした。

NestWhileList[Mod[(r=IntegerReverse@#)~Max~#,r~Min~#]&,#,#!=0&][[2;;-2]]&

1
適切な終了条件が設定されていないことに注意してください(入力例を試してください11000)。これを回避するには、最後の段落で説明した手法に切り替えます。しかし、私はどのように取り除くRestMost、この方法で見ない。一方、FixedPointList[ Mod[(r = IntegerReverse@#)~Max~#, r~Min~#] &, #][[2 ;; -4]] &スペースが削除されると68バイトのみになります(エラーがいくつか発生します(nbd))。
グレッグマーティン

私はどういうわけか、spanのような{a,b,c,d}[[2;;-4]]ものは空のリストではなくエラーを与えると確信していました(おそらくではなくコンマを使用しました;;)。何かを学んだ。
ngenisis

あなたがその全体の最小/最大のビジネスを取り除くことができますSortFixedPointList[-Mod@@Sort@-{#,IntegerReverse@#}&,#][[2;;-4]]&
マーティン・エンダー

1

JavaScript、72 70バイト

f=(s,...o)=>(u=s>(z=[...s+''].reverse().join``)?s%z:z%s)?f(u,...o,u):o

console.log(...[32452345, 12345678, 11000].map(x=>f(x)))
.as-console-wrapper{max-height:100%!important}

編集済み:

-2バイト:スプレッド演算子は文字列の連結を待機します。


1

R、126 117バイト

x=scan();while(x){y=sort(c(x,as.double(paste(rev(el(strsplit(c(x,""),""))),collapse=""))));if(x<-y[2]%%y[1])print(x)}

悲しいことに、数字(as.double(paste(rev(el(strsplit(c(x,""),""))),collapse=""))))を逆にするとかなり冗長になります。休憩はとても簡単です。sortどちらが高いかを間接的に確認するために使用します。

残りは単純で、までループし続けx=0、すべてのステップを出力します。


1

C、87バイト

t;r;f(n){while(t=n){r=0;while(t)r=10*r+t%10,t/=10;n=r>n?r%n:n%r;if(n)printf("%d ",n);}}

t逆転のための一時的なものです。内側のループはr1桁左にシフトし、最後の桁をt使い果たすまで追加します。出力は、最初と最後の項目が表示されないようにするために、最初の反復の後、ゼロ以外の場合のみです。

ゴルフをしないと使用法:

t;r;
f(n){
  while (t = n){
    r = 0;
    while (t)
      r = 10*r + t%10,
      t /= 10; 
    n = r>n ? r%n : n%r;
    if(n)
      printf("%d ",n);
  }
}

0

Mathematica、64バイト

NestWhileList[#2~If[#<=#2,Mod,#0]~#&[IntegerReverse@#,#]&,#,#>0&]&

上記のコードは、単一の入力を受け取り、kuznetsovsシーケンスを返す純粋な関数を表しています。数学に関する本当に美しいことは、純粋な関数のレイヤーの上にレイヤーを置くことができるということです...コードを説明させてください;)

シーケンス自体の各用語は、1つの入力を受け取り、次の用語を返す以下の関数を使用して計算されます。

#2~If[#<=#2,Mod,#0]~#&[IntegerReverse@#,#]&

コードIntegerReverse@#は、逆の値であるrを生成するだけです。このコード#2~If[#<=#2,Mod,#0]~#&は、2つの入力を受け取り、mod操作を行うか、入力を逆にして自分自身を再度呼び出す関数です。別の記述方法はIf[#<=#2, Mod, #0][#2, #]&、または、次のような通常の関数として記述できます。k[a_, b_] := If[a <= b, Mod, k][b, a]


0

ラケット180バイト

(let p((n n)(ol'()))(let*((v reverse)(o modulo)
(r(string->number(list->string(v(string->list(number->string n))))))
(m(if(> n r)(o n r)(o r n))))(if(= m 0)(v ol)(p m(cons m ol)))))

ゴルフをしていない:

(define (f n)
  (let loop ((n n)
             (ol '()))
    (let* ((r (string->number
               (list->string
                (reverse
                 (string->list
                  (number->string n))))))
           (m (if (> n r)
                  (modulo n r)
                  (modulo r n))))
      (if (= m 0)
          (reverse ol)
          (loop m (cons m ol))))))

テスト:

(f 32452345)
(f 12345678)

出力:

'(21873078 21418578 1907100 9999)
'(1234575 816021 92313 29655 26037 20988 4950 198 99)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.