Die meisten Menschen hier kennen sieben Segmentanzeigen, die auch in Streichholzrätseln verwendet werden. Nachfolgend sind die Ziffern 0
bis 9
und die Buchstaben a
bis aufgeführt z
, sofern k,m,t,v,w
sie nicht in diesem Format geschrieben sind.
_ _ _ _ _ _ _ _
| | | _| _| |_| |_ |_ | |_| |_|
|_| | |_ _| | _| |_| | |_| _|
_ _ _ _ _ _ _ _ _
|_| |_ | _| |_ |_ | |_ | | | _ _ |_| |_| _ |_ |_| |_| _|
| | |_| |_ |_| |_ | |_| | | | |_| |_ | | |_| | | | _| |_| | | | |_
Die Herausforderung ist hier einfach. Geben Sie bei einer gegebenen Eingabezeichenfolge die Anzahl der Matchsticks aus, die für die Darstellung dieser Zeichenfolge erforderlich sind. Wenn die Zeichenfolge ein Zeichen außerhalb der obigen Darstellung enthält, ignorieren Sie es (zählen Sie es als 0).
Zum Beispiel werden für die Eingabe 53
insgesamt 10
Streichhölzer benötigt, 5
für die 5
und 5
für die 3
, so ist die Ausgabe 10
.
Für die Eingabe werden hello
insgesamt 19
Streichhölzer benötigt, h (4), e (5), l (3), l (3), o (4)
die Ausgabe also 19
.
Der Übersichtlichkeit halber sind hier die Streichhölzer aufgeführt, die zum Erstellen der einzelnen Charaktere erforderlich sind:
0 -> 6
1 -> 2
2 -> 5
3 -> 5
4 -> 4
5 -> 5
6 -> 6
7 -> 3
8 -> 7
9 -> 6
a -> 6
b -> 5
c -> 4
d -> 5
e -> 5
f -> 4
g -> 5
h -> 4
i -> 2
j -> 4
l -> 3
n -> 3
o -> 4
p -> 5
q -> 5
r -> 2
s -> 5
u -> 3
x -> 5
y -> 4
z -> 5
Nun zur Wendung, und es gibt zwei davon.
- Der erste ist, dass bei der Eingabe zwischen Groß- und Kleinschreibung unterschieden wird. Das heißt,
A
unda
beide sollten für6
Streichhölzer zählen, obwohl die visuelle Darstellung wie Großbuchstaben aussiehtA
. - Ihre Punktzahl ist Ihr Quellcode, der diesen Algorithmus durchläuft, plus die Länge Ihres Quellcodes in Bytes, niedriger ist besser. Wenn zum Beispiel Ihr Quellcode
abc123
wäre, wäre Ihre Punktzahl6+5+4+2+5+5 = 27 + 6 = 33
. Wenn Ihr Quellcode#&@()*
wäre, wäre Ihre Punktzahl0 + 6 = 6
.
Ein- / Ausgabebeispiele
0 -> 6
53 -> 10
111 -> 6
112 -> 9
8888 -> 28
hello -> 19
PPCG -> 19
Programming Puzzles & Code Golf -> 99
#&()mt!!~ -> 0
*DḌƤÆE%Ḅċ0 -> 16
Regeln
- Gegebenenfalls können Sie davon ausgehen, dass die Eingabe / Ausgabe in den systemeigenen Integer-Typ Ihrer Sprache passt.
- Die Eingabe und Ausgabe kann durch jede bequeme Methode erfolgen .
- Es ist entweder ein vollständiges Programm oder eine Funktion zulässig. Bei einer Funktion können Sie die Ausgabe zurückgeben, anstatt sie zu drucken.
- Standardlücken sind verboten.
quelle
|_\n|_
(Kleinbuchstabent
)[0-9a-z]
wir für Zeichen außerhalb 0 Streichhölzer zählen? Das ist, was ich aus Ihrer Punktzahl verstehe, Ihr Quellcode, der diesen Algorithmus durchläuft , plus die Länge Ihres Quellcodes in Bytes .Antworten:
Python 2 , 97 Bytes + 237 Übereinstimmungen = 334
Probieren Sie es online!
Dies funktioniert durch Generieren einer Zeichenfolge, bei der für jedes erstellbare Zeichen die gleiche Anzahl von Matchsticks angezeigt wird, die zum Erstellen dieses Zeichens erforderlich sind
quelle
+'069a8'*6+'8')
statt mit gespeichert werden+'069a'*6+'8'*7)
.Perl 5 mit
-pF
95 Bytes + 14, 109Dies ist äquivalent zu:
Mit dem
~
Operator können wir jedoch High-Byte-Zeichen verwenden und viele Zeichen vermeiden, ohne wirklich Byte zu opfern.Trotz der Unterstützung ist Ton noch ein gutes Stück von seinem Punktestand entfernt!
Probieren Sie es online!
Diese Lösung enthält nicht druckbare Dateien. Daher gibt es hier einen umkehrbaren Hex-Dump, um die Anzahl der Bytes zu überprüfen:
quelle
}{
? Lass es fallen und die-n
Option. Auch halten forgeting Sie+lc
stattlc()
:-)+
fällt mir nicht sofort ein! Ich brauchen
auf meiner Maschine und vergesse, dass ich es fallen lassen kann!}{
und-p
" (und ersetze es durch,-n
wenn dein Perl es noch braucht. Heutzutage zählt es sowieso nicht mehr)JavaScript (ES6), 198 (102 Byte + 96 Streichhölzer)
5 Punkte gespart dank @ l4m2
Probieren Sie es online!
Wie?
Wir verwenden den ASCII-Code modulo 9 von Zeichen, die keine Strafe für die Codierung der Streichholznummern hinzufügen.
Wir müssen uns keine Sorgen um den Fall machen, da
parseInt()
die Groß- und Kleinschreibung nicht berücksichtigt wird.Für Zeichen, die nicht mit [0-9A-Za-z] übereinstimmen , wird
parseInt()
zurückgegeben,NaN
und die Suche nach Zeichenfolgen führt zuundefined
. Gibt"undefined".charCodeAt()
den ASCII-Code von zurück"u"
, der 117 ist, sobald er in eine Zeichenfolge umgewandelt wurde . Günstigerweise ergibt 117 modulo 9 wie erwartet 0 .quelle
v=>[...v].map(w=>t+='~{w__^_{]|{{_^__^_^w^~]~]^__w_~]~~_^_'.charCodeAt(1+parseInt(w,36))%9,t=+[])|t
1 wenigerGelee , 42 Bytes + 0 Streichhölzer = 42 Punkte
Vielen Dank an @ JonathanAllan für -2 Punkte!
Probieren Sie es online!
Wie es funktioniert
Literale, die mit split on beginnen
“
und mit’
split on enden“
, ersetzen die verbleibenden Zeichen durch ihre auf 1 basierenden Indizes in Jellys Codepage und konvertieren dann von bijektiver Basis 250 in Ganzzahl.Dieses spezielle Literal codiert
×/
reduziert sich durch Multiplikation, ergibt sich(Das Codieren dieser Ganzzahl würde 6 Bytes einsparen, aber 28 Streichhölzer kosten.)
ṚṚ
kehrt zweimal um; Der erste Aufruf befördert eine Ganzzahl in das Ziffernfeld. Dies ergibtċЀØW$
zählt (ċ
) die Vorkommen jedes (Ѐ
) Zeichens von "A ... Za ... z0 ... 9_" (ØW
) in der Eingabezeichenfolge.Zum Schluss
æ.
wird das Skalarprodukt berechnet, indem die Anzahl der Zeichen mit den entsprechenden Kosten in Streichhölzern multipliziert und dann die Summe berechnet wird.quelle
D
zu speichern, anstatt ein anderes zu speichern. Versuchen Sie es onlineƊ
. Vielen Dank!Perl 5
-p
,9064 Code + 9 Bewertungsgeschirr + 14 Streichhölzer = 87Ersetzen Sie die Hex-Codes durch ihre 1-Byte-Literalvariante ( nicht UTF-8, wie TIO versucht) für die beanspruchte Punktzahl
Probieren Sie es online!
Code In der ergänzten Zeichenfolge:
quelle
Jelly , 34 Bytes + 3 Übereinstimmungen = 37
Ein monadischer Link, der eine Liste von Zeichen akzeptiert und eine Ganzzahl zurückgibt.
Probieren Sie es online!
Wie?
Funktioniert ähnlich wie Dennis 'Jelly-Antwort, hat sich aber so viel Mühe gegeben, dass ich der Meinung bin, dass es eine andere Antwort rechtfertigt. Der Hauptunterschied besteht darin, dass die Eingabe für einen Preis von drei Übereinstimmungen (
Œl
enthält einl
) in Kleinbuchstaben geschrieben wird, sodass dann eine viel kleinere Zahl zum Erstellen des Kostenarrays verwendet werden kann. Das Knifflige dabei war, einen Weg zu finden, diese Zahl ohne Übereinstimmungen zu konstruieren und dabei präzise zu bleiben.ØW
ergibt"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_"
also, dass das Zählen von Eingabevorgängen mit kleinerem Gehäuse immer mit 26 Nullen beginnt. Wir können dies umkehren und ein Skalarprodukt mit einem Array der Länge 37 anstelle eines Arrays der Länge 63 ausführen.quelle
PHP 176 Bytes = 397 Punkte
Probieren Sie es online!
quelle
SOGL V0.12 , 34 Bytes + 18 = 52
Probieren Sie es hier aus!
Golfen, aber weniger punkten :
quelle
Python 3 , 138 + 265 = 403 Bytes
Probieren Sie es online!
quelle
Ruby , 125 Bytes + 87 Streichhölzer = 212
Probieren Sie es online!
Stark inspiriert von Arnauld's Javascript-Antwort .
Normalerweise sind die Kosten für die Angabe, dass ein Lambda nur zweimal verwendet werden soll, nicht wert, aber das Streichholzgewicht von "
scanap
" in hat dies.scan(/./).map
geändert. Das war eine lustige Herausforderung!quelle
MATL , Punktzahl
166156Codelänge 41 + Ausgabe für Code, der als Eingabe 115 verwendet wird.
Probieren Sie es online!
quelle
R, 112 Bytes + 319 Übereinstimmungen = 431 Punkte
Probieren Sie es online!
Ein großes Lob an Giuseppe, der sich diese Verbesserung einfallen ließ .
Alte Version, 143 Bytes + 454 Übereinstimmungen = 597 Punkte
Damit die
el()
Funktion in TIO funktioniert, müssen Sie verwendenlibrary(methods)
.Meine Güte, ist R wortreich!
quelle
methods
Paket aus irgendeinem Grund nicht automatisch , aber da es sich um einbase
Paket handelt, habe ich es immer in den Header verschoben und es nicht für die Byteanzahl gezählt.readline
funktioniert auch nicht mit TIO, da es sich nicht um eine interaktive Sitzung handelt. Das ist aber definitiv golfen.Perl 6 , 87 Bytes + 26 Streichhölzer = 113
Probieren Sie es online!
Verwendet einige Nicht-ASCII-Unicode-Zeichen. Die Nachschlagetabelle ist in einer Unicode-Zeichenfolge codiert:
Zeichen werden mit einer Base-36-Konvertierung unter Verwendung von arabisch-indischen Ziffern in Indizes konvertiert:
quelle
sed, 367 (Quellcode-Bytes) + 532 (Anzahl der Matchsticks für den Quellcode) = 899
Probieren Sie es online
Mehrzeilige Version:
Erläuterung:
Das obige Skript liest die Standardeingabe zeilenweise (in den Musterraum - der übliche "sed way") und gibt für jede Zeile die Anzahl der Streichhölzer aus, die erforderlich sind, um alle vom Streichholz darstellbaren Zeichen in dieser Zeile darzustellen. Die Berechnungen für jede Eingabezeile erfolgen wie folgt:
Zunächst entfernen wir jedes Zeichen, für das wir keine entsprechende Streichholzdarstellung (wie in der Frage angegeben) haben, aus dem Musterbereich. Das heißt, wir entfernen jedes Zeichen, das keine Ziffer von "0" bis "9" ist, einen Buchstaben von "a" bis "j", "n" bis "s", "l", "u". "x", "y" oder "z". Groß- und Kleinbuchstaben werden gleich behandelt.
Wenn wir am Ende ein leeres Musterfeld haben, drucken wir 0 (automatisch gefolgt von einer neuen Zeile, wie dies bei sed immer der Fall ist, es sei denn, Sie übergeben ein spezielles Flag), überspringen alle hinteren Zeilen des Skripts und fahren mit dem nächsten "sed-Zyklus" fort ( dh lesen Sie die nächste Eingabezeile und wiederholen Sie die Verarbeitung ab dem ersten Befehl erneut, bis keine Eingabezeilen mehr zu verarbeiten sind.
Wenn der Musterraum nicht leer ist, teilen wir ihn jetzt in zwei durch Semikolon getrennte "Teilräume" auf: Zuerst kommt der Eingaberaum , der anfänglich aus allen Zeichen gebildet wird, die nach dem nicht aus dem Musterraum entfernt wurden Ausführung von Zeile 1; Als nächstes kommt das Semikolon und danach der Kartenraum .
Der Kartenbereich gibt an, wie viele Streichhölzer neben 1 für jedes relevante alphanumerische Zeichen erforderlich sind. Wenn wir wissen möchten, wie viele Streichhölzer erforderlich sind, um ein alphanumerisches Zeichen im Kartenbereich darzustellen, suchen wir nach der ersten Folge von zusammenhängenden% s links von diesem Zeichen und die Antwort ist die Anzahl von% s in diese Sequenz plus 1. So ist zum Beispiel die Anzahl der Streichhölzer, die notwendig sind, um ein "b" darzustellen, 4 + 1 = 5; eine "4" darstellen, 3 + 1 = 4, eine "y" darstellen, 3 + 1 = 4; und so weiter.
Dies ist eine Schleife. Jetzt ersetzen wir jedes Zeichen im Eingaberaum durch die (vollständige) Folge von%, deren Nummer die erforderliche Anzahl von Streichhölzern angibt, um dieses Zeichen darzustellen, und folgen dieser Folge durch ein Leerzeichen (wiederum Groß- und Kleinbuchstaben) die gleiche Behandlung gegeben). Das Kriterium, um zu bestimmen, ob die Schleife enden soll, besteht darin, zu überprüfen, ob ein Leerzeichen unmittelbar links vom Semikolon im Musterraum vorhanden ist. Wenn diese Bedingung zutrifft, beenden wir die Schleife und fahren mit der nächsten Zeile fort.
Diese beiden Zeilen entfernen das Semikolon und alles, was danach steht, aus dem Musterbereich und fügen dann ein Komma und ein Semikolon am Anfang des Musterbereichs ein. Wir haben jetzt den Musterraum noch einmal in zwei neue Unterräume unterteilt: den analogen Ergebnisraum vor dem Semikolon und den analogen Eingaberaum danach.
Der analoge Eingaberaum ist genau das, was wir zuvor als "Eingaberaum" bezeichnet haben, aber in einer anderen Form: Er enthält jetzt Sequenzen von% s, die durch Leerzeichen getrennt sind. Die Gesamtzahl solcher% im analogen Eingabebereich entspricht der Anzahl der Matchsticks, die zur Darstellung der anfänglichen Eingabezeichenfolge erforderlich sind, dh diese Anzahl ist das Ergebnis. Aber wir müssen das Ergebnis in Dezimalschreibweise ausgeben, nicht als Folge von Prozentzeichen. Der Zweck des analogen Ergebnisraumes ist eine analoge Darstellung jeder Ziffer des Ergebnisses zu halten , während wir dieses Ergebnis zu berechnen , indem jede zusammenhängende Sequenz von% Summieren 's in dem analogen Eingangsraum eines nach der anderen. Die nächste Schleife führt diese Summe aus:
Zuerst verschieben wir nach dem Label 2 die nächste zusammenhängende Folge von% nach dem Semikolon aus dem analogen Eingaberaum in die unmittelbare linke Ecke des Semikolons im analogen Ergebnisraum.
Als nächstes betreten wir eine Unterschleife (Label 3 ), die die folgenden Berechnungen durchführt:
Wenn nach einem Komma im analogen Ergebnisbereich eine zusammenhängende Folge von zehn% steht, entfernen wir diese% und setzen ein einzelnes% unmittelbar links vom Komma. Vereinfacht ausgedrückt bedeutet dies, dass eine der Dezimalstellen im Ergebnis mehr als 9 Einheiten hat. Wir entfernen 10 Einheiten von dieser Dezimalstelle und addieren 1 Einheit zur nächstgrößeren Dezimalstelle.
Wenn ein "%" das erste Zeichen im Musterbereich ist, fügen wir unmittelbar davor ein neues Komma ein. Dies zeigt an, dass die Summe einen Wert erreicht hat, dessen Dezimalrepräsentation links eine Dezimalstelle mehr als der vorherige Wert hat.
Wenn im analogen Ergebnisraum noch eine zusammenhängende Folge von 10% vorhanden ist, kehren wir zu Beschriftung 3 zurück und wiederholen diesen Vorgang. Andernfalls verlassen wir diese Unterschleife und gehen in die nächste Zeile.
Befindet sich noch ein "%" im analogen Eingabebereich (dh nach dem Semikolon), bedeutet dies, dass noch einige Streichhölzer zur Gesamtsumme hinzugefügt werden müssen. Wir kehren also zu Beschriftung 2 zurück .
Sobald die Summe vollständig ist, betreten wir die letzte Schleife des Codes:
Hier überprüfen wir jedes Zeichenpaar, das aus einem Komma links und einem Semikolon oder einem Komma rechts besteht. Wir ersetzen alle derartigen Zeichenpaare durch eine "0" innerhalb von zwei Kommas.
Der obige Code ist recht einfach: Wir ersetzen jede zusammenhängende Folge von% s im analogen Ergebnisraum durch eine Dezimalziffer, die der Anzahl von% s in jeder bestimmten Folge entspricht.
Schließlich entfernen wir alle nicht-numerischen Zeichen aus dem Musterraum und das Endergebnis verbleibt in der vertrauten Dezimalschreibweise. Dieser Wert wird auf die Standardausgabe gedruckt und der nächste Sed-Zyklus beginnt, wenn weitere Eingabezeilen zu verarbeiten sind.
quelle
C (gcc) , 134 Bytes + 38 Streichhölzer = 172
Probieren Sie es online!
quelle
05AB1E , 30 Bytes + 70 Übereinstimmungen = 100 Punkte
Probieren Sie es online!
-5 danke an Emgina
quelle
Al
=A
. Das brauchst du auch nicht}
.Java 10,
452432416404 Punkte (145 Bytes + 259 Übereinstimmungen)Erläuterung:
Probieren Sie es online aus.
VariablennamenBEARBEITEN: Variablennamen$ραετ
werden anstelle von Buchstaben verwendet.kmtvw
werden jetzt stattdessen verwendet, da sie nicht durch Übereinstimmungen gemäß der Herausforderungsbeschreibung gebildet werden können.''
(nicht druckbar) wird anstelle von verwendet6
.m-m
undt-t
werden anstelle von verwendet0
.(char)(w|32)+""
mit Zeichenarray-Eingabe anstelle vonw.toLowerCase()
String-Array-Eingabe.quelle
AutoHotkey , 148 Bytes + 345 Streichhölzer = 493
Dieser war ein bisschen eine Herausforderung zu verkürzen.
quelle
Python 3 , 123 Bytes + 65 Übereinstimmungen = 188
Eine unbenannte Funktion, die eine Zeichenfolge akzeptiert und eine Ganzzahl zurückgibt.
Enthält viele nicht druckbare Zeichen (insbesondere die Bytes eins bis acht).
Probieren Sie es online!
quelle
Kohle , 48 Bytes + 3 = 51
Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:
Durchlaufen Sie die Zeichen der Eingabe, berechnen Sie die Anzahl der Streichhölzer, addieren Sie das Ergebnis, konvertieren Sie es in einen String und geben Sie es implizit aus.
Wenn es ein Brief ist ...
Suchen Sie die Anzahl der Streichhölzer in der komprimierten Zeichenfolge
65455454240303455250300545
.Sonst, wenn es im Wert von erscheint
2 ** 1000
...Suchen Sie die Anzahl der Streichhölzer in der komprimierten Zeichenfolge
6255456376
.quelle
PHP, 98 + 253 = 351
Laufen Sie als Pipe mit
-nr
oder versuchen Sie es online .quelle