Wyzwanie polega na przyjęciu tekstu jako wiersza tekstu i wydrukowaniu go w ten sposób.
Wejście wyjście
Dane wejściowe będą ciągiem zawierającym tylko drukowalne znaki ASCII. Pierwsze lub ostatnie znaki nigdy nie będą spacjami i nigdy nie będzie dwóch spacji z rzędu. Zawsze będzie mieć co najmniej dwie postacie.
Twój wynik powinien być taki sam, przekonwertowany na kolory tęczy, co zostanie opisane poniżej. Wynik może być w postaci obrazu (zapisany w pliku lub w inny sposób udostępniony) lub może po prostu wyświetlić wynik na ekranie (tak jak w poniższej implementacji referencyjnej).
Konwersja
Aby ustalić, jaki kolor powinna mieć każda litera w ciągu, użyj następującego algorytmu. Pamiętaj, że każda litera ma swój indywidualny kolor . To nie jest gradient!
Jeśli ta postać jest spacją:
- ... to nie ma znaczenia, ponieważ przestrzenie tak naprawdę nie mogą ... mieć koloru. Po prostu wyjmij spację.
Inaczej:
Niech
i
= indeks tego znaku w ciągu (oparty na 0, więc dla pierwszej litery to jest0
), nie licząc spacji. Na przykład w ciągufoo bar
ta wartość będzie4
dlaa
. Innymi słowy, tak wiele napotkano do tej pory spacji.Niech
n
= liczba spacji w ciągu.Kolor tej litery można teraz wyrazić w układzie współrzędnych cylindrycznych HSL jako [odcień = (
i
/n
) * 360 °, nasycenie = 100%, jasność = 50%].
Zauważ, że te kierunki sugerują, że dane wyjściowe dla foo
i f oo
powinny być dokładnie takie same, z wyjątkiem dodanej spacji po f
. Oznacza to, że wszystkie litery powinny zachować te same kolory.
Dalsze zasady dotyczące procesu konwersji opisano poniżej w sekcji Reguły .
Realizacja referencyjna
Jest to napisane w JavaScript i możesz spróbować, naciskając przycisk „Uruchom fragment kodu”.
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;
}
Zasady
Podczas obliczania wartości Barwy litery prawie na pewno otrzymasz liczbę dziesiętną (niecałkowitą). Możesz zaokrąglić to do najbliższej liczby całkowitej, umieścić ją na podłodze, wziąć sufit lub po prostu w ogóle nie zaokrąglić.
Rozmiar czcionki musi być czytelny. Tutaj jest to definiowane jako czcionka o rozmiarze 10pt lub większa.
Do wydrukowania tekstu możesz użyć płótna o stałej szerokości lub „obszaru rysowania”, ale musi on pasować do przykładu podanego w pierwszym zdaniu tego wpisu.
Punktacja to gra w golfa , więc wygra najkrótszy kod w bajtach.
Odpowiedzi:
Perl, 95
Kod 92 bajty + 3 dla
-p
Ten skrypt używa aproksymacji kolorów dostępnych dla terminala (maksymalnie 256), obecnie obejmując tylko kilka punktów kolorów wybranych z tej listy , więc prawdopodobnie nie jest określony, ale i tak było fajnie! I filtrowany listę, aby tylko pokazać kolory z
S
orazL
wartości100%
i50%
odpowiednio, następnie sortowane przez odcień, zapakowane numery na sznurku i wybrać kolory z tej listy.Ta implementacja zawiera znaki niedrukowalne! Pomysł Stole @ edc65 polegający na zamianie tylko
\S
zamiast.
, prosty, ale sprytny!Hexdump:
Odwróć zrzut heksowy, kopiując powyższy tekst i uruchamiając:
wklejenie danych i naciśnięcie Ctrl+ D.
Uruchom używając:
Wytwarza dane wyjściowe takie jak:
źródło
Python 2: 240 przy użyciu PIL i colorsys lib
Przykładowe dane wyjściowe:
Podziękowania dla @agtoever i @Trang Oul za wskazówki dotyczące gry w golfa oraz @Mauris za wskazanie wymagań dotyczących miejsca.
Aby dodać czcionki typu true, należy kontrolować rozmiar czcionki, w tym przesunięcie w poziomie i zmianę koloru w zależności od długości.
Czcionka, której użyłem, jest dostępna tutaj : Rezultat jest następujący (góra drukuje tylko ciąg, a poniższa drukuje na literę):
źródło
as P
i wypiszPIL
dwa razy i wygraj jedną postać. Zmieńimg
sięi
i wygraj 4 kolejne postacie.255
w zmiennej, zamień wszystkie okazje i użyj(a,)*3
jako białego koloru. Zastąpfloat(j)
przez(j+.0)
.float(j)
na1.*j
u=len(s) a=255
=>u,a=len(s),255
). Usuń[]
nawiasy klamrowetuple
, nie są potrzebne. Zastąp pętlę zrozumieniem listy (metoda zostanie oceniona jako efekt uboczny).JavaScript (ES6), 114
117 125Edytuj2 3 bajty zapisane dzięki @Dom Hastings Edytuj Nieprawidłowy HTML, ale i tak działa.
Zwykła uwaga: przetestuj fragment kodu w przeglądarce zgodnej z EcmaScript 6 (w szczególności nie Chrome, a nie MSIE. Testowałem na Firefox)
źródło
)
po,hsl(
ponieważ wydaje się, że nadal działa dla mnie w przeglądarce Firefox!${c}'
aby'+c
zaoszczędzić jeszcze 2 ... Lepiej wróć do mnie!Python 3, 131 bajtów
Podobnie do odpowiedzi Dom Hastings, ale zaimplementowany w pythonie.
Ciąg
'|\x82\x88\x8ejF"#$%\x1f\x19\x137[\x7f~}'
został zbudowany z listy, która[124,130,136,142,106,70,34,35,36,37,31,25,19,55,91,127,126,125]
zawiera kody kolorów terminali, które mają być wyświetlane w kolejności. Zostały przefiltrowane, więc zawierają tylko kolory o nasyceniu 100% i wartości 50%. Lista została następnie posortowana, więc najpierw wyświetlane były prawidłowe barwy.Pobiera dane wejściowe ze standardowego wejścia i zwraca je do standardowego wejścia.
Twój terminal, którego używasz MUSI obsługiwać kody ucieczki ANSI, aby poprawnie to uruchomić.
Lub wersja skrócona ze znakami bajtów dosłownych (niepoprawnie wklejona):
Dosłowny zrzut heksowy:
Dzięki @swstephe za uratowanie 9 bajtów (i również powiadomienie mnie, że moje liczenie bajtów było bardzo nieznacznie bardzo błędne)!
źródło
PHP, 165 bajtów
Uruchom z wejściem jako parametrem „s”
HTML jest nieprawidłowy, ale powinien się wyświetlać we wszystkich głównych przeglądarkach (testowane w Chrome i Firefox)
źródło
PHP 4.1,
112103102 bajtyUżyłem odpowiedź @DankMemes' jako punkt wyjścia. Odtąd wprowadziłem mnóstwo zmian, do tego stopnia, że kod jest inny.
Implementacja jest podobna, kod jest zupełnie inny.
Aby go użyć, po prostu ustaw wartość w SESSION / GET / POST / COOKIE o nazwie
s
.Wynik uruchomienia tej funkcji w zdaniu testowym:
źródło