Zähle die Streichhölzer


20

Die meisten Menschen hier kennen sieben Segmentanzeigen, die auch in Streichholzrätseln verwendet werden. Nachfolgend sind die Ziffern 0bis 9und die Buchstaben abis aufgeführt z, sofern k,m,t,v,wsie 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 53insgesamt 10Streichhölzer benötigt, 5für die 5und 5für die 3, so ist die Ausgabe 10.

Für die Eingabe werden helloinsgesamt 19Streichhö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, Aund abeide sollten für 6Streichhölzer zählen, obwohl die visuelle Darstellung wie Großbuchstaben aussieht A.
  • 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 abc123wäre, wäre Ihre Punktzahl 6+5+4+2+5+5 = 27 + 6 = 33. Wenn Ihr Quellcode #&@()*wäre, wäre Ihre Punktzahl 0 + 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.

2
T wird allgemein geschrieben als |_\n|_(Kleinbuchstaben t)
12Me21

@ 12Me21 Ich hatte darüber nachgedacht, so etwas zu tun, aber ich hatte nicht das Gefühl, dass es nah genug an dem Brief lag, also habe ich es ausgelassen.
AdmBorkBork

Was ist mit deinem Buchstaben X (H)? (Nun, es ist mir jetzt egal, dass es eine Antwort gibt.)
12Me21

Sollten [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 .
Erik der Outgolfer

@EriktheOutgolfer Ja, das stimmt.
AdmBorkBork

Antworten:


8

Python 2 , 97 Bytes + 237 Übereinstimmungen = 334

lambda w:sum(map(('1ir'*2+'7lnu'*3+'4cfhjoy'*4+'235bdegpqsxz'*5+'069a'*6+'8'*7).count,w.lower()))

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


Ein Zeichen kann mit +'069a8'*6+'8')statt mit gespeichert werden +'069a'*6+'8'*7).
Xbarbie

@xbarbie in der Tat, aber das würde die Matchanzahl erhöhen, was zu +3 Punkten führt
Rod

6

Perl 5 mit -pF95 Bytes + 14, 109

eval~"Û£Ô„…ÊÏÉÎÍÍÊÌÊËËÊÊÉÉÈÌÇÈÆÉžÉʜ˛ʚʙ˘ʗ˖͕˓̑ÌËÊŽÊ͌ʊ̇ʆËÂÐÑИ‚ÒÁ„Ô“œ‚™¿¹"}{

Dies ist äquivalent zu:

$\+={z506122535445566738796a6b5c4d5e5f4g5h4i2j4l3n3o4p5q5r2s5u3x5y4=~/./g}->{+lc}for@F

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:

00000000: 6576 616c 7e22 dba3 d4c2 8485 cacf c9ce  eval~"..........
00000010: cdcd cacc cacb cbca cac9 c9c8 ccc7 c8c6  ................
00000020: c99e c99d ca9c cb9b ca9a ca99 cb98 ca97  ................
00000030: cb96 cd95 cb93 cc91 cc90 cb8f ca8e ca8d  ................
00000040: cd8c ca8a cc87 ca86 cbc2 81d0 d1d0 9882  ................
00000050: d2c1 84d4 939c 8299 908d bfb9 227d 7b    ............"}{

Warum das }{? Lass es fallen und die -nOption. Auch halten forgeting Sie +lcstatt lc():-)
Ton Hospel

@TonHospel Verdammt! Ich habe sogar unsere beiden Posts durchgesehen und konnte mich nicht erinnern, auf welchem ​​Post ich es gesehen hatte, und es +fällt mir nicht sofort ein! Ich brauche nauf meiner Maschine und vergesse, dass ich es fallen lassen kann!
Dom Hastings

Entschuldigung, ich habe mich vertippt. Ich meinte "Lass das }{und -p" (und ersetze es durch, -nwenn dein Perl es noch braucht. Heutzutage zählt es sowieso nicht mehr)
Ton Hospel

@TonHospel Ich hatte meinen Code nicht auf den neuesten Stand gebracht, oops ...
Dom Hastings

6

JavaScript (ES6), 198 (102 Byte + 96 Streichhölzer)

