Ihre Herausforderung besteht darin, die Eingabe als Textzeile zu verstehen und so auszugeben.
Input-Output
Die Eingabe ist eine Zeichenfolge, die nur druckbare ASCII-Zeichen enthält. Das erste oder letzte Zeichen wird niemals ein Leerzeichen sein, und es wird niemals zwei Leerzeichen in einer Reihe geben. Es wird immer mindestens zwei Zeichen lang sein.
Ihre Ausgabe sollte dieselbe Zeichenfolge sein, die in Regenbogenfarben konvertiert wurde, wie nachfolgend beschrieben wird. Die Ausgabe kann in Bildform erfolgen (in einer Datei gespeichert oder auf andere Weise verfügbar gemacht), oder sie zeigt das Ergebnis einfach auf dem Bildschirm an (wie in der folgenden Referenzimplementierung).
Umwandlung
Verwenden Sie den folgenden Algorithmus, um zu bestimmen, welche Farbe jeder Buchstabe in der Zeichenfolge haben soll. Beachten Sie, dass jeder Buchstabe eine eigene Farbe hat . Dies ist kein Farbverlauf!
Wenn dieses Zeichen ein Leerzeichen ist:
- ... spielt keine Rolle, da Leerzeichen sowieso keine Farbe haben können. Gib einfach ein Leerzeichen aus.
Andernfalls:
Let
i
= der Index dieses Zeichens in der Zeichenfolge (0-basiert, also für den allerersten Buchstaben0
), ohne Leerzeichen. In der Zeichenfolgefoo bar
wäre dieser Wert beispielsweise4
für diea
. Mit anderen Worten, so viele Nicht-Leerzeichen wurden bisher angetroffen.Let
n
= Die Anzahl der Nicht-Leerzeichen in der Zeichenfolge.Die Farbe dieses Buchstabens kann nun im HSL-Zylinderkoordinatensystem ausgedrückt werden als [Farbton = (
i
/n
) * 360 °, Sättigung = 100%, Helligkeit = 50%].
Beachten Sie, dass diese Richtungen implizieren, dass die Ausgabe für foo
und f oo
genau gleich sein sollte, mit Ausnahme eines zusätzlichen Leerzeichens nach dem f
. Das heißt, alle Buchstaben sollten die gleichen Farben behalten.
Weitere Regeln für den Konvertierungsprozess werden unten im Abschnitt Regeln beschrieben .
Referenzimplementierung
Dies ist in JavaScript geschrieben, und Sie können es versuchen, indem Sie auf die Schaltfläche "Code-Snippet ausführen" klicken.
window.addEventListener('load', function() {
addRainbow('Your challenge is to take input as a line of text and ' +
'output it like this.');
});
// append this text rainbow-ified to the argument (document.body by default)
function addRainbow(text, el) {
(el || document.body).appendChild(makeRainbow(text));
}
// returns a <div> that contains the text in a rainbow font
function makeRainbow(text) {
var div = document.createElement('div');
var letterCount = text.replace(/ /g, '').length, spaceCount = 0;
text.split('').forEach(function(letter, idx) {
if (letter == ' ') ++spaceCount;
div.appendChild(makeLetter(letter, (idx - spaceCount) / letterCount));
});
return div;
}
// returns a <span> that contains the letter in the specified color
function makeLetter(letter, hue) {
hue = Math.floor(hue * 360);
var span = document.createElement('span');
span.appendChild(document.createTextNode(letter));
span.style.color = 'hsl(' + hue + ', 100%, 50%)';
return span;
}
Regeln
Wenn Sie den Farbtonwert eines Buchstabens berechnen, erhalten Sie mit ziemlicher Sicherheit eine Dezimalzahl (keine Ganzzahl). Sie können dies auf die nächste ganze Zahl runden, auf den Boden legen, die Decke nehmen oder einfach gar nicht runden.
Die Schriftgröße muss lesbar sein. Hier wird dies als Schriftgröße von 10pt oder mehr definiert.
Sie können eine Leinwand mit fester Breite oder einen "Zeichenbereich" verwenden, um den Text auszugeben, aber er muss in der Lage sein, dem im allerersten Satz dieses Beitrags angegebenen Beispiel zu entsprechen.
Das Scoring ist Code-Golf , also gewinnt der kürzeste Code in Bytes.
Antworten:
Perl, 95
92 Byte Code + 3 für
-p
Dieses Skript verwendet eine Annäherung der für das Terminal verfügbaren Farben (maximal 256), wobei derzeit nur einige Farbpunkte aus dieser Liste ausgewählt werden. Es wird also wahrscheinlich nicht spezifiziert, aber das hat trotzdem Spaß gemacht! Ich habe die Liste gefiltert, um nur Farben mit
S
undL
Werten von100%
bzw.50%
anzuzeigen, dann nach Farbton sortiert, die Zahlen in eine Zeichenfolge gepackt und die Farben aus dieser Liste ausgewählt.Diese Implementierung enthält nicht druckbare Zeichen! Die Idee von Stole @ edc65 , nur zu ersetzen,
\S
statt.
, einfach, aber clever!Hexdump:
Kehren Sie den Hexdump um, indem Sie den obigen Text kopieren und ausführen:
Einfügen der Daten und Drücken von Ctrl+ D.
Ausführen mit:
Es erzeugt eine Ausgabe wie:
quelle
Python 2: 240 mit PIL und colorsys lib
Beispielausgabe:
Vielen Dank an @agtoever und @Trang Oul für einige Golftipps und an @Mauris für den Hinweis auf den Platzbedarf.
Zum Hinzufügen von True Type-Schriftarten können Sie die Schriftgröße steuern, einschließlich des horizontalen Versatzes und der Farbänderung basierend auf der Länge.
Die Schriftart I verwendet wird , ist aus verfügbar hier : Das Ergebnis ist (die obere nur die Zeichenfolge gedruckt wird , unter die man Druck pro Brief):
quelle
as P
und schreib esPIL
zweimal auf und gewinne einen Charakter. Wechsleimg
zui
und gewinne 4 weitere Charaktere.255
einer Variablen speichern , alle Vorkommen ersetzen und(a,)*3
als weiße Farbe verwenden. Ersetzenfloat(j)
durch(j+.0)
.float(j)
zu1.*j
u=len(s) a=255
=>u,a=len(s),255
). Entfernen Sie die[]
Klammern vontuple
, sie werden nicht benötigt. Schleife durch Listenverständnis ersetzen (Methode wird als Nebeneffekt gewertet).JavaScript (ES6), 114
117 125Edit2 3 Bytes gespeichert dank @Dom Hastings Edit Ungültiges HTML, aber es funktioniert trotzdem.
Üblicher Hinweis: Testen Sie die Ausführung des Snippets in einem EcmaScript 6-kompatiblen Browser (insbesondere nicht in Chrome, nicht in MSIE. Ich habe es in Firefox getestet).
quelle
)
nach deinerhsl(
Erklärung weglassen, da das in Firefox immer noch für mich zu funktionieren scheint!${c}'
,'+c
um 2 weitere zu sparen ... Machen Sie besser mit meinen weiter!Python 3, 131 Bytes
Ähnlich der Antwort von Dom Hastings, aber in Python implementiert.
Die Zeichenfolge
'|\x82\x88\x8ejF"#$%\x1f\x19\x137[\x7f~}'
wurde aus der Liste[124,130,136,142,106,70,34,35,36,37,31,25,19,55,91,127,126,125]
der Terminal-Farbcodes erstellt, die in der angegebenen Reihenfolge angezeigt werden sollen. Sie wurden gefiltert, sodass nur Farben mit einer Sättigung von 100% und einem Wert von 50% enthalten sind. Die Liste wurde dann sortiert, sodass zuerst die richtigen Farbtöne angezeigt wurden.Übernimmt die Eingabe von stdin und gibt sie an stdout zurück.
Ihr Terminal, das Sie verwenden, MUSS ANSI-Escape-Codes unterstützen, um dies ordnungsgemäß auszuführen.
Oder verkürzte Version mit Literalbyte-Zeichen (wurde nicht richtig eingefügt):
Literal Hexdump:
Vielen Dank an @swstephe, dass du 9 Bytes gespart hast (und mir auch aufgefallen ist, dass meine Byteanzählung etwas falsch war)!
quelle
PHP, 165 Bytes
Mit Eingabe als Parameter "s" ausführen
Der HTML-Code ist ungültig, sollte jedoch in allen gängigen Browsern dargestellt werden (getestet in Chrome und Firefox).
quelle
PHP 4.1,
112103102 BytesIch habe die Antwort von @DankMemes als Ausgangspunkt verwendet. Von da an habe ich eine Menge Änderungen vorgenommen, bis zu dem Punkt, dass der Code anders ist.
Die Implementierung ist ähnlich, der Code ist völlig anders.
Um es zu benutzen, setzen Sie einfach einen Wert auf ein SESSION / GET / POST / COOKIE mit dem Namen
s
.Ergebnis der Ausführung dieser Funktion für den Testsatz:
quelle