Mein erstes Programmierpuzzlespiel und Codegolf ist das Sieben-Schrägstrich-Display . Hier ist meine erste Challenge, die ebenfalls auf einer 7-Segment-Anzeige basiert.
Ich denke oft neben Zahlen darüber nach, welche Buchstaben ich mit einer einfachen 7-Segment-Anzeige darstellen kann. Es können sehr viele Buchstaben angezeigt werden. Tatsächlich können alle Buchstaben außer K, M, V, W, X mit einer einzigen 7-Segment-Anzeige angezeigt werden. Dies liegt daran, dass Sie entweder Kleinbuchstaben oder Großbuchstaben eines Buchstabens anzeigen können. z.B
"abcdef" kann angezeigt werden als
_ _ _ _
!_!!_ ! _!!_ !_
! !!_!!_ !_!!_ !
Beachten Sie, dass jedes Zeichen eine 3x3-Matrix aus !
und ist _
.
Natürlich kann die 7-Segment-Anzeige zur Anzeige von Zahlen und Symbolen verwendet werden:
_ _ _ _ _ _ _
! _ !_ !_ ! _! !!_ !_!! !_!!_!
! _!!_ !_! !_! ! _!! !_ ! ! _!
Einige Buchstaben können sowohl Groß- als auch Kleinbuchstaben enthalten:
_ _
! _ !_!!_ ! ! ! _ ! !
!_ !_ ! !! ! ! !!_!!_!!_!!_!
Hier sind die vollständigen Zeichen:
_ _ _ _ _ _ _ _ _
! ! ! _! _!!_!!_ !_ !!_!!_! _ !_ _ _ _!
!_! !!_ _! ! _!!_! !!_! _! !_ ! ! !!_!!_! !
_ _ _ _ _ _ _ _ _ _
!_!!_ ! _!!_ !_ ! !_! ! !! _ ! !!_!!_! _ !_ !_ ! !!_! _!
! !!_!!_ !_!!_ ! !_!! ! !!_!!_ ! !!_!! !! _!!_ !_! _!!_
Achten Sie darauf, dass ein Leerzeichen ( ), ein Bindestrich (
-
) und ein Fragezeichen ( ?
) vorhanden sind. Der Brief I
, O
und Z
ist die gleiche wie Zahlen 1
, 0
und 2
jeweils.
In dieser Herausforderung schreiben Sie ein Programm oder eine Funktion zum Anzeigen einer Zeichenfolge im obigen 7-Segment-Anzeigeformat.
Regeln
Sie können ein Programm oder eine Funktion schreiben
Dies ist Code-Golf, der kürzeste Code in Bytes gewinnt
Ihr Programm oder Ihre Funktion sollte Eingaben von STDIN oder als Parameter erhalten. Und gibt eine Zeichenfolge an STDOUT oder als Zeichenfolge in 3 Zeilen ohne vorangestelltes Leerzeichen aus, die jedoch mit einem Zeilenumbruch abgeschlossen wird. Behandeln Sie die Groß- / Kleinschreibung
CHIOU
richtig.Optional können Sie nachfolgende Leerzeichen drucken
Sie müssen das obige Format befolgen. Verwenden Sie Unterstrich
_
und Ausrufezeichen!
, um Ihre 7-Segment-Anzeige zu erstellen.Sie müssen Leerzeichen (
), Bindestrich (
-
) und Fragezeichen (?
) unterstützenWenn die Zeichenfolge ein nicht unterstütztes Zeichen (k, m, v, w, x) enthält, wird ein einzelnes Fehlerzeichen (3 Horizontlinien, siehe Beispiel) angezeigt. Neben den 5 nicht unterstützten Zeichen können Sie davon ausgehen, dass die Eingabe nur aus dem unterstützten Zeichensatz besteht.
Ich habe mich aus
l
Unklarheiten dafür entschieden, keinen Buchstaben für Kleinbuchstaben L ( ) zu haben, aber wenn Sie so geneigt sind, können Sie ihn wie einen1
entweder rechts oder links anzeigen .
Beispiele
$./a.out Start
_ _
!_ !_ !_! _ !_
_!!_ ! !! !_
$./a.out "7-seg dIsplay"
_ _ _ _ _ _ _
! _ !_ !_ ! _! !!_ !_!! !_!!_!
! _!!_ !_! !_! ! _!! !_ ! ! _!
$./a.out "0123456789 chiou-?"
_ _ _ _ _ _ _ _ _
! ! ! _! _!!_!!_ !_ !!_!!_! _ !_ _ _ _!
!_! !!_ _! ! _!!_! !!_! _! !_ ! ! !!_!!_! !
$./a.out "ABCDEFGHIJLNOPQRSTUZ"
_ _ _ _ _ _ _ _ _ _
!_!!_ ! _!!_ !_ ! !_! ! !! _ ! !!_!!_! _ !_ !_ ! ! _!
! !!_!!_ !_!!_ ! !_!! ! !!_!!_ ! !!_!! !! _!!_ !_!!_
$./a.out "abcdefghijlnopqrstuz"
_ _ _ _ _ _ _ _
!_!!_ _ _!!_ !_ ! !_ !! _ _ !_!!_! _ !_ !_ _!
! !!_!!_ !_!!_ ! !_!! ! !!_!!_ ! !!_!! !! _!!_ !_!!_
$./a.out "Bad Form"
_
_
_
$./a.out "Hello"
_
!_!!_ ! ! _
! !!_ !_ !_ !_!
$./a.out "World"
_
_
_
k, m, v, w, x
, nicht angezeigt werden.\r
) mit Zeilenvorschub (LF,\n
) verwechselt . * nix verwendet LF und Windows verwendet CRLF. Nur bestimmte Altsysteme verwenden CR für sich. Weitere Informationen hier: en.wikipedia.org/wiki/NewlineAntworten:
CJam,
123114112110 BytesOben wird die Caret-Notation verwendet, da der Code nicht druckbare Zeichen enthält. Eine davon ist ein Null-Byte (
^@
), was bedeutet, dass dieser Code nur über die Befehlszeile ausgeführt werden kann.Auf Kosten von nur zwei weiteren Bytes (für insgesamt 112 ) können wir dies beheben.
Dieses Mal können alle Zeichen gedruckt werden. Probieren Sie es online im CJam-Interpreter aus .
Beispiellauf
Idee (druckbare Version)
Jedes Zeichen kann auf der 9-Segment-Anzeige angezeigt werden
durch Ersetzen einiger seiner Zeichen durch Leerzeichen.
Wir können ein bestimmtes Zeichen in eine ganze Zahl verwandeln, indem wir jedes gezeigte Segment in natürlicher Lesereihenfolge durch eine 1 ersetzen , jedes nicht gezeigte Segment durch eine 0 und die resultierenden Binärziffern berücksichtigen.
Das erste und dritte Segment werden nie gezeigt, daher werden ganze Zahlen in den Bereichen [0,64) und [128,192) erzeugt .
Wir können jede dieser Ganzzahlen als ein einzelnes Byte codieren, aber die Hälfte davon führt zu nicht druckbaren Zeichen. Daher addieren wir vor dem Umwandeln in ein Zeichen 64 zu jeder Ganzzahl, wodurch sichergestellt wird, dass die Codepunkte in den Bereichen [64, 128] und [192, 256 ] liegen .
Das einzige nicht druckbare Zeichen in diesen beiden Bereichen ist DEL (Code-Punkt 127), das der folgenden nicht verwendeten Anzeigekonfiguration entspricht:
Wir können die obige Codierung umkehren, indem wir jedem Codepunkt 448 == 512 - 64 hinzufügen , in Basis 2 konvertieren und die erste Binärziffer entfernen.
Alles was noch zu tun ist, um eine effiziente Möglichkeit zu finden, diese codierten Segmenets mit ihren entsprechenden ASCII-Zeichen zu verknüpfen.
Wenn wir die Zeichen von
" -chiou"
den Zeichen von";=KMVWX"
zuordnen und die gesamte Eingabe in Großbuchstaben umwandeln, können wir einfach die Codierung für alle Zeichen zwischen0
(Codepunkt 48) undZ
(Codepunkt 90) speichern und einen Bereich von 43 angeben.Array Indizierung ist modular in CJam, so dass , wenn
A
eine Zeichenfolge mit einer Länge von 43,A86=
,A43=
undA0=
alle die gleichen Ergebnisse liefern. Das Zeichen mit dem Codepunkt 86 istV
, also speichern wir einfach die codierten Segmente von V - Z und 0 - U in der angegebenen Reihenfolge.Im eigentlichen Code wählen wir das At-Zeichen als "Bad Form" -Zeichen aus, ersetzen die gesamte Eingabe durch die Zeichenfolge,
"@"
wenn sie einen verbotenen Buchstaben enthält, und kehren die obigen Schritte um.Code (druckbare Version)
quelle
Perl,
475469424390280272 Bytesmehrzeilig mit Kommentaren:
Die Bitmuster, die die Segmente codieren, werden in einer Zeichenfolge gespeichert (wobei 3 nicht druckbare Zeichen mit
\x
und ohne\0
Leerzeichen ausgegeben werden) und mit dem Perl-Transliterationsoperator auf die Eingabezeichen abgebildet.Für 5 der 7 Segmente wird ein bitweises und zusammen mit dem ternären Operator verwendet, um ein Leerzeichen oder das Segmentzeichen auszugeben. Für die beiden unteren linken Segmente (codiert durch 2 und 4 im Bitset) wird eine Teilstringsuche in einer 8-Zeichen-Zeichenfolge verwendet, um 2 Bytes zu speichern.
Vielen Dank an Dom Hastings für seine Perl Golftipps.
Alte Version (mit Regexen, um die Muster zu kodieren), 390 Bytes:
mehrzeilig mit Kommentaren:
Die Zeichenfolge wird eingelesen und mit einem regulären Ausdruck auf ungültige Zeichen überprüft. Anschließend werden die ungültigen Zeichen durch die zulässigen Kleinbuchstaben ersetzt, und die gesamte Zeichenfolge wird in Kleinbuchstaben umgewandelt.
Die Zeilen werden einzeln generiert, wobei 1 Segment pro Buchstabe in der ersten Zeile und 3 in den beiden anderen Segmenten enthalten sind. Für jede Zeile wird die Zeichenfolge einzeln verarbeitet, und das Zeichen wird für jedes Segment mit einem regulären Ausdruck verglichen, um zu überprüfen, ob ein! oder _ sollte angezeigt werden. Die Verwendung einer Regex bedeutet, dass für Zeichen, bei denen das Segment nicht gesetzt ist, für die Kodierung der Einstellung null Bits pro Segment und Zeichen benötigt werden, und für diejenigen, bei denen es sich um ein Regex handelt, im Durchschnitt etwas weniger als 8 Bits, da es sich um Regex-Zeichenbereiche handeln kann benutzt. Das heißt, es gibt ungefähr 3 oder 4 Bits pro Segment pro Zeichen im Satz oder ungefähr 21 bis 24 Bits pro Zeichen.
Zeilenumbrüche werden nicht verarbeitet.
quelle
' '
kann durch ersetzt werden$"
und' '
kann sein,$"x3
was ein paar abschneidet, Ihre\n
s können wörtliche Zeilenumbrüche sein, um ein paar mehr loszuwerden. Auch Ihr früher Austritt kann mit dem Würfel gekürzt werden, so dassif(/[kmvwx]/i){print" -\n"x3;exit}
wirddie" - "x3if(/[kmvwx]/i)
. Mit etwas mehr Fudging können Sie die Schleife neu anordnen, um die Klammern zu umgehen, und Sie sollten nicht noch$z
ein paar mehr sparen müssen!$_=lc<>
nicht, da der Code dann nicht zwischen CHIOU in Groß- und Kleinbuchstaben unterscheiden kannGemeines Lisp,
488416Beispiel
Mit
"abcdefg'hijklnopqrstuz"
, druckt:Bemerkungen
Zeichen und ihre Darstellungen sind in dieser Zahl in Basis 36 codiert:
Die Binärdarstellung dieser Ziffer ist in 17-Bit-Gruppen unterteilt.
Zum Beispiel ist die letzte Gruppe von 17 Bits
110000111101010
, die hier in zwei Teile zerlegt wird:110000
, der Zeichencode des Zeichens0
111101010
, eine Kodierung der Zeichnung, am besten wie folgt dargestellt:Die Bits in der ersten und letzten "Spalte" stehen für
!
Zeichen, die in der mittleren Spalte für das_
Zeichen. Bei Bedarf werden sowohl Groß- als auch Kleinbuchstaben eines Zeichens gespeichert.Die Funktion iteriert dreimal über die Eingabezeichenfolge, eine für jede Ausgabezeile, sucht nach einem übereinstimmenden Zeichen in der Tabelle (oder standardmäßig 146, dh drei Balken) und druckt die Darstellung in der aktuellen Zeile.
quelle
'
Charakter hinzugefügt haben, was nett ist; Es wird jedoch außerhalb dessen angezeigt, wozu eine 7-Segment-Anzeige in der Lage ist. Wenn Sie den!
Cursor um eine Zeile nach unten bewegen , ist dies perfekt.'
Charakter und bearbeite die Frage für,K
weil ich in der TatK
die falsche Stelle in die Eingabezeichenfolge gesetzt habe ("... jlKn ...") ;-) Sie können die Dreifachbalken (Fehler) nur sehen nach dem L. Danke, dass du es bemerkt hast.JavaScript (ES6),
380352324 Byte( Hinweis: Der Code verwendet die Caret-Notation, da er einige nicht druckbare Zeichen enthält. Um den Originalcode zu erhalten, klicken Sie hier und wählen Sie die Rohdaten aus. Und nein, es
h
handelt sich nicht um ein CJam-Programm.;)Genannt als
d("7-seg display")
oder ähnlich. Funktioniert in Firefox 40, jedoch möglicherweise nicht in anderen Browsern. Aus irgendeinem Grund speichert das HTML / JS-Snippet die nicht druckbaren Dateien nicht, aber Sie können die Rohdaten von hier aus kopieren und einfügen .Ungolfed:
( Anmerkung:
g
undh
wurde mit Leerzeichen aufgefüllt entsprechen8
,-
,ÿ
undspace
mit ihren entsprechenden Unicode - Werten.)Erläuterung:
Ich bemerkte sofort, dass die in
0
/1
bits konvertierten 7 Segmente gut zu den ersten 128 Unicode-Zeichen passen würden. Das Problem bei dieser Idee ist, dass 1/4 dieser Zeichen nicht druckbare Steuerzeichen sind. Wenn ich sie in meinem Code verwende, sieht es unglaublich chaotisch aus (oder unglaublich intelligent; ich habe nicht entschieden, welcher). Um dies zu lösen und gleichzeitig den Rest des Codes einfach zu halten, kam mir folgende Idee:Mit Ausnahme von
-
, Raum , und Fehler , keiner der Charaktere waren beide der unteren vertikalen Segmente fehlen. Um sicherzustellen, dass alle diese Zeichen zwischen0020
und bleiben007f
, habe ich einfach die 64- und 32- Bit-Zeichen diesen Segmenten zugeordnet :Die Zahlen der anderen 5 Segmente sind nicht so wichtig. Sie könnten auch auf andere Weise angeordnet sein und dennoch dieselben Zeichen "in-bounds" haben.
Als Beispiel ist hier die codierte Version von A :
Ich habe dann die codierte Version jedes 7-Seg-Zeichens eingefügt
h
. Jedoch8
führte007f
(den Lösch - Steuercode; konstant unabhängig davon , wie die Segmente angeordnet sind), Raum in Folge0000
(der Nullcode; konstant),-
führte0002
, und Fehler in Folge0007
. Ich das rohe Bytes in die richtige Position kopier klebte für8
,-
und Fehler ; Platz war mit leicht zu erreichen\0
.Nach all dieser Kodierung musste ich den String nur noch dekodieren und in einem 7-Segment-lesbaren Format ausgeben. Ich habe eine for- Schleife und drei Variablen (
x
,y
undz
, die jeweils einer Ausgabezeile entsprechen) verwendet, um jedes Zeichen in der Zeichenfolge durchzugehen und seine 7-Seg-Entsprechung zur Ausgabe hinzuzufügen. Ich wählteÿ
für den Fehler Charakter , weil AFAIK, es ist nicht auf jeder Tastatur, und es ist das letzte Zeichen imu+0000-u+00ff
Bereich. Vielleicht hätte ichΞ
stattdessen witzig und auserwählt sein können (griechischer Buchstabe xi) ....;)Edit 1: Gespeichert ein Bündel von Raum durch Mini-Funktionen zu schaffen , um zu bestimmen , ob
!
,_
oderbenötigt wird .
Bearbeiten 2: Mit den Tricks, die ich seit meinem letzten Besuch in diesem Beitrag gelernt habe, hat sich einiges an Platz gespart.
Wie immer sind Vorschläge sehr willkommen!
quelle