Kuznetsov'un Sırası


18

Kuznetsov'un Sırası

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

Herhangi bir sayı verildiğinde , sayının tersini temsil n > 0edelim . Aşağıdaki işlemi gerçekleştirerek her yinelemenin sonucunu özyineleme veya seçtiğiniz bir yöntemi kullanarak işleve geri geçirerek nihai sonuç sıfır oluncaya kadar yineleyin:rn

  • Bu r > nyineleme için sonuç r % n.
  • Bu n > ryineleme için sonuç n % r.
  • Eğer n % r = 0ya r % n = 0, yinelemeyi sonlandırmak.

Her yürütmenin orta sonucunu alın ve son yanıt için bunları bir dizide saklayın. İlk sayı ndizinin bir parçası değildir 0; örnekler her şeyi biraz daha açık hale getirmelidir.

Bir örnek üzerinden geçelim 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]     

Başka bir örnek 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]

Son bir örnek n=11000:

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

Result: []

Bu en düşük bayt-sayısı kazanır.


2
Sonuçlar hesaplamalar yapıldıkça yazdırılabilir mi veya bir dizi oluşturmalı mı?
FlipTack

Varsayılan çıktı kurallarının geçerli olduğunu varsayarım, böylece çıktı formartını (dizi, boşluklarla ayrılmış görüntülenen sayılar, ...) seçebilirsiniz
Luis Mendo

@ Flp.Tkc Gerekli sayılar görüntülendiği sürece çıkışı kısıtlamayacağım.
Sihirli Ahtapot Urn

2
Bir sayının 'tersinin' sadece belirli bir tabana göre anlamlı olduğunu unutmayın.
David Conrad

1
@ Sp3000 çeşit; ancak her yinelemeyi tersine çevirmeniz gerekir. Hesaplama boyunca yalnızca bir sayıyı iki değil, iş parçacığına bağlar ve ikincisini her zaman birincinin tersi olarak alırsınız.
9'da tomsmeding

Yanıtlar:



6

PowerShell v2 +, 89 bayt

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

Yinelemeli çözüm. Bir diziyi tersine çevirmenin kolay bir yolu olmadığından, diziyi dizginler ve depolamak için geriye doğru dizine ekleriz $r. Daha sonra uygun modüloyu çıkarmak $nve bir sonraki tur için yeniden saklamak için bir sahte üçlü . Ancak, sonuç sıfır ise, bu !($n...)olacak demektir $true, yani bizexit yerine $n. Sayılar boru hattında bırakılır ve (örtük olarak) bir dizi olarak döndürülür, ancak kapsülleyici bir boru hattı olmadan veya sonuçları bir değişkene kaydetmeden, varsayılan değer Write-Outputarasında bir satırsonu çizgisi bulunur.

Çevrimiçi deneyin! (Evet, çok ciddi.)
PowerShell artık TIO'da! PowerShell başlangıçta bir canavar olduğu için, Bir saniye ya da iki vermelisin, ama şimdi, evet sen , tarayıcınızda PowerShell kod hakkını doğrulamak!


Gah, beni aynı yaklaşımla dövdü. Güzel!
Briantist

6

Perl, 43 38 + 1 = 39 bayt

-nBayrakla koş

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

Çevrimiçi deneyin! Boş olmayan iki örneği içerir.

Açıklama tablosu

-n: Tüm programı içine sarar while(<>){ ... ;}. Bu aşağıdaki hattına Yukarıdaki kodu döner: while(<>){say while$_=($;=reverse)>$_?$;%$_:$_%$;}. Dikkat edin, noktaya bir noktalı virgül eklenmiştir $, bu yüzden şimdi değişkenin bir örneği haline gelir $;. Bir koşulu olarak whiledöngü, <>otomatik giriş bir satır okur ve kaydeder $_değişken. Şimdi yorumlayıcının dış whiledöngü içinde ne okuduğuna bakalım :

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

Poster için kaydedilen orijinal kod: 43 + 1 = 44 bayt

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

$%>$_?$%%$_:$_%$%Seçtiğiniz mı $%sadece bu hat için kasten değişkeni?
9'da tomsmeding

Neredeyse - while deyiminden önce son karakter için alfasayısal olmayan bir karakter kullanarak da 1 bayt kaydederim, bu yüzden bir boşluk gerekmez. Bunun dışında - hemen hemen, evet
Gabriel Benamy

5

Pyth, 13 12 bayt

t.u|%F_S,s_`

@TheBikingViking'e teşekkürler.

Çevrimiçi deneyin: Gösteri

Eski kodum:

W
W=Q%F_S,s_`

Çevrimiçi deneyin: Gösteri

Açıklama:

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 bayt: t.u|%F_S,s_<backtick>. Test
TheBikingViking

1
@TheBikingViking Teşekkürler, bu gerçekten zekice.
Jakube

4

Jöle , 15 14 13 bayt

,ṚḌṢṚ%/
ÇÇпḊ

TryItOnline

Nasıl?

,ṚḌṢṚ%/ - 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

Jöle , 13 12 bayt

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

Bu, STDOUT'a yazdırılan monadik bir bağlantı / işlevdir.

