Ile cyfr kartonowych potrzebuję?

32

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:

  1. Zero do wyświetlania liczby 0 lub dowolnej innej okrągłej liczby
  2. Dwie kopie cyfr 1, 2, 3 i 4 do wyświetlania odpowiednich liczb
  3. Jedna kopia cyfr 5, 6, 7 i 8, w przypadku gdy pojawiają się jako najmniej znacząca cyfra w liczbie
  4. 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
anatolig
źródło
2
Czy można obrócić dowolną inną cyfrę oprócz 6/9?
feersum
Nie (patrz przykład)
anatolyg
Więc dwa 1 nie można nakładać na siebie, aby następnie 7
user253751
2
... a dwa zera nie mogą dać cyfry 8. To byłoby brzydkie.
anatolyg
Prawdopodobnie dziwne pytanie, ale skoro są to cyfry „kartonowe”, czy można je zadrukować dwustronnie, aby zaoszczędzić na wymaganej sumie? W tym przykładzie na przykład nigdy nie potrzebujesz 6 i 0.
Weckar E.

Odpowiedzi:

16

Galaretka , 9 bajtów

‘ḶDœ|/ḟ9L

Wypróbuj online!

Jak to działa

‘ḶDœ|/ḟ9L
‘Ḷ         [0,1,...,n]
  D        convert each to list of its digits
   œ|/     fold by multiset union
      ḟ9   remove 9
        L  length
Leaky Nun
źródło
14
Zbyt szybko>. <Przysięgam, masz galaretkową odpowiedź na każde znane wyzwanie we wszechświecie i po prostu masz bota, który opublikuje je zaraz po wyzwaniu. : P Ładna odpowiedź.
HyperNeutrino
10
@HyperNeutrino Wydaje mi się, że bot wyodrębnia testy z wyzwania i wypróbowuje każdy możliwy program galaretki za pomocą superkomputera.
NieDzejkob,
1
@HyperNeutrino Znasz to uczucie ... szczególnie, jeśli masz rozwiązanie 0rDŒr€ẎQṪÞẎḟ9ĠẎL.
Erik the Outgolfer,
Przez chwilę wątpiłem w ważność części ḟ9, a potem uświadomiłem sobie, że 6 <9, więc liczba 6 nie może być mniejsza niż całkowita możliwa liczba 6 i 9 w kombinacji.
Nader Ghanbari,
7

Python 2 , 49 bajtów

lambda n:9*len(`n`)-9+(n*9+8)/10**len(`n`)+(n<10)

Wypróbuj online!

Niezdarna formuła arytmetyczna. Zakładać, żen pasuje do inttak, aby Lnie 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+8zamiast n*9+9, dzięki czemu, powiedzmy, 999*9+8=8999nie przechodzi na 9000.

xnor
źródło
@ovs To nie do końca działa, nie wystarczy znać pierwszą cyfrę. Na przykład 33333wymaga pięciu 3, ale 22222wymaga tylko czterech. n*9[0] jest kuszące, ale zawodzi w przypadku liczb zaczynających się od 1i mniej 111...
xnor
Według moich obliczeń (patrz moja odpowiedź wsadowa) prawdopodobnie można użyć, (n*9+8)/10**len(`n`)aby tego uniknąć min.
Neil,
7

Haskell , 117 114 108 95 89 88 87 84 82 63 bajty

6 bajtów zaoszczędzonych dzięki Laikoni

1 4 6 bajtów zapisanych dzięki nim

g x=sum[maximum[sum[1|u<-show y,d==u]|y<-[0..x]]|d<-['0'..'8']]

Wypróbuj online!

Kreator pszenicy
źródło
3
1.) maximum[a,b]jest taki sam jak max a b. 2.) Rozumienie listy jest często krótsze niż filter:max d$sum[1|x<-show a,x==b]
Laikoni,
1
Można wymienić gz pointfree funkcji dosłownym: sum.(#[-9..]).
nimi
@nimi Nie wiem, co to jest dosłowna funkcja dosłowna, ale myślę, że rozumiem to, co sugerujesz. Powiedz mi, jeśli się mylę.
Kreator pszenicy
1
... i length[x|x<-...]jest sum[1|x<-...].
nimi
1
Funkcje mogą być nienazwane, więc nie ma potrzeby g=(ale być może chcesz dołączyć to do wersji TIO).
nimi
5

Mathematica, 49 bajtów

Tr@Delete[Max~MapThread~DigitCount@Range[0,#],9]&
alephalpha
źródło
miły! Czy to jest oparte na mojej odpowiedzi?
J42161217,
5

JavaScript (ES6), 60 53 bajtów

f=(n,i=9)=>n>(i%9+1+"e"+(i/9|0))/9-1?1+f(n,-~i):n>9^1

Rodzaj zhackowanego rozwiązania rekurencyjnego. Generuje to liczby wymagające dodania cyfry:

1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 22, 33, 44, 55, 66, 77, 88, 100, 111, 222, ...

a następnie liczy, ile jest mniej niż danych wejściowych. Szczęśliwym cudem usunięcie cyfry 9faktycznie usuwa kilka bajtów z funkcji, ponieważ sekwencję można następnie wygenerować w ten sposób (zakładając dzielenie liczb całkowitych):

1e1 / 9 = 1, 2e1 / 9 = 2, ..., 8e1 / 9 = 8, 9e1 / 9 = 10, 1e2 / 9 = 11, 2e2 / 9 = 22, ...

Musimy wziąć pod uwagę fakt, że liczby poniżej 10 nadal wymagają zera, ale jest to tak proste, jak dodanie n > 9 ? 0 : 1wyniku.

Przypadki testowe

ETHprodukcje
źródło
n>9^1prawdopodobnie może byćn<10
CalculatorFeline
@CalculatorFeline Cóż, to daje truewkład 0, więc jestem trochę niezdecydowany, aby to zrobić.
ETHproductions
0>9jest fałszem, false^1czy 1 ...?
CalculatorFeline
@CalculatorFeline Tak, mówię, że waham się przed wypisaniem wartości logicznej truezamiast liczby 1.
ETHproductions
4

Partia, 67 bajtów

@if %1 geq 10%2 %0 %1 0%2 -~%3
@cmd/cset/a(%1*9+8)/10%2+9*%30+!%30

W standardowym sformułowaniu tego problemu potrzebujesz osobnych cyfr 6i 9cyfr, ale nie musisz wyświetlać 0. Wraz ze wzrostem maksymalnej nwymaganej 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ęga 10potrzebuje 10więcej cyfr niż poprzednia, którą można obliczyć jako floor(log10(n))*10. Dla wartości nmiędzy potęgami 10 liczbę pośrednich powtórzeń można następnie obliczyć jako floor(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 %2zyskuje dodatkowy 0i %3zyskuje dodatkowy -~. Oznacza to, że 10%2jest 10*10**floor(log10(n))i %30jest floor(log10(n)).

Powielanie 6i 9ma dwa efekty: po pierwsze, 9dla każdej potęgi wymagane są tylko cyfry 10, a po drugie wykrywanie repdigit musi zignorować 9reprodukcje. 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<10np floor(log10(n))==0.

Neil
źródło
2

Mathematica, 83 bajty

v=DigitCount;s=v@0;(Table[s[[i]]=v[j][[i]]~Max~s[[i]],{i,10},{j,#}];s[[9]]=0;Tr@s)&
J42161217
źródło
1

Python 3 , 75 bajtów

lambda n:sum(max(str(j).count(str(i))for j in range(n+1))for i in range(9))

Wypróbuj online!

Leaky Nun
źródło