곱셈 지속성


46

곱하기 지속성

  1. 숫자의 모든 숫자를 곱하십시오
  2. 한 자릿수가 남을 때까지 반복하십시오.

Numberphile이 설명 했듯이 :

  1. 277777788888899 → 2x7x7x7x7x7x7x8x8x8x8x8x8x9x9 = 4996238671872
  2. 4996238671872 → 4x9x9x6x2x3x8x6x7x1x8x7x2 = 438939648
  3. 438939648 → 4x3x8x9x3x9x6x4x8 = 4478976
  4. 4478976 → 4x4x7x8x9x7x6 = 338688
  5. 338688 → 3x3x8x6x8x8 = 27648
  6. 27648 → 2x7x6x4x8 = 2688
  7. 2688 → 2x6x8x8 = 768
  8. 768 → 7x6x8 = 336
  9. 336 → 3x3x6 = 54
  10. 54 → 5x4 = 20
  11. 20 → 2x0 = 0

그건 그렇고 현재 기록입니다 : 단계 수가 가장 많은 가장 작은 숫자.

골프

정수를 입력으로 취한 다음 한 자릿수에 도달 할 때까지 입력 자체부터 시작하여 각 단계의 결과를 출력하는 프로그램입니다. 277777788888899의 경우 출력은

277777788888899
4996238671872
438939648
4478976
338688
27648
2688
768
336
54
20
0

(단계 수를 계산하는 것은 사용자에게 연습으로 남습니다).

더 많은 예

에서 A003001 :

25
10
0

A003001에서도 :

68889
27648
2688
768
336
54
20
0

로부터 Numberphile의 비디오 :

327
42
8

따라서 Additive Persistence에 대한 질문 이 있었지만 이것이 Multiplicative Persistence입니다. 또한이 질문은 출력 단계 수를 묻는 반면 중간 결과를 보는 데 관심이 있습니다.


보너스 : 새로운 기록을 찾으십시오 : 가장 많은 단계를 가진 가장 작은 숫자. 주의 사항 : 추측에 따르면 11이 가장 큽니다.
SQB

7
끝나지 않는 몇 가지 테스트 사례를 포함해야 할 것입니다 . 0
Arnauld

이 게시물을 만들기 위해 왔으며, 이미 존재 함을 발견했습니다. gg
cat

한 자리 유효한 입력입니까?
dzaima

1
Numberphile 비디오에서 Matt Parker는 수백 자리로 검색이 완료되었다고 말합니다.
HardScale

답변:


7

젤리 , 4 바이트

DP$Ƭ

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

설명

D    | convert to decimal digits
 P   | take the product
  $  | previous two links as a monad
   Ƭ | loop until no change, collecting all intermediate results

보너스로, 주어진 자릿수 범위에 대해 가장 큰 단계 수를 가진 숫자를 찾는 TIO 가 있습니다. TIO에서도 잘 확장됩니다.


15

TI-BASIC (TI-84), 30 32 31 바이트

@SolomonUcko 덕분에 -1 바이트!

