Cyfrowy pierwiastek (również powtarzana suma cyfrowa) dodatniej liczby całkowitej jest wartością (pojedynczej cyfry) uzyskaną w wyniku iteracyjnego procesu sumowania cyfr, na każdej iteracji z wykorzystaniem wyniku z poprzedniej iteracji do obliczenia sumy cyfrowej. Proces ten trwa do momentu uzyskania liczby jednocyfrowej.
Na przykład cyfrowy pierwiastek z 65536 wynosi 7 , ponieważ 6 + 5 + 5 + 3 + 6 = 25 i 2 + 5 = 7 .
Sortowanie wszystkich cyfrowych pierwiastków nie ma większego sensu, ponieważ zaczynałoby się od nieskończenie wielu 1 s.
Zamiast tego utworzymy listy wszystkich jednocyfrowych liczb całkowitych wraz z cyfrowymi pierwiastkami, następnie wszystkie dwucyfrowe liczby wraz z cyfrowymi pierwiastkami, a następnie potrójne, poczwórne i tak dalej.
Teraz dla każdej z tych list posortujemy ją tak, aby najpierw pojawiły się wszystkie liczby całkowite z cyfrowymi pierwiastkami 1 , a następnie wszystkie liczby całkowite z cyfrowymi pierwiastkami 2 i tak dalej. Sortowanie będzie stabilne, więc lista liczb całkowitych z pewnymi cyfrowymi pierwiastkami powinna być posortowana rosnąco po sortowaniu.
Na koniec połączymy te listy w jedną sekwencję. Ta sekwencja rozpocznie się od wszystkich liczb jednocyfrowych, następnie wszystkich liczb dwucyfrowych (posortowanych według cyfrowego pierwiastka), a następnie wszystkich liczb potrójnych i tak dalej.
Wyzwanie:
Weź jako liczbę całkowitą dodatnią n i wyślij n -tą liczbę w sekwencji opisanej powyżej. Możesz wybrać, czy lista ma wartość 0 - indeks 1 - indeks.
Sekwencja wygląda następująco:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 19, 28, 37, 46, 55, 64, 73, 82, 91, 11, 20, 29 ...
72, 81, 90, 99, 100, 109, 118, ...
981, 990, 999, 1000, 1009, 1018, 1027, ...
Przypadki testowe:
Przypadki testowe są indeksowane 1.
n f(n)
9 9
10 10
11 19
40 13
41 22
42 31
43 40
44 49
45 58
600 105
601 114
602 123
603 132
604 141
605 150
4050 1453
4051 1462
4052 1471
4053 1480
4054 1489
4055 1498
Łatwiej kopiować:
n = 9, 10, 11, 40, 41, 42, 43, 44, 45, 600, 601, 602, 603, 604, 605, 4050, 4051, 4052, 4053, 4054, 4055,
f(n) = 9, 10, 19, 13, 22, 31, 40, 49, 58, 105, 114, 123, 132, 141, 150, 1453, 1462, 1471, 1480, 1489, 1498
Wyjaśnienia:
- Nie możesz wyprowadzać wszystkich n pierwszych elementów. Wyprowadzisz tylko n -ty.
- Kod musi teoretycznie działać dla wszystkich liczb całkowitych do 10 ^ 9 , ale jest OK, jeśli przekroczy limit czasu dla TIO (lub innych interpreterów z ograniczeniami czasowymi) dla danych wejściowych większych niż 999 .
- Wyjaśnienia są zachęcane.
To gra w golfa , więc wygrywa najkrótszy kod w każdym języku! Nie zniechęcaj się innymi rozwiązaniami w języku, w którym chcesz grać w golfa, nawet jeśli są one krótsze niż możesz sobie poradzić!
Odpowiedzi:
Python 2 ,
7860524645 bajtów-6 bajtów dzięki GB .
-1 bajt dzięki Jakob .
Wypróbuj online!
W końcu osiągnął formę zamkniętą, indeksowaną 1.
Python 2 , 78 bajtów
0-indeksowane.
Wypróbuj online!
źródło
Python 3 , 80 bajtów
Wypróbuj online!
1-indeksowany. To jest najlepsze, co mogłem zarządzać w Pythonie 3 (no oprócz 78-byter , który jest portem mojego rozwiązania Python 2 poniżej; myślę, że ten jest jednak znacznie fajniejszy). Pełne programy w języku Python 2 są korzystne dla tego konkretnego wyzwania, ponieważ
input()
wymagają konwersji naint
język Python 3 (+5 bajtów),exec
jest funkcją, a nie instrukcją (+2 bajty) i/
domyślnie wykonuje dzielenie liczb całkowitych, jeśli jej argumentami są liczby całkowite w Py 2 (+1 bajt), więc jest to zdecydowanie krótszy czas niż przeniesienie odpowiedzi ovs .Jak to działa
Ustawiać
Definiuje funkcji rekurencyjnej F , które zajmuje jedną liczbę argumentów ı i drugiego, k , domyślnie jest to 1 . Podczas gdy k ≤ i , funkcja f zwraca f (i, 10k) , mnożąc k przez 10 za każdym razem, aż stanie się większe niż i .
Zakres docelowy i poprawne indeksowanie
Po tym zestawie operacji pozostaje nam i , początkowe dane wejściowe i zmienna k, która reprezentuje najmniejszą moc 10 większą od i . W ten sposób jesteśmy w stanie wygenerować zakres (liczba całkowita) [floor (k / 10), k) , który zasadniczo obejmuje wszystkie liczby całkowite, które są:
Ponieważ pomijamy liczby całkowite mniejsze niż x = floor (k / 10) , musimy przesunąć indeksowanie, aby uwzględnić brakujące liczby. Oczywistym sposobem jest odjęcie ich liczby x od i , abyśmy indeksowali się do listy (po sortowaniu, co opisano poniżej), a zatem ix . Jednakże, ponieważ lista zawiera 9K / 10 , pozycji i indeksowanie na liście w indeksie -y jakiegoś pozytywnego y daje pręd th element z końca w Pythonie, to jest po prostu odpowiednikiem indeksowania z ik , stąd oszczędność 4 bajty.
Sortowanie każdej porcji według cyfrowego katalogu głównego
Wzór na funkcję cyfrowego pierwiastka to 1 + ((n-1) mod 9) (zobacz sekcję Wzór zgodności w tym artykule w Wikipedii ). Jako 1 będzie w ten sposób być dodawane do każdego z nich, to jest zbędne przy sortowaniu, więc jesteśmy w lewo z (n-1) mod 9 . Sposób działania
%
operatora Pythona, gdy podane są liczby ujemne na RHS, jest bardzo wygodny, ponieważ zamiast tego możemy użyć n pymod -9, aby zapisać jeszcze inny bajt.Python 2 , 72 bajty
Zainspirowany poddaniem się Chasa Browna .
Wypróbuj online!
źródło
Python 2 ,
737170 bajtówWypróbuj online!
2 bajty dzięki panu XCoder ; i 1 bajt dzięki za H.PWiz .
To jest indeksowane na 0.
źródło
i%9
powinno wystarczyć zamiasti%9+1
... w ten sposób pokonałeś moje 72 bajty: DD:len(`~i`)
powinno działaćGalaretka ,
15 14 109 bajtówWypróbuj online!
W jaki sposób?
Korzysta z golfowej wersji rozwiązania w zamkniętej formie stworzonego przez ovs w odpowiedzi na Pythona ...
Wzór naświetlany przez ovs to: 9 * (n% b) + (n / b) + b - 1 gdzie b = 10 piętro (log (n, 10))
Teraz jeśli c jest liczbą cyfr dziesiętnych n, to b-1 jest c-1 dziewiątkami dziesiętnymi.
Jest to to samo, co dziewięciokrotność wartości c-1 w systemie dziesiętnym (np
111*9=999
.).Ponadto n / b jest cyfrą wiodącą n, a n% b jest resztą cyfr jako liczba dziesiętna.
Formuła taka jak b * x + y może być zaimplementowana jako konwersja
[x,y]
z podstawy b(tj. B ^ 1 * x + b ^ 0 * y = b * x + y )
Jako taki możemy wziąć liczbę, n (na przykład
7045
), podzielić ją na cyfry wiodącą i końcową, umieszczając cyfrę wiodącą na końcu ([[0,4,5],7]
), dodać jedną do wszystkich cyfr pierwszego elementu, aby uwzględnić dodanie b-1 ([[1,5,6],7]
) konwertuje je z list dziesiętnych na liczby całkowite ([156,7]
) i konwertuje je z podstawy dziewięciu (1411
).W poniższej implementacji dodajemy jedną do wszystkich cyfr obu pozycji, uwzględniając catering b-1 (
[[0,4,5],8]
), konwertujemy z list dziesiętnych na liczby całkowite ([156,8]
), konwertujemy z podstawy dziewiątej (1412
), a następnie odejmujemy tę dodaną przez ten proces (1411
).Poprzedni, 14 bajtów:
Wypróbuj online!
Ta buduje listę do następnej potęgi 10 powyżej wejścia, sortując te liczby naturalne,
[digitalRoot, digitCount]
a następnie znajduje wartość na wprowadzonym indeksie.źródło
Haskell ,
9488 bajtówWypróbuj online! 0-indeksowane.
Wyjaśnienie:
Zrozumienie listy generuje sekwencję jako nieskończoną listę, w której indeksujemy
!!
:x
jest o jeden mniej niż bieżąca liczba cyfr i pochodzi z nieskończonej listy[0,1,2,3, ...]
i
iteruje w zakresie od1
do9
i służy do sortowania według cyfrowych pierwiastkówn
iteruje wszystkiex+1
cyfryuntil(<10)(sum.map(read.pure).show)
oblicza cyfrowy root ( zobacz wyjaśnienie tutaj )n
jest dodawany do listy, jeśli jego cyfrowy katalog główny jest równyi
.źródło
Siatkówka , 65 bajtów
Wypróbuj online! 1-indeksowany. Wyjaśnienie:
Zbuduj listę linii
_
od 0 do następnej potęgi 10 (wyłącznie).Posortuj je wszystkie w kolejności cyfrowej root.
Konwertuj z unarnego na dziesiętny.
Sortuj je według długości.
Wyodrębnij
n
element th.źródło
Pyth ,
36 31 25 24 2322 bajtów1-indeksowany.
Zestaw testowy!
Jak to działa (nieaktualne)
źródło
05AB1E ,
1911 bajtówPort mojej odpowiedzi w języku Python .
-6 bajtów (!) Dzięki Kevin Cruijssen .
Wypróbuj online!
źródło
g<°©÷¹®%9*®O<
. Oto wyjaśnienie, które zamierzałem opublikować .Pyth , 23 bajty
Wypróbuj tutaj.
-3 dzięki Mr. Xcoder
1-indeksowany.
źródło
Perl 6 ,
6858 bajtówPrzetestuj to w oparciu o 0
Przetestuj to 1
Rozszerzony:
źródło
Rubinowy ,
4338 bajtówWypróbuj online!
Pierwotnie port doskonałej odpowiedzi Pythona przez ovs, a następnie nieco uprościł.
źródło
Java 8, 68 bajtów
Nudny port odpowiedzi @ovs na Python 2 , więc pamiętaj, aby go zagłosować!
-1 bajt dzięki @Jakob
Wypróbuj online.
źródło
K4 , 38 bajtów
Rozwiązanie:
Przykłady:
Wyjaśnienie:
Rozwiązanie rozwiązania Jonathana Allana, gdy zabrakło mi pamięci, budując cyfrowe korzenie od 1 do 1e9.
Premia:
Tłumaczenie rozwiązania ovs jest prostsze, ale dłuższe:
źródło
Galaretka , 19 bajtów
Wypróbuj online!
-1 dzięki Mr. Xcoder .
1-indeksowany.
źródło
J, 24 bajty
To milczenie wyrażenie jest zawinięte w pareny, co oznacza, że powinno być traktowane samo, a nie jako część dowolnego następnego wyrażenia (jak argumenty).
Wyrażenie „] /:” porządkuje (rosnąco ”/:”) oryginalną tablicę „]” sumą „+ /” cyfr Wyrażenie
konwertuje liczbę na wektor znaków za pomocą „”: ”, a następnie stosuje odwrotność„ ”. - znak na cyfrę - stosowany do każdego elementu „&>”. Zatem 65536 -> „65536” -> 6 5 5 3 6.
Koniunkcja potęgi „^:” pod koniec wyrażenia stosuje kod, który właśnie wyjaśniliśmy (po lewej) określoną liczbę razy. W tym przypadku podana liczba razy to nieskończoność „_”, co oznacza kontynuowanie stosowania, aż wynik przestanie się zmieniać.
Ostatnie „0” oznacza zastosowanie całego wyrażenia po lewej stronie do każdego skalarnego (0-wymiarowego) elementu po prawej stronie, który byłby tablicą liczb, do której chcemy to zastosować.
źródło
Eliksir , 239 bajtów
Wypróbuj online!
Wyjaśnienie przychodzące (powoli)! Nie sądzę, że może być znacznie krótszy, ale zawsze jestem otwarty na sugestie
źródło
Perl 5
-pF
, 27 bajtówWypróbuj online!
Wykorzystuje formułę @ ovs i wyjaśnienia @ JonathanAllen, aby wymyślić ładny kompaktowy fragment kodu.
źródło