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 15209
staje się, 75403
ponieważ 1
mapy do 7
, 5
mapy do 5
, 2
mapy do 4
, 0
mapy do 0
i 9
mapy 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, 15209
otrzymujemy cykl
15209 -> 75403 -> 95801 -> 35607 -> 15209 -> repeats...
^
|
cycle restarts here
Jako kolejny przykład 505
ma 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.
źródło
Odpowiedzi:
Pyth, 14 bajtów
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:
źródło
.u
Python 2, 69 bajtów
Funkcja jest łatwa do opisania:
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
źródło
Python 2, 63 bajty
Argument wejściowy powinien być ciągiem.
źródło
strip
że tak się zachowuję.CJam, 16 bajtów
Używając tego samego algorytmu jak wszyscy inni:
Zestaw testowy. (Generuje wszystkie wyniki od 1 do wejścia.)
Wyjaśnienie
źródło
JavaScript (ES6),
5451 bajtówZa pomocą metody xnor :
Zaoszczędzono 3 bajty dzięki @charlie !
Wyjaśnienie
Test
Pokaż fragment kodu
Metoda naiwna, 102 bajty
Pokaż fragment kodu
źródło
n=>/[^05]/.test(n)?`${n}0`.replace(/./g,d=>+d&&2):n
n=>n-(s=`${n}`.replace(/[^0]/g,5))?s*4:n
s*4
sztuczka 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. :)Mathematica,
837760 znakówBez golfa
źródło
JavaScript (ES5), 40 bajtów
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ść.źródło
n=>(s=[...`${n}`].map(d=>+d&&5).join``)^n?s*4:n
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
źródło
Perl 6 ,
68 55 53 3633 bajtówJest to zdecydowanie zły sposób, aby to zrobić, jeśli liczba składa się tylko z
5
s i0
s zwróci obiekt Dopasuj, w przeciwnym razie zastąpi wszystko oprócz0
a2
i dopisze a0
na 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
gist
metody.stosowanie:
źródło