Chuỗi tổng số chu kỳ của bảy


17

Hãy xem bảng nhân bảy số từ 7 × 0 đến 7 × 9:

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

Nếu chúng ta chỉ nhìn vào các chữ số ở vị trí của một người, chúng ta sẽ có một hoán vị của các chữ số từ 0 đến 9:

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

Xem xét lấy một số nguyên thập phân dương N và thay thế mỗi chữ số D bằng N bằng chữ số ở vị trí 7 × D.

Ví dụ: 15209trở thành 754031bản đồ đến 7, 5bản đồ đến 5, 2bản đồ đến 4, 0bản đồ đến 09bản đồ đến 3.

Bây giờ, hãy lặp lại quá trình này với số nguyên thập phân mới này cho đến khi chúng ta thấy một chu kỳ, tức là cho đến khi một số nguyên mà chúng ta đã thấy xuất hiện.

Ví dụ: với 15209chu kỳ

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

Một ví dụ khác, 505có chu kỳ ngắn

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

Nó chỉ ra rằng với bất kỳ N, các chu kỳ này sẽ luôn chứa chính xác 1 hoặc 4 số nguyên khác nhau. (Tôi sẽ để lại cho bạn để tìm hiểu lý do tại sao.) Điều thú vị là nếu bạn tính tổng tất cả các số nguyên riêng biệt trong một chu kỳ, bạn hầu như luôn nhận được một số nguyên thập phân chỉ bao gồm 2's và 0'.

Ví dụ: 15209 + 75403 + 95801 + 35607 = 222020.

N = 505 là một trong những trường hợp ngoại lệ. Số nguyên duy nhất trong chu kỳ là 505 nên tổng tổng là chính nó.

Dưới đây là tổng của các chu kỳ cho N = 1 đến 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

Chúng tôi sẽ gọi đây là Chuỗi tổng hợp chu kỳ của Bảy.

Thử thách

Viết chương trình hoặc hàm lấy số nguyên N thập phân dương và in hoặc trả về, theo số thập phân, số hạng tương ứng của Chuỗi tổng số chu kỳ của Bảy.

Ví dụ, nếu đầu vào là 95801, đầu ra phải là 222020. Nếu đầu vào là 505, đầu ra nên 505. Nếu đầu vào là 54, đầu ra nên 220.

Mã ngắn nhất tính bằng byte thắng.


1
Tất nhiên, nếu bạn lấy các số từ một chu kỳ và nhân chúng với bốn, bạn sẽ thấy rằng tất cả chúng đều cho các số có chữ số duy nhất là 2 và 0.
Peter Taylor

Câu trả lời:


1

Bình thường, 14 byte

s.uieM*R7jNTTQ

Không chắc chắn, tại sao mọi người xác định kết quả bằng cách nhìn vào các mẫu trong các số. Đơn giản chỉ cần thực hiện quá trình, tính toán tất cả các số của vòng tròn và tổng hợp chúng là ngắn hơn. Ít nhất là trong Pyth ;-)

Dùng thử trực tuyến: Trình diễn hoặc Test Suite

Btw, đây là câu trả lời golf thứ 200 của tôi. Vì vậy, bài đăng này kiếm cho tôi huy hiệu golf mã vàng.

Giải trình:

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

Mã ... chờ nó ... golf! :) Xin chúc mừng và sử dụng tốt.u
FryAmTheEggman

6

Python 2, 69 byte

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

Hàm này rất đơn giản để mô tả:

  • Nếu n chỉ gồm 0 và 5, thì không đổi.
  • Mặt khác, thay thế mỗi chữ số của n bằng 2, ngoại trừ 0 giữ 0 và giải quyết từ 0 đến cuối.

Việc chơi golf có thể được cải thiện, tôi chủ yếu đăng bài để chia sẻ phương pháp. Một ngôn ngữ với regex bản địa sẽ cho phép một giải pháp ngắn.

Một tuyên bố thay thế của chức năng là

  • Trong n, thay thế mỗi chữ số bằng 5, ngoại trừ 0 giữ nguyên là 0
  • Nếu điều này thay đổi n (nó có một chữ số khác 0 hoặc 5), nhân kết quả với 4

4

Python 2, 63 byte

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

Đối số đầu vào dự kiến ​​là một chuỗi.


1
Wow, tôi không có ý tưởng striphành xử theo cách này.
xsot

Thôi nào, chuyển đổi loại (chuỗi & harr; số) là một phần đáng kể của niềm vui (tức là độ dài mã; o)!
charlie

4

CJam, 16 byte

Sử dụng cùng một thuật toán như mọi người khác:

r_50s-{:~2fe&0}&

Bộ thử nghiệm. (Tạo tất cả kết quả từ 1 đến đầu vào.)

Giải trình

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 byte

Sử dụng phương pháp của xnor :

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

Đã lưu 3 byte nhờ @charlie !

Giải trình

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

Kiểm tra

Phương thức ngây thơ, 102 byte

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 byte:n=>/[^05]/.test(n)?`${n}0`.replace(/./g,d=>+d&&2):n
charlie

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

1
@charlie Wow, s*4thủ thuật đó thật tuyệt vời! Tôi nghĩ bạn nên đăng bài này như một câu trả lời riêng biệt bởi vì phương pháp này đủ khác biệt và nó ngắn hơn tôi rất nhiều. :)
user81655

ok, tôi sẽ khiêm tốn; o)
charlie

2

Toán học, 83 77 60 ký tự

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

Bị đánh cắp

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

2

JavaScript (ES5), 40 byte

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

Đó là một sự phát triển của giải pháp của người dùng81655 , sử dụng phương pháp thay thế được mô tả bởi xnor .

Giải trình

Tổng của một chữ số khác không trong 4 chu kỳ luôn là 20, vì các chữ số quay vòng qua 1 → 7 → 9 → 3 hoặc 2 → 4 → 8 → 6 hoặc 5 → 5 → 5 → 5. Vì vậy, thay thế mỗi chữ số như vậy bằng 5 không thay đổi tổng.

Hành động thay thế đó được sử dụng lại để phân biệt 4 chu kỳ với 1 chu kỳ - nếu kết quả thay thế khác với đầu vào, thì đó là 4 chu kỳ, nếu không thì đó là 1 chu kỳ.

NB: Chuỗi mẫu `${n}`chỉ dành cho khả năng đọc, (n+'')có cùng độ dài.


không có biểu thức chính quy - 47 byte:n=>(s=[...`${n}`].map(d=>+d&&5).join``)^n?s*4:n
charlie

0

sed, 26 byte

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

(Một cách khác để thực hiện phương pháp "thay thế bằng 2".)

Ví dụ

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 byte

{[+] $^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

Đây chắc chắn là cách sai để làm điều này, nếu số chỉ bao gồm 5s và 0s, nó sẽ trả về một đối tượng Match, nếu không, nó sẽ thay thế mọi thứ trừ 0một 2, và nối thêm 0vào cuối.
(Đối tượng Match sẽ hoạt động như một số nếu bạn sử dụng nó làm một)

Mặc dù vì nó làm sai, nhưng nó dễ dàng chỉ ra các số hiếm bằng cách gọi gistphương thức.

sử dụng:

# 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)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.