5 Punkte gespart dank @ l4m2

v=>[...v].map(w=>t+=('{w__^_{]|{{_^__^_^w^~]~]^__w_~]~~_^_'[parseInt(w,36)]+v).charCodeAt()%9,t=+[])|t

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.

 char. | code | modulo 9
-------+------+-----------------
   ~   |  126 |   0
   v   |  118 |   1  (not used)
   w   |  119 |   2
   ]   |   93 |   3
   ^   |   94 |   4
   _   |   95 |   5
   {   |  123 |   6
   |   |  124 |   7

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, NaNund die Suche nach Zeichenfolgen führt zu undefined. 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 .


v=>[...v].map(w=>t+='~{w__^_{]|{{_^__^_^w^~]~]^__w_~]~~_^_'.charCodeAt(1+parseInt(w,36))%9,t=+[])|t1 weniger
l4m2

5

Gelee , 42 Bytes + 0 Streichhölzer = 42 Punkte

“ṄḟṭkɗØæ⁶ṡ“£ƈṠ¤żȥṬ}ė$t¿ƬⱮȷ|çƓ’×/ṚṚæ.ċЀØW$

Vielen Dank an @ JonathanAllan für -2 Punkte!

Probieren Sie es online!

Wie es funktioniert

“ṄḟṭkɗØæ⁶ṡ“£ƈṠ¤żȥṬ}ė$t¿ƬⱮȷ|çƓ’

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

[3096734725226860846495, 211369264881118657055472842435156679693648].

×/ reduziert sich durch Multiplikation, ergibt sich

654554542403034552503005456545545424030345525030054562554563760

(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

[6, 5, 4, 5, 5, 4, 5, 4, 2, 4, 0, 3, 0, 3, 4, 5, 5, 2, 5, 0, 3, 0, 0, 5, 4, 5, 6, 5, 4, 5, 5, 4, 5, 4, 2, 4, 0, 3, 0, 3, 4, 5, 5, 2, 5, 0, 3, 0, 0, 5, 4, 5, 6, 2, 5, 5, 4, 5, 6, 3, 7, 6, 0]

ċЀØ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.


Verwenden Sie eine Faktorisierung der großen Zahl, um ein Byte und die Basisdekomprimierung und das Modulo Dzu speichern, anstatt ein anderes zu speichern. Versuchen Sie es online
Jonathan Allan

byte ... err point :)
Jonathan Allan

1
Und noch einer mit Ɗ. Vielen Dank!
Dennis

3

Perl 5 -p , 90 64 Code + 9 Bewertungsgeschirr + 14 Streichhölzer = 87

Ersetzen Sie die Hex-Codes durch ihre 1-Byte-Literalvariante ( nicht UTF-8, wie TIO versucht) für die beanspruchte Punktzahl

