Terminale są teraz tak nudne . Kiedyś wyglądały tak:
Teraz są po prostu nijakie, nudne i czarno-białe. Chcę, żebyś napisał mi program, który sprawi, że mój terminal znów będzie kolorowy!
Opis
Weźmy przykładowy kod Ruby:
Większość terminali Linuksa obsługuje te sekwencje specjalne ( \e
oznacza znak zmiany znaczenia), a system Windows może je obsługiwać za pomocą ANSICON . Oto składnia określonej sekwencji zmiany znaczenia, która może zmienić kolor tekstu lub tła łańcucha:
\e[{{COLOR}}m
gdzie \e
oznacza znak zmiany znaczenia ( 0x1B
w ASCII) i {{COLOR}}
jest zastępowany numerem koloru, którego chcesz użyć (więcej szczegółów na ten temat później). Tekst pojawiający się po tej sekwencji ucieczki zostanie sformatowany zgodnie z zaleceniami, a wartość 0
spowoduje zresetowanie całego formatowania.
Twoim wyzwaniem jest pobranie ciągu określającego tekst, który może zawierać kolor, i wydrukowanie jego kolorowej wersji.
Wejście wyjście
Normalny tekst działa tak jak normalnie i jest drukowany dosłownie. Na przykład dane wejściowe waffles
dają taką samą moc wyjściową, bez specjalnego koloru.
Składnia określania koloru jest podobna do składni Wikipedii . Na przykład, aby w zdaniu pokolorować słowa „kolor czerwony” na czerwono This is the color red!
, dane wejściowe byłyby następujące:
This is {{red|the color red}}!
Kolory tła też działają. Jeśli chcesz czarne litery na białym tle, skorzystaj z tego:
{{black|white|This text is black on white}}
Aby uzyskać tylko kolor tła, pomiń pierwszy plan:
{{|red|This text has a red background}}
Specyfikacja
Dwa otwarte nawiasy klamrowe zawsze określają początek dyrektywy w sprawie kolorów . Dwa zamykające nawiasy klamrowe określają koniec. Nawiasy zawsze będą pasować; nigdy nie będzie {{
bez odpowiednika }}
, a }}
nigdy nie przyjdzie przed jego odpowiednikiem {{
. Te dyrektywy dotyczące kolorów nie zostaną zagnieżdżone i {{
nigdy nie pojawią się w dyrektywie kolorów.
W dyrektywie kolorów zawsze będzie jeden lub dwa |
symbole. Jeśli istnieje, tekst przed nim ma kolor pierwszego planu, a tekst po nim to ciąg znaków, który ma być wyświetlany w tym kolorze. Jeśli są dwa, tekst przed pierwszym jest kolorem pierwszego planu, tekst po pierwszym, ale przed drugim kolorem tła, a tekst po drugim to ciąg znaków do wyświetlenia. Te pionowe paski mogą istnieć poza dyrektywą dotyczącą kolorów i powinny być drukowane dosłownie.
Kolor pierwszego planu lub kolor tła (ale nie oba) mogą być puste, w takim przypadku należy pozostawić je jako domyślne. Ostatni ciąg (ten, który ma zostać wyprowadzony) nigdy nie będzie pusty.
Oto wskazówki, jak wydrukować tekst określonego koloru:
Sekwencji kolorów jest zdefiniowana w sekcji „Opis”. Na przykład sekwencja kolorów 42
"\e[42m"
.Aby ustawić kolor, wydrukuj sekwencję kolorów liczby określonej poniżej:
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
W nazwach kolorów rozróżniana jest wielkość liter i nigdy nie zostanie podana nieprawidłowa nazwa koloru. Nie trzeba obsłużyć rzeczy jak
RED
lublightgrey
(pisany ze związkieme
).Po wydrukowaniu sekwencji kolorów będzie ona obowiązywać dla całego tekstu po niej. Aby zakończyć sekwencję kolorów (przywróć domyślny kolor), wypisz sekwencję kolorów
0
("\e[0m"
).
Przypadek testowy
{{|yellow| }}
{{|yellow| }} {{|yellow| }}
{{|yellow| }} {{red|'}} {{red|'}} {{|yellow| }}
{{|yellow| }} \_/ {{|yellow| }}
{{|yellow| }} {{|yellow| }}
{{|yellow| }}
To powinno wywołać uśmiechniętą twarz ... ze złymi czerwonymi oczami.
Zasady
Nie można używać żadnych bibliotek ani funkcji języka programowania do automatycznego analizowania koloru. Oznacza to, że musisz być tym, który określa, co
"red"
oznacza; nie możesz mieć biblioteki, która zrobi to automatycznie.To jest golf golfowy , więc wygra najkrótszy kod w bajtach!
\n\[\e[32m\]\w\n\[\e[0m\]>
(zielona nazwa katalogu, zwykły monit w następnym wierszu), ale nie mogę go uruchomić z programu (jak dotąd wypróbowałem Python i Javę). Jakieś pomysły?echo -e "\e[31mtest\e[0m"
.lolcat
.you
przenośni oznacza onyour program
(w przeciwieństwie do wywołania funkcji bibliotecznej) i żedetermine
rozumie tofigure out
, a nie jakchoose
. Tj. To twój program powinien obsługiwać mapowanie: String („red”) | -> Integer (31). dzieje się takred
tylko31
dlatego, że tak mówi, informacja ta musi zostać włączona do programu. Chociaż można argumentować, co by się liczyłoyour program
- czy możemy używać funkcji manipulacji ciągami ogólnego przeznaczenia? - nie rażąco oszukiwać / nadużywać.Odpowiedzi:
Rubinowy,
205189188186185182174170165161159 159154 bajtówUmieszczanie długich ciągów nazw kolorów w kodzie nie wygląda na dość nerdy.
Do 170 częściowo dzięki
rubik
. Teraz zniknęły paski przewijania!Jedna oczywista i jedna nie tak oczywista poprawa, dzięki elastycznej odpowiedzi, bez poprawy, nie wróciłbym do tego!
Już nie, zapisałem 4 bajty za pomocą #sum.
Nie zamierzałem tego, ale zauważyłem, że w tym rozwiązaniu nie jest rozróżniana wielkość liter. Szczęśliwie przetwarza{{RED|Red text}}
.Zrzut szesnastkowy:
Możesz to przekonwertować za pomocą
xxd -r hex.dump
.Program ze wszystkimi znakami, których nie można wydrukować, uciekł w celach referencyjnych:
To jest jedna linia. Użyj tego w ten sposób
-W0
Flag pomija ostrzeżenia, które będą wysyłane dostderr
inaczej. Jednak program działa dobrze bez żadnych flag.Wynik:
źródło
'1?IYU_N[(\x0c\x16&",\x1f\x01'
. Mój ciąg ma jednak długość 16. Widzę, że twój ma 18 lat, więc prawdopodobnie musisz się dostosować.int()
funkcja Pythona nie może przekroczyć 36). Następnie wypróbowałem wszystkie kombinacje dla modułu (od 2 do 10000, ale teoretycznie można rozszerzyć wyszukiwanie na cały Unicode) i dla xora, który zachowałem mały (1 do 9). Następnie uznałem za akceptowalne wyniki tylko te, które nie zawierały zduplikowanych znaków.x.to_i(base)%mod+offset
. Następnie otrzymuje+
się^
, bo dobrze, wygląda chłodniej. Poza tym nie jest to konieczne. Upuszczanie^99
i zmiana<<
na+
zapisane dla większej liczby bajtów. Dzięki za wskazówkę, inaczej bym tego nie zauważył!Rubinowy, 329 bajtów.
źródło
ruby 2.1.2p95
i rzucać błąd:undefined method 'gsub' for nil:NilClass (NoMethodError)
.ruby colors.rb < input.txt
, będzie on zapętlał po odczytaniu wszystkich danych wejściowych. Następniegets
zwracanil
, która nie posiada#gsub
metody, co powoduje błąd. Użyj$><<$<.read
zamiastloop{puts gets
, jest również krótszy; )Flex (Lexer) -
226197192182168 (lub 166)Aby sprowadzić go do 166, zmień
\33
postać na ucieczkę.Skompiluj i uruchom:
źródło
Python - 351
źródło
Kobra - 496
Może to być prawie pojedyncza instrukcja drukowania.
źródło
Python, 561
Odczytuje tekst do sformatowania ze standardowego wejścia.
źródło
is not None
w golfie. Możesz użyć!=None
na przykład.def p(f,b,t)
twoim kodzie wyrzuci sięZeroDivisionError
. Cokolwiek mod 0 jest niemożliwe.re.sub
uruchamiania tego