มารวมกันเป็น 9!


21

ได้รับจำนวนเต็มn> 2พิมพ์หรือกลับมีขนาดเล็กที่สุดจำนวนเต็มไม่เป็นลบkดังกล่าวว่าA (n, k) = 9ที่A (n, k)จะถูกกำหนดโดย:

  • a (n, 0) = n
  • a (n, k + 1) =
    • a (n, k) / 2 + 1ถ้า a (n, k)เป็นเลขคู่
    • ผลรวมของตัวเลขของa (n, k) ² (ในฐาน 10) ถ้า(n, k)เป็นเลขคี่

ตัวอย่าง

สำหรับn = 5ผลลัพธ์ที่คาดหวังคือk = 4 :

a(5, 0) = 5
a(5, 1) = 7  (5² = 25 and 2 + 5 = 7)
a(5, 2) = 13 (7² = 49 and 4 + 9 = 13)
a(5, 3) = 16 (13² = 169 and 1 + 6 + 9 = 16)
a(5, 4) = 9  (16 / 2 + 1)

สำหรับn = 40ผลลัพธ์ที่คาดหวังคือk = 2 :

a(40, 0) = 40
a(40, 1) = 21 (40 / 2 + 1)
a(40, 2) = 9  (21² = 441 and 4 + 4 + 1 = 9)

คำอธิบายและกฎ

  • อินพุตรับประกันว่ามากกว่า 2
  • โปรแกรมของคุณในทางทฤษฎีควรจะทำงานให้คุ้มค่าของn (ในทางปฏิบัติมันอาจถูก จำกัด โดยขนาดเต็มจำนวนสูงสุดที่ภาษาของคุณสนับสนุน)
  • kอาจเป็นดัชนี 0 หรือดัชนี 1 โปรดระบุในคำตอบของคุณ
  • นี่คือดังนั้นคำตอบที่สั้นที่สุดในจำนวนไบต์ชนะ!

ค่าแรก

ด้านล่างเป็นค่าแรกจากn = 3ถึงn = 422โดยมีดัชนีk 0 (สำหรับการจัดทำดัชนี 1 รายการเพียงเพิ่ม1ไปยังค่าเหล่านี้)

 1  2  4  3  3  5  0  4  3  4  2  6  1  1  6  5  5  4  1  5  2  3  3  7  6  2  3  2  2  7
 6  6  5  6  6  5  1  2  2  6  6  3  1  4  3  4  4  8  1  7  6  3  5  4  6  3  2  3  3  8
 7  7  3  7  4  6  6  7  5  7  6  6  6  2  4  3  3  3  6  7  3  7  2  4  7  2  6  5  6  4
 7  5  2  5  6  9  6  2  3  8  2  7  1  4  6  6  6  5  1  7  4  4  3  3  7  4  3  4  2  9
 6  8  6  8  6  4  6  8  2  5  3  7  6  7  3  8  2  6  7  8  6  7  5  7  6  7  4  3  3  5
 6  4  3  4  4  4  6  7  6  8  3  4  6  8  7  3  6  5  6  8  3  3  2  7  6  6  5  7  6  5
 7  8  2  6  3  3  6  6  6  7  4 10  6  7  3  3  6  4  1  9  2  3  3  8  7  2  6  5  2  7
 7  7  6  7  3  6  7  2  4  8  3  5  6  5  6  4  2  4  6  8  3  5  6  4  7  5  2  3  6 10
 7  7  3  9  2  7  1  9  5  7  6  5  6  7  4  9  6  3  6  6  3  4  2  8  7  7  6  8  6  4
 7  9  4  3  3  7  7  8  3  9  4  7  6  8  3  6  6  8  7  7  7  8  6  5  7  4  6  4  2  6
 7  7  6  5  3  4  7  5  4  5  3  5  7  7  6  8  2  7  1  9  6  4  6  5  7  7  2  9  6  8
 7  4  3  7  4  6  6  7  6  9  3  4  6  4  2  3  3  8  1  7  6  7  2  6  7  8  3  7  5  6
 7  8  2  9  3  3  6  7  6  4  4  4  6  7  6  7  6  7  6  8  7  5  6 11  7  7  3  8  4  4
 7  4  6  7  3  5  6  2  2 10  6  3  6  4  3  4  4  9  7  8  3  3  6  7  7  6  4  3  6  8

