ลำดับรอบผลรวมของเซเว่น


17

ดูตารางสูตรคูณ sevens จาก 7 × 0 ถึง 7 × 9:

0, 7, 14, 21, 28, 35, 42, 49, 56, 63

ถ้าเราแค่ดูตัวเลขในตำแหน่งที่เราได้รับการเปลี่ยนแปลงของตัวเลข 0 ถึง 9:

0, 7, 4, 1, 8, 5, 2, 9, 6, 3

ลองพิจารณาจำนวนเต็มเลขทศนิยมบวก N และแทนที่แต่ละหลัก D ใน N ด้วยตัวเลขแทนตำแหน่งที่ 7 × D

ยกตัวอย่างเช่น15209กลายเป็น75403เพราะ1แผนที่7, 5แผนที่เพื่อ5, 2แมปไป4, 0แมปไป0และแมปไป93

ตอนนี้ให้ทำซ้ำกระบวนการนี้ด้วยจำนวนเต็มทศนิยมใหม่นี้จนกว่าเราจะเห็นรอบเช่นจนกว่าจำนวนเต็มที่เราได้เห็นมาแล้ว

ตัวอย่างเช่นเมื่อ15209เราได้วัฏจักร

15209 -> 75403 -> 95801 -> 35607 -> 15209 -> repeats...
                                      ^
                                      |
                             cycle restarts here

เป็นอีกตัวอย่างหนึ่งที่505มีรอบสั้น

505 -> 505 -> repeats...
        ^
        |
cycle restarts here

ปรากฎว่าสำหรับ N รอบใด ๆ เหล่านี้จะมีจำนวนเต็ม 1 หรือ 4 จำนวนที่แน่นอนเสมอ (ฉันจะปล่อยให้มันอยู่กับคุณที่จะคิดออกว่าทำไม.) สิ่งที่น่าสนใจคือว่าถ้าคุณรวมทั้งหมดเลขที่แตกต่างกันในวงจรที่คุณมักจะได้รับจำนวนเต็มทศนิยมว่ามีเพียงประกอบด้วย2'และ0' s

ตัวอย่างเช่น 15209 + 75403 + 95801 + 35607 = 222020

N = 505 เป็นหนึ่งในข้อยกเว้น จำนวนเต็มเดียวในรอบคือ 505 ดังนั้นผลรวมทั้งหมดคือ 505

นี่คือผลรวมของรอบสำหรับ N = 1 ถึง 60:

N sum
1 20
2 20
3 20
4 20
5 5
6 20
7 20
8 20
9 20
10 200
11 220
12 220
13 220
14 220
15 220
16 220
17 220
18 220
19 220
20 200
21 220
22 220
23 220
24 220
25 220
26 220
27 220
28 220
29 220
30 200
31 220
32 220
33 220
34 220
35 220
36 220
37 220
38 220
39 220
40 200
41 220
42 220
43 220
44 220
45 220
46 220
47 220
48 220
49 220
50 50
51 220
52 220
53 220
54 220
55 55
56 220
57 220
58 220
59 220
60 200

เราจะเรียกสิ่งนี้ว่าลำดับการวนรอบของเซเว่น

ท้าทาย

เขียนโปรแกรมหรือฟังก์ชั่นที่ใช้ในจำนวนเต็มเลขฐานสิบบวก N และพิมพ์หรือส่งกลับเป็นทศนิยมคำที่สอดคล้องกันของลำดับรอบผลรวมของเซเว่น

ตัวอย่างเช่นถ้าใส่เป็นผลผลิตที่ควรจะเป็น95801 222020ถ้าใส่เป็นผลผลิตที่ควรจะเป็น505 505ถ้าใส่เป็นผลผลิตที่ควรจะเป็น54220

รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ


1
แน่นอนถ้าคุณจะใช้ตัวเลขจากหนึ่งรอบและคูณพวกเขาโดยสี่คุณจะพบว่าทั้งหมดของพวกเขาให้ตัวเลขที่มีเพียงตัวเลข 2 และ 0
ปีเตอร์เทย์เลอร์

คำตอบ:


1

Pyth, 14 ไบต์

s.uieM*R7jNTTQ

ไม่แน่ใจว่าทำไมทุกคนกำหนดผลลัพธ์โดยดูจากรูปแบบตัวเลข เพียงทำกระบวนการคำนวณตัวเลขทั้งหมดของวงกลมแล้วสรุปให้สั้นลง อย่างน้อยใน Pyth ;-)

ลองใช้ออนไลน์: การสาธิตหรือชุดทดสอบ