eval~"\xdb\xa3\xd4\xc2\x86\xd0\xcf\xd2\xc6\x9e\xd2\x85\xd0\xc9\xcd\xca\xca\xcb\xca\xc9\xcc\xc8\xc9\xc9\xca\xcb\xca\xca\xcb\xca\xcb\xcd\xcb\xcf\xcc\xcf\xcc\xcb\xca\xca\xcd\xca\xcf\xcc\xcf\xcf\xca\xcb\xca\xd0\x8d\x99\x90\x8d\xdf\x93\x9c\xc2\x81\xd0\xd1\xc0\xd0\x98"}{

Probieren Sie es online!

Code In der ergänzten Zeichenfolge:

$\+=y/0-9a-z/625545637665455454240303455250300545/rfor lc=~/.?/g

3

Jelly , 34 Bytes + 3 Übereinstimmungen = 37

⁽[ɱד®-&]Ṙṙ£⁺ÐĊṂⱮɼ ’‘ḤṚæ.ŒlċЀØWṚƊ

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 ( Œlenthält ein l) 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.

ØWergibt "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.

⁽[ɱד®-&]Ṙṙ£⁺ÐĊṂⱮɼ ’‘ḤṚæ.ŒlċЀØWṚƊ - Link: list of characters
⁽[ɱ                                - literal                                     23913
    “®-&]Ṙṙ£⁺ÐĊṂⱮɼ ’               - literal         136861653160003879166772353166783
   ×                               - multiply  = 3272772712015172762515027281277281879
                    ‘              - increment = 3272772712015172762515027281277281880
                     Ḥ             - double    = 6545545424030345525030054562554563760
                      Ṛ            - reverse (implicit decimal list) -> [0,6,7,3,6,5,4,5,5,2,6,5,4,5,0,0,3,0,5,2,5,5,4,3,0,3,0,4,2,4,5,4,5,5,4,5,6]
                                   -                     (to align with: _ 9 8 7 6 5 4 3 2 1 0 z y x w v u t s r q p o n m l k j i h g f e d c b a)
                                 Ɗ - last four links as a monad:
                         Œl        -   lower-case (the input)
                              ØW   -   word -> "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_"
                            Ѐ     -   map across right:
                           ċ       -     count (right character in lower-cased input)
                                Ṛ  -   reverse (to align with the values as shown above)
                       æ.          - dot-product

2

PHP 176 Bytes = 397 Punkte

<?$n="6255456376";$l="065455454240303455250300545";$a=strtolower($argv[1]);for($i=0;$i<strlen($a);$i++)$t+=(is_numeric($a[$i])?$n[$a[$i]]:$l[max((ord($a[$i])-96),0)]);echo$t;

Probieren Sie es online!


1
Willkommen bei PPCG!
AdmBorkBork



1

Ruby , 125 Bytes + 87 Streichhölzer = 212

->m{v=->w,k{w.scan(/./).map &k};v[m,->t{v["!#&&;&=$(==&;&&;&;#;!$!$;&&#&!$!!&;&",->k{k.ord%11}][t.to_i 36].to_i+(t==?0?6:0)}].sum}

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(/./).mapgeändert. Das war eine lustige Herausforderung!

->m{
  v=->w,k{w.scan(/./).map &k};                # v is a lambda taking a string and a block
  v[m,->t{                                    # Transform each char t of the input:
    v["!#&&;&=$(==&;&&;&;#;!$!$;&&#&!$!!&;&", # Transform each char of this magic string
      ->k{k.ord%11}                           #  into a matchstick count ([0,2,5,5,4,5...])
    ][t.to_i 36]+                             # Parse t as a base 36 index into the counts
    (t==?0?6:0)                               # If t was "0", add 6 matchsticks
  }].sum                                      # Add the counts for all characters
}


1

R, 112 Bytes + 319 Übereinstimmungen = 431 Punkte

sum(strtoi(el(strsplit(chartr("0-9a-z","625545637665455454240303455250300545",tolower(scan(,""))),""))),na.rm=T)

Probieren Sie es online!

Ein großes Lob an Giuseppe, der sich diese Verbesserung einfallen ließ .

Alte Version, 143 Bytes + 454 Übereinstimmungen = 597 Punkte

b=el(strsplit(chartr("0123456789abcdefghijlnopqrsuxyz","6255456376654554542433455253545",tolower(readline())),""))
sum(as.numeric(b[b%in%0:9]))

Damit die el()Funktion in TIO funktioniert, müssen Sie verwenden library(methods).

Meine Güte, ist R wortreich!


TIO lädt das methodsPaket aus irgendeinem Grund nicht automatisch , aber da es sich um ein basePaket handelt, habe ich es immer in den Header verschoben und es nicht für die Byteanzahl gezählt. readlinefunktioniert auch nicht mit TIO, da es sich nicht um eine interaktive Sitzung handelt. Das ist aber definitiv golfen.
Giuseppe


^ benötigt jedoch Anführungszeichen um Eingaben, die Leerzeichen enthalten.
Giuseppe

Außerdem habe ich gerade einen Chatroom für R-Golf gestartet ! ! Ich habe in letzter Zeit viele Antworten in R von vielen verschiedenen Benutzern gesehen, was sehr ermutigend ist :)
Giuseppe

@ Giuseppe Ich denke, Sie sollten Ihre Antwort separat posten. Es ist prinzipiell anders und meiner weit überlegen.
Andreï Kostyrka

1

Perl 6 , 87 Bytes + 26 Streichhölzer = 113

