ตัวเลขรูปสามเหลี่ยม


20

จำนวนสามเหลี่ยมเป็นจำนวนที่สามารถแสดงเป็นผลรวมของจำนวนเต็มบวกติดต่อกันเริ่มต้นที่ 1 พวกเขายังสามารถแสดงออกด้วยสูตรn(n + 1) / 2ที่nเป็นจำนวนเต็มบวกบาง

คู่ที่เป็นตัวเลขดิจิตอลของตัวเลขถูกคำนวณด้วยวิธีต่อไปนี้:

  1. แบ่งตัวเลขออกเป็นอาเรย์ของตัวเลขเช่น 613 => [6 1 3]
  2. สำหรับแต่ละหมายเลขในอาร์เรย์ให้คำนวณnจำนวนสามเหลี่ยมที่สาม[6 1 3] => [21 1 6]
  3. รวมอาร์เรย์ผลลัพธ์ [21 1 6] => 28

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

กรณีทดสอบ

23 => 9 45 25 18 37 34 16 22 6 21 4 10 1
72 => 31 7 28 39 51 16 22 6 21 4 10 1
55 => 30 6 21 4 10 1
78 => 64 31 7 28 39 51 16 22 6 21 4 10 1
613 => 28 39 51 16 22 6 21 4 10 1
8392 => 90 45 25 18 37 34 16 22 6 21 4 10 1
11111 => 5 15 16 22 6 21 4 10 1
8592025 => 117 30 6 21 4 10 1
999999999 => 405 25 18 37 34 16 22 6 21 4 10 1

1
เราจะรวมหมายเลขเดิมเป็นลำดับแรกในอาร์เรย์ผลลัพธ์ได้ไหม
Uriel

1
เราจะรู้ได้อย่างไรว่ามันลดลงเหลือ 1 เสมอ
งานศิลปะที่สวยงามเพียง

5
ลองสมมติว่าตัวเลขมีขนาดใหญ่กว่า141และมีnหลัก ค่าสูงสุดของค่าที่เป็นคู่ของรูปสามเหลี่ยมสามารถมีได้45nเช่นdigi-△(x) ≤ 45n < 45(1+log_10(x))นั้นและสำหรับx > 141เรามี45(1+log_10(x)) < xดังนั้นdigi-△(x) ≤ x-1สำหรับx > 141และเมื่อเราผ่าน141ขีด จำกัด แล้วเราจะบังคับให้พิสูจน์ผ่านโปรแกรม
ศิลปะที่สวยงามเพียง

1
ฉันสามารถต่อท้าย 1 เมื่อสิ้นสุดผลลัพธ์ได้ไหม?
ศิลปะที่สวยงามเพียง

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

คำตอบ:



7

05AB1E , 6 5 ไบต์

Δ=SLO

ลองออนไลน์! แก้ไข: บันทึก 1 ไบต์ขอบคุณ @Emigna คำอธิบาย:

Δ       Repeat until value doesn't change
 =      Print current value
  S     Split into characters
   L    Turn each character into range from 1 to N
    O   Sum

หากคุณแทนที่ด้วยSคุณสามารถข้ามOได้
Emigna

@Emigna ... ทำไมLถึงมีพฤติกรรมเช่นนั้น
Neil

ถ้าฉันจำได้อย่างถูกต้องมันเป็นข้อผิดพลาดที่กลายเป็นประโยชน์และยังคงเป็นคุณลักษณะ ฉันคิดว่ามันเป็นวิธีแรกที่ใช้เวกเตอร์
Emigna

4

J, 20 19 ไบต์

