Muszę przygotować cyfry wykonane z tektury, aby wyświetlić pewną liczbę ( przykład ). Nie wiem z góry, którą liczbę powinienem wyświetlić - jedyne, co wiem, to że nie jest większa niż n
.
Ile cyfr kartonowych powinienem przygotować?
Przykład: n = 50
Aby wyświetlić dowolną liczbę z zakresu 0 ... 50, potrzebuję następujących cyfr:
- Zero do wyświetlania liczby 0 lub dowolnej innej okrągłej liczby
- Dwie kopie cyfr 1, 2, 3 i 4 do wyświetlania odpowiednich liczb
- Jedna kopia cyfr 5, 6, 7 i 8, w przypadku gdy pojawiają się jako najmniej znacząca cyfra w liczbie
- Cyfra 9 nigdy nie jest potrzebna, ponieważ zamiast tego mogę użyć odwróconej cyfry 6
Łącznie: 13 cyfr
Przypadki testowe (każdy wiersz to przypadek testowy w formacie „wejście; wyjście”)
0 1 1 2 9 9 11 10 50 13 99 17 100 18 135 19 531 22 1000 27 8192 34 32767 38
Odpowiedzi:
Galaretka , 9 bajtów
Wypróbuj online!
Jak to działa
źródło
0rDŒr€ẎQṪÞẎḟ9ĠẎL
.Python 2 , 49 bajtów
Wypróbuj online!
Niezdarna formuła arytmetyczna. Zakładać, że
n
pasuje doint
tak, abyL
nie było dołączane.Dzięki Neilowi za zaoszczędzenie 5 bajtów, wskazując, że nieużywanie 9 może być obsłużone przez zrobienie
n*9+8
zamiastn*9+9
, dzięki czemu, powiedzmy,999*9+8=8999
nie przechodzi na 9000.źródło
33333
wymaga pięciu 3, ale22222
wymaga tylko czterech.n*9
[0] jest kuszące, ale zawodzi w przypadku liczb zaczynających się od1
i mniej111..
.(n*9+8)/10**len(`n`)
aby tego uniknąćmin
.Haskell ,
11711410895898887848263 bajty6 bajtów zaoszczędzonych dzięki Laikoni
146 bajtów zapisanych dzięki nimWypróbuj online!
źródło
maximum[a,b]
jest taki sam jakmax a b
. 2.) Rozumienie listy jest często krótsze niżfilter
:max d$sum[1|x<-show a,x==b]
g
z pointfree funkcji dosłownym:sum.(#[-9..])
.length[x|x<-...]
jestsum[1|x<-...]
.g=
(ale być może chcesz dołączyć to do wersji TIO).Mathematica, 49 bajtów
źródło
JavaScript (ES6),
6053 bajtówRodzaj zhackowanego rozwiązania rekurencyjnego. Generuje to liczby wymagające dodania cyfry:
a następnie liczy, ile jest mniej niż danych wejściowych. Szczęśliwym cudem usunięcie cyfry
9
faktycznie usuwa kilka bajtów z funkcji, ponieważ sekwencję można następnie wygenerować w ten sposób (zakładając dzielenie liczb całkowitych):Musimy wziąć pod uwagę fakt, że liczby poniżej 10 nadal wymagają zera, ale jest to tak proste, jak dodanie
n > 9 ? 0 : 1
wyniku.Przypadki testowe
Pokaż fragment kodu
źródło
n>9^1
prawdopodobnie może byćn<10
true
wkład0
, więc jestem trochę niezdecydowany, aby to zrobić.0>9
jest fałszem,false^1
czy 1 ...?true
zamiast liczby1
.Partia, 67 bajtów
W standardowym sformułowaniu tego problemu potrzebujesz osobnych cyfr
6
i9
cyfr, ale nie musisz wyświetlać0
. Wraz ze wzrostem maksymalnejn
wymaganej wartości , liczba wymaganych cyfr rośnie za każdym razem, gdy osiągasz reprodukcję (ponieważ nie masz dość tej liczby) i za każdym razem, gdy osiągasz potęgę10
(kiedy potrzebujesz dodatkowego zera). W sumie każda potęga10
potrzebuje10
więcej cyfr niż poprzednia, którą można obliczyć jakofloor(log10(n))*10
. Dla wartościn
między potęgami 10 liczbę pośrednich powtórzeń można następnie obliczyć jakofloor(n/((10**floor(log10(n))*10-1)/9))
lub alternatywniefloor(n*9/(10**floor(log10(n))*10-1))
.Obliczam
floor(log10(n))
za pomocą pętli w pierwszym wierszu. Za każdym razem%2
zyskuje dodatkowy0
i%3
zyskuje dodatkowy-~
. Oznacza to, że10%2
jest10*10**floor(log10(n))
i%30
jestfloor(log10(n))
.Powielanie
6
i9
ma dwa efekty: po pierwsze,9
dla każdej potęgi wymagane są tylko cyfry10
, a po drugie wykrywanie repdigit musi zignorować9
reprodukcje. Na szczęście, ponieważ są one o jedną moc mniejszą niż 10, można to osiągnąć, modyfikując formułęfloor((n*9+8)/(10**floor(log10(n))*10))
.Radzenie sobie z zerem jest dość proste: wymaga to tylko dodatkowej cyfry, kiedy
n<10
npfloor(log10(n))==0
.źródło
Mathematica, 83 bajty
źródło
Python 3 , 75 bajtów
Wypróbuj online!
źródło
PHP , 60 bajtów
Wypróbuj online!
źródło