{+[+] (~'򘮉򛫡񯌞𺪯񯉒񉘁'.ords~~m:g/\w/)[m:g/<[/..{]-[\W_]>/>>.&{:٣٦(~$_)}]}

Probieren Sie es online!

Verwendet einige Nicht-ASCII-Unicode-Zeichen. Die Nachschlagetabelle ist in einer Unicode-Zeichenfolge codiert:

say '򘮉򛫡񯌞𺪯񯉒񉘁'.ords;
# (625545 637665 455454 240303 455250 300545)

Zeichen werden mit einer Base-36-Konvertierung unter Verwendung von arabisch-indischen Ziffern in Indizes konvertiert:

:٣٦('z'); # is equivalent to
:36('z');

1

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
  1. 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.

  2. 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.

  3. 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.




1

Java 10, 452 432 416 404 Punkte (145 Bytes + 259 Übereinstimmungen)

k->{int m=0,t;for(var w:k)for(t=m-m;t<'';)m+="1ir 7lnu 4cfhjoy 235bdegpqsxz 069a 8".split(" ")[t++].contains((char)(w|32)+"")?-~t:t-t;return m;}

Erläuterung:

Probieren Sie es online aus.

k->{                   // Method with character-array parameter and int return-type
  int m=0,             //  Result-integer, starting at 0
      t;               //  Index-integer
  for(var w:k)         //  Loop over the input String-array
    for(t=m-m;t<'';)   //   Inner loop over the parts array with index [0,6)
      m+="1ir 7lnu 4cfhjoy 235bdegpqsxz 069a 8".split(" ")[t++]
                       //     If the current part ordered by amount of matches (2-8)
         .contains((char)(w|32)+"")?
                       //     contains the current (lowercase) letter
          -~t          //      Increase the result by the index + 2
         :             //     Else:
          t-t;         //      The result remains the same by adding 0
  return m;}           //  Return the result
  • Variablennamen $ραετwerden anstelle von Buchstaben verwendet. BEARBEITEN: Variablennamen kmtvwwerden jetzt stattdessen verwendet, da sie nicht durch Übereinstimmungen gemäß der Herausforderungsbeschreibung gebildet werden können.
  • ''(nicht druckbar) wird anstelle von verwendet 6.
  • m-mund t-twerden anstelle von verwendet 0.
  • (char)(w|32)+""mit Zeichenarray-Eingabe anstelle von w.toLowerCase()String-Array-Eingabe.

0

AutoHotkey , 148 Bytes + 345 Streichhölzer = 493

Dieser war ein bisschen eine Herausforderung zu verkürzen.

n:=["1ir","7lnu","4cfhjoy","235bdegpqsxz","09a5",7+1]
Loop Parse,i
{r:=A_LoopField
Loop % n.Length()
{l:=A_Index
if InStr(n[l],r)
u+=l+1
}}
send % u

0

Python 3 , 123 Bytes + 65 Übereinstimmungen = 188

lambda w,m='',t='',k=ord:sum(~-k((m+t+m+''+t)[k(v)%77])*('/'<v<'{')for v in w)

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!


0

Kohle , 48 Bytes + 3 = 51

IΣEθ⎇№α↥ιI§”)➙⊞←!Σw➙⊙↘⁴↘”⌕α↥ι∧№IX²φιI§”)⧴u↑$◨”Iι

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:

IΣEθ

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 ...

I§”)➙⊞←!Σw➙⊙↘⁴↘”⌕α↥ι

Suchen Sie die Anzahl der Streichhölzer in der komprimierten Zeichenfolge 65455454240303455250300545.

∧№IX²φι

Sonst, wenn es im Wert von erscheint 2 ** 1000...

I§”)⧴u↑$◨”Iι

Suchen Sie die Anzahl der Streichhölzer in der komprimierten Zeichenfolge 6255456376.


0

PHP, 98 + 253 = 351

for(;$k=ord($argn[$v++]);)$m+=$k>64?_65455454240303455250300545[$k&31]:_6255456376[$k-47];print$m;

Laufen Sie als Pipe mit -nroder versuchen Sie es online .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.