Schreiben Sie ein Programm, das eine nicht leere Zeichenfolge mit den Ziffern 0 bis 9 eingibt und mit Schrägstrichen ( , ) ausgibt , wie sie auf einer Siebensegmentanzeige angezeigt würden ./
\
Dies sind die genauen Ziffernformen:
/\
\ \
\/
\
\
/\
/
\/
/\
/\
/
\
\/\
/
\/\
/
/
\/\
\/
/\
\
/\
\/\
\/
/\
\/\
/
Wenn eine Ziffer nach der anderen vorkommt, werden sie diagonal nach rechts mit einem diagonalen Abstand dazwischen verkettet. So 203
würde zum Beispiel dies werden:
/\
/\
/\ /
\ \
/\ \/
/
\/
Beachten Sie, dass der 1
Charakter den gleichen Platz wie die anderen einnimmt. Die zwei Zeilen von 1
befinden sich auf der rechten Seite des Displays, nicht auf der linken.
So 159114
würde das werden:
\
\/\
\
\
\
\
/\
\/\
/ /
\/\
\ /
\
Die Ausgabe kann eine beliebige Anzahl und Kombination von führenden / nachfolgenden Zeilen oder Leerzeichen enthalten, sofern sich die Ziffern in der richtigen Position zueinander befinden.
Also für 159114
diese wäre auch gültig:
\
\/\
\
\
\
\
/\
\/\
/ /
\/\
\ /
\
Nehmen Sie Eingaben von stdin oder der Befehlszeile entgegen oder schreiben Sie eine Funktion, die eine Zeichenfolge akzeptiert. Drucken Sie das Ergebnis auf stdout oder geben Sie es als Zeichenfolge zurück, wenn Sie eine Funktion schreiben.
Jede nicht-leere Zeichenkette der Ziffern 0 bis 9 sollte funktionieren, einschließlich einstelligen Strings (zB 8
) und Zeichenfolge mit führenden Nullen (zB in 007
den Nullen haben müssen gedruckt werden).
Der kürzeste Code in Bytes gewinnt.
Antworten:
CJam,
777170696362 BytesAlle Zeichen können ausgedruckt werden, sodass Kopieren und Einfügen problemlos funktionieren sollten.
Probieren Sie es online im CJam-Interpreter aus .
Idee
Wir beginnen damit, die Anzahl der Stellen n in der Eingabe zu untersuchen und ein Quadrat mit Leerzeichen zu verschieben, das groß genug ist, um die Ausgabe abzudecken. In der Implementierung wird dieses Quadrat als zweidimensionales Array von Zeichenfolgen mit einem Zeichen codiert.
Ein Quadrat der Länge 2n + 1 wäre für eine einfache Implementierung genau das Richtige (dh kein umgebendes Leerzeichen), aber wir verwenden ein Quadrat der Länge 5n , um ein paar Bytes zu sparen. Glücklicherweise ist das Umgeben von Leerzeichen erlaubt.
Wenn wir die Zeilen der Darstellung mit sieben Schrägstrichen von 8 umkehren , erhalten wir Folgendes:
Die Darstellung aller Ziffern kann als 8-Bit-Ganzzahl codiert werden, wobei das i- te Bit 0 ist, wenn das i- te Zeichen durch ein Leerzeichen ersetzt werden soll. Für die Ziffern 0 bis 9 sind die sich ergebenden ganzen Zahlen
die den folgenden ISO-8559-1-Zeichen entsprechen:
Für jede Stelle in dem Eingang nach dem entsprechenden 8-Bit - Integer - Auswahl wiederholen wir die i - te Zeichen der Darstellung von 8 genau eine i - mal, wobei a i die i - te Bit der Ganzzahl. Dadurch wird ein Array von Zeichenfolgen mit einem oder null Zeichen verschoben. Durch Aufteilen dieses Arrays in Abschnitte der Länge 3 erhalten wir ein Array, in dem jedes Element einer Zeile der Darstellung entspricht.
Nun berechnen wir das vektorisierte Maximum der Zeichenfolgen, die das Quadrat darstellen, und der Zeichenfolgen, die die Ziffer darstellen. Die Zeichenfolgen
, sodass sie die Leerzeichen im Quadrat ersetzen. Die leere Zeichenfolge ist jedoch kleiner als die Zeichenfolge
, sodass leere Zeichenfolgen in der Stellendarstellung die Leerzeichen im Quadrat beibehalten.
/
und\
sind größer als die ZeichenfolgeWir drehen nun die Zeilen und Spalten um zwei Einheiten, um die folgende Zifferndarstellung im richtigen Teil des Quadrats zu platzieren und wiederholen den Vorgang für die verbleibenden Ziffern in der Eingabe.
Schließlich kehren wir jede Zeile um und fügen einen Zeilenumbruch zwischen den einzelnen Zeilen ein.
Code
Die letzten Umdrehungen würden die Ausgabe durcheinander bringen, wenn die Seitenlänge des Quadrats kleiner als 2n + 3 wäre . Da 5n ≥ 2n + 3 für alle positiven ganzen Zahlen n ist , ist das Quadrat groß genug, um dies zu verhindern.
quelle
Python 3,
189183174 BytesDie Komprimierung sieht für mich in Ordnung aus, aber ich habe Probleme damit, die sieben Variablen in den Hintergrund zu rücken ...
Glücklicherweise ist die Spezifikation in Bezug auf Whitespace-Regeln ziemlich locker, da es viele führende / nachfolgende Whitespaces gibt.
Erweitert:
Erläuterung
Die durch die Variablen dargestellten Segmentpositionen sind:
Jedes Segment wird durch ein einzelnes 2-Byte-Unicode-Zeichen codiert. Codiert beispielsweise
ϻ
dasg
Segment wie folgt:Tatsächlich
2
ist dies die einzige Ziffer, bei der das untere rechte Segment einer Siebensegmentanzeige nicht verwendet wird.quelle
C
1098345323319 BytesErsterzweiterdritter Versuch. Schließlich beschlossen, den Bildschirmpuffer zu löschen, um ein paar Bytes zu sparen. Dieses Programm verwendet einen Ziffernparameter und druckt die Ziffern im 7-Segment-Format.Erstmaliger Teilnehmer. Nur zum Spaß. Sei sanft.
Erweitert, warnfrei:
quelle
JavaScript,
192178167162 BytesVerbrauch:
f("1337");
kehrt zurückEs verwendet die Funktionen von ES6 und weist möglicherweise ein implementierungsabhängiges Verhalten auf, da Semikolons und Klammern weggelassen werden. Dies funktioniert jedoch in Firefox.
Erweitert:
Erläuterung:
l
ist ein Array mit 10 Einzelbytezeichen, die der Form jeder Ziffer entsprechen. Beispielsweise wird die Ziffer 0 durch das Zeichen dargestelltî
:Die eingegebenen Zeichen werden als Schlüssel für das Array verwendet, das die Form der Gegenstücke enthält, die Bit für Bit gelesen werden.
quelle
==0
und müssen==1
ja vorher?
. Werden int in js nicht als boolesch angesehen? @Regret"w\x05k/\x1D>~\x07\x7F?"
mit jedem Zeichen wird bitweise umgekehrt"\xee\xa0\xd6\xf4\xb8|~\xe0\xfe\xfc"
, jedes davon ist druckbar. Dies ergibt 8 weitere Bytes. Obwohl nicht genug ...f=(x)=>{}
- sie werden nicht mit nur einem Argument benötigt.Perl - 103 Bytes
Die obigen Angaben enthalten 6 nicht druckbare Zeichen (die Quelle kann bei Ideone heruntergeladen werden ) und entsprechen den folgenden Angaben:
Jedes
^F
kann durch ein Literalzeichen 6 (ACK) und\177
durch ein Zeichen 127 (DEL) ersetzt werden.Der Shebang wird als 1 gezählt, die zweite Newline ist unnötig. Die Eingabe erfolgt aus stdin.
Beispielnutzung
Erläuterung
Die Ausgabe erfolgt byteweise. Jedes Zeichen wird transliteriert und dies wird dann unter Verwendung von als Bit-Array interpretiert
vec
. Die Bits werden auf folgende Weise gespeichert:Die Ausgabe wechselt zwischen 3 und 5 Schrägstrichen, sodass Bits
56
in01
die nächste Ziffer übergehen. Bit7
wird nicht verwendet.quelle
C #,
360 355331 BytesHallo, erster Versuch mit Code-Golf. Hoffe, dass dies für einen C # -Eintrag nicht allzu schlecht abschneidet.
Verbrauch:
p("159114");
kehrt zurückErweitert:
quelle
string s(string n)
zun=>
durch ein Lambda verwenden. Na ja, Sie können es einfach so lassen, wenn Sie es vorziehen. :) Ich habe einen Port für Java erstellt, der Ihnen jedoch gutgeschrieben wurde. ;)Python 2,
317298278273.15Beim Zählen betrachtete ich 4 Leerzeichen als Tabulatoren.
Unkomprimiert und lesbar:
quelle
l[y+dy][x+dx]=c if r[map(int,s)[x/2]][i]=='1' else ' '
derl[y+dy][x+dx]=[' ',c][r[map(int,s)[x/2]][i]=='1']
Einstellung werden 5 Byte und durch Ändernreturn '\n'.join(''.join(x) for x in l)
der Einstellungprint'\n'.join(''.join(x)for x in l)
3 Byte sowie einige weitere Änderungen gespeichert. Hier ist ein Link zu einem Gist, bei dem ich die Anzahl der Bytes von 508 auf 440 herunterzählte.KDB (Q),
172136 BytesErläuterung
1) Erstellen Sie eine
d
Karte mit allen Ziffernformen.2) Füllen Sie die Matrix mit zusätzlichen Nullen auf und addieren Sie diese. dh "01"
3) Verwenden Sie den Index, um mit abzubilden
" /\"
und zu drucken-1
.Prüfung
Ich bin sicher, das kann kürzer sein !!
Danke @hjk
quelle
1 2 0 2 1 2 0 2 1
mit(9#1 2 0 2)
(-6).enlist
mit1#
Werken, damit ist eine andere -5.enlist
count[a 0]#0
Pip, 122 + 1 = 123 Bytes
Verwendet die
-n
Flagge. Übernimmt die Eingabe über das Befehlszeilenargument.Die Zeichen in der UTF-8 - String haben folgende Codepunkte:
11152, 19190, 12535, 12547, 17651, 11575, 11557, 12629, 11071, 11089
.Leicht ungolfed:
Die grundlegende Strategie besteht darin, die konstituierenden Zeichen jeder Zahl zu finden und sie dann entsprechend zu verzerren. Zum Beispiel
8
wollen wir dies (durch Punkte dargestellte Leerzeichen):was daraus wird:
Das Schöne an dieser Strategie ist, dass mehrere vorversetzte Zahlen einfach nebeneinander verkettet werden können.
Jetzt können wir
/.\\/.\\/.
in Basis 3 als kodieren1200120012
. Dann können wir dies in eine Dezimalzahl konvertieren und als UTF-8-Codepunkt behandeln.Der Ausdruck
J"\/ "@^(A_TB3M"⮐䫶ヷ䓳ⴷⴥㅕ⬿⭑")@_.2<>2Ma
erhält die vorversetzten Daten durch den folgenden Prozess:Nachdem wir diese Zeichenfolgen nebeneinander verkettet haben
$.
, erstellen wir ein Gitter mit Leerzeichen (2 * n + 2 Quadrat), durchlaufen das vorversetzte Gitter und ersetzen die entsprechenden Leerzeichen im nachversetzten Gitter durch das entsprechende Zeichen. Um dies zu sehen, können Sie den Code so ändern, dass er jede Stufe druckt und für Benutzereingaben pausiert:Das Gitter ist tatsächlich verkehrt herum aufgebaut, weil das die Mathematik einfacher zu machen schien.
Ich bin mir sicher, dass es bessere Algorithmen gibt. Aber ich wollte lieber auf meine eigene Idee kommen, als die einer anderen Person zu kopieren.
Mehr zu Pip
quelle
Brainfuck - 719 Bytes
Nur für den historischen Kontext, dankt Daniel B Cristofani. Ich bin mir nicht ganz sicher, wann dies erstellt wurde, aber es ist bereits am 9. Mai 2003 im Internetarchiv verfügbar .
Die Ausgabe für
9
unterscheidet sich von der Problembeschreibung.quelle
Perl, 270 Bytes
Ich hätte wirklich nicht meine Zeit damit verschwenden sollen.
quelle
[$1]while/(.)/g
mit[$_]for/./g
, um 4 Bytes zu sparen. Ersetzen Siefor($i=0;$i<=$l;$i++)
mitfor$i(0..$l)
, um 9 Bytes zu sparen.JavaScript ( ES6 ), 191
206Führen Sie zum Testen das Snippet in Firefox aus.
quelle
Java 8, 341 Bytes
Port von @Shions C # .NET-Antwort , also stelle sicher, dass du ihn auch positiv bewertest!
Probieren Sie es online aus.
Erläuterung:
quelle