23
พันธะ nitpick ในชื่อ:9! ≠ 9
JungHwan Min

1
ลำดับเย็น คุณค้นพบสิ่งนี้ด้วยตัวเองหรือไม่?
Robert Fraser

@RobertFraser ฉันทำ แต่ฉันแน่ใจว่าลำดับที่คล้ายกันอยู่ที่ไหนสักแห่ง (ฉันไม่สามารถหาได้ แต่ฉันไม่ได้ใช้เวลาในการค้นหามาก)
Arnauld

หลังจากการคาดคะเน Collatz การคาดเดาของ Arnauld! อะไรต่อไป?
sergiol

@sergiol อ้างอิงจากlmgtfy.com/?q=conjectureการคาดเดาคือan opinion or conclusion formed on the basis of incomplete information.
Roman Gräf

คำตอบ:


6

Husk , 13 ไบต์

€9¡?o→½ȯΣd□¦2

นี่คือดัชนี 1 ลองออนไลน์!

คำอธิบาย

ไม่มีอะไรแฟนซีเกินไปที่นี่

€9¡?o→½ȯΣd□¦2  Implicit input, say n = 5
  ¡            Iterate the following function:
   ?       ¦2   If divisible by 2,
    o→½         then halve and increment,
       ȯΣd□     else square, take digits and get their sum.
               This gives an infinite sequence: [5,7,13,16,9,9,9,9,9..
€9             1-based index of 9; print implicitly.

ฉันคิดว่ามันคงจะดีถ้าแก้ปัญหานี้
H.PWiz

10

Perl 6 , 41 ไบต์ (40 ตัวอักษร)

{+($_,{$_%2??[+] $_².comb!!$_/2+1}...9)}

ลองออนไลน์!

สิ่งนี้ใช้การจัดทำดัชนี 1 ตัวของ k ดังนั้นมันจึงให้คำตอบที่สูงกว่า 1 ตัวอย่างจาก OP หากนี่ไม่ใช่สิ่งที่หมายถึงการจัดทำดัชนี 1 ฉันจะต้องเพิ่มอีก 1 ไบต์

คำอธิบาย : เป็นฟังก์ชันที่ไม่ระบุชื่อ เราเพียงแค่ใช้เครื่องมืออำนวยความสะดวกของ Perl 6 สำหรับสร้างรายการโดยใช้การสอบถามซ้ำ: —) (first element),(block that takes the previous element and gives the next)...(end condition)มันมีลักษณะเช่นนี้ ในกรณีนี้องค์ประกอบแรกคือ$_(อาร์กิวเมนต์ของฟังก์ชั่นหลัก) และเงื่อนไขสิ้นสุดคือ9(ปฏิบัติตามเมื่อเราสร้าง 9) ในบล็อกกลางเราใช้$_เพื่ออ้างถึงอาร์กิวเมนต์ของมัน (= องค์ประกอบก่อนหน้าของลำดับ) ตัว?? !!ดำเนินการประกอบไปด้วยที่เก่า (รู้จักกันในชื่อ? :) +(...)สุดท้ายเราจะใช้ความยาวของรายการนี้ด้วยการบังคับให้บริบทโดยตัวเลข

สิ่งสุดท้ายที่แปลกประหลาดที่นี่คือผลรวมของตัวเลข ตัวเลขคือCool(ทำหน้าที่เหมือนทั้งสตริงและตัวเลข) ดังนั้นเราจึงใช้เมธอดสตริง.combที่$_²(ให้รายการของอักขระ = ตัวเลข) จากนั้นเพิ่มอักขระขึ้น (ที่แปลงกลับเป็นตัวเลข)


ใช่นี่คือความหมายของการจัดทำดัชนี 1 รายการ
Arnauld

7

เยลลี่ขนาด 17 ไบต์

²DSµH‘$Ḃ?ßµ-n9$?‘

ลองออนไลน์!

