In vielen Schriften (insbesondere in der Consolas-Schrift ) weisen 5 der 10 Dezimalstellen "Löcher" auf. Wir werden diese heiligen Ziffern nennen:
46890
Die 5 unheiligen Ziffern sind also:
12357
Eine Ganzzahl kann daher als "heilig" klassifiziert werden, wenn sie nur heilige Ziffern enthält, und ansonsten als "unheilig". Weil -
es unheilig ist, können keine negativen ganzen Zahlen heilig sein.
Heilige ganze Zahlen können basierend auf der Anzahl ihrer Löcher weiter klassifiziert werden. Beispielsweise haben die folgenden Ziffern eine Heiligkeit von 1:
469
Und diese Ziffern haben eine Heiligkeit von 2:
80
Wir sagen, dass die Gesamtheiligkeit einer ganzen Zahl die Summe der Heiligkeit ihrer Ziffern ist. Daher 80
hätte eine Heiligkeit von 4 und 99
eine Heiligkeit von 2.
Die Herausforderung
Geben Sie bei zwei Ganzzahlen n > 0
und h > 0
die n
th heilige Ganzzahl aus, deren Heiligkeit mindestens ist h
. Sie können davon ausgehen, dass die Ein- und Ausgänge nicht größer sind als die maximal darstellbare Ganzzahl in Ihrer Sprache oder 2^64 - 1
, je nachdem, welcher Wert kleiner ist.
Hier ist eine Liste der ersten 25 heiligen ganzen Zahlen mit Heiligkeit h >= 1
als Referenz:
0, 4, 6, 8, 9, 40, 44, 46, 48, 49, 60, 64, 66, 68, 69, 80, 84, 86, 88, 89, 90, 94, 96, 98, 99
Die ersten 25 Ganzzahlen mit Heiligkeit h >= 2
sind:
0, 8, 40, 44, 46, 48, 49, 60, 64, 66, 68, 69, 80, 84, 86, 88, 89, 90, 94, 96, 98, 99, 400, 404, 406
0
eine Heiligkeit von zwei", bevor ich schließlich auf den Wikipedia-Link zu ConsolasAntworten:
Pyth, 32 Bytes
Erläuterung
Probieren Sie es hier aus
Nimmt Eingaben in das Formular auf
h \n n
quelle
Ruby,
1091059582 BytesDies ist der schreckliche Ansatz "Berechne von 0 bis 99999999999 ...", der 13 Byte kürzer ist als sein fauler Gegenüber. Es ist jedoch unwahrscheinlich, dass diese Version vor dem Hitzetod des Universums fertig wird. Trotzdem 13 Bytes wert. \ _ (ツ) _ /
Sie können es auf kleinere Werte testen, indem Sie beispielsweise
?9*99
auf'99999'
.Hier ist die alte Version (95 Bytes, mit verzögerter Auswertung, die fast sofort und nicht so gut wie nie ausgeführt wird):
quelle
take
stattfirst
?take
gibt einen Wert zurückLazy
, der nicht indiziert werden kann.Python 3, 103
Hier ist eine Lösung, die einen speichereffizienten Ansatz verwendet, aber ansonsten denselben Algorithmus verwendet, wenn Sie ihn testen möchten.
Testfälle:
quelle
2**64-1
; Siehe stackoverflow.com/questions/34113609/…PowerShell,
1631501411019896 ByteÜbernimmt die Eingabe und schleift dann, bis
$n
Null ist. Wir setzen zunächst$i=-1
mit Hilfe eines Pre-Processing-Tricks, der funktioniert, weil$i
, nachdem zuvor nicht deklariert, ist$null
. Dann wir--
es, was PowerShell veranlasst, es als zu bewerten$i = $null - 1
, was ist$i=-1
.Jede Schleife wird inkrementiert
$i
und anschließend eine ausführlicheif
Anweisung ausgeführt. Im ersten Teil der Bedingung wird mithilfe des Operators überprüft, ob$i
noch etwas12357
davon enthalten ist, um die unheiligen Zahlen herauszufiltern.-notmatch
Der zweite Teil der Bedingung prüft die Anzahl der Löcher in
$i
. Es verwendet den-replace
Operator, um jedes8
oder0
durch zu ersetzen11
, und vergleicht dann, ob die Länge> = ist$h
. Wir müssen uns nicht darum kümmern, die unheiligen Zahlen zu entfernen, da dies im ersten Teil der Bedingung steht und die einlochigen Zahlen die gleiche Länge wie1
ohnehin haben, sodass wir sie auch nicht ersetzen müssen.Wenn das immer noch wahr ist, verringern wir
$n
(das heißt, wir haben eine andere Zahl gefunden, die die Eingabeanforderungen erfüllt). Wenn also diefor
Bedingung neu berechnet wird, um zu überprüfen, ob$n
Null ist, bedeutet dies, dass wir die n-te gefunden haben , also verlassen wir diefor
Schleife, geben sie aus$i
und beenden sie.Bearbeiten - 13 Bytes mit einem Array anstelle eines Strings speichern
$l
und ändern, wie$n
dekrementiert / markiert wird.Bearbeiten 2 - 9 Bytes zusätzlich speichern, indem
$n
diefor
Bedingung geprüft und die Ausgabe aus der Schleifeverschoben wird. Bearbeiten 3 - Satte Ergebnisse gespeichert 40 weitere Bytes durch radikale Änderung der Berechnung von Löchern
Edit 4 - 3 zusätzliche Bytes durch Verschieben
++
von als Vorinkrement für den ersten Teil des bedingtenEdit 5 gespart - weitere 2 Bytes dank TessellatingHeckler gespart
quelle
for(--$i;$n)
und-replace"8|0"
?$i=-1
mich total verrückt gemacht. Ich versuche immer noch, einen Weg zu finden, damit wir nicht erst initialisieren müssen$i
, aber die Dinge, die ich bisher ausprobiert habe, sind länger (und werden diesbezüglich wahrscheinlich noch länger sein).CJam,
3634 BytesDanke an aditsu für das Speichern von 2 Bytes.
Teste es hier.
quelle
Bash + GNU-Dienstprogramme, 67
seq
generiert einfach ganze Zahlen ab0
aufwärtssed -r
:h
Kopieren Sie die Eingabezeile in den Hold-Bereich/12357/d
unheilige zahlen löschens/8|0/&&/g
Ersetzen Sie doppelt heilige Ziffern durch doppelt selbst. Somit werden einfach heilige Ziffern einmal und doppelt heilige Ziffern zweimal gezählt./^.{$1}/!d
Wenn mindestens die$1
Löcher nicht übereinstimmen , löschen Sie und fahren Sie mit der nächsten Zeile fortx
Bringen Sie die ursprüngliche Nummer wieder in den Musterbereichsed
$2!d
$2
Löschen Sie alle Zeilen vor der Zeile und fahren Sie mit der nächsten Zeile fortq
muss sich am Zeilenende befinden$2
(und impliziter Druck)Ideone.
quelle
sed -r "h;/[12357]/d;s/8|0/&&/g;/^.{$1}/!d;x"
. Und noch ein 4:sed $2!d\;q
. Und wenn Sie mit einer Obergrenze von nur 4611686018427387904 zufrieden sind, könnten Sie mitseq 0 $[1<<62]
seq
akzeptiereNaN
als Wert: Ich habe jetztseq 0 NaN|sed -r "h;/[12357]/d;s/8|0/&&/g;/^.{$1}/!d;x"|sed $2!d\;q
67.-sh: !d\: event not found
` before
! ` Wird in einem Skript nicht benötigt . Es wird nur benötigt, wenn dies direkt auf der Kommandozeile ausgeführt wird, was ich nicht für erforderlich halte.MATL , 39 bis
40BytesInpunts sind
n
undh
in dieser Reihenfolge.Probieren Sie es online!
Wir müssen zwei Zahlen im Auge behalten: die aktuelle Kandidatennummer (um ihre Heiligkeit zu überprüfen) und die Anzahl der gefundenen Zahlen, die heilig genug sind. Das erste ist die Oberseite des Stapels, und das letztere wird als Anzahl der Elemente im Stapel beibehalten. Wenn das Programm beendet ist, muss nur die Oberseite angezeigt werden.
quelle
R
109107 BytesMit neuen Zeilen und Einrückungen:
Verwendungszweck:
quelle
JavaScript (ES6), 110 Byte
Schwanzrekursive Lösung, die heilige Zahlen in einem Array ansammelt.
Aus Gründen des Interesses wird die Heiligkeit ungünstiger, wenn die Zahl nicht vollständig (!) Heilig sein muss. Insgesamt werden jedoch 10% gespart:
quelle
i
und vertauschtr
und konnte die Änderung nicht richtig bearbeiten.JavaScript ES6, 191 Bytes
Sicher, das ist nicht der effizienteste Weg. Aber du kennst mich, ich liebe Generatoren <3
Leicht ungolfed:
quelle
C # 6, 168 Bytes
Dies ist ein Lambda-Ausdruck vom Typ Func <int, int, int>. Dieser Code ist für die Mindestgröße optimiert (nicht performatisch).
Unten der verschönerte Code in der Methodendeklaration (mit mehr Leistung):
quelle
JavaScript (ES6), 87
Weniger golfen
Prüfung
quelle
Lua, 169 Bytes
Ungolfed:
quelle
Lua,
155141140 BytesÜbernimmt beide Eingaben per Kommandozeilenargument (erstes Argument ist n, dann h)
Edit: Danke an @DavisDude, der mir geholfen hat, 14 Bytes zu sparen und mich daran erinnert hat, dass ich nicht alle heiligen Zahlen bis n drucken musste, sondern nur die n-te.
Ungolfed und Erklärungen
quelle
print(a[arg[1]])
n
. Spart eigentlichprint(a[#a])
noch mehr Bytes. Danke für den Kommentar !x=0a={}
stattx,a=0,{}
.0a
da keine hexadezimale Zahl interpretieren, aber ich kanna={}x=0while
ohne ProblemeOracle SQL 11.2, 229 Byte
Nicht golfen
quelle
Python 2, 96 Bytes
Der Heiligkeitszustand an
k
wird durch geprüftsum(map(s.count,`k`))>=h
, der die Anzahl der Löcher zählt, indem er die Anzahl für jedes Zeichen in summierts="0046889"
, wobei0
und8
zweimal erscheint.set(str(k))<=set(s))
, die überprüft, dass die Zahlen alle heilig sind.str
wird anstelle von Backticks verwendet, um das SuffixL
für Longs zu vermeiden .Diese werden unter Verwendung der Python 2-Tatsache, dass Zahlen kleiner als Mengen sind, zu einer einzelnen Gleichheit verkettet.
Die Funktion wird rekursiv definiert, um Zahlen
k
hochzuzählen und den Zählern
jedes Mal zu verringern, wenn eine heilige Anzahl von Treffern erzielt wird, es sei denn, sie trifft0
. Es könnte dann den zurückgebenk
, der dies ausgelöst hat, aber es ist kürzer, die Zählung rekursiv zu halten, indem1
jedes Mal addiert wird, obwohl ein Off-by-One-Wert eine Basiszählung von-1
zum Reparieren erfordert .quelle
Haskell, 94 Bytes
c
Ist die Heiligkeit einer Ziffer,v
die Heiligkeit einer Zahl,n!h
erledigt den Rest.Hinweis: Ich denke, dies ist die einzige Antwort ohne die Zeichen
4,6,8
.quelle
Schnell
quelle