While Ans>9:Disp Ans:prod(int(10fPart(Ans10^(seq(-X-1,X,0,log(Ans:End:Ans

입력이입니다 Ans.
챌린지 요청으로 출력이 표시됩니다. Ans마지막 단계를 인쇄하려면 후행 이 필요합니다.

나는이 공식 자신을 생각하지 않았다 인정할 것이다, 오히려 나는 그것을 발견 여기에 더 나은 도전에 맞도록 수정했습니다.

편집 : 도전을 다시 읽었을 때 제품이 한 자리이면 프로그램을 종료해야한다는 것을 깨달았습니다. 따라서 이를 설명하기 위해 2 바이트 가 추가되었습니다.

예:

24456756
        24456756
prgmCDGF8
        24456756
          201600
               0
11112
           11112
prgmCDGF8
           11112
               2

설명:

While Ans>9               ;loop until the product is one digit
Disp Ans                  ;display the current product
prod(                     ;get the product of...
 int(                     ; the integer part of...
  10fPart(                ; ten times the fractional part of...
  Ans                     ; each element in the following list times the
                          ;  current product
  10^(                    ; multiplied by the list generated by using each
                          ;  element of the following list as an exponent
                          ;  for 10^n
   seq(-X-1),X,0,log(Ans  ; generate a list of exponents from -1 to -L where
                          ;  L = the length of the current product
End
Ans                       ;leave the final product in "Ans" and implicitly
                          ; print it

비주얼 모델 :로
Ans 시작합니다 125673.
이 모델은 숫자를 곱하는 배후의 논리 만 다룹니다. 다른 모든 것은 이해하기 쉽습니다.

seq(-X-1,X,0,log(Ans  =>  seq(-X-1,X,0,5.0992
   {-1 -2 -3 -4 -5 -6}
10^(...
   {.1 .01 .001 1E-4 1E-5 1E-6}
Ans...
   {12567.3 1256.73 125.673 12.5673 1.25673 .125673}
fPart(...
   {.3 .73 .673 .5673 .25673 .125673}
10...
   {3 7.3 6.73 5.673 2.5673 1.25673}
int(...
   {3 7 6 5 2 1}
   (the digits of the number, reversed)
prod(...
   1260
   (process is repeated again)

seq(-X-1,X,0,log(Ans  =>  seq(-X-1,X,0,3.1004
   {-1 -2 -3 -4}
10^(...
   {.1 .01 .001 1E-4}
Ans...
   {126 12.6 1.26 .126}
fPart(...
   {0 .6 .26 .126}
10...
   {0 6 2.6 1.26}
int(...
   {0 6 2 1}
prod(...
   0
   (product is less than 10.  loop ends)

노트:

TI-BASIC은 토큰 화 된 언어입니다. 문자 수는 바이트 수와 같지 않습니다 .

10^(이 1 바이트 토큰 .

이 프로그램은 TI 계산기의 십진 정밀도의 한계로 인해 길이가 14 자리를 초과하는 올바른 제품 시퀀스를 제공하지 않습니다.


10^(바깥쪽으로 이동 seq(하고 닫는 괄호를 생략하여 바이트를 절약 할 수 있습니까 ?
솔로몬 Ucko

네, 믿습니다!
타우

11

K (ngn / k) , 9 바이트

{*/.'$x}\

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

{ }\ 시퀀스가 수렴 될 때까지 함수를 중괄호로 계속 적용

$x 인수를 문자열 (문자 목록)로 형식화

.'각각을 평가하십시오 (k의 다른 방언은 콜론이 필요합니다 .:')

*/ 시간 초과, 즉 제품



8

R , 59 바이트

n=scan();while(print(n)>9)n=prod(n%/%10^(nchar(n):1-1)%%10)

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

print invisibly입력을 반환 하므로 루프 print(n)내부 를 사용 하여 while루프를 시뮬레이션 할 수 있습니다 do-while. 이것은 R에서의 골프 팁 중 하나에서 영감을 얻었습니다 .

헤더는 과학적 표기법으로 많은 숫자가 인쇄되는 것을 방지합니다.







5

PowerShell , 54 바이트

for($a=$args;$a-gt9){$a;$a=("$a"|% t*y)-join"*"|iex}$a

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


입력 인수를 먼저 쓴 다음이를 문자열로 변환하여 문자형 배열로 파이프하는 반복적 메소드입니다. 이 배열은 단일 별표로 결합되며 호출 표현식 별명을 가진 명령으로 실행됩니다. 이것은 시작 번호를 0보다 큰 마지막 숫자 (주어진 테스트 시나리오에서 20)로 기록 $a하기 때문에 마지막에 출력을 마무리합니다.




5

파이썬 2 , 61 62 59 바이트

def f(n):print n;n>9and f(reduce(int.__mul__,map(int,`n`)))

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

Jonathan Allan 덕분에 -3 바이트


마지막 반복에서 0으로 끝나지 않는 입력 (예 : 23
의 무지의 구현)

int.__mul__인 3 바이트 미만lambda a,b:a*b
조나단 앨런

@JonathanAllan 감사합니다! 나는 그런 일이있을 것을 알고 있었다
TFeld

13 바이트를 저장 f(reduce(int.__mul__,map(int,`n`)))하도록 변경하십시오 f(eval('*'.join(`n`))).
mypetlion

@ mypetlion ... 나는 이미 다른 게시물에서 그 작업을 수행했습니다.
Jonathan Allan


5

MathGolf , 9 10 바이트

h(ôo▒ε*h(→

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

이제 한 자리수의 입력을 올바르게 처리합니다. 완벽하지는 않지만 적어도 맞습니다.

설명

h(            check length of input number and decrease by 1
  ö       →   while true with pop using the next 6 operators
   p          print with newline
    ▒         split to list of chars/digits
     ε*       reduce list by multiplication
       h(     length of TOS without popping, subtracted by 1 (exits when len(TOS) == 1)

한 자릿수 입력에 대한 출력은 숫자의 사본이어야합니다-주석에 명시되어 있습니다
dzaima

@dzaima 나는 그것에 대해 살펴보고 해결 될 때 답을 업데이트 할 것이다
maxb




4

APL (NARS), 19 자, 38 바이트

{⍵≤9:⍵⋄∇×/⍎¨⍕⍵⊣⎕←⍵}

테스트:

   f←{⍵≤9:⍵⋄∇×/⍎¨⍕⍵⊣⎕←⍵}
   f 23     
23
6
   f 27648     
27648
2688
768
336
54
20
0




4

apt -R , 9 바이트

끔찍하게 비효율적 -조차하지 않는 시도 첫 번째 테스트 케이스를 실행!

_ì ×}hN â

시도 해봐

_ì ×}hN â     :Implicit input of integer U
      N       :Starting with the array of inputs (i.e., [U])
     h        :Do the following U times, pushing the result to N each time
_             :Take the last element in N and pass it through the following function
 ì            :  Convert to digit array
   ×          :  Reduce by multiplication
    }         :End function
        â     :Deduplicate N
              :Implicitly join with newlines and output

3

Brachylog , 7 바이트

ẉ?Ḋ|ẹ×↰

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

설명

ẉ          Write the input followed by a linebreak
 ?Ḋ        If the input is a single digit, then it's over
   |       Otherwise
    ẹ      Split the input into a list of digits
     ×     Multiply them together
      ↰    Recursive call with the result of the multiplication as input

나는 그것을 직접 시도했다. Ḋ에 대해 잊어 버렸습니다. 나머지는 똑 같았습니다.
Kroppeb

3

JavaScript (바벨 노드) , 46 바이트

f=a=>a>9?[a,...f(eval([...a+''].join`*`))]:[a]

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


자바 스크립트 (Babel Node) , 44 바이트

입력을 문자열로 가져올 수있는 경우

f=a=>a>9?[a,...f(''+eval([...a].join`*`))]:a

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


@Arnauld 예, 방금 잘못된 코드를 편집하고 추가했습니다. 나는 여전히 문자열 대신 배열만을 사용하여 무언가를 찾고있다
Luis felipe De jesus Munoz

3

PowerShell , 64 59 바이트

for($a="$args";9-lt$a){$a;$a="$(($a|% t*y)-join'*'|iex)"}$a

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

반복적 인 방법. 입력을 받아서에 저장 $a한 다음 for길이 $a가 2 이상인 한 (즉,보다 큼 9) 루프에 들어갑니다 . 루프 우리 내부 출력 $a하고 그것을 변환하여 계산 toCharArra을 y, join함께를 보내고 *다음과 iex(짧게 Invoke-Expression과 유사 eval). 루프에서 벗어나면 인쇄 할 단일 숫자 $a가 남으므로 파이프 라인에 다시 배치 됩니다.

KGlasier 덕분에 -5 바이트


5 바이트를 절약하는 9-lt$a대신 비교 를 사용할 수 있습니다 $a.length-1. 그리고 당신이 전체 시간에 문자열 기반으로 가지 않으면 괜찮은 덩어리를 잘라낼 수 있습니다. 원한다면 내 powershell 시도를 확인하십시오 !
KGlas

3

, 13 바이트

θW⊖Lθ«≔IΠθθ⸿θ

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 설명:

θ

입력 내용을 처음으로 인쇄하십시오.

W⊖Lθ«

입력 길이가 1이 아닌 동안 반복하십시오.

≔IΠθθ

입력을 디지털 제품 캐스트로 변환하십시오.

⸿θ

새 줄에 입력을 인쇄하십시오.


3

레티 나 , 24 바이트

.+~(\`

.
$&$*
^
.+¶$$.(

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

.+~(\`

모든 루프가 시작될 때까지 변경을 중지하고 변경되지 않은 값을 두 번 인쇄하지 않을 때까지 현재 값을 자체 줄에 인쇄하십시오. 각 루프의 끝에서 현재 값을 평가하십시오.

.
$&$*

*각 숫자 뒤에 숫자를 추가하십시오 .

^
.+¶$$.(

입력을 디지털 제품으로 평가되는 표현식으로 바꾸십시오.

레코드를 위해 Retina는 한 줄 (25 바이트)로이 작업을 수행 할 수 있습니다.

.+"¶"<~[".+¶$.("|'*]'*L`.

3

C (gcc) , 58 바이트

f(n,t){for(;n=printf("%d\n",t=n)>2;)for(;n*=t%10,t/=10;);}

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

반복적 접근 방식은 1 바이트 더 짧습니다.

f(n,t){
    for(;n=printf("%d\n",t=n)   //print and update current number
            >2;)                //until only one digit is printed
        for(;n*=t%10,t/=10;);   //n*= product of digits of t (step)
}

C (gcc) , 61 59 바이트 (재귀)

f(n){printf("%d\n",n)>2&&f(p(n));}p(n){n=n?n%10*p(n/10):1;}

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

재귀는 인쇄와 단계 모두 반복보다 짧은 것 같습니다 ...

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.