(1#.2!1+,.&.":)^:a:

ลองออนไลน์!

ส่งออกหมายเลขเดิมเช่นกัน

คำอธิบาย

(1#.2!1+,.&.":)^:a:
               ^:a:  Apply until input converges, storing all results in an array
(1#.2!1+,.&.":)      Digitangular sum
        ,.&.":         Split to digits
          &.":           Convert to string, apply left function, then undo conversion
        ,.               Ravel items (make array of singleton arrays of items)
                         This ensures that when cast back to integers, the digits are split.
      1+               Add 1 to each
    2!                 Compute (n choose 2) on each (nth triangular number)
 1#.                   Sum (debase 1)

1
[:+/-> 1#.meow!
FrownyFrog

@ ฟรุตนี่ไม่ได้เป็นกลอุบายดั้งเดิมถึงแม้ว่าฉันจะใช้มันอย่างคุ้มค่าเมื่อฉันจำได้
โคล

4

APL (Dyalog) , 23 20 17 ไบต์

บันทึกได้ 3 ไบต์ด้วย @ngn

{⍵∪⍨+/∊⍳¨⍎¨⍕⊃⍵}⍣≡

ลองออนไลน์!

อย่างไร?

⍵∪⍨ - เพิ่มอาร์เรย์ปัจจุบันให้กับ

+/ - ผลรวมของ

- แบน

⍳¨ - ช่วงของแต่ละ

⍎¨⍕ - หลักของ

⊃⍵ - ค่าก่อนหน้า

⍣≡จนกระทั่งบรรจบ การใช้(สหภาพ) ทำให้แน่ใจว่าหลังจากที่ 1 เข้าร่วมครั้งแรกจะถูกแยกออกเนื่องจากการตั้งค่าที่ไม่ซ้ำกันและอาร์เรย์จะมาบรรจบกัน


หากคุณไม่ได้รับอนุญาตให้ส่งออกค่าดั้งเดิมด้วยระยะเวลานานเท่าไหร่
caird coinheringaahing

@cairdcoinheringaahing 2 ไบต์ - 1↓(เลื่อนก่อน)
Uriel

@Uriel Here power limit (⍣≡) ให้วิธีแก้ปัญหาที่สั้นกว่าการเรียกซ้ำ: {⍵∪⍨ + / ∊⍳¨⍎¨⍕⊃⍵} ⍣≡ แต่มันเป็นความอัปยศที่ APL ไม่มีวิธีรัดกุมในการรวบรวมการทำซ้ำทั้งหมดของ ฟังก์ชั่นจนบรรจบ: ⍵ (f⍵) (f⍣2⊢⍵) (f⍣3⊢⍵) ...
NGN

@ngn ขอบคุณ! ฉันพยายามใช้ตัวดำเนินการด้านพลังงาน แต่ฉันไม่ได้คิดเกี่ยวกับความจริงที่ว่ามันมาบรรจบกันหลังจากที่ 1 จะอัปเดตในเร็ว ๆ นี้
Uriel

@ngn ความคิดใด ๆ เกี่ยวกับวิธีการใช้งาน{+/∊⍳¨⍎¨⍕⎕←⍵}⍣≡โดยไม่ได้รับการตีพิมพ์ 1 ครั้งล่าสุด?
Uriel

3

Haskell, 51 47 46 ไบต์

f 1=[1]
f x=x:f(sum$do d<-show x;[1..read[d]])

ลองออนไลน์!

f 1=[1]                     -- if x == 1, return the singleton list [1]
f x=                        -- else
         do d<-show x       --  for each char 'd' in the string representation of x
                            --    (using the list monad)
           [1..read[d]]     --  make a list of [1..d]
                            --    (the list monad concatenates all those lists into a single list)
        sum                 --  sum those numbers
      f                     --  call f on it
    x:                      --  and put x in front of it 

แก้ไข: @ H.PWiz บันทึกไบต์ ขอบคุณ!



2

ภาษา Wolfram (Mathematica) , 43 41 ไบต์

Echo@#>1&&#0[#.(#+1)/2&@IntegerDigits@#]&

ลองออนไลน์!

มันทำงานอย่างไร

การแสดงออกให้คู่ของ#.(#+1)/2&@IntegerDigits@# digitangular #เราEchoป้อนข้อมูลและการประเมินผลการใช้ลัดวงจรกับ&&หยุดถ้าเราได้มาถึง1และอื่น ๆ recurse ในคู่ digitangular


-2 ไบต์ขอบคุณที่มาร์ตินเอนเดอร์สำหรับ.เคล็ดลับ: เราไม่ได้มีการใช้Trที่จะสรุปตัวเลขถ้าเราเปลี่ยนคูณโดยคูณจุด#(#+1)/2#.(#+1)/2


2
เพิ่งเห็นคำตอบของคุณตอนนี้ คุณสามารถเอาชนะของฉันโดยใช้เคล็ดลับผลิตภัณฑ์เซนต์คิตส์และเนวิสเพื่อหลีกเลี่ยงTr:Echo@#>1&&#0[#.(#+1)/2&@IntegerDigits@#]&
Martin Ender

@ มาร์ตินเดอร์ขอบคุณนั่นเป็นกลลวงที่เรียบร้อย ฉันสงสัยว่ามีวิธีใดที่นักกอล์ฟที่จะทำ "พิมพ์การวนซ้ำทั้งหมดของฟังก์ชันนี้ระหว่างทางไปยังจุดคงที่" (โดยพื้นฐานแล้วการปรับใช้ซ้ำFixedPointListนอกจากวิธีที่พิมพ์จุดคงที่สองครั้ง) ดูเหมือนว่าควรจะเกิดขึ้นมาก่อน
Misha Lavrov

2

ภาษา Wolfram (Mathematica) , 49 42 39 ไบต์

ขอบคุณ Misha Lavrov สำหรับการบันทึก 3 ไบต์

#//.x_:>(y=IntegerDigits@Echo@x).++y/2&

ลองออนไลน์! (TIO ต้องการวงเล็บล้อมรอบ++yด้วยเหตุผลบางอย่างในการติดตั้ง Mathematica ท้องถิ่นของฉันมันใช้งานได้โดยที่ไม่มีมันตามที่ควร)

พิมพ์แต่ละค่าในบรรทัดของตัวเองนำหน้าด้วย>>และรวมถึงหมายเลขเริ่มต้น


คุณสามารถย้อนกลับไปที่คำตอบของฉัน#//.x_:>(y=IntegerDigits@Echo@x).++y/2&ได้ (... อาจจะด้วยเหตุผลบางอย่าง TIO ไม่ชอบสิ่งนี้ แต่ Mathematica ไม่เป็นไรใช่มั้ย)
Misha Lavrov

ดี#//.x_:>(y=IntegerDigits@Echo@x).(++y)/2&41 ไบต์และผลงานใน TIO แต่ Mathematica ของฉันไม่คิดว่าจำเป็นต้องใช้วงเล็บ
Misha Lavrov

@MishaLavrov ขอบคุณ ใช่เบาะแสว่าทำไม TIO ต้องการวงเล็บ แต่ไวยากรณ์ในไฟล์สคริปต์บางครั้งก็ไม่เกะกะ
Martin Ender

1

โอห์ม v2 ,  9  7 ไบต์

·Ω}#ΣΣu

ลองออนไลน์!

คำอธิบาย

          Implicit input as a string
·Ω        Evaluate until the result has already been seen, pushing intermediate results
  }       Split digits
   #      Range from 0 to N
    ΣΣ    Sum
      u   Convert to string

ไม่uจำเป็นเลยเหรอ?
Nick Clifford

มีความจำเป็นมิฉะนั้น}จะไม่แยกตัวเลข
Cinaski

ฮึ่ม นั่นอาจเป็นข้อผิดพลาด ฉันจะตรวจสอบมันออก
Nick Clifford

1

เรติน่า 21 ไบต์

;{:G`
.
$*1¶
1
$%`1
1

ลองออนไลน์! (ผลลัพธ์ของแต่ละกรณีไม่ได้แยกออกจากกัน แต่แต่ละเอาต์พุตลงท้ายด้วย a 1.)

พิมพ์แต่ละหมายเลขบนบรรทัดของตัวเองตามลำดับรวมถึงหมายเลขเริ่มต้น

คำอธิบาย

;{:G`

นี่เป็นเพียงการกำหนดค่าบางส่วนของโปรแกรม {ทำให้โปรแกรมวนซ้ำจนกว่าจะล้มเหลวในการเปลี่ยนผลลัพธ์ (ซึ่งเกิดขึ้นเมื่อเราไปถึง1) :พิมพ์หมายเลขก่อนการวนซ้ำแต่ละครั้งและ;ป้องกันไม่ให้ผลลัพธ์สุดท้ายถูกพิมพ์สองครั้งเมื่อสิ้นสุดโปรแกรม นี่Gเป็นวิธีปกติของฉันในการสร้างเวทีแบบไม่ต้องเปิด

.
$*1¶

แปลงตัวเลขแต่ละหลักเป็นเอกและวางไว้บนเส้นของตัวเอง

1
$%`1

คำนวณตัวเลขสามเหลี่ยมในแต่ละบรรทัดโดยแทนที่1ด้วยคำนำหน้า เราสามารถใช้M!&`1+ที่นี่ได้ซึ่งทำให้เรามีคำต่อท้ายทุกบรรทัด

1

นับ1s ทั้งหมดซึ่งสรุปตัวเลขสามเหลี่ยมทั้งหมดแล้วแปลงผลลัพธ์กลับเป็นทศนิยม


Retina เป็นภาษาที่สมบูรณ์แบบหรือไม่?

@ThePirateBay ใช่
Martin Ender

1

Ruby, 60 47 42 ไบต์

-13 ไบต์โดย @JustinMariner

-5 ไบต์โดย @GB

->x{p x=x.digits.sum{|k|k*-~k/2}while x>1}

ลองออนไลน์!


คุณสามารถวางอาร์เรย์และเครื่องหมาย ( [*...]) และการเปลี่ยนแปลง(k+1)เพื่อ-~kที่จะบันทึกจำนวน 5 ไบต์: ลองออนไลน์! นอกจากนี้คุณสามารถประหยัดอีก 8 ได้โดยเปลี่ยนเป็นฟังก์ชั่นแลมบ์ดานิรนาม: ลองใช้งานออนไลน์!
Justin Mariner

อืมข้าไม่รู้ว่าทำไมข้าถึงคิดว่า.mapไม่สามารถใช้อาร์เรย์ได้
ศิลปะที่สวยงามเพียง

คุณสามารถใช้ "sum {... }" แทน "map {... }. sum" และจากนั้นลบช่องว่างก่อน "ขณะที่"
GB


1

Pushy , 24 22 21 17 ไบต์

[sL:R{;Svc^#&1=?i

ลองออนไลน์!

คำอธิบาย

[sL:R{;Svc^#&1=?i

[           &1=?i   \ Loop until result == 1:
 s                  \   Split last result into digits
  L:  ;             \   For each digit n:
    R{              \       Push the range (1, n) inclusive
       S            \   Sum the ranges
        vc^         \   Delete all stack items, except the sum
           #        \   Print result




0

05AB1E , 20 12 ไบต์

บันทึก 2 ไบต์ขอบคุณที่เก็บเหรียญหยอดเหรียญ

ΔD,þ€iLO}O}}

ลองออนไลน์!

คำอธิบาย

(เวอร์ชั่นเก่า)

Δþ€iD>*;}OD1›iD,}}1,  Main program
Δ                }    Repeat until there is no changes
 þ                    Push digits of the input number
  €i    }             Apply for each digit
    D>*;              Calculate the triangular number for given digit
         O            Sum all numbers
          D1›iD,}     Print if greater than 1
                  1,  Print 1 at the end



0

ถ่าน 18 ไบต์

W⊖Iθ«≔IΣ⭆θΣ…·0κθθ⸿

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด คำอธิบาย:

   θ                Input
  I                 Cast to integer
 ⊖                  Decrement
W   «               Loop while not zero
         θ          Current value
        ⭆           Map over characters and concatenate
             0      Literal character 0
              κ     Current character
           …·       Inclusive range
          Σ         Concatenate
       Σ            Sum of digits
      I             Cast to string
     ≔         θ    Assign back to value
                θ   Output latest value
                 ⸿  Move to start of next line


0

k , 19 ไบต์

{+/(+/1+!"I"$)'$x}\

แปลกใจที่ทำงานคล้ายกับโซลูชั่น APL และ J ที่โพสต์แล้ว

               $x    cast x (implicit var of lambda) to string
   (         )'      apply composition (function train) to each character of string
    +/1+!"I"$        cast character to number, create list from 1 to n, sum it
 +/                  sum triangular numbers
{                }\  iterate lambda until result converges, appending each result

0

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

DRFSµÐĿ

ลองออนไลน์!

  • DRFSµÐĿ: ลิงก์โปรแกรม / monadic เต็มรูปแบบ

  • ÐĿ: วนซ้ำจนกว่าผลลัพธ์จะไม่ซ้ำกันอีกต่อไป (หากมีสิ่งอื่นที่ไม่ใช่ 1 เกิดขึ้นสองครั้งอินพุตที่ให้มาจะไม่มีผลลัพธ์ที่กำหนดเนื่องจากจะไม่ถึง 1)

  • D: แปลงจากจำนวนเต็มเป็นทศนิยม

  • R: ช่วง (มีดัชนี 1 ดัชนี) เวกเตอร์

  • F: แบนและS: รวม ( µเพียงสร้างเชน monadic ใหม่)


0

dc, 31 ไบต์

[[I~d1+*2/rd0<m+]dsmxpd1<f]dsfx

ฟังก์ชั่น mคำนวณดิจิตัลของอินพุตfทำซ้ำสิ่งนี้จนกว่าผลลัพธ์จะถึง 1

โปรดทราบว่าเราใช้ radix อินพุตเพื่อแยกตัวเลข - ซึ่งหมายความว่ามันจะทำงานในระบบพื้นฐานใด ๆ ไม่ใช่แค่ทศนิยม

การสาธิต

for i in 23 72 55 78 613 8392 11111 8592025 999999999
    do echo $i '=>' $(dc -e $i'[[I~d1+*2/rd0<m+]dsmxpd1<f]dsfx')
done
23 => 9 45 25 18 37 34 16 22 6 21 4 10 1
72 => 31 7 28 39 51 16 22 6 21 4 10 1
55 => 30 6 21 4 10 1
78 => 64 31 7 28 39 51 16 22 6 21 4 10 1
613 => 28 39 51 16 22 6 21 4 10 1
8392 => 90 45 25 18 37 34 16 22 6 21 4 10 1
11111 => 5 15 16 22 6 21 4 10 1
8592025 => 117 30 6 21 4 10 1
999999999 => 405 25 18 37 34 16 22 6 21 4 10 1


0

Neim , 8 ไบต์

ͻ𝐂t𝕕𝐬D÷D

คำอธิบาย:

ͻ             Start infinite loop
 𝐂            Split top of stack into each of its characters
  t           Push infinite list of triangular numbers
   𝕕          For each of the characters, get the nth element in the above list.
    𝐬          Sum.
     D         Duplicate.
      ÷        If top of stack is equal to 1, break.
       D       Duplicate.
               Implicitly print all elements in the stack, concatenated.

ลองออนไลน์!

รูปแบบผลลัพธ์



0

PHP, 71 + 1 ไบต์

for(;1<$n="$s"?:$argn;print$s._)for($i=$s=0;$p--||~$p=$n[$i++];)$s+=$p;

ทำงานเป็นท่อที่มี-nRหรือลองออนไลน์ (ต้องใช้ PHP 5.3 หรือใหม่กว่าสำหรับผู้ดำเนินการ Elvis)


ตัวดำเนินการ Elvis คืออะไร
caird coinheringaahing

@cairdcoinheringaahing A?:B: ถ้า A เป็นความจริงแล้ว A else B
Titus

0

เพิ่ม ++ , 32 ไบต์

D,f,@,EDBFEREss
+?
y:1
W!,$f>x,O

ลองออนไลน์!

ไม่ส่งออกค่าแรก

มันทำงานอย่างไร

D,f,@,   - Create a monadic function, f.
         - Example argument: [613]
      ED - Digits;   STACK = [[6 1 3]]
      BF - Flatten;  STACK = [6 1 3]
      ER - Range;    STACK = [[1 2 3 4 5 6] [1] [1 2 3]]
      Es - Sum each; STACK = [21 1 6]
      s  - Sum;      STACK = [28]

           f calculates n's digitangular counterpart

+?       - Take input;     x = 613; y = 0
y:1      - Set y to 1;     x = 613; y = 1
W!,      - While x != y...
   $f>x, -   Call f;       x =  28; y = 1
   O     -   Print x;

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