Urutan Kuznetsov

18

Urutan Kuznetsov

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

Diberi nomor apa pun n > 0, mari kita rwakili kebalikan dari angka tersebut n. Ulangi sampai hasil akhir adalah nol, dengan meneruskan hasil setiap iterasi kembali ke fungsi menggunakan rekursi atau metodologi pilihan Anda dengan melakukan operasi di bawah ini:

  • Jika r > nuntuk iterasi hasilnya adalah r % n.
  • Jika n > runtuk iterasi hasilnya adalah n % r.
  • Jika n % r = 0atau r % n = 0, Anda mengakhiri iterasi.

Ambil hasil antara dari setiap eksekusi dan simpan dalam array untuk jawaban akhir. Nomor awal nbukan bagian dari urutan, juga bukan 0; contoh-contohnya harus membuat segalanya sedikit lebih jelas.

Mari kita telusuri contoh di mana 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]     

Contoh lain 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]

Contoh terakhir n=11000:

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

Result: []

Ini adalah kemenangan byte-count terendah.

Guci Gurita Ajaib
sumber
2
Bisakah hasilnya dicetak saat perhitungan terjadi atau haruskah itu membangun array?
FlipTack
Saya berasumsi aturan output default berlaku, sehingga Anda dapat memilih formart output (array, angka yang ditampilkan dipisahkan oleh spasi, ...)
Luis Mendo
@ Flp.Tkc Saya tidak akan membatasi output, asalkan angka-angka yang diperlukan ditampilkan.
Magic Gurita Guci
2
Hanya sebuah catatan bahwa 'kebalikan' angka hanya bermakna sehubungan dengan basis tertentu.
David Conrad
1
@ Sp3000 semacam; kecuali bahwa Anda perlu membalik setiap iterasi. Anda hanya memasukkan satu nomor melalui penghitungan, bukan dua, dan ambil yang kedua untuk selalu menjadi kebalikan dari yang pertama.
mulai

Jawaban:

6

PowerShell v2 +, 89 byte

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

Solusi berulang. Panjang karena tidak ada cara mudah untuk membalikkan array, jadi kami meringkasnya dan mengindeksnya ke belakang untuk menyimpannya $r. Kemudian pseudo-ternary untuk menarik modulo yang sesuai dan menyimpannya kembali $nuntuk putaran berikutnya. Namun, jika hasilnya nol, itu berarti !($n...)akan $true, jadi kami exitbukan $n. Angka-angka dibiarkan pada pipa dan (secara implisit) dikembalikan sebagai array, tetapi tanpa pipa enkapsulasi atau menyimpan hasilnya ke dalam variabel, default Write-Outputmenempel baris baru di antara.

Cobalah online! (Ya, sangat serius.)
PowerShell sekarang di TIO! Anda harus memberikannya satu atau dua detik, karena PowerShell adalah binatang untuk startup, tetapi sekarang Anda, ya Anda , dapat memverifikasi kode PowerShell tepat di browser Anda!

AdmBorkBork
sumber
Gah, kalahkan aku dan lakukan pendekatan yang sama. Bagus!
briantist
6

Perl, 43 38 + 1 = 39 byte

Jalankan dengan -nbendera

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

Cobalah online! Termasuk dua contoh tidak kosong.

Bagan penjelasan

-n: Membungkus seluruh program dalam while(<>){ ... ;}. Ini ternyata kode di atas ke baris berikut: while(<>){say while$_=($;=reverse)>$_?$;%$_:$_%$;}. Perhatikan, titik koma telah ditambahkan ke trailing $, jadi sekarang menjadi instance dari variabel $;. Dalam kondisi whileloop, <>secara otomatis membaca satu baris input dan menyimpannya dalam $_variabel. Jadi sekarang mari kita lihat apa yang dibaca penerjemah di dalam whilelingkaran luar :

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

Kode asli, disimpan untuk anak cucu: 43 + 1 = 44 byte

say$_=$%>$_?$%%$_:$_%$%while$_-($%=reverse)
Gabriel Benamy
sumber
$%>$_?$%%$_:$_%$%Apakah Anda memilih $%variabel dengan sengaja hanya untuk baris ini?
tommeding
Hampir - Saya juga menyimpan 1 byte dengan menggunakan karakter non-alfanumerik untuk karakter terakhir sebelum pernyataan while, jadi saya tidak perlu spasi kosong. Selain itu - cukup banyak, ya
Gabriel Benamy
5

Pyth, 13 12 byte

t.u|%F_S,s_`

Terima kasih kepada @TheBikingViking.

Cobalah online: Demonstrasi

Kode lama saya:

W
W=Q%F_S,s_`

Cobalah online: Demonstrasi

Penjelasan:

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)
Jakube
sumber
12 byte: t.u|%F_S,s_<backtick>. Uji
TheBikingViking
1
@ TheBikingViking Terima kasih, itu sangat pintar.
Jakube
4

Jelly , 15 14 13 byte

,ṚḌṢṚ%/
ÇÇпḊ

TryItOnline

Bagaimana?

,ṚḌṢṚ%/ - 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)
Jonathan Allan
sumber
4

Jelly , 13 12 byte

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

Ini adalah tautan / fungsi monadik yang mencetak ke STDOUT.

Cobalah online!

Bagaimana itu bekerja

