Wie viele Pappziffern brauche ich?

32

Ich muss Ziffern aus Pappe vorbereiten, um eine Nummer anzuzeigen ( Beispiel ). Ich weiß vorher nicht, welche Zahl ich anzeigen soll - das einzige, was ich weiß, ist, dass es nicht größer als ist n.

Wie viele Pappziffern soll ich vorbereiten?

Beispiel: n = 50

Um eine beliebige Zahl im Bereich von 0 bis 50 anzuzeigen, benötige ich die folgenden Ziffern:

  1. Eine Null zum Anzeigen der Zahl 0 oder einer anderen runden Zahl
  2. Zwei Kopien der Ziffern 1, 2, 3 und 4 zur Anzeige der entsprechenden Nummern
  3. Eine Kopie der Ziffern 5, 6, 7 und 8, für den Fall, dass sie als niedrigstwertige Ziffer in der Zahl erscheinen
  4. Die Ziffer 9 wird nie benötigt, da ich stattdessen die invertierte Ziffer 6 verwenden kann

Insgesamt: 13 Stellen

Testfälle (jede Zeile ist ein Testfall im Format "Eingabe; Ausgabe")

0 1
1 2
9 9
11 10
50 13
99 17
100 18
135 19
531 22
1000 27
8192 34
32767 38
anatolyg
quelle
2
Kann eine andere Ziffer als 6/9 gedreht werden?
Feersum
Nein (siehe Beispiel)
anatolyg
Also können zwei
Einsen
2
... und zwei Nullen können keine 8 ergeben. Das wäre hässlich.
Anatolyg
Wahrscheinlich eine heikle Frage, aber da es sich um Pappziffern handelt, können sie doppelseitig gedruckt werden, um die erforderliche Summe zu sparen? Im Beispiel würden Sie zum Beispiel niemals 6 und 0 zusammen benötigen.
Weckar E.

Antworten:

16

Gelee , 9 Bytes

‘ḶDœ|/ḟ9L

Probieren Sie es online!

Wie es funktioniert

‘ḶDœ|/ḟ9L
‘Ḷ         [0,1,...,n]
  D        convert each to list of its digits
   œ|/     fold by multiset union
      ḟ9   remove 9
        L  length
Undichte Nonne
quelle
14
Zu schnell. Ich schwöre, Sie haben eine Gelee-Antwort für jede bekannte Herausforderung im Universum und Sie haben nur einen Bot, um sie direkt nach der Herausforderung zu posten. : P Schöne Antwort.
HyperNeutrino
10
@HyperNeutrino Ich denke, der Bot extrahiert Testfälle aus der Herausforderung und probiert jedes mögliche Geleeprogramm mit einem Supercomputer aus.
NieDzejkob
1
@HyperNeutrino Du kennst das Gefühl ... vor allem wenn es deine Lösung ist 0rDŒr€ẎQṪÞẎḟ9ĠẎL.
Erik der Outgolfer
Ich bezweifelte für einen Moment die Gültigkeit des part9-Teils, dann wurde mir klar, dass 6 <9 sind, sodass die Anzahl der 6er nicht geringer sein kann als die insgesamt mögliche Anzahl der 6er und 9er in jeder Kombination.
Nader Ghanbari
7

Python 2 , 49 Bytes

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

Probieren Sie es online!

Eine ungeschickte Rechenformel. Angenommen, das npasst in eine, intso dass eine Lnicht angehängt wird.

Dank Neil für 5 Byte Speicher mit dem Hinweis darauf , dass 9 die nicht verwendeten werden , indem Sie behandelt werden könnte n*9+8statt n*9+9, so dass, sagen sie, 999*9+8=8999rollt nicht bis 9000 über.

xnor
quelle
@ovs Das funktioniert nicht ganz, es reicht nicht aus, die erste Ziffer zu kennen. Zum Beispiel 33333erfordert fünf 3er, 22222erfordert aber nur vier. n*9[0] ist verlockend, scheitert aber bei Zahlen, die mit 1und weniger beginnen 111...
Xnor
Durch meine Berechnungen (siehe meine Batch-Antwort) können Sie wahrscheinlich die Verwendung (n*9+8)/10**len(`n`)vermeiden min.
Neil
7

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

