Stwórzmy system liczb, w którym największa cyfra w n-tym miejscu wartości (licząc od prawej do lewej) o długości liczby m jest zawsze równa m - n + 1. Na przykład największa 5-cyfrowa liczba wyrażalna w tym systemie jest napisany 12345. Poza liczbą cyfr dostępnych do użycia w określonym miejscu, które jest ograniczone, wszystkie inne przyrosty są standardowe. Mianowicie, gdy cyfra ma przekroczyć limit cyfr, dodajemy ją do następnej cyfry.
Oto jak liczenie byłoby reprezentowane w tym systemie:
1; 10; 11; 12; 100; 101; 102; 103; 110; 111; 112; 113; 120; 121; 122; 123; 1000; 1001 ...
Twoim zadaniem jest napisanie funkcji, która pobierze standardową liczbę podstawową 10 i przekształci ją w mój system numeracji.
Preferowany jest krótszy kod. Bonne Chance!
** Jeśli potrzebujesz cyfr po 9 (powinieneś), możesz użyć liter lub możesz zwrócić 2-cyfrową liczbę jako element listy.
Przypadki testowe
10 -> 111
20 -> 1003
30 -> 1023
50 -> 1123
100 -> 10035
23116 -> 1234567
21977356 -> 123456789A
Ostatni przypadek może być niewiarygodnie powolny, w zależności od sposobu wdrożenia. Nie musisz go uruchamiać, jeśli trwa to zbyt długo lub zużywa zbyt dużo pamięci. Należy jednak pamiętać, że istnieją sposoby na szybkie uruchomienie i użycie niewielkiej ilości pamięci.
źródło
100 -> 10035
raczej100 -> 10033
, czy możesz to zweryfikować?Odpowiedzi:
Mathematica, 64 bajty
Nienazwana funkcja przyjmująca dodatni argument liczby całkowitej i zwracająca listę liczb całkowitych.
Join[{{1}},Array[Range,#-1,3]-1]
zwraca listę zagnieżdżoną{ {1}, {0,1,2}, {0,1,2,3}, ..., {0,1,...,#} }
. NastępnieTuples
zwraca (posortowany) zestaw wszystkich krotek, w których znajduje się pierwszy element, w{1}
których znajduje się drugi element{0,1,2}
i tak dalej; są to#
numery cyfrowe w tym systemie numeracji.Join@@Array[...,#]
zwraca tablicę wszystkich liczb w tym systemie numeracji z najwyżej#
cyframi iPart[...,#]
wyodrębnia tę#
liczbę.To jest beznadziejnie powolne! Działa poprawnie do wejściowego aż do 9. W przypadku większych wejścia, test go zastępując koniec
,#],#]&
z,Ceiling[0.9Log[#]]],#]&
; nakłada to bardziej realistyczny pułap na liczbę cyfr potrzebną do przejścia wystarczająco daleko w systemie numeracji, aby znaleźć tę, której chcemy.źródło
Mathematica, 93 bajty
Czysta funkcja z pierwszym argumentem
#
. Jeśli podana jest nieujemna liczba całkowita, wyświetli ona prawidłową listę cyfr (nawet0
poprawnie się obsługuje !).Wyjaśnienie
Nest[f,expr,n]
daje wynik zastosowaniaf
doexpr
n
czasów. W tym przypadkuexpr
jest to lista{0}
in
wejściowa liczba całkowita#
. Funkcjaf
jest skomplikowana:źródło
y___,z_:0
celu zwiększenia długości listy!Perl 6 , 38 bajtów
Pobiera dodatnią liczbę całkowitą i wyświetla listę liczb całkowitych reprezentujących cyfry.
Wyjaśnienie:
źródło
Pyth - 14 bajtów
Zwraca po prostu
nth
wartość pasującą do „wzorca wartości mniejszej niż miejsce”.Pakiet testowy .
źródło
2018967
, gdzie ostatnia cyfra wynosi 10?Haskell, 65 bajtów
i
zwiększa liczby w systemie liczbowym o cyfry w odwrotnej kolejności.iterate
tworzy nieskończoną listę wszystkich tych liczb, zaczynając od zera, który jest reprezentowany przez[]
. Następnie pozostaje tylko wziąć!!
żądaną liczbę ireverse
to.Ostatni wiersz jest funkcją, a nie definicją funkcji, więc nie może pojawić się tak, jak w pliku kodu źródłowego. Zamiast tego umieść tylko inne wiersze w kodzie źródłowym i użyj ostatniego wiersza w tłumaczu (lub powiąż funkcję z nazwą, przechodząc
f=
do ostatniego wiersza).Przykładowe zastosowanie:
(8 bajtów można by zapisać, gdyby
[5,3,0,0,1]
były dozwoloną reprezentacją wyniku).źródło
Haskell, 49 bajtów
Pierwszy wiersz jest definicją pomocniczą, a drugi stanowi funkcję. Pobiera liczbę całkowitą i zwraca listę liczb całkowitych. Wypróbuj online!
Wyjaśnienie
Definiuję
x
jako nieskończoną listę przedstawień wymienionych w tekście wyzwania; główna funkcja po prostu zmniejsza swój argument i indeksuje dox
. Pierwszy wiersz działa w następujący sposób:Widzisz, że
x
jest to zdefiniowane samo w sobie, ale Haskell jest leniwy, więc to nie jest problem.źródło