ผลรวมตัวเลขจนถึง Square


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 = 53 y = 3ด้วยเหตุนี้จึงyต้องมีขนาดใหญ่กว่า 3 และคุณสามารถเพิกเฉยได้

จำนวนการวนซ้ำต้องเป็นค่าแรกหรือค่าสุดท้าย

นี่คือการชนะการนับไบต์ต่ำสุดของ


กำหนดจำนวนขั้นตอนในคำตอบที่ดูเหมือนว่านอกจากนี้ที่ไม่จำเป็นในการแก้ไขปัญหา โซลูชันของฉันต้องเพิ่ม 21 ไบต์เพื่อทำสิ่งต่าง ๆ เพื่อค้นหาความยาวของรายการและลบ 1
ngenisis

@ngenis เกิดขึ้นกับเพียงลำดับของเอาต์พุต แต่ไม่สนใจเมธอด (อาร์เรย์, สแต็ก, delim. string, หลายสตริง .... ) ในการติดตามสิ่งต่าง ๆ 2 อย่าง (ค่าสุดท้ายและจำนวน) หลีกเลี่ยงการสะสม "คนตาบอด" ของค่า (มากหรือน้อย) และเป็นส่วนเสริมที่ดีในสายตาของฉัน บางทีวิธีการที่แตกต่างกันอาจต้องการการคำนวณมากกว่า 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 byter จะพิมพ์แต่ละอินพุตไปยังลูปพร้อมกับ line feed ( ) และในที่สุดก็พิมพ์จำนวนที่ลดลงของผลลัพธ์ที่เก็บไว้โดยไม่จำเป็นต้องแยก monadic chain ( µ) และ concatenation ( ;)


1
เนื่องจากไม่มีการตั้งค่า "การจัดรูปแบบเอาท์พุท" ที่ร้องขอ เอาต์พุตจำนวนมากจะถูกนับตราบเท่าที่คำสั่งนั้นใช้ได้ วิธีนี้คำตอบ 13 ไบต์นั้นถูกต้อง
Dirk Reichel

เจ๋งฉันไม่แน่ใจขอบคุณที่บอกให้ฉันรู้!
Jonathan Allan

4

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

Ungolfed และการใช้งาน:

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

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

การใช้งาน<’¥นั้นเป็นวิธีสั้น ๆ ในการเขียน dyad (ลิงก์ที่มีสองอาร์กิวเมนต์) ที่ส่งคืน -1 เสมอ (เพราะเรารู้ว่าคำตอบจะไม่เล็กกว่าฐาน) การเลือกระหว่างการเรียกใช้ซ้ำและโปรแกรมทั้งหมดซ้ำช่วยให้เราสามารถกำหนดได้ว่าจะหยุดลูปเมื่อใด จากนั้นเมื่อสแต็กผ่อนคลายเมื่อสิ้นสุดการเรียกซ้ำเราจะเพิ่ม -1 เพื่อพิจารณาว่ามีกี่ขั้นตอน


2

MATL, 25 21 ไบต์

บันทึกได้ 4 ไบต์ด้วย @Luis

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.