Sekwencja sumy siedmiu cykli

17

Spójrz na tabliczkę mnożenia siódemek od 7 × 0 do 7 × 9:

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

Jeśli popatrzymy tylko na cyfry na swoim miejscu, otrzymamy permutację cyfr od 0 do 9:

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

Zastanów się nad wzięciem dodatniej liczby całkowitej dziesiętnej N i zastąpieniem każdej cyfry D w N cyfrą w miejscu 7 × D.

Na przykład 15209staje się, 75403ponieważ 1mapy do 7, 5mapy do 5, 2mapy do 4, 0mapy do 0i 9mapy do 3.

Teraz powtórzmy ten proces z nową liczbą całkowitą dziesiętną, dopóki nie zobaczymy cyklu, tj. Dopóki nie pojawi się liczba, którą już widzieliśmy.

Na przykład, 15209otrzymujemy cykl

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

Jako kolejny przykład 505ma krótki cykl

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

Okazuje się, że dla dowolnego N cykle te zawsze będą zawierać dokładnie 1 lub 4 różne liczby całkowite. (Zostawię to tobie, aby dowiedzieć się, dlaczego tak jest.) Co ciekawe, jeśli zsumujesz wszystkie odrębne liczby całkowite w cyklu, prawie zawsze otrzymasz dziesiętną liczbę całkowitą, która składa się tylko z 2„i 0”.

Na przykład 15209 + 75403 + 95801 + 35607 = 222020.

N = 505 jest jednym z wyjątków. Jedyną liczbą całkowitą w cyklu jest 505, więc całkowita suma to sama 505.

Oto sumy cykli dla N = 1 do 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

Nazwiemy to Sekwencją Sumy Cyklu Siedmiu.

Wyzwanie

Napisz program lub funkcję, która przyjmuje dodatnią liczbę całkowitą dziesiętną N i wypisuje lub zwraca dziesiętnie odpowiedni termin z Sekwencji sumy cykli siedmiu.

Na przykład, jeśli wejście jest 95801, wyjście powinno być 222020. Jeśli wejście jest 505, wyjście powinno być 505. Jeśli wejście jest 54, wyjście powinno być 220.

Najkrótszy kod w bajtach wygrywa.

Hobby Calvina
źródło
1
Oczywiście, jeśli weźmiesz liczby z pojedynczych cykli i pomnożysz je przez cztery, przekonasz się, że wszystkie dają liczby, których jedynymi cyframi są 2 i 0.
Peter Taylor

Odpowiedzi:

1

Pyth, 14 bajtów

s.uieM*R7jNTTQ

Nie jestem pewien, dlaczego wszyscy określają wynik, patrząc na wzory w liczbach. Po prostu wykonanie tego procesu, obliczenie wszystkich liczb koła i ich podsumowanie jest krótsze. Przynajmniej w Pyth ;-)

Wypróbuj online: pakiet demonstracyjny lub testowy

Przy okazji, to moja 200. odpowiedź na kod-golfa. Więc ten post daje mi złotą odznakę golfa.

Wyjaśnienie:

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
Jakube
źródło
Kod ... poczekaj na to ... golf! :) Gratulacje i miłego użycia.u
FryAmTheEggman
6

Python 2, 69 bajtów

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

Funkcja jest łatwa do opisania:

  • Jeśli n składa się tylko z zer i 5, wyprowadza je bez zmian.
  • W przeciwnym razie zamień każdą cyfrę n na 2, z wyjątkiem tego, że 0 oznacza 0, i zaznacz wartość 0 do końca.

Gra w golfa może być ulepszona, głównie publikuję, aby podzielić się tą metodą. Język z natywnym wyrażeniem regularnym powinien umożliwiać krótkie rozwiązanie.

Alternatywnym wyrażeniem funkcji jest

  • In n zamień każdą cyfrę na 5, z wyjątkiem 0 pozostaje jako 0
  • Jeśli zmieniło się to n (miał cyfrę inną niż 0 lub 5), należy pomnożyć wynik przez 4
xnor
źródło
4

Python 2, 63 bajty

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

Argument wejściowy powinien być ciągiem.

feersum
źródło
1
Wow, nie miałem pojęcia, stripże tak się zachowuję.
xsot,
Daj spokój, konwersje typów (string & harr; number) są istotną częścią zabawy (tj. Długość kodu; o)!
Charlie
4

CJam, 16 bajtów

Używając tego samego algorytmu jak wszyscy inni:

r_50s-{:~2fe&0}&

Zestaw testowy. (Generuje wszystkie wyniki od 1 do wejścia.)

Wyjaśnienie

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.
}&
Martin Ender
źródło
3

JavaScript (ES6), 54 51 bajtów

Za pomocą metody xnor :

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

Zaoszczędzono 3 bajty dzięki @charlie !

Wyjaśnienie

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

Test

Metoda naiwna, 102 bajty

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

użytkownik 81655
źródło
51 bajtów:n=>/[^05]/.test(n)?`${n}0`.replace(/./g,d=>+d&&2):n
charlie,
1
40 bajtów:n=>n-(s=`${n}`.replace(/[^0]/g,5))?s*4:n
charlie,
1
@charlie Wow, ta s*4sztuczka jest niesamowita! Uważam, że powinieneś zamieścić to jako osobną odpowiedź, ponieważ metoda jest wystarczająco inna i jest o wiele krótsza niż moja. :)
user81655
ok, pokornie to zrobię; o)
charlie
2

Mathematica, 83 77 60 znaków

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

Bez golfa

Tr@
  Union@
   NestList[
    FromDigits@Mod[7 IntegerDigits@#, 10] &,
    #,
    4
   ] &
shrx
źródło
2

JavaScript (ES5), 40 bajtów

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

To ewolucja user81655 , wykorzystująca alternatywne podejście opisane przez xnor .

Wyjaśnienie

Suma niezerowej cyfry w cyklu 4 wynosi zawsze 20, ponieważ cyfra przechodzi przez 1 → 7 → 9 → 3 lub 2 → 4 → 8 → 6 lub 5 → 5 → 5 → 5. Zatem zamiana każdej takiej cyfry na 5 nie zmienia sumy.

To działanie zastępcze jest ponownie wykorzystywane do odróżnienia cyklu 4 od cyklu 1 - jeśli wynik zamiany różni się od wartości wejściowej, to jest to cykl 4, w przeciwnym razie jest to cykl 1.

Uwaga: Ciąg szablonu `${n}`jest tylko dla czytelności, (n+'')ma tę samą długość.

Charlie
źródło
brak wyrażenia regularnego - 47 bajtów:n=>(s=[...`${n}`].map(d=>+d&&5).join``)^n?s*4:n
charlie
0

sed, 26 bajtów

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

(Kolejne podejście do metody „zamień na 2”).

Przykłady

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

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

Charlie
źródło
0

Perl 6 ,  68 55 53 36  33 bajtów

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

Jest to zdecydowanie zły sposób, aby to zrobić, jeśli liczba składa się tylko z 5s i 0s zwróci obiekt Dopasuj, w przeciwnym razie zastąpi wszystko oprócz 0a 2i dopisze a 0na końcu.
(Obiekt Match zachowuje się jak liczba, jeśli użyjesz go jako jednego)

Chociaż robi to źle, ułatwia wskazanie rzadkich numerów poprzez wywołanie gistmetody.

stosowanie:

# 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)
Brad Gilbert b2gills
źródło