sed, 367 (Quellcode-Bytes) + 532 (Anzahl der Matchsticks für den Quellcode) = 899
s/[^0-9a-jln-suxyz]//Ig;/^$/{s/.*/0/;b};s/.+/&; %1ir %%7lnu %%%4cfhjoy %%%%235bdegpqsxz %%%%%069a %%%%%%8/;:1;s/([^% ])(.+ (%+)[^ ]*\1)/%\3 \2/I;/ ;/!b1;s/;.+//;s/^/,;/;:2;s/(;[^%]*)(%+)/\2\1/;:3;s/,%{10}/%,/;s/^%/,&/;/%{10}/b3;/;.*%/b2;:4;s/,[;,]/,0,/;/,[;,]/b4;s/%{9}/9/g;s/%{8}/8/g;s/%{7}/7/g;s/%{6}/6/g;s/%{5}/5/g;s/%%%%/4/g;s/%%%/3/g;s/%%/2/g;s/%/1/g;s/[^0-9]//g
Probieren Sie es online
Mehrzeilige Version:
s/[^0-9a-jln-suxyz]//Ig
/^$/{s/.*/0/;b}
s/.+/&; %1ir %%7lnu %%%4cfhjoy %%%%235bdegpqsxz %%%%%069a %%%%%%8/
:1
s/([^% ])(.+ (%+)[^ ]*\1)/%\3 \2/I
/ ;/!b1
s/;.+//
s/^/,;/
:2
s/(;[^%]*)(%+)/\2\1/
:3
s/,%{10}/%,/
s/^%/,&/
/%{10}/b3
/;.*%/b2
:4
s/,[;,]/,0,/
/,[;,]/b4
s/%{9}/9/g
s/%{8}/8/g
s/%{7}/7/g
s/%{6}/6/g
s/%{5}/5/g
s/%%%%/4/g
s/%%%/3/g
s/%%/2/g
s/%/1/g
s/[^0-9]//g
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:
s/[^0-9a-jln-suxyz]//Ig
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.
/^$/{s/.*/0/;b}
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.
s/.+/&; %1ir %%7lnu %%%4cfhjoy %%%%235bdegpqsxz %%%%%069a %%%%%%8/
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.
:1
s/([^% ])(.+ (%+)[^ ]*\1)/%\3 \2/I
/ ;/!b1
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.
s/;.+//
s/^/,;/
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:
:2
s/(;[^%]*)(%+)/\2\1/
:3
s/,%{10}/%,/
s/^%/,&/
/%{10}/b3
/;.*%/b2
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:
:4
s/,[;,]/,0,/
/,[;,]/b4
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.
s/%{9}/9/g
s/%{8}/8/g
s/%{7}/7/g
s/%{6}/6/g
s/%{5}/5/g
s/%%%%/4/g
s/%%%/3/g
s/%%/2/g
s/%/1/g
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.
s/[^0-9]//g
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.
|_\n|_
(Kleinbuchstabent
)