Btw นี่คือคำตอบที่ 200 กอล์ฟรหัสของฉัน ดังนั้นการโพสต์นี้ทำให้ฉันได้รับตราสัญลักษณ์ทองกอล์ฟ

คำอธิบาย:

s.uieM*R7jNTTQ   implicit: Q = input number
 .u          Q   apply the following expression to N=Q until it reaches a circle
         jNT        convert N to base 10
      *R7           multiply each digit with 7
    eM              and perform modulo 10 for each number
   i        T       convert digits from base 10 to a number
                    update N
                 .u returns the list of all intermediate results of N, 
                 so we have now all numbers of the circle
s                sum them up

รหัส ... รอเลย ... กอล์ฟ! :) ขอแสดงความยินดีและใช้งานได้ดี.u
FryAmTheEggman

6

Python 2, 69 ไบต์

lambda n:[''.join('02'[x>'0']for x in`n`)+'0',n][set(`n`)<=set('05')]

ฟังก์ชั่นนี้อธิบายได้ง่าย:

  • ถ้า n ประกอบด้วยเพียง 0 และ 5 ให้เอาท์พุทมันไม่เปลี่ยนแปลง
  • มิฉะนั้นให้แทนที่แต่ละหลักด้วย n ด้วย 2 ยกเว้น 0 จะอยู่ที่ 0 และเปลี่ยนเป็น 0 จนสุด

การตีกอล์ฟนั้นดีขึ้นฉันโพสต์วิธีการแบ่งปันเป็นส่วนใหญ่ ภาษาที่มี native regex ควรยอมให้มีวิธีแก้ปัญหาสั้น ๆ

คำสั่งทางเลือกของฟังก์ชั่นคือ

  • ใน n ให้แทนที่แต่ละหลักด้วย 5 ยกเว้น 0 ยังคงเป็น 0
  • หากสิ่งนี้เปลี่ยนไป n (มันมีตัวเลขอื่นที่ไม่ใช่ 0 หรือ 5) ให้คูณผลลัพธ์ด้วย 4

4

Python 2, 63 ไบต์

lambda s:s.strip('05')and''.join(`(c>'0')*2`for c in s)+'0'or s

อาร์กิวเมนต์อินพุตคาดว่าจะเป็นสตริง


1
ว้าวฉันไม่มีความคิดstripทำตัวแบบนี้
xsot

มาเลยพิมพ์การแปลง (สตริง & harr; ตัวเลข) เป็นส่วนสำคัญของความสนุก (เช่นความยาวโค้ด; o)!
charlie

4

CJam, 16 ไบต์

ใช้อัลกอริทึมเดียวกันกับคนอื่น ๆ :

r_50s-{:~2fe&0}&

ชุดทดสอบ (สร้างผลลัพธ์ทั้งหมดตั้งแต่ 1 ถึงอินพุต)

คำอธิบาย

r_      e# Read input and duplicate
50s     e# Push the string "50".
-       e# Remove all '5' and '0' characters from the input.
{       e# If any characters remained in the input...
  :~    e#   Evaluate each digit character to turn it into an integer.
  2fe&  e#   Map (&& 2) over the list. Due to short-circuiting, zeros remain zeros and
        e#   everything else becomes 2.
  0     e#   Push a trailing zero.
}&

3

JavaScript (ES6), 54 51 ไบต์

ใช้วิธีการของxnor :

n=>/[^05]/.test(n)?`${n}0`.replace(/./g,d=>+d&&2):n

บันทึกแล้ว 3 ไบต์ขอบคุณ@charlie !

คำอธิบาย

n=>
  (s=n+"").match`[^05]`          // if there are any digits which aren't 5 or 0
    ?s.replace(/\d/g,d=>+d&&2)+0 //     replace every digit except 0 with 2 then add a 0
  :s                             // else return the input unchanged

ทดสอบ

วิธีการซื่อๆ 102 ไบต์

n=>(c=x=>~r.indexOf(x+=m="")?eval(r.join`+`):[...r[++i]=x].map(d=>m+="0741852963"[d])&&c(m))(n,i=r=[])
n=>
  (c=x=>                  // c = recursive function
    ~r.indexOf(           // if we have calculated this number before
      x+=m="")?           // cast x to a string, m = calculated result
        eval(r.join`+`):  //     return the sum of all the calculated numbers
    [...r[++i]=x].map(d=> // else add x to the list of calculated numbers
      m+="0741852963"[d]  // map each digit of x to the "seven" digits
    )&&c(m)               // calculate the value of the result
  )(n,i=r=[])             // r = array of previously calculated values


51 bytes:n=>/[^05]/.test(n)?`${n}0`.replace(/./g,d=>+d&&2):n
charlie

