Hier ist ein einfacher ASCII-Kunst- Rubin :
___
/\_/\
/_/ \_\
\ \_/ /
\/_\/
Als Juwelier der ASCII Gemstone Corporation müssen Sie die neu erworbenen Rubine untersuchen und eventuelle Mängel notieren.
Zum Glück sind nur 12 Arten von Fehlern möglich, und Ihr Lieferant garantiert, dass kein Rubin mehr als einen Fehler aufweist.
Die 12 Defekte entsprechen den Ersatz von einem des 12 Innen _
, /
oder \
Zeichen des Rubins mit einem Leerzeichen ( ). Der äußere Umfang eines Rubins weist niemals Mängel auf.
Die Mängel sind nummeriert, je nachdem, in welchem inneren Zeichen ein Leerzeichen steht:
So sieht ein Rubin mit Defekt 1 aus:
___
/\_/\
/_/ _\
\ \_/ /
\/_\/
Ein Rubin mit Defekt 11 sieht folgendermaßen aus:
___
/\_/\
/_/ \_\
\ \_/ /
\ _\/
Das ist die gleiche Idee für alle anderen Mängel.
Herausforderung
Schreiben Sie ein Programm oder eine Funktion, die die Zeichenfolge eines einzelnen, möglicherweise defekten Rubins aufnimmt. Die Fehlernummer sollte ausgedruckt oder zurückgesandt werden. Die Fehlernummer ist 0, wenn kein Fehler vorliegt.
Nehmen Sie Eingaben aus einer Textdatei, einem stdin oder einem Zeichenfolgenfunktionsargument entgegen. Senden Sie die Fehlernummer zurück oder drucken Sie sie auf stdout.
Sie können davon ausgehen, dass der Rubin einen nachgestellten Zeilenumbruch hat. Sie können nicht davon ausgehen, dass es Leerzeichen oder führende Zeilenumbrüche enthält.
Der kürzeste Code in Bytes gewinnt. ( Handy-Byte-Zähler. )
Testfälle
Die 13 genauen Rubintypen, gefolgt von der erwarteten Ausgabe:
___
/\_/\
/_/ \_\
\ \_/ /
\/_\/
0
___
/\_/\
/_/ _\
\ \_/ /
\/_\/
1
___
/\ /\
/_/ \_\
\ \_/ /
\/_\/
2
___
/\_/\
/_ \_\
\ \_/ /
\/_\/
3
___
/\_/\
/_/ \_\
\ _/ /
\/_\/
4
___
/\_/\
/_/ \_\
\ \ / /
\/_\/
5
___
/\_/\
/_/ \_\
\ \_ /
\/_\/
6
___
/\_/\
/_/ \ \
\ \_/ /
\/_\/
7
___
/\_ \
/_/ \_\
\ \_/ /
\/_\/
8
___
/ _/\
/_/ \_\
\ \_/ /
\/_\/
9
___
/\_/\
/ / \_\
\ \_/ /
\/_\/
10
___
/\_/\
/_/ \_\
\ \_/ /
\ _\/
11
___
/\_/\
/_/ \_\
\ \_/ /
\/_ /
12
quelle
Antworten:
CJam,
2723 BytesKonvertiere Basis 11, nimm Mod 67, nimm Mod 19 des Ergebnisses und finde den Index dessen, was du im Array hast
Zauber!
Probieren Sie es online aus .
quelle
Ruby 2.0, 69 Bytes
Hexdump (um die Binärdaten in der Zeichenkette originalgetreu anzuzeigen):
Erläuterung:
-Kn
Option liest die Quelldatei alsASCII-8BIT
(binär).-0
Option ermöglichtgets
das Einlesen der gesamten Eingabe (und nicht nur einer Zeile).-rdigest
Option lädt dasdigest
bereitgestellte ModulDigest::MD5
.quelle
Julia,
9059 BytesAuf jeden Fall nicht die kürzeste, aber das schöne Mädchen Julia achtet sehr auf die Inspektion der königlichen Rubine.
Dadurch wird eine Lambda-Funktion erstellt, die eine Zeichenfolge akzeptiert
s
und die entsprechende Ruby-Fehlernummer zurückgibt. Um es zu nennen, geben Sie ihm einen Namen, zf=s->...
.Ungolfed + Erklärung:
Beispiele:
Beachten Sie, dass Backslashes in der Eingabe maskiert werden müssen. Ich habe mit @ Calvin'sHobbies bestätigt, dass es in Ordnung ist.
Lassen Sie mich wissen, wenn Sie Fragen oder Anregungen haben!
Edit: 31 Bytes mit Hilfe von Andrew Piliser gespeichert!
quelle
search
und die Array-Indizierung entfernen.s->(d=reshape([18 10 16 24 25 26 19 11 9 15 32 34],12);search(s[d],' '))
. Ich mag die Umformung nicht, aber ich könnte mir keinen kürzeren Weg vorstellen, um ein 1d-Array zu erhalten.reshape()
zu benutzen istvec()
. :)> <> (Fisch) , 177 Bytes
Dies ist eine lange, aber einzigartige Lösung. Das Programm enthält keine Arithmetik oder Verzweigung außer dem Einfügen von Eingabezeichen an festen Stellen im Code.
Beachten Sie, dass alle untersuchten rubinbildenden Charaktere (
/ \ _
) "Spiegel" im Code> <> sein können, die die Richtung des Befehlszeigers (IP) ändern.Wir können diese Eingabezeichen verwenden, um mit der Code-Änderungsanweisung ein Labyrinth daraus zu erstellen,
p
und bei jedem Exit (der durch einen fehlenden Spiegel in der Eingabe erzeugt wird) können wir die entsprechende Zahl drucken.Die
S B U
Buchstaben sind diejenigen, die/ \ _
jeweils geändert wurden. Wenn die Eingabe ein voller Rubin ist, lautet der endgültige Code:Sie können das Programm mit diesem großartigen visuellen Online-Dolmetscher ausprobieren . Da Sie dort keine Zeilenumbrüche eingeben können, müssen Sie stattdessen einige Dummy-Zeichen verwenden, damit Sie einen vollständigen Ruby eingeben können, wie z
SS___LS/\_/\L/_/S\_\L\S\_/S/LS\/_\/
. (Die Leerzeichen wurden aufgrund von Abschriften ebenfalls in S geändert.)quelle
CJam,
41 31 2928 BytesFolgen Sie für nicht druckbare Zeichen wie gewohnt diesem Link .
Probieren Sie es hier online aus
Erklärung bald
Bisheriger Ansatz:
Ziemlich sicher, dass dies durch Ändern der Ziffern- / Konvertierungslogik reduziert werden kann. Aber hier ist der erste Versuch:
Verwenden Sie wie gewohnt diesen Link für nicht druckbare Zeichen.
Die Logik ist ziemlich einfach
"Hash for each defect":i
- Dadurch erhalte ich den Hash pro Defekt als IndexqN-"/\\_ "4,er
- Hiermit werden die Zeichen in Zahlen umgewandelt4b1e3%A/
- Dies ist die eindeutige Nummer in der umgerechneten Basisnummer#
Dann finde ich einfach den Index der eindeutigen Nummer im HashProbieren Sie es hier online aus
quelle
.h
ist sie nutzlos, weil sie die eingebaute unzuverlässige und schlechte Funktion verwendethash()
), bis dahin kann ich es nicht besser machen.Beleg ,
123108 + 3 = 111 BytesLaufen Sie mit den
n
undo
Flags, dhAlternativ können Sie es auch online versuchen .
Slip ist eine Regex-ähnliche Sprache, die im Rahmen der 2D-Pattern-Matching- Herausforderung erstellt wurde. Mit dem
p
Positions-Flag kann Slip die Position eines Defekts über folgendes Programm erkennen:das nach einem der folgenden Muster sucht (hier
S
bedeutet dies, dass die Übereinstimmung beginnt):Probieren Sie es online aus - Koordinaten werden als (x, y) Paar ausgegeben. Alles liest sich wie ein normaler Regex, außer dass:
`
wird für die Flucht verwendet,<>
drehen Sie den Match-Zeiger nach links / rechts,^6
Setzt den Übereinstimmungszeiger nach links und\
Bewegt den Übereinstimmungszeiger orthogonal nach rechts (z. B. wenn der Zeiger nach rechts zeigt, wird eine Zeile nach unten verschoben)Was wir jedoch brauchen, ist eine einzelne Zahl von 0 bis 12, die angibt , welcher Fehler festgestellt wurde, und nicht, wo er festgestellt wurde. Slip bietet nur eine Methode zur Ausgabe einer einzelnen Nummer - das
n
Flag, das die Anzahl der gefundenen Übereinstimmungen ausgibt.Zu diesem Zweck erweitern wir den obigen regulären Ausdruck mithilfe des
o
überlappenden Übereinstimmungsmodus so, dass er für jeden Fehler die richtige Anzahl von Übereinstimmungen aufweist. Aufgeschlüsselt sind die Komponenten:Ja, das ist eine exzessive Verwendung von
?
, um die Zahlen richtig zu machen: Pquelle
JavaScript (ES6), 67,
72Sucht einfach nach Leerzeichen an den angegebenen 12 Stellen
Bearbeite gespeicherte 5 Bytes, danke @apsillers
Test In der Firefox / FireBug-Konsole
Ausgabe
quelle
C,
9884 BytesUPDATE: Ein bisschen cleverer in Bezug auf die Saite und ein Problem mit nicht defekten Rubinen wurde behoben.
Entwirrt:
Ganz einfach und gerecht 100 Bytes.
Zum Prüfen:
Eingabe in STDIN.
Wie es funktioniert
Jeder Fehler im Rubin liegt bei einem anderen Charakter. Diese Liste zeigt, wo jeder Fehler in der Eingabezeichenfolge auftritt:
Da das
{17,9,15,23,24,25,18,10,8,14,31,33}
Erstellen eines Arrays viele Bytes kostet, finden wir einen kürzeren Weg, um diese Liste zu erstellen. Beachten Sie, dass durch Hinzufügen von 30 zu jeder Zahl eine Liste von Ganzzahlen erstellt wird, die als druckbare ASCII-Zeichen dargestellt werden können. Diese Liste ist wie folgt:"/'-5670(&,=?"
. Daher können wir ein Zeichenarray (im Codec
) auf diese Zeichenfolge setzen und einfach 30 von jedem Wert abziehen, den wir aus dieser Liste abrufen, um unser ursprüngliches Array von Ganzzahlen zu erhalten. Wir definierena
, gleich zu sein,c
um zu verfolgen, wie weit wir auf der Liste sind. Das einzige, was im Code übrig bleibt, ist diefor
Schleife. Es prüft, ob wir das Endec
noch nicht erreicht haben, und prüft dann, ob das Zeichenb
der aktuellenc
ein Leerzeichen ist (ASCII 32). Wenn ja, setzen wir das erste, nicht verwendete Element vonb
an die Fehlernummer und senden Sie diese zurück.quelle
Python 2,
146888671 BytesDie Funktion
f
testet jede Segmentposition und gibt den Index des defekten Segments zurück. Ein Test des ersten Bytes in der Eingabezeichenfolge stellt sicher, dass wir zurückgeben,0
wenn keine Fehler gefunden werden.Wir packen jetzt die Segmentversätze in eine kompakte Zeichenfolge und verwenden sie
ord()
, um sie wiederherzustellen:Testen mit einem perfekten Rubin:
Testen mit Segment 2, das durch ein Leerzeichen ersetzt wurde:
EDIT: Danke an @xnor für die nette
sum(n*bool for n in...)
Technik.EDIT2: Danke an @ Sp3000 für zusätzliche Golftipps.
quelle
sum(n*(s[...]==' ')for ...)
.<'!'
anstatt==' '
für ein Byte. Sie können die Liste auch mit generierenmap(ord, ...)
, aber ich bin mir nicht sicher, wie Sie sich zu Unprintables fühlen :)Pyth,
353128 BytesBenötigt einen gepatchten Pyth , die aktuellste Version von Pyth hat einen Fehler
.z
, der abschließende Zeichen beseitigt .Diese Version verwendet keine Hash-Funktion, sondern verwendet die Basis-Konvertierungsfunktion in Pyth, um einen sehr dummen, aber funktionierenden Hash zu berechnen. Dann konvertieren wir diesen Hash in ein Zeichen und schlagen seinen Index in einer Zeichenkette nach.
Die Antwort enthält nicht druckbare Zeichen. Verwenden Sie diesen Python3-Code, um das Programm genau auf Ihrem Computer zu generieren:
quelle
Haskell, 73 Bytes
Gleiche Strategie wie bei vielen anderen Lösungen: Suche nach Räumen an den angegebenen Standorten. Das Nachschlagen gibt eine Liste von Indizes zurück, von denen ich das letzte Element nehme, weil es immer einen Treffer für den Index 0 gibt.
quelle
05AB1E , 16 Bytes
Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
Erläuterung:
Sehen Sie sich meinen Tipp 05AB1E an (Abschnitte Wie komprimiere ich große Ganzzahlen? Und Wie komprimiere ich Ganzzahlenlisten? ) , Um zu verstehen, warum das so
•W)Ì3ô;4(•
ist2272064612422082397
und•W)Ì3ô;4(•₆в
ist[17,9,15,23,24,25,18,10,8,14,31,33]
.quelle