6 Bytes dank Laikoni gespart

1 4 6 Bytes gespart dank nimi

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

Probieren Sie es online!

Weizen-Assistent
quelle
3
1.) maximum[a,b]ist dasselbe wie max a b. 2.) Listenverständnisse sind oft kürzer als filter:max d$sum[1|x<-show a,x==b]
Laikoni
1
Sie können ersetzen gmit einem pointfree Funktionsliteral: sum.(#[-9..]).
Nimi
@nimi Ich weiß nicht, was ein Pointfree-Funktions-Literal ist, aber ich denke, ich sehe, was Sie vorschlagen. Sag mir, wenn ich falsch liege.
Wheat Wizard
1
... und length[x|x<-...]ist sum[1|x<-...].
Nimi
1
Funktionen können unbenannt sein, daher wird die nicht benötigt g=(aber möglicherweise möchten Sie sie in die TIO-Version aufnehmen).
Nimi
5

Mathematica, 49 Bytes

Tr@Delete[Max~MapThread~DigitCount@Range[0,#],9]&
Alephalpha
quelle
nett! Basiert das auf meiner Antwort?
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

Eine Art hacky rekursive Lösung. Dies erzeugt die Zahlen, für die eine Ziffer hinzugefügt werden muss:

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

und zählt dann, wie viele weniger als die Eingabe sind. Durch ein glückliches Wunder, die Ziffer Entfernen 9tatsächlich beseitigt mehrere Bytes von der Funktion, da die Sequenz dann wie so erzeugt werden kann (unter der Annahme ganzzahlige Division):

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

Wir müssen berücksichtigen, dass Zahlen unter 10 immer noch die Null erfordern, aber das ist so einfach wie das Hinzufügen n > 9 ? 0 : 1 zum Ergebnis.

Testfälle

ETHproductions
quelle
n>9^1kann wahrscheinlich seinn<10
CalculatorFeline
@CalculatorFeline Nun, das gibt trueInput 0, also zögere ich ein bisschen, das zu tun.
ETHproductions
0>9ist falsch, false^1ist 1 ...?
CalculatorFeline
@CalculatorFeline Ja, ich sage, ich zögere, den Booleschen Wert anstelle der Zahl auszugeben . true1
ETHproductions
4

Batch, 67 Bytes

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

In der Standardformulierung dieses Problems benötigen Sie separate 6und 9Ziffern, müssen diese jedoch nicht anzeigen 0. Wenn der maximal nerforderliche Wert zunimmt, nimmt die Anzahl der erforderlichen Ziffern jedes Mal zu, wenn Sie eine Nachkommastelle erreichen (weil Sie nicht genug von dieser Zahl haben) und jedes Mal, 10wenn Sie eine Potenz von erreichen (wenn Sie eine zusätzliche Null benötigen). Insgesamt jeder Kraft der 10Bedürfnisse 10mehr Ziffern als die vorherige, die als caluclated werden kann floor(log10(n))*10. Für Werte nzwischen Zehnerpotenzen kann dann die Anzahl der Zwischenwiederholungen als floor(n/((10**floor(log10(n))*10-1)/9))oder alternativ berechnet werden floor(n*9/(10**floor(log10(n))*10-1)).

Ich berechne floor(log10(n))mit Hilfe der Schleife in der ersten Zeile. Jedes Mal %2erhält ein Extra 0und %3ein Extra -~. Das heißt das 10%2ist 10*10**floor(log10(n))und %30ist floor(log10(n)).

Die Vervielfältigung von 6und 9hat zwei Auswirkungen: Erstens sind 9für jede Potenz von nur Ziffern erforderlich 10, und zweitens muss die Umstellerkennung die Umstellziffern ignorieren 9. Glücklicherweise sind sie eins weniger als eine Potenz von 10, was durch Ändern der Formel erreicht werden kann floor((n*9+8)/(10**floor(log10(n))*10)).

Der Umgang mit der Null ist relativ einfach: Dies erfordert nur eine zusätzliche Ziffer, wenn n<10, dh floor(log10(n))==0.

Neil
quelle
2

Mathematica, 83 Bytes

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

Python 3 , 75 Bytes

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

Probieren Sie es online!

Undichte Nonne
quelle