Rozważ dodatnie liczby całkowite równe pięciu w systemie dziesiętnym. Oto pierwsze 25, wyrównane do prawej:
X 5^X
1 5
2 25
3 125
4 625
5 3125
6 15625
7 78125
8 390625
9 1953125
10 9765625
11 48828125
12 244140625
13 1220703125
14 6103515625
15 30517578125
16 152587890625
17 762939453125
18 3814697265625
19 19073486328125
20 95367431640625
21 476837158203125
22 2384185791015625
23 11920928955078125
24 59604644775390625
25 298023223876953125
Zauważ, że prawa kolumna wszystkich praw znajduje się po prawej stronie 5
. Druga kolumna po prawej to wszystko 2
. Trzecia kolumna z prawej strony, czytane od góry do dołu, zastępców 1
, 6
, 1
, 6
, itd. Kolejna kolumna zaczyna 3
, 5
, 8
, 0
a następnie cykle.
W rzeczywistości każda kolumna (jeśli schodzimy wystarczająco daleko) ma sekwencję cykliczną cyfr, których długość jest dwa razy większa niż w poprzednim cyklu, z wyjątkiem cykli początkowych 5
i 2
cyklicznych.
Po wywołaniu N numeru kolumny, zaczynając od N = 1 po prawej stronie, pierwsze kilka cykli to:
N cycle at column N
1 5
2 2
3 16
4 3580
5 17956240
6 3978175584236200
7 19840377976181556439582242163600
8 4420183983595778219796176036355599756384380402237642416215818000
Wyzwanie
Biorąc pod uwagę dodatnią liczbę całkowitą N, wypisz cyfry dziesiętne cyklu w kolumnie N, jak opisano powyżej. Na przykład wyjście dla N = 4 byłoby 3580
.
Cyfry mogą być wyprowadzane jako lista taka jak [3, 5, 8, 0]
lub w innym rozsądnym formacie, o ile:
- Cyfry są uporządkowane w kolejności od góry do dołu w kolumnach mocy. np.
0853
jest nieprawidłowy. - Cykl rozpoczyna się od najwyższej liczby w kolumnie mocy. np.
5803
jest nieprawidłowy, ponieważ 4. kolumna zaczyna się od „3
nie”5
. - Dokładnie jeden cykl jest generowany. np.
358
lub35803
lub35803580
wszystkie byłyby nieprawidłowe.
Twój kod musi działać przez co najmniej N = 1 do 30.
W razie potrzeby można założyć, że kolumny są indeksowane 0 zamiast 1 indeksowane. Więc N = 0 daje 5
, N = 1 daje 2
, N = 2 daje 16
, N = 3 daje 3580
itd.
Najkrótszy kod w bajtach wygrywa .
2^(N-2)
z wyjątkiemN = 1
Odpowiedzi:
Python 2,
626158 bajtówZero. Zakładam, że przyrostki L są dopuszczalne.
Wynik:
Poprzednie rozwiązanie:
Wyjaśnienie:
range(2**n/2)
Wykorzystuje spostrzeżenie, że każdy cykl ma długość r = 2 n-1 , z wyjątkiem, gdy n = 0, to po prostu obliczać cyfry n-tej do 5 m do 5 m + n - 1 .Początek cyklu 5 m jest pierwszą liczbą większą niż 10 n . Rozwiązanie 5 m ≥ 10 n daje m ≥ n / log 10 5. Tutaj przybliżamy log 10 5 ≈ 0,7, który rozkłada się, gdy n = 72. Możemy dodać więcej cyfr, aby zwiększyć dokładność:
W
/ 10**n % 10
pętli po prostu wyodrębnij żądaną cyfrę. Inne alternatywne rozwiązanie wykorzystuje manipulację ciągiem. Użyłem tej sztuczki~n == -n-1
, aby usunąć 1 bajt.Wspomniane w komentarzu wyrażenie
5**(m+i) / 10**n
można jeszcze bardziej uprościć, co daje obecną 58-bajtową odpowiedź.(Podziału
x/2**n
można dokonać za pomocą bitowego przesunięcia w prawox>>n
. Niestety, ze względu na pierwszeństwo operatora Pythona nie oszczędza to żadnych bajtów.) Ułamek 3/7 można również poprawić w podobnym mannar:źródło
(5**(n*3/7-~i)>>n)%10
. Ponieważ bierzesz moc 5 podzieloną przez (mniejszą) moc 10, możesz zmniejszyć moc 5 i zamiast tego przesunąć w prawo.n/.7 - n
→n*10/7 - n
→n*3/7
. Przede wszystkim wyodrębnia cyfry z najmniejszej potęgi 5 większej niż 2ⁿ (z 3/7 przybliżeniem dla 1 / log₂ (5) ). Również użycierange(2**n/2or 1)
zamiast tego zapewni spójny wynik.(x>>n)%10
nie daje żadnej poprawy w stosunku do tego,x/2**n%10
więc na razie nie używam przesunięcia bitowego, ponieważ być może istnieje sposób, aby rozliczyć to, co wspólne2**n
.2**n
, wydaje się jednak nieco dłuższy:int(5**(-~i-n*log(2,5)%1))%10
(uprościłemint(n*log(2,5))-n*log(2,5)
jako-(n*log(2,5)%1)
).2**n
argument tu i zakres.dc , 72 bajty
Indeksowanie na podstawie 0.
Wykorzystuje to dokładną arytmetykę liczb całkowitych - brak aproksymacji logarytmu. Będzie działać do pojemności pamięci komputera.
Wypróbuj program DC online!
Kod DC można przekształcić w rozwiązanie Bash:
Narzędzia Bash + GNU,
967775 bajtówWypróbuj wersję Bash online!
źródło
Mathematica,
666052 bajtówFunkcja anonimowa, indeksowana 0. Wykorzystuje aproksymację log5 (10) (≈ 0,7)
Jak to działa?
Weź większy z 2 ^ (dane wejściowe) / 2 i 1. Wygeneruj {1… ten numer}
Dodaj wejście / .7
Podnieś 5 do potęgi wyniku (moce generujące 5), podziel przez 10 ^ danych wejściowych (pozbywając się cyfr po prawej stronie żądanej kolumny)
Zastosuj modulo 10, biorąc cyfrę jednej (żądaną kolumnę).
Dokładna wersja, 58 bajtów
źródło
JavaScript (ES7),
7876 bajtów0-indeksowany, tzn .
f(0)
Daje2
.Testowy fragment kodu
Pokaż fragment kodu
Fragment używa
Math.pow
zamiast**
kompatybilności z różnymi przeglądarkami.źródło
CJam, 35
Wypróbuj online
Zajmuje mało miejsca i nie jest zbyt wolny, wejście danych 30 na moim komputerze zajęło kilka minut (używając interpretera Java).
źródło
Galaretka ,
2621 bajtów-2 bajtów wykorzystujące kennytm za 0,7 aproksymacji pomysł
Wypróbuj online! (przekroczony limit czasu dla n> 15 )
Zwraca listę liczb całkowitych, cyfr.
Zero oparty. Teoretycznie działa dla n <= 72 (zamiast
.7
z5l⁵¤
, aby uzyskać precyzję obliczeń zmiennoprzecinkowych).W jaki sposób?
Lokalnie: pamięć zestawu roboczego dla n = 17 wzrosła do około 750 MB, a następnie do około 1 GB ; dla n = 18 powoli osiągnął 2,5 GB, a następnie zwiększył się do około 5 GB .
źródło
Perl 6 , 52 bajtów
Działa dla dowolnie wysokich danych wejściowych, przy wystarczającej pamięci (tzn. Bez aproksymacji logarytmu) .
Zwraca listę cyfr.
Wypróbuj online!
Jak to działa
Część „pomijanie elementów” działa w następujący sposób:
//
jest operatorem „zdefiniowanym lub”.|()
zwraca pusty Slip , który rozpuszcza się na liście zewnętrznej jako 0 elementów, zasadniczo upewniając się, że bieżący element zostanie pominięty.Przypadek brzegowy
n=1
działa dobrze, ponieważ2**n/4
staje się0.5
i^(0.5)
oznacza0 ..^ 0.5
aka „liczby całkowite od 0 (włącznie) do 0,5 (nie włącznie)”, tj. Lista z pojedynczym elementem 0.źródło
J, 50 bajtów
Uwaga: musi przejść w rozszerzonej liczbie
Stosowanie:
źródło
Haskell , 73 bajty
Wypróbuj online! Wykorzystuje indeksowanie 0.
Wyjaśnienie:
źródło
Partia, 294 bajty
Wysyła każdą cyfrę we własnym wierszu. Działa, obliczając moce 5 długodystansowych, ale działa tylko z
N=33
powodu 32-bitowych liczb całkowitych, aby śledzić liczbę cyfr do wydrukowania.s
zawiera (odwrócone) ostatnieN
cyfry bieżącej mocy 5, podczas gdyt
zawierax
s używane jako wypełnienie, chociażx=0
powoduje, że obliczają je jako zero przy obliczaniu następnej mocy. Przykład dlaN=4
:źródło
JavaScript (ES6), 73 bajty
1-indeksowany. Nieco krótszy niż odpowiedź ES7 , ale zawodzi 3 kroki wcześniej (przy N = 13).
Próbny
Pokaż fragment kodu
źródło
PHP> = 7,1, 104 bajtów
PHP Sandbox Online
źródło