วิธีการตรงไปข้างหน้า ใช้การจัดทำดัชนีแบบ 0

คำอธิบาย

²DSµH‘$Ḃ?ßµ-n9$?‘  Input: n
               ?   If
            n9$      n != 9
          µ        Then
        ?            If
       Ḃ               n % 2 == 1
   µ                 Then
²                      Square
 D                     Decimal digits
  S                    Sum
      $              Else
    H                  Halve
     ‘                 Increment
         ß           Call recursively
                   Else
           -         The constant -1
                ‘  Increment

1
@Arnauld ขอบคุณเงื่อนไขเป็นdo-while n != 9แทนwhile n!= 9
ไมล์

7

Python 2 , 129 126 76 68 67 64 54 53 ไบต์

-3 ไบต์ขอบคุณ Jonathan Frech -8 ไบต์ขอบคุณ Maltysen -7 ไบต์ขอบคุณ Jonathan Allan -1 ไบต์ขอบคุณ Mr. Xcoder

f=lambda n:n-9and-~f(n%2*sum(map(int,`n*n`))or 1+n/2)

ลองออนไลน์!

จากใครบางคนที่อาจไม่รู้จักคณิตศาสตร์เพียงพอดูเหมือนว่าจะเป็นเรื่องที่ไม่มีเหตุผล : P


1
คุณสามารถแทนที่)%2and sumด้วย)%2*sumการบันทึกสามไบต์
Jonathan Frech

