쿠즈 네 초프의 순서


18

쿠즈 네 초프의 순서

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

어떤 수를 감안할 때 n > 0, LET r수의 역을 나타냅니다 n. 최종 결과가 0이 될 때까지 반복하고 아래 작업을 수행하여 각 반복의 결과를 재귀 또는 선택한 방법을 사용하여 함수로 다시 전달하십시오.

  • 만약 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 (배열, 공백으로 구분 된 숫자 등 ...)를 선택할 수 있습니다.
— Luis Mendo

@ Flp.Tkc 필요한 숫자가 표시되는 한 출력을 제한하지 않습니다.
— Magic Octopus Urn

2
숫자의 '반전'은 특정 기준에 대해서만 의미가 있습니다.
— David Conrad

1
@ Sp3000 종류의; 반복 할 때마다 역순으로 수행해야한다는 점을 제외하고. 두 개의 숫자가 아닌 계산을 통해 하나의 숫자 만 스레드하고 두 번째 숫자는 항상 첫 번째 숫자의 반대가됩니다.
— 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다음 라운드 를 위해 다시 저장 합니다. 결과가 0 인 경우, 그 수단이 !($n...)될 것입니다 $true, 우리는 그렇게 exit하는 대신 $n. 숫자는 파이프 라인에 남겨지고 (암시 적으로) 배열로 반환되지만 캡슐화 파이프 라인이 없거나 결과를 변수에 저장하지 않으면 기본값 Write-Output이 줄 바꿈을 유지합니다.

온라인으로 사용해보십시오! (예, 매우 심각합니다.)
이제 PowerShell이 ​​TIO에 있습니다! PowerShell을 시작으로 짐승이기 때문에 당신은 그것을 두 번째 또는 두 가지를 줘,하지만 지금은, 그래 당신은 , 당신의 브라우저에서 PowerShell을 코드 권리를 확인할 수 있습니다!


가, 같은 방법으로 나를 이길. 좋은!
— briantist

6

펄, 43 38 + 1 = 39 바이트

-n플래그로 실행

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

온라인으로 사용해보십시오! 비어 있지 않은 두 가지 예를 포함합니다.

설명 차트

-n: 전체 프로그램을에 래핑합니다 while(<>){ ... ;}. 위 코드를 다음 줄로 바꿉니다.while(<>){say while$_=($;=reverse)>$_?$;%$_:$_%$;} . 세미콜론이 후행에 추가 $되었으므로 이제 변수의 인스턴스가됩니다 $;. while루프 조건에서 <>입력 한 줄을 자동으로 읽고 $_변수에 저장합니다 . 이제 인터프리터가 외부 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 바이트를 절약하므로 공백이 필요하지 않습니다. 그 외에 – 거의, 예
— Gabriel Benamy

5

피스, 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

1
@TheBikingViking 감사합니다, 정말 영리합니다.
— Jakube

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이 출력되는 것 같습니다.
— Luis Mendo

맞습니다. 0 이 폐기되지 않는 경우 통역자 인화 함수의 리턴 값이다. 당 이 메타 토론 , 그 허용합니다.
— Dennis

4

파이썬 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

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 바이트

내가 아닌 다음을 사용하도록 제안한 Greg Martin 에게 감사드립니다 .FixedPointListNestWhileList

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

원래 솔루션을 얻을 수있는 가장 짧은 시간 FixedPointList은 73 바이트였습니다.

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

1
올바른 종료 조건이 없습니다 (입력 예제 시도 11000). 마지막 단락에 설명 된 기술로 전환하여이 문제를 해결할 수 있습니다. 하지만 제거하는 방법을 볼 수 없습니다 Rest또는 Most이런 식으로. 반면, FixedPointList[ Mod[(r = IntegerReverse@#)~Max~#, r~Min~#] &, #][[2 ;; -4]] &공백이 제거되면 68 바이트 만됩니다 (몇 번의 오류 nbd가 발생 함).
— Greg Martin

나는 어떻게 든 {a,b,c,d}[[2;;-4]]빈 목록이 아니라 오류가 발생하는 것처럼 스팬을 확신했습니다 (아마도 쉼표를 사용했습니다 ;;). 무언가를 배웠다.
— ngenisis

다음과 같이 전체 최소 / 최대 비즈니스를 제거 할 수 있습니다 Sort.FixedPointList[-Mod@@Sort@-{#,IntegerReverse@#}&,#][[2;;-4]]&
— Martin Ender

1

자바 스크립트, 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 bytes : Spread 연산자가 문자열 연결을 기다립니다.


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반전을위한 임시입니다. 내부 루프 시프트r 1 자리 왼쪽으로 이동하고 t끝날 때까지 마지막 자리를 추가합니다 . 출력은 첫 번째 반복 이후이며 첫 번째 항목과 마지막 항목이 표시되지 않도록 0이 아닌 경우에만 해당됩니다.

언 골프 및 사용법 :

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 시퀀스를 반환하는 순수 함수를 나타냅니다. mathematica에 대한 정말 아름다운 점은 순수한 함수의 레이어에 레이어를 넣을 수 있다는 것입니다.

시퀀스 자체의 각 항은 아래 함수를 사용하여 계산되며, 하나의 입력을 받고 다음 항을 반환합니다.

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

코드 IntegerReverse@#는 역전 된 값인 r을 생성합니다. 이 코드 #2~If[#<=#2,Mod,#0]~#&는 두 개의 입력을 받고 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.