ความเพียรคูณ


46

ความเพียรคูณ

  1. คูณตัวเลขทั้งหมดด้วยตัวเลข
  2. ทำซ้ำจนกว่าคุณจะเหลือตัวเลขหนึ่งหลัก

ตามที่อธิบายโดยNumberphile :

ตัวอย่าง

  1. 277777788888899 → 2x7x7x7x7x7x7x8x8x8x8x8x8x8x8x9x9 = 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

ดังนั้นจึงมีคำถามเกี่ยวกับการคงอยู่ของสารเติมแต่งแต่นี่คือการคงอยู่แบบทวีคูณ นอกจากนี้คำถามนั้นถามจำนวนขั้นตอนเป็นผลลัพธ์ในขณะที่ฉันสนใจที่จะเห็นผลลัพธ์ระดับกลาง


โบนัส: ค้นหาระเบียนใหม่: หมายเลขที่น้อยที่สุดพร้อมจำนวนขั้นตอนมากที่สุด Caveat: การคาดคะเนมี 11 ว่าเป็นไปได้ที่ใหญ่ที่สุด
SQB

7
คุณอาจจะรวมถึงอีกไม่กี่กรณีการทดสอบที่ไม่ได้จบลงด้วย00
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 ไบต์

-1 ไบต์ขอบคุณ @SolomonUcko!

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^(คือนี้โทเค็นหนึ่งไบต์

โปรแกรมนี้จะไม่ให้ลำดับที่ถูกต้องของผลิตภัณฑ์ที่มีจำนวนเต็มมากกว่า 14 หลักยาวเนื่องจากข้อ จำกัด ของความแม่นยำทศนิยมในเครื่องคิดเลข TI


คุณสามารถบันทึกไบต์ด้วยการย้าย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

C # (Visual C # Interactive Compiler) , 79 74 68 ไบต์

void f(int a){Print(a);if(a>9)f((a+"").Aggregate(1,(j,k)=>k%48*j));}

ฉันพยายามอยู่ห่างจากการเรียกซ้ำใน C # เนื่องจากวิธีการประกาศเป็นเวลานาน แต่ในกรณีนี้มันช่วยประหยัดเมื่อเทียบกับการวนซ้ำ

ลองออนไลน์!


5

PHP , 63 ไบต์

<?=$n=$argn;while($n>9)echo"
",$n=array_product(str_split($n));

รุ่นซ้ำโทรที่มีการป้อนข้อมูลจากphp -nFSTDIN

ลองออนไลน์!

PHP ,72 71 ไบต์

function h($n){echo"$n
",($n=array_product(str_split($n)))>9?h($n):$n;}

ลองออนไลน์!

เวอร์ชันเรียกซ้ำเป็นฟังก์ชัน

อินพุต: 277777788888899

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

อินพุต: 23

23
6

5

Python 2 , 61 62 59 ไบต์

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

ลองออนไลน์!

-3 ไบต์ขอบคุณ Jonathan Allan


ใช้งานไม่ได้กับอินพุตที่ไม่ลงท้ายด้วย 0 ในการทำซ้ำครั้งล่าสุดของพวกเขาเช่น 23
ศูนย์รวมความไม่รู้

int.__mul__น้อยกว่าสามไบต์lambda a,b:a*b
Jonathan Allan

@JanathanAllan ขอบคุณ! ฉันรู้ว่าต้องมีอะไรแบบนั้น
TFeld

เปลี่ยนf(reduce(int.__mul__,map(int,`n`)))เป็นf(eval('*'.join(`n`)))บันทึก 13 ไบต์
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

Japt -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]

ลองออนไลน์!


JavaScript (โหนดบาเบล) 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สองหรือมากกว่า (เช่นมันใหญ่กว่า9) ภายในการส่งออกห่วงเรา$aแล้วคำนวณได้โดยการแปลงtoCharArra y, joinไอเอ็นจีร่วมกับ*แล้วiex(สั้นInvoke-Expressionและคล้ายกับeval) เมื่อเราออกจากวงเรามีหลักเดียวที่เหลือในการพิมพ์ดังนั้นเราจึงวาง$aลงบนท่ออีกครั้ง

-5 ไบต์ขอบคุณ KGlasier


คุณสามารถใช้การเปรียบเทียบ9-lt$aแทน$a.length-1การบันทึก 5 ไบต์ และถ้าคุณไม่ได้ไปตามสายตลอดเวลาคุณสามารถตัดชิ้นอันดี ลองใช้PowerShell ของฉันถ้าคุณต้องการ!
KGlasier

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.