Çevrimiçi deneyin!

Nasıl çalışır

,ṚḌṢṚ%/Ṅß$Ṡ¡  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.

Altbilgi ne için? Kaldırılırsa kod bir izleyen 0 çıktı gibi görünüyor
Luis Mendo

Bu doğru. 0 atılır değilse yorumlayıcı baskı fonksiyonunun dönüş değeridir. Bu meta tartışmaya göre buna izin verilir.
Dennis

4

Python 2, 92 87 81 73 61 bayt

Özyinelemeli çözüm:

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

Çevrimiçi deneyin

Yinelemeli çözüm: (ayrıca 61 bayt )

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

Çevrimiçi deneyin


Size verdiğim yinelemeli çözüm aslında 59 bayt, ancak girdiyi yazdırdığı için geçerli olup olmadığından emin değilim. Eğer öyleyse, o zaman sadece 2 bayt golf yapabilirsiniz while n:. Aksi takdirde, 61 bayt ile yapabilirsiniz .
FlipTack

3

MATL , 16 bayt

`tVPUhSPZ}\tt]xx

Çevrimiçi deneyin!

açıklama

`         % 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 bayt

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

2

Toplu işlem, 140 bayt

@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 üzerine girdi alır ve sırayı ayrı satırlarda çıkarır. Batch, koşullu ifadelere (biraz ayrıntılı) sahiptir, ancak koşullu ifadeler içermez, bu nedenle ( %s'yi alıntılamak zorunda kalmanıza rağmen ) hesaplamak r%n%r( r%neğer if n<rveya sıfıra eşittir n>r) ve n%r%n( n%rif n>rveya sıfıra eşittir n<r) ve ekleyin onları birlikte.


2

Mathematica, 68 bayt

Ben kullanmak yerine önermek için Greg Martin için teşekkürler :FixedPointListNestWhileList

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

Orijinal çözümümü alabildiğim en kısa FixedPointListsüre 73 bayt oldu:

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

1
Doğru sonlandırma koşuluna sahip olmadığınızı unutmayın (örnek girişi deneyin 11000). Son paragrafınızda açıklanan tekniğe geçerek bunun üstesinden gelebilirsiniz. Ama nasıl Restya Mostda bu şekilde kurtulacağımı görmüyorum . Öte yandan, FixedPointList[ Mod[(r = IntegerReverse@#)~Max~#, r~Min~#] &, #][[2 ;; -4]] &boşluklar kaldırıldıktan sonra sadece 68 bayttır (birkaç hata atar, nbd).
Greg Martin

Kendimi bir şekilde {a,b,c,d}[[2;;-4]]boş liste yerine bir hata vereceğine kendimi ikna etmiştim (muhtemelen daha çok virgül kullandım ;;). Bir şey öğrendim.
ngenisis

Tüm min / max işlerinden aşağıdakilerle kurtulabilirsiniz Sort:FixedPointList[-Mod@@Sort@-{#,IntegerReverse@#}&,#][[2;;-4]]&
Martin Ender

1

JavaScript, 72 70 bayt

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}

Düzenlendi:

-2 bayt : Spread operatörü dize birleştirmesini bekler.


1

R, 126 117 bayt

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

Ne yazık ki, bir sayıyı ( as.double(paste(rev(el(strsplit(c(x,""),""))),collapse="")))) tersine çevirmek oldukça garip. Dinlenme oldukça kolaydır. sortHangisinin daha yüksek olduğunu dolaylı olarak kontrol etmek için kullanır .

Gerisi basittir, o zamana kadar döngü devam eder x=0ve tüm adımları yazdırır.


1

C, 87 bayt

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

ttersine çevirmek için geçicidir. İç döngü r1 basamak sola kayar ve ekranın son basamağını ekler.t bitene kadar . Çıktı ilk yinelemeden sonra ve yalnızca ilk ve son öğenin görüntülenmesini önlemek için sıfırdan farklıysa.

Ungolfed ve kullanımı:

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 bayt

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

Yukarıdaki kod, tek bir giriş alan ve kuznetsovs dizisini döndüren saf bir işlevi temsil eder. Mathematica ile ilgili gerçekten güzel olan şey, saf fonksiyonların katmanına katman koyabileceğinizdir ... Kodu açıklamama izin verin;)

Dizideki her terim, bir girdi alan ve bir sonraki terimi döndüren aşağıdaki işlevle hesaplanır.

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

Kod IntegerReverse@#tersine çevrilmiş değer olan r'yi üretir. Kod #2~If[#<=#2,Mod,#0]~#&, iki giriş alan ve mod işlemini yapan veya girişleri tersine çeviren ve kendini tekrar çağıran bir fonksiyondur. Yazmanın başka bir yolu If[#<=#2, Mod, #0][#2, #]&, ya da böyle normal bir işlev olarak yazılabilir:k[a_, b_] := If[a <= b, Mod, k][b, a]


0

Raket 180 bayt

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

Ungolfed:

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

Test yapmak:

(f 32452345)
(f 12345678)

Çıkışı:

'(21873078 21418578 1907100 9999)
'(1234575 816021 92313 29655 26037 20988 4950 198 99)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.