Di quante cifre ho bisogno?


32

Devo preparare cifre fatte di cartone per visualizzare un numero ( esempio ). Non so in anticipo quale numero dovrei visualizzare - l'unica cosa che so è che non è maggiore di n.

Quante cifre di cartone dovrei preparare?

Esempio: n = 50

Per visualizzare qualsiasi numero nell'intervallo 0 ... 50, ho bisogno delle seguenti cifre:

  1. Uno zero, per visualizzare il numero 0 o qualsiasi altro numero tondo
  2. Due copie delle cifre 1, 2, 3 e 4, per visualizzare i numeri corrispondenti
  3. Una copia delle cifre 5, 6, 7 e 8, nel caso in cui compaiano come cifre meno significative nel numero
  4. La cifra 9 non è mai necessaria, perché posso usare invece la cifra 6 invertita

Totale: 13 cifre

Casi di test (ogni riga è un caso di test nel formato "input; output")

0 1
1 2
9 9
11 10
50 13
99 17
100 18
135 19
531 22
1000 27
8192 34
32767 38

2
È possibile ruotare qualsiasi altra cifra oltre a 6/9?
feersum

No (vedi esempio)
anatolyg

Quindi due 1 non possono essere sovrapposti per fare un 7 quindi
user253751

2
... e due zeri non possono fare un 8. Sarebbe brutto.
Anatolyg,

Probabilmente una domanda imbarazzante, ma dato che si tratta di cifre in "cartone", possono essere stampate su due lati per risparmiare sul totale richiesto? Nell'esempio, non avresti mai bisogno di 6 e 0 insieme, per esempio.
Weckar E.,

Risposte:


16

Gelatina , 9 byte

‘ḶDœ|/ḟ9L

Provalo online!

Come funziona

‘ḶDœ|/ḟ9L
‘Ḷ         [0,1,...,n]
  D        convert each to list of its digits
   œ|/     fold by multiset union
      ḟ9   remove 9
        L  length

14
Troppo veloce>. <Lo giuro, hai una risposta Jelly per ogni sfida conosciuta nell'universo e hai solo un bot per pubblicarle subito dopo la sfida. : P Bella risposta.
HyperNeutrino,

10
@HyperNeutrino Penso che il bot estrae le prove dalla sfida e provi ogni possibile programma di gelatina usando un supercomputer.
NieDzejkob,

1
@HyperNeutrino Conosci la sensazione ... soprattutto se la tua soluzione è 0rDŒr€ẎQṪÞẎḟ9ĠẎL.
Erik the Outgolfer,

Ho dubitato della validità di ḟ9 parti per un momento, quindi ho realizzato 6 <9, quindi il numero di 6s non può essere inferiore al numero totale possibile di 6s e 9s combinati in ciascuna combinazione.
Nader Ghanbari,

7

Python 2 , 49 byte

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

Provalo online!

Una formula aritmetica maldestra. Supponiamo che nrientri in un intmodo che un Lnon sia aggiunto.

Grazie a Neil per aver salvato 5 byte sottolineando che i 9 inutilizzati potrebbero essere gestiti facendo n*9+8invece di n*9+9, in modo che, diciamo, 999*9+8=8999non passi a 9000.


@ovs Non funziona del tutto, non è sufficiente conoscere la prima cifra. Ad esempio 33333richiede cinque 3 ma ne 22222richiede solo quattro. n*9[0] è allettante, ma fallisce per i numeri che iniziano con 1e meno 111...
xnor

Dai miei calcoli (vedi la mia risposta in batch) probabilmente puoi usare (n*9+8)/10**len(`n`)per evitare di usare min.
Neil,

7

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

6 byte salvati grazie a Laikoni

1 4 6 byte salvati grazie a nimi

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

Provalo online!


3
1.) maximum[a,b]è uguale a max a b. 2.) La comprensione dell'elenco è spesso più breve di filter:max d$sum[1|x<-show a,x==b]
Laikoni,

1
È possibile sostituire gcon un letterale funzione pointfree: sum.(#[-9..]).
nimi,

@nimi Non so che cosa sia una funzione letterale senza senso, ma penso di vedere cosa stai suggerendo. Dimmi se sbaglio.
Mago del grano,

1
... e lo length[x|x<-...]è sum[1|x<-...].
nimi,

1
Le funzioni possono essere senza nome, quindi non è necessario per g=(ma forse si desidera includerlo nella versione TIO).
nimi,

5

Mathematica, 49 byte

Tr@Delete[Max~MapThread~DigitCount@Range[0,#],9]&

simpatico! È basato sulla mia risposta?
J42161217

5

JavaScript (ES6), 60 53 byte

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

Una sorta di soluzione ricorsiva hacky. Questo genera i numeri che richiedono l'aggiunta di una cifra:

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

e quindi conta quanti sono inferiori all'input. Per un miracolo felice, la rimozione della cifra rimuove9 effettivamente diversi byte dalla funzione, perché la sequenza può quindi essere generata in questo modo (supponendo la divisione intera):

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

Dobbiamo tener conto del fatto che i numeri inferiori a 10 richiedono ancora lo zero, ma questo è semplice come aggiungere n > 9 ? 0 : 1al risultato.

Casi test


n>9^1può probabilmente esseren<10
CalculatorFeline

@CalculatorFeline Bene, questo dà trueinput 0, quindi sono un po 'titubante nel farlo.
ETHproductions

0>9è falso, false^1è 1 ...?
Calcolatrice

@CalculatorFeline Sì, sto dicendo che sono titubante nel produrre il valore booleano trueal posto del numero 1.
ETHproductions

4

Lotto, 67 byte

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

Nella formulazione standard di questo problema, è necessario separato 69 numeri e cifre , ma non è necessario visualizzarli 0. All'aumentare del valore massimo nrichiesto, il numero di numeri richiesti aumenta ogni volta che si raggiunge una riconfigurazione (perché non si ha abbastanza di quel numero) e ogni volta che si raggiunge una potenza di 10(quando è necessario uno zero aggiuntivo). In totale ogni potenza ha 10bisogno di 10più numeri rispetto alla precedente, che può essere calcolata come floor(log10(n))*10. Per valori compresi ntra potenze di 10, il numero di riprogrammazioni intermedie può quindi essere calcolato come floor(n/((10**floor(log10(n))*10-1)/9))o in alternativa floor(n*9/(10**floor(log10(n))*10-1)).

Io calcolo floor(log10(n)) per mezzo del ciclo sulla prima riga. Ogni volta, %2guadagna un extra 0e %3guadagna un extra -~. Questo significa che 10%2è 10*10**floor(log10(n))ed %30è floor(log10(n)).

La duplicazione 6e 9ha due effetti: in primo luogo, sono 9necessari solo numeri per ciascuna potenza di 10, e in secondo luogo il rilevamento delle modifiche deve ignorare le 9modifiche. Fortunatamente poiché sono uno in meno di una potenza di 10, questo può essere ottenuto modificando la formula per ottenere floor((n*9+8)/(10**floor(log10(n))*10)).

Affrontare lo zero è ragionevolmente semplice: questo richiede solo un numero aggiuntivo quando n<10, ad es floor(log10(n))==0.


2

Mathematica, 83 byte

v=DigitCount;s=v@0;(Table[s[[i]]=v[j][[i]]~Max~s[[i]],{i,10},{j,#}];s[[9]]=0;Tr@s)&


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.