1
40 bytes:n=>n-(s=`${n}`.replace(/[^0]/g,5))?s*4:n
charlie

1
@ Charlie Wow, s*4เคล็ดลับนั้นยอดเยี่ยม! ฉันคิดว่าคุณควรโพสต์คำตอบนี้เป็นคำตอบที่แยกต่างหากเพราะวิธีการนั้นแตกต่างกันมากและสั้นกว่าของฉันมาก :)
user81655

ตกลงฉันจะทำด้วยความถ่อมใจ o)
ชาร์ลี

2

Mathematica, 83 77 60 ตัวอักษร

Tr@Union@NestList[FromDigits@Mod[7IntegerDigits@#,10]&,#,4]&

Ungolfed

Tr@
  Union@
   NestList[
    FromDigits@Mod[7 IntegerDigits@#, 10] &,
    #,
    4
   ] &

2

JavaScript (ES5), 40 ไบต์

n=>(s=`${n}`.replace(/[^0]/g,5))^n?s*4:n

มันเป็นวิวัฒนาการของที่user81655 's วิธีการแก้ปัญหาโดยใช้วิธีทางเลือกอธิบายโดยXNOR

คำอธิบาย

ผลรวมของหลักที่ไม่เป็นศูนย์ใน 4 รอบคือ 20 เสมอเนื่องจากรอบหลักผ่าน 1 → 7 → 9 → 3 หรือ 2 → 4 → 8 → 6 หรือ 5 → 5 → 5 → 5 ดังนั้นการแทนที่ตัวเลขดังกล่าวทุกตัวด้วย 5 จะไม่เปลี่ยนผลรวม

การดำเนินการแทนนั้นถูกนำมาใช้ซ้ำเพื่อแยกความแตกต่าง 4 รอบจาก 1 รอบ - หากผลการเปลี่ยนแตกต่างจากอินพุตดังนั้นจะเป็น 4 รอบมิฉะนั้นจะเป็น 1 รอบ

หมายเหตุ: สตริงแม่แบบ`${n}`เป็นเพียงการอ่าน(n+'')มีความยาวเท่ากัน


ไม่มี regexp - 47 bytes:n=>(s=[...`${n}`].map(d=>+d&&5).join``)^n?s*4:n
charlie

0

sed, 26 ไบต์

/[^05]/{s/[^0]/2/g;s/$/0/}

(ใช้วิธีการ "แทนที่ด้วย 2" อีกวิธีหนึ่ง)

ตัวอย่าง

echo '500' | sed '/[^05]/{s/[^0]/2/g;s/$/0/}'500

echo '501' | sed '/[^05]/{s/[^0]/2/g;s/$/0/}'2020


0

Perl 6 ,  68 55 53 36  33 ไบต์

{[+] $^a,{[~] $^b.comb.map: {'0741852963'.comb[$_]}}...^{$++*?/$a/}} # 68
{$_=@=$_.comb;[~] (@$_,(|.map(2*?+*),0))[$_qw<0 5>]} # 55
{[~] ($_=@=$_.comb)⊆qw<0 5>??@$_!!(|.map(2*?+*),0)} # 53
{/^<[05]>+$/??$_!!S:g/./{2*?+$/}/~0} # 36

{m/^<[05]>+$/||S:g/./{2*?+$/}/~0} # 33

นี้แน่นอนทางที่ผิดจะทำเช่นนี้หากตัวเลขมีค่าประกอบด้วยเดียวของ5และ0s ก็จะกลับเป็นวัตถุ Match มิฉะนั้นจะแทนที่ทุกอย่าง แต่0มี2และผนวก0ไปยังจุดสิ้นสุด
(วัตถุที่ตรงกันจะทำงานเหมือนตัวเลขถ้าคุณใช้เป็นหนึ่ง)

แม้ว่ามันจะทำผิดมันทำให้ง่ายที่จะชี้ให้เห็นตัวเลขที่หายากโดยการเรียกgistวิธีการ

การใช้งาน:

# give it a name
my &code = {...}

.say for (0..60,505,15209).flat.map({ code($_).gist.fmt: '%4s' }).rotor(1,10 xx 6,:partial)

( 0」)
(  20   20   20   20  5   20   20   20   20  200)
( 220  220  220  220  220  220  220  220  220  200)
( 220  220  220  220  220  220  220  220  220  200)
( 220  220  220  220  220  220  220  220  220  200)
( 220  220  220  220  220  220  220  220  220 50」)
( 220  220  220  220 55  220  220  220  220  200)
(「505」)
(222020)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.