Послідовність суми циклу семи


17

Погляньте на таблицю множення сьомих від 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і 9карти в3 .

Тепер давайте повторюємо цей процес з цим новим десятковим цілим числом, поки ми не побачимо цикл, тобто поки не з’явиться ціле число, яке ми вже бачили.

Наприклад, 15209ми отримуємо цикл

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

Як інший приклад 505- короткий цикл

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

Виявляється, для будь-якого N ці цикли завжди будуть містити рівно 1 або 4 різних цілих числа. (Я залишу це для вас, щоб розібратися, чому це так.) Що цікаво, що якщо підсумовувати всі цілі цілі числа в циклі, ви майже завжди отримуєте десятковий ціле число, яке складається лише з 2s і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. Якщо вхід є 54, вихід повинен бути 220.

Виграє найкоротший код у байтах.


1
Звичайно, якщо взяти числа з одноциклів і помножити їх на чотири, ви побачите, що всі вони дають числа, єдині цифри яких 2 і 0.
Пітер Тейлор

Відповіді:


1

Піт, 14 байт

s.uieM*R7jNTTQ

Не впевнений, чому всі визначають результат, дивлячись на візерунки в числах. Просто виконати процес, обчислити всі числа кола і підсумувати їх коротше. Принаймні в Pyth ;-)

Спробуйте в Інтернеті: Демонстрація або Тестовий набір

До речі, це моя відповідь на 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
повагою

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 до кінця.

Гольф можна вдосконалити, я здебільшого публікую, щоб поділитися методом. Мова з рідною виразкою повинна дозволити коротке рішення.

Альтернативним твердженням функції є

  • У 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)!
Чарлі

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 байт:n=>/[^05]/.test(n)?`${n}0`.replace(/./g,d=>+d&&2):n
Чарлі

1
40 байт:n=>n-(s=`${n}`.replace(/[^0]/g,5))?s*4:n
Чарлі

1
@charlie Вау, цей s*4трюк приголомшливий! Я вважаю, що ви повинні опублікувати це як окрему відповідь, оскільки метод досить інший і він набагато коротший, ніж мій. :)
користувач81655

ок, я смиренно буду; о)
Чарлі

2

Математика, 83 77 60 символів

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

Безумовно

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+'')має однакову довжину.


no regexp - 47 байт:n=>(s=[...`${n}`].map(d=>+d&&5).join``)^n?s*4:n
charlie

0

sed, 26 байт

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

(Ще один прийом "замінити двома".)

Приклади

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

Це, безумовно, неправильний спосіб зробити це, якщо число складається лише з 5s і 0s, воно поверне об'єкт Match, інакше він замінить усе, але 0не 2, і додасть a 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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.