1
มีเหตุผลสำหรับหลาม 3 หรือไม่? มิฉะนั้นคุณสามารถใช้ `สำหรับ str repr
Maltysen

1
คุณสามารถกำจัดได้kทั้งหมดและประหยัดอีกเจ็ดไบต์
Jonathan Allan

8
ฉันจะสารภาพว่าฉันหลงทางว่ามันใช้งานได้เมื่อไม่กี่นาทีที่ผ่านมา > _ <
สิ้นเชิงมนุษย์


6

Mathematica, 58 ไบต์

1 การจัดทำดัชนี

If[#!=9,#0@If[OddQ@#,Total@IntegerDigits[#^2],#/2+1]+1,0]&

ลองออนไลน์! (เพื่อที่จะทำงานกับคณิตศาสตร์Trถูกแทนที่ด้วยTotal)

ที่นี่คือรุ่น -1 ไบต์โดย @JungHwanMin (แต่มันไม่ทำงานกับคณิตศาสตร์ดังนั้นฉันจึงเก็บทั้งสองไว้)

Mathematica, 57 ไบต์

If[#!=9,#0@If[2∣#,#/2+1,Total@IntegerDigits[#^2]]+1,0]&

1
-1 ไบต์: ใช้2∣#แทนและสลับทั้งสองแสดงออกของOddQ@# If
JungHwan Min

6

JavaScript (ES6), 59 50 ไบต์

0 การจัดทำดัชนี

f=n=>n-9&&f(n%2?eval([...""+n*n].join`+`):n/2+1)+1

ลองมัน

o.innerText=(
f=n=>n-9&&f(n%2?eval([...""+n*n].join`+`):n/2+1)+1
)(i.value=5);oninput=_=>o.innerText=f(+i.value)
<input id=i min=3 type=number><pre id=o>


คำอธิบาย

n-9สิ่งแรกที่เราทำคือการคำนวณ ถ้าอย่างn==9นั้นเห็นได้ชัดว่าให้0และสิ่งที่หยุดอยู่ที่นั่น หากn!=9แล้วn-9จะให้ไม่ใช่ศูนย์ค่าซึ่งเป็น truthy หมายถึงเราสามารถดำเนินการต่อผ่านตรรกะและ เราเรียกฟังก์ชันนี้อีกครั้งโดยส่งค่าใหม่nไปยังฟังก์ชันคำนวณดังนี้

n%2?

ถ้าnโมดู2โล่เป็นจริง - nคือคี่

[...""+n*n]

คูณnด้วยตัวเองแปลงเป็นสตริงและโครงสร้างสตริงนั้นไปยังอาร์เรย์ของอักขระ (ตัวเลข) แต่ละตัว

 .join`+`

เข้าร่วมตัวละครกับสตริงโดยใช้+การแสดงออกทางคณิตศาสตร์

eval(                   )

n*nประเมินการแสดงออกที่ทำให้เรามีผลรวมของตัวเลขของ

:n/2+1

ถ้าn%2เป็น falsey (กล่าวคือnแม้) แล้วเราเพียงแค่แบ่งnโดยและเพิ่ม21

1ผลที่ได้จากการเรียกฟังก์ชั่นอีกครั้งที่เรานั้นเพิ่ม ดังนั้นเมื่อใช้อินพุตเริ่มต้นของ5กระบวนการจะเป็นดังนี้:

f(5)
= -4&&f(7)+1
= -2&&(f(13)+1)+1
=  4&&((f(16)+1)+1)+1
=  7&&(((f(9)+1)+1)+1)+1
=     (((0+1)+1)+1)+1
= 4

4

เยลลี่ ,  16  15 ไบต์

-1 ไบต์ขอบคุณไมล์ (ใช้ประกอบไปด้วยถ้า)

²DSµH‘µḂ?_9$пL

ลิงก์ monadic ที่รับและส่งคืนตัวเลข
1 การจัดทำดัชนี

ลองออนไลน์! หรือดูชุดทดสอบ (รวมผลลัพธ์เป็น 0 ดัชนีและรูปแบบเช่นบล็อกโค๊ด OP)

อย่างไร?

²DSµH‘µḂ?_9$пL - Link: number, n
            п  - collect results in a list while:
           $    -   last two links as a monad:
         _9     -     subtract nine
        ?       -   if:
       Ḃ        -     bit - current loop input modulo by 2 (1 if odd, 0 if even)
   µ            -   ...then:
²               -     square the current loop input
 D              -     cast to a list of its decimal digits
  S             -     sum
      µ         -   ...else:
    H           -     halve current loop input
     ‘          -     increment
              L - length (get the number of results collected
                -         - this includes the 9, so is 1-indexed w.r.t. k)

ฉันเชื่อว่าคุณสามารถบันทึก byte ที่รวมคำสั่ง if ที่ฉันใช้กับ loop ของคุณ ²DSµH‘$Ḃ?n9$пL
ไมล์




1

VB.NET (.NET 4.5.2), 107 + 20 (นำเข้า) = 117 ไบต์

ต้องใช้ Imports System.Linq

Function A(n)
While n<>9
n=If(n Mod 2=0,n/2+1,CStr(n^2).Sum(Function(c)Val(c)))
A+=1
End While
End Function

ฟังก์ชั่นซึ่งจะnเป็นจำนวนเต็มการป้อนข้อมูลและผลตอบแทน k0-based

Ungolfed:

Function A(n) ' input/output types are Object, but we will be casting to integer
    'A = 0 ' VB will create an implicit variable with the same name as the function

    ' loop until a(n, k) = 9
    ' using n as the variable to store a(n, k)
    While n <> 9

        n = If(n Mod 2 = 0, ' equivalent to c# ternary ?: operator

            n / 2 + 1, ' even case

            CStr(n ^ 2).Sum(Function(c) Val(c)))
            ' odd case
            ' cast number to string
            ' then convert each char to the number it represents
            ' and do a linq sum

        A += 1 ' Object + Integer will coerce to an integer
    End While

    ' Where's the return?
    ' That implicit variable with the matching name will get returned if there's no explicit return
End Function


1

Pyth ,  23  22 ไบต์

สำหรับตอนนี้เป็นฟังก์ชันเวียนแต่ฉันจะพยายามที่จะเปลี่ยนไป.W(ในขณะที่ทำงาน) เพื่อบันทึกไบต์แทน

L&-b9hy|*%b2sj^b2Th/b2

ลองที่นี่! (พร้อมรหัสเพิ่มเติมเพื่อเรียกใช้ฟังก์ชัน - ใช้- ไม่มีช่องว่าง)y<your_number>


1

Java 8, 110 98 ไบต์

n->{int k=0,s;for(;n!=9;k++){s=0;for(int c:(n*n+"").getBytes())s+=c-48;n=n%2<1?n/2+1:s;}return k;}

0 การจัดทำดัชนี

คำอธิบาย:

ลองที่นี่

 n->             // Method with integer as both input and return-type
   int k=0,      //  Result-integer `k` starting at 0
       s;        //  Sum-integer
   for(;n!=9;    //  Loop (1) as long as `n` is not 9
        k++){    //    And increase `k` by 1 after every iteration
     s=0;        //   Reset sum `s` to 0
     for(int c:(n*n+"").getBytes())
                 //   Do `n*n` and inner loop (2) over the digits as characters
       s+=c-48;  //    And increase the sum `s` with these digits
                 //   End of inner loop (2) (implicit / single-line body)
     n=n%2<1?    //   If `n` is even:
        n/2+1    //    Change `n` to `n/2+1`
       :         //   Else:
        s;       //    Change `n` to sum `s`
  }              //  End of loop (1)
  return k;      //  Return the result `k`
}                // End of separated method (2)

1

Clojure v1.8, 124 113 112 ไบต์

0 การจัดทำดัชนี

(fn[n](loop[a n k 0](if(= a 9)k(recur(if(even? a)(+(/ a 2)1)(apply +(map #(-(int %)48)(str(* a a)))))(inc k)))))

ลองออนไลน์!

คำอธิบาย

(loop[a n k 0](if(= a 9)...))  Loop until a=9
(if(even? a)(+(/ a 2)1)...)    If even, a(n, k) / 2 + 1 if a(n, k)
(if(even? a)...(apply +(map #(-(int %)48)(str(* a a)))))  If odd, calculate the sum of digits of a(n, k)²
#(-(int %)48)                  Convert character to number

1

Pyth, 18 ไบต์

tl.u?%N2sj*NNTh/N2

ลองใช้งานออนไลน์: การสาธิต

คำอธิบาย:

tl.u?%N2sj*NNTh/N2
  .u                 apply the following function to the input, 
                     until it runs into a fixed point
    ?%N2                if value % 2 == 1:
          *NN               value * value
         j   T              convert to digits
        s                   sum
                        else:
               /N2          value / 2
              h              + 1
 l                   get the length of all visited values
t                     - 1

1

Japt 22 22ไบต์

0 การจัดทำดัชนี

NcUÆ=v ?U/2Ä:U²ìxà b9

ลองมัน


คำอธิบาย

Uการป้อนข้อมูลโดยนัยของจำนวนเต็ม

UÆ             Ã

สร้างอาร์เรย์ของจำนวนเต็มตั้งแต่0ถึงถึงU-1และผ่านแต่ละฟังก์ชัน

=

Uการตั้งค่าของ

v ?

ถ้าUหารด้วย 2

U/2Ä

Uหารด้วย 2, บวก 1 ( Ä)

:U²ìx

อื่น ๆ : Uกำลังของ 2 ( ²), แบ่งเป็นอาร์เรย์ของตัวเลข (ì ) และลดลงด้วยการเพิ่ม ( x)

Nc

ผนวกอาร์เรย์ผลลัพธ์ลงในอาร์เรย์ของอินพุต

b9

ค้นหาดัชนีของการเกิดขึ้นครั้งแรก9ในอาร์เรย์ แสดงผลลัพธ์โดยปริยาย


แดง ฉันรู้สึกว่าการใช้วิธีการฟังก์ชั่นจะดีขึ้นมาก แต่ฉันทำได้เพียง 23 ไบต์: @¥9}a@=u ?U²ìx :U/2Ä;°Tหากมีวิธีที่คืนจำนวนการวนซ้ำจนกว่าค่าจะหยุดการเปลี่ยนแปลง ...
ETHproductions

@ETHproductions: เอาต์พุต 1 สำหรับ 9 แทนที่จะเป็น 0 แต่นี่เป็นเวอร์ชัน22 ไบต์ (ซึ่งยังคงล้มเหลวเป็น 9)
Shaggy

ฉันมาด้วยรุ่น20 ไบต์เมื่อคืน แต่มันก็มีปัญหาเดียวกัน
Shaggy
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.