,ṚḌṢṚ%/Ṅß$Ṡ¡  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.
Dennis
sumber
Untuk apa footernya? Jika dihapus, kode ini tampaknya menghasilkan angka 0
Luis Mendo
Itu benar. Angka 0 adalah nilai balik dari fungsi, yang dicetak oleh juru bahasa jika tidak dibuang. Sesuai diskusi meta ini , itu diizinkan.
Dennis
4

Python 2, 92 87 81 73 61 byte

Solusi rekursif:

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

Cobalah online

Solusi berulang: (juga 61 byte )

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

Cobalah online

mbomb007
sumber
Solusi iteratif yang saya berikan kepada Anda sebenarnya 59 byte, tapi saya tidak yakin apakah itu valid karena mencetak input. Jika ya, maka Anda bisa bermain golf 2 byte hanya dengan melakukan while n:. Kalau tidak, Anda bisa melakukannya dengan 61 byte .
FlipTack
3

MATL , 16 byte

`tVPUhSPZ}\tt]xx

Cobalah online!

Penjelasan

`         % 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
Luis Mendo
sumber
2

PHP, 78 byte

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

Batch, 140 byte

@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

Mengambil input pada STDIN dan mengeluarkan urutan pada baris yang berbeda. Batch memiliki pernyataan kondisional (yang agak verbose) tetapi tidak ada ekspresi kondisional sehingga lebih mudah (meskipun harus mengutip %s) untuk menghitung r%n%r(yang sama dengan r%njika n<ratau nol jika n>r) dan n%r%n(yang sama dengan n%rjika n>ratau nol jika n<r) dan menambahkan mereka bersama.

Neil
sumber
2

Mathematica, 68 byte

Terima kasih kepada Greg Martin karena menyarankan saya menggunakan FixedPointListdaripada NestWhileList:

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

Terpendek saya bisa mendapatkan solusi asli saya dengan FixedPointList73 byte:

NestWhileList[Mod[(r=IntegerReverse@#)~Max~#,r~Min~#]&,#,#!=0&][[2;;-2]]&
ngenisis
sumber
1
Perhatikan bahwa Anda tidak memiliki kondisi terminasi yang cukup (coba contoh input 11000). Anda bisa menyiasatinya dengan beralih ke teknik yang dijelaskan dalam paragraf terakhir Anda. Tetapi saya tidak melihat bagaimana cara menyingkirkan Restatau Mostdengan cara ini. Di sisi lain, FixedPointList[ Mod[(r = IntegerReverse@#)~Max~#, r~Min~#] &, #][[2 ;; -4]] &hanya 68 byte setelah spasi dihapus (melempar beberapa kesalahan, nbd).
Greg Martin
Saya entah bagaimana meyakinkan diri saya bahwa bentang suka {a,b,c,d}[[2;;-4]]akan memberikan kesalahan daripada daftar kosong (saya mungkin menggunakan koma daripada ;;). Belajar sesuatu.
ngenisis
Anda dapat menyingkirkan seluruh bisnis min / maks dengan Sort:FixedPointList[-Mod@@Sort@-{#,IntegerReverse@#}&,#][[2;;-4]]&
Martin Ender
1

JavaScript, 72 70 byte

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}

Diedit:

-2 byte : Operator spread menunggu penggabungan string.

Washington Guedes
sumber
1

R, 126 117 byte

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)}

Sayangnya, membalikkan angka ( as.double(paste(rev(el(strsplit(c(x,""),""))),collapse="")))) cukup bertele-tele. Beristirahat cukup mudah. Penggunaan sortuntuk memeriksa secara tidak langsung mana yang lebih tinggi.

Sisanya mudah, terus berputar sampai x=0, dan mencetak semua langkah.

JAD
sumber
1

C, 87 byte

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);}}

tbersifat sementara untuk membalikkan. Loop dalam menggeser r1 digit ke kiri dan menambahkan digit terakhir thingga habis. Output adalah setelah iterasi pertama dan hanya jika tidak nol untuk mencegah item pertama dan terakhir ditampilkan.

Tidak digabungkan dan digunakan:

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);
  }
}
Karl Napf
sumber
0

Mathematica, 64 byte

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

Kode di atas mewakili fungsi murni yang mengambil input tunggal, dan mengembalikan urutan kuznetsovs. Hal yang sangat indah tentang Mathematica adalah bahwa Anda dapat menempatkan lapisan demi lapisan fungsi murni ... Izinkan saya menjelaskan kode;)

Setiap istilah dalam urutan itu sendiri dihitung dengan fungsi di bawah ini, yang mengambil satu input dan mengembalikan istilah berikutnya.

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

Kode IntegerReverse@#hanya menghasilkan r, nilai terbalik. Kode #2~If[#<=#2,Mod,#0]~#&adalah fungsi yang mengambil dua input dan melakukan operasi mod, atau membalikkan input dan memanggil dirinya lagi. Cara penulisan lainnya adalah If[#<=#2, Mod, #0][#2, #]&, atau dapat ditulis sebagai fungsi reguler seperti ini:k[a_, b_] := If[a <= b, Mod, k][b, a]

J. Antonio Perez
sumber
0

Racket 180 byte

(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)))))

Tidak Disatukan:

(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))))))

Pengujian:

(f 32452345)
(f 12345678)

Ouput:

'(21873078 21418578 1907100 9999)
'(1234575 816021 92313 29655 26037 20988 4950 198 99)
juga
sumber