제곱까지의 자릿수


11

정수 x> 0 및 밑수 y> 3이 제공됩니다.

  1. x의 모든 자릿수를 합산하십시오 (설정된 밑면에 기록 된 경우).
  2. 이 숫자에 가능한 한 높은 숫자를 곱하십시오 (항상 base -1).
  3. 이 값이 될 때까지 반복하십시오 (y - 1) ^ 2

반복 횟수와 단계가 검색됩니다.

예 1 :

x= 739
y= 7
searched: (7 - 1) ^ 2 = 36

based: (b7)2104
sum: (dec)7
mul: (dec)42

based: (b7)60
sum: (dec)6
mul: (dec)36

2 steps needed -> answer is [2, 739, 42, 36] or [739, 42, 36, 2]

예 2 :

x = 1712
y = 19
s: 324

step1: 1712 -> 360
step2:  360 -> 648
step3:  648 -> 324

3 steps needed -> answer is [3, 1712, 360, 648, 324] or [1712, 360, 648, 324, 3]

특별 :
일부의 경우 (3의 염기로 일부 조합)에서는 얻을 수 없습니다 (y - 1) ^ 2에 같은 x = 53y = 3. 이러한 이유로 y3보다 커야하며이를 무시할 수 있습니다.

반복 횟수는 첫 번째 또는 마지막 값이어야합니다

이것은 최저 바이트 수 승리입니다.


대답의 단계 수를 요구하는 것은 문제에 불필요한 추가로 보입니다 . 내 솔루션은 목록의 길이를 찾고 1을 빼는 데 필요한 21 바이트를 추가해야했습니다.
ngenisis

@ngenisis는 출력 순서대로 진행되지만 메소드 (배열, 스택, delim. string, 여러 문자열 ....)는 무시합니다. 두 가지 다른 것들 (최종 가치와 수)을 추적하는 것은 "맹목적인"가치의 수집 (거의 또는 더 적은)을 피하고 내 눈에 좋은 추가입니다. 어쩌면 다른 접근 방식은 계산에 5 바이트가 더 필요하지만 계산 부분에서 8을 절약 할 수 있습니다 (여기서는 임의의 숫자).
Dirk Reichel

답변:


4

젤리 , 14 13 바이트

반복 될 때 인쇄하여 -1 바이트 ( 체인 분리 µ및 연결 대체 ;)

Ṅb⁹S×⁹’¤µÐĿL’

TryItOnline!

어떻게?

Ṅb⁹S×⁹’¤µÐĿL’ - Main link: x, y
        µÐĿ   - loop monadically until results are no longer unique and collect
Ṅ             - print z (initially x), then result of previous loop and return z
  ⁹           -     right argument (y, even though monadic)
 b            -     left to base right
   S          -     sum (the result was a list of base y digits)
       ¤      -     nilad followed by link(s) as a nilad
     ⁹’       -         y decremented
    ×         -     multiply
           L  - length(z)
            ’ - decrement
              - implicit print

대안 13은 각 입력을 루프에 추가하고 라인 피드 ( )를 출력하고, 수집 된 결과의 감소 된 카운트를 암시 적으로 인쇄하여 모나 딕 체인 분리 ( µ) 및 연결 ( ;)이 필요 없습니다.


1
요청 된 "출력 형식"이 설정되어 있지 않습니다. 순서가 괜찮다면 여러 출력이 계산됩니다. 이런 식으로 13 바이트 응답이 유효합니다.
Dirk Reichel

쿨, 나는 확실하지 않았다, 알려 주셔서 감사합니다!
Jonathan Allan

4

펄 6 , 60 바이트

{$/=[$^x,*.polymod($^y xx*).sum*($y-1)...($y-1)²];$/-1,|$/}

넓히는:

