Terminals sind heutzutage so langweilig . Früher sahen sie so aus:
Jetzt sind sie nur langweilig und langweilig und schwarz-weiß. Ich möchte, dass Sie mir ein Programm schreiben, das mein Terminal wieder bunt macht!
Beschreibung
Nehmen Sie dieses Beispiel Ruby-Code:
Die meisten Linux-Terminals unterstützen diese Escape-Sequenzen ( \e
steht für das Escape-Zeichen), und Windows kann sie mit ANSICON unterstützen . Hier ist die Syntax der spezifischen Escape-Sequenz, die den Text oder die Hintergrundfarbe einer Zeichenfolge ändern kann:
\e[{{COLOR}}m
Dabei \e
steht das Escape-Zeichen ( 0x1B
in ASCII) und {{COLOR}}
wird durch die Nummer der Farbe ersetzt, die Sie verwenden möchten (dazu später mehr Details). Text, der nach dieser Escape-Sequenz kommt, wird wie angegeben formatiert, und ein Wert von 0
setzt alle Formatierungen zurück.
Ihre Herausforderung besteht darin, eine Zeichenfolge zu verwenden, die einen Text angibt, der möglicherweise Farbe enthält, und eine farbenfrohe Version davon auszugeben.
Input-Output
Normaler Text funktioniert genauso wie normal und wird buchstäblich gedruckt. Beispielsweise waffles
liefert die Eingabe dieselbe Ausgabe ohne spezielle Farbe.
Die Syntax zum Festlegen einer Farbe ähnelt der Wikipedia-Syntax . Um beispielsweise die Wörter "die Farbe Rot" im Satz in Rot zu färben This is the color red!
, wäre die Eingabe:
This is {{red|the color red}}!
Hintergrundfarben funktionieren auch. Wenn Sie schwarze Buchstaben auf weißem Hintergrund möchten, würden Sie Folgendes verwenden:
{{black|white|This text is black on white}}
Lassen Sie den Vordergrund weg, um nur eine Hintergrundfarbe zu erhalten:
{{|red|This text has a red background}}
Spezifikation
Zwei offene geschweifte Klammern geben immer den Beginn einer Farbanweisung an . Zwei schließende geschweifte Klammern geben das Ende an. Die Klammern stimmen immer überein. es wird niemals ein {{
ohne ein entsprechendes geben }}
, und ein }}
wird niemals vor seinem korrespondierenden kommen {{
. Diese Farbanweisungen werden nicht verschachtelt, und a {{
wird niemals in einer Farbanweisung angezeigt.
Innerhalb einer Farbanweisung gibt es immer entweder ein oder zwei |
Symbole. Wenn es eine gibt, ist der Text davor die Vordergrundfarbe und der Text danach die Zeichenfolge, die in dieser Farbe angezeigt werden soll. Wenn es zwei gibt, ist der Text vor dem ersten die Vordergrundfarbe, der Text nach dem ersten, aber vor dem zweiten die Hintergrundfarbe und der Text nach dem zweiten die anzuzeigende Zeichenfolge. Diese vertikalen Balken können außerhalb einer Farbrichtlinie vorhanden sein und sollten wörtlich gedruckt werden.
Die Vordergrund- oder Hintergrundfarbe (aber nicht beide) ist möglicherweise leer. In diesem Fall sollten Sie sie als Standard beibehalten. Die letzte Zeichenfolge (die auszugebende) wird niemals leer sein.
Hier sind die Anweisungen zum Ausgeben von Text einer bestimmten Farbe:
Eine Farbsequenz wird im Abschnitt "Beschreibung" definiert. Zum Beispiel wäre eine Farbsequenz von 42
"\e[42m"
.Um eine Farbe festzulegen, drucken Sie die Farbsequenz der unten angegebenen Nummer:
Color name | Color sequence number (foreground / background) --------------+---------- black | 30 / 40 red | 31 / 41 green | 32 / 42 yellow | 33 / 43 blue | 34 / 44 magenta | 35 / 45 cyan | 36 / 46 lightgray | 37 / 47 darkgray | 90 / 100 lightred | 91 / 101 lightgreen | 92 / 102 lightyellow | 93 / 103 lightblue | 94 / 104 lightmagenta | 95 / 105 lightcyan | 96 / 106 white | 97 / 107
Farbnamen unterscheiden zwischen Groß- und Kleinschreibung, und ein ungültiger Farbname wird niemals angegeben. Sie müssen nicht mit Dingen wie
RED
oderlightgrey
(geschrieben mit eineme
) umgehen .Nachdem Sie eine Farbsequenz gedruckt haben, gilt sie für den gesamten darauf folgenden Text. Geben Sie eine Farbsequenz von
0
("\e[0m"
) aus , um eine Farbsequenz zu beenden (auf die Standardfarbe zurücksetzen ).
Testfall
{{|yellow| }}
{{|yellow| }} {{|yellow| }}
{{|yellow| }} {{red|'}} {{red|'}} {{|yellow| }}
{{|yellow| }} \_/ {{|yellow| }}
{{|yellow| }} {{|yellow| }}
{{|yellow| }}
Dies sollte ein Smiley-Gesicht ausgeben ... mit bösen roten Augen.
Regeln
Sie dürfen keine Bibliotheken oder Funktionen Ihrer Programmiersprache verwenden, um eine Farbe automatisch zu analysieren. Dies bedeutet, dass Sie derjenige sein müssen, der bestimmt, was
"red"
bedeutet; Eine Bibliothek kann das nicht automatisch für Sie erledigen.Dies ist Code-Golf , also gewinnt der kürzeste Code in Bytes!
\n\[\e[32m\]\w\n\[\e[0m\]>
(grüner Verzeichnisname, einfache Eingabeaufforderung in der nächsten Zeile), aber ich kann sie nicht über ein Programm zum Laufen bringen (bisher Python und Java ausprobiert). Irgendwelche Ideen?echo -e "\e[31mtest\e[0m"
.lolcat
.you
er damit im übertragenen Sinne meintyour program
(im Gegensatz zu einem Aufruf einer Bibliotheksfunktion) und dass erdetermine
im Sinne vonfigure out
, nicht wie inchoose
. Das heißt, es ist Ihr Programm, das die Zuordnung handhaben sollte: String ("rot") | -> Integer (31).red
Nur31
weil er es so sagt, müssen Informationen in das Programm integriert werden. Obwohl genau argumentiert werden kann, worauf es ankommtyour program
- können wir universelle String-Manipulationsfunktionen verwenden? - nicht offen betrügen / missbrauchen.Antworten:
Ruby,
205189188186185182174170165161159154 BytesDas Einfügen langer Farbnamenfolgen in Ihren Code sieht nicht nerdig genug aus.
Bis auf 170 teilweise dank
rubik
. Jetzt sind die Bildlaufleisten weg!Eine offensichtliche und eine nicht so offensichtliche Verbesserung, dank der flexiblen Antwort, ohne die Verbesserung hätte ich dies nicht noch einmal wiederholt!
Nicht mehr, ich habe 4 Bytes mit #sum gespeichert.
Ich hatte es nicht vor, aber ich habe gerade bemerkt, dass bei dieser Lösung auch die Groß- und Kleinschreibung nicht berücksichtigt wird. Es verarbeitet glücklich{{RED|Red text}}
.Hex Dump:
Sie können es mit konvertieren
xxd -r hex.dump
.Das Programm mit allen nicht druckbaren Zeichen wurde zu Referenzzwecken maskiert:
Das ist eine Zeile. Verwenden Sie es so
Das
-W0
Flag unterdrückt Warnungen, an diestderr
andernfalls gesendet werden würde . Das Programm funktioniert jedoch ohne Flags.Ausgabe:
quelle
'1?IYU_N[(\x0c\x16&",\x1f\x01'
. Meine Saite ist allerdings 16 lang. Ich sehe, deine ist 18, also musst du dich wahrscheinlich anpassen.int()
Funktion kann 36 nicht überschreiten). Dann habe ich versucht alle Kombinationen für den Modul (2-10000, aber in der Theorie könnte man die Suche erweitern alle von Unicode) und für die xor, die ich klein gehalten (1 bis 9). Dann betrachtete ich akzeptable Ergebnisse nur als solche, die keine doppelten Zeichen enthielten.x.to_i(base)%mod+offset
. Ich ersetzen dann die+
mit^
, weil gut, es kühler aussieht. Davon abgesehen ist es nicht notwendig. Löschen des^99
und Ändern<<
auf+
gespeichert für mehr Bytes. Danke für den Tipp, sonst hätte ich es nicht bemerkt!Ruby, 329 Bytes.
quelle
ruby 2.1.2p95
und es wirft Fehler :undefined method 'gsub' for nil:NilClass (NoMethodError)
.ruby colors.rb < input.txt
, wird die Schleife fortgesetzt, nachdem alle Eingaben gelesen wurden. Dann wirdgets
zurückgegebennil
, das keine#gsub
Methode besitzt, wodurch ein Fehler ausgelöst wird. Verwenden Sie$><<$<.read
stattloop{puts gets
, es ist auch kürzer; )Flex (Lexer) -
226197192182168 (oder 166)Um es auf 166 zu bringen, ändern Sie das
\33
in ein tatsächliches Escape-Zeichen.Kompilieren und ausführen:
quelle
Python - 351
quelle
Cobra - 496
Es könnte fast eine einzelne Druckanweisung sein.
quelle
Python, 561
Liest den zu formatierenden Text von stdin.
quelle
is not None
in einem Codegolf zu haben . Sie können!=None
zum Beispiel verwenden.def p(f,b,t)
Ihr Code in a werfenZeroDivisionError
. Alles Mod 0 ist unmöglich.re.sub