{    # bare block lambda with placeholder parameters 「$x」 「$y」

  $/ = [          # store in 「$/」 ( so that we don't have to declare it )

    # generate a sequence

    $^x,          # declare first parameter, and seed sequence generator

    # Whatever lambda

    *\            # the parameter to this lambda

    .polymod(     # broken down with a list of moduli

      $^y         # declare second parameter of the outer block lambda
      xx *        # an infinite list of copies of it

    )
    .sum
    *
    ( $y - 1 )

    # end of Whatever lambda

    ...           # repeat until it reaches

    ( $y - 1 
  ];

  # returns
  $/ - 1,         # count of values minus one
  |$/             # Slip 「|」 the list into the result
}

용법:

# store it in the lexical namespace so that it is easier to understand
my &code = {$/=[$^x,*.polymod($^y xx*).sum*($y-1)...($y-1)²];$/-1,|$/}

say code  739,  7; # (2 739 42 36)
say code 1712, 19; # (3 1712 360 648 324)

4

C, 116 113 바이트

매번 제곱을 다시 계산하기위한 -3 바이트

s,t,i;f(x,y){s=y-(i=1);while(x-s*s){t=0;++i;printf("%d ",x);while(x)t+=x%y,x/=y;x=t*y-t;}printf("%d %d ",x,i-1);}

언 골프 및 사용법 :

s,t,i;
f(x,y){
 s=y-(i=1);
 while(x-s*s){
  t=0;
  ++i;
  printf("%d ",x);
  while(x)
   t+=x%y,    //add the base y digit
   x/=y;      //shift x to the right by base y
  x=t*y-t;
 }
 printf("%d %d ",x,i-1);
}

main(){
 f(739,7);puts("");
 f(1712,19);puts("");
}

4

자바 스크립트 (ES6), 97 91 84 82 바이트

f=(n,b,k=1,c=b-1)=>[n,(s=(B=n=>n%b*c+(n>b&&B(n/b|0)))(n))-c*c?f(s,b,k+1):[s,k]]+''

테스트 사례


4

젤리 , 16 바이트

나는 그것을 쓰는 동안 때렸다하더라도, 어쨌든 이것을 게시 할 것이라고 생각합니다. 왜냐하면 그것은 다른 알고리즘이며 쓰기가 흥미 롭기 때문입니다. ( ÐĿ문서보다 파싱 된 방법을 파악할 수 없었 으며 포기했을 것입니다. 아마도 이보다 짧은 해결책으로 이어질 것입니다.)

ṄbS×⁹’¤ß<’¥n⁸$?‘

온라인으로 사용해보십시오!

설명:

ṄbS×⁹’¤ß<’¥n⁸$?‘
Ṅ                 Output {the first argument} and a newline
 b                Convert to base {the second argument}
  S               Sum digits
    ⁹’¤           {the second argument} minus 1, parsed as a group
   ×              Multiply
           n⁸$    {the current value} ≠ {the first argument}, parsed as a group
              ?   If that's true:
       ß          then run the whole program recursively
        <’¥       else run (lambda a,b: (a<b)-1)
               ‘  Increment the result

의 사용 <’¥은 기본적으로 항상 -1을 반환하는 다이어 드 (두 개의 인수가있는 링크)를 작성하는 짧은 방법입니다 (답이 기본보다 작지 않기 때문에). 재귀 적으로 실행하고 전체 프로그램을 재귀 적으로 실행하는 것을 선택하면 루핑을 중지 할 시점을 결정할 수 있습니다. 그런 다음 재귀 끝에서 스택이 풀릴 때 단계 수를 결정하기 위해 -1을 계속 증가시킵니다.


2

MATL, 25 21 바이트

@Luis 덕분에 4 바이트 절약

XJx`tJYA!UsJq*tJqU-}@

온라인으로 사용해보십시오!

설명

XJ      % Implicitly grab the first input and store in clipboard J
x       % Delete this from the stack
`       % Do...while loop
  t     % Duplicate last element on stack (implicitly grabs second input)
  JYA   % Convert this number to the specified base
  !Us   % Sum the digits
  Jq*   % Multiply by the largest number in this base
  t     % Duplicate this value
  JqU   % Compute (base - 1) ^ 2
  -     % Subtract the two. Evaluates to TRUE if they are not equal
}       % When they are finally equal
@       % Push the number of iterations
        % Implicitly display the stack contents

@LuisMendo 고정!
Suever

1

Mathematica, 80 바이트

(s=FixedPointList[x(#2-1)(Plus@@x~IntegerDigits~#2),#];s[[-1]]=Length@s-2;s)&

U+F4A1를 나타내는 데 사용되는 개인용 문자 \[Function]입니다. 답변에 단계 수가 필요하지 않은 경우 60 바이트로 수행 할 수 있습니다.

Most@FixedPointList[x(#2-1)(Plus@@x~IntegerDigits~#2),#]&
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.