streszczenie
Wprowadzono nowy język manipulacji ciągami, wykorzystujący tylko znaki $+#-!*|@>
! Twoim zadaniem jest zaimplementowanie dla niego interpretera w jak najmniejszej liczbie bajtów.
Wejście
Ciąg, który jest pojedynczą linią tego języka. Można to wziąć w dowolny rozsądny sposób (standardowe, parametr funkcji, argument wiersza poleceń itp.) Lub jako predefiniowaną zmienną. Jeśli program prosi o podanie danych przez użytkownika, zaakceptuj wszystkie dane wprowadzone przez użytkownika od standardowego wejścia i nic więcej, patrz poniżej. Możesz założyć, że jest to prawidłowy program.
Wynik
Bez względu na język, specyfikacje poniżej. Musisz wyprowadzić ciąg znaków w dowolny rozsądny sposób (standardowe wyjście, wyjście funkcji itp.) Lub wartość zmiennej. Gdy język wypisuje jawnie, musi to przejść do standardowego wyjścia. Standardowe luki są zabronione.
Specyfikacje językowe
Przetwarzanie i składnia
Język ma bardzo prostą formę przetwarzania, ponieważ wykonuje jedynie operacje na łańcuchach: zaczyna się od pustego łańcucha ( ""
) i zmienia go z każdym terminem. Termin składa się z jednej lub dwóch części: funkcji (poniżej), a następnie ewentualnie parametru (poniżej), który edytuje jego zachowanie. Warunki są oddzielone potokami ( |
). Możesz założyć, że nie będzie to pusty program i żaden termin nie będzie pusty. Powinieneś wypisać wartość na końcu programu.
Funkcje
Język ma tylko 6 funkcji, jak pokazano poniżej. Każda funkcja akceptuje jeden lub zero parametrów.
+
konkatenuje łańcuchy (pobiera jeden parametr łańcucha, łączy go z bieżącą wartością)!
odwróć kolejność znaków bieżącej wartości (bez parametru)*
powtórz ciąg (pobiera jeden parametr liczby całkowitej, wielokrotnie powtarza bieżącą wartość)-
usuwa wszystkie wystąpienia wartości (pobiera jeden parametr ciągu, usuwa wszystkie jego wystąpienia z bieżącej wartości)$
[pseudo-] losowo tasuje bieżącą wartość (bez parametru)<
wyślij aktualną wartość dostdout
(bez parametrów)
Wartości
Są to wartości, które można przekazać do funkcji, reprezentowane przez wyrażenia regularne, które by do nich pasowały:
@[^|]*
literał łańcuchowy, w tym dowolny znak inny niż fajka. Może być pusty.#[0-9]+
literał całkowity>
następny wierszstdin
. Jeśli jest używany z*
, przekonwertuj na liczbę całkowitą.
Przypadki testowe
╔════════════════════════╤═════════════╤══════════════╗
║code │input │output ║
╟────────────────────────┼─────────────┼──────────────╢
║+>|!|+@hello|*> │13 │31hello31hello║
║ │2 │ ║
╟────────────────────────┼─────────────┼──────────────╢
║+>|+@abcdefg|$ │hello │hcloeebafdlg ║
╟────────────────────────┼─────────────┼──────────────╢
║+@how areyou|-@o|-> │w │h areyu ║
╟────────────────────────┼─────────────┼──────────────╢
║+@out|<|*#3 │ │out ║
║ │ │outoutout ║
╟────────────────────────┼─────────────┼──────────────╢
║+> │what ever 345│what ever 345 ║
╟────────────────────────┼─────────────┼──────────────╢
║+@$pe<i@l|<|-@$pe<i@l|+>│A|$o $pe<!@| │$pe<i@l ║
║ │ │A|$o $pe<!@| ║
╟────────────────────────┼─────────────┼──────────────╢
║<|+>|!|< │input text | ║
║ │ │txet tupni ║
║ │ │txet tupni ║
╟────────────────────────┼─────────────┼──────────────╢
║+@># │ |># ║
╚════════════════════════╧═════════════╧══════════════╝
Zauważ, że przypadek testowy 2 jest losowy, więc każda kombinacja znaków w nim jest poprawna. Ponadto wyniki w tabeli są oddzielone znakami nowej linii, ale twój program nie musi robić tego samego. Ostatnia wartość w każdym przypadku końcowy wynik.
Przykład (nie golfa) interpretera Pythona
Wypróbuj online! IMO lepiej, jeśli uruchomisz go przez IDLE lub cokolwiek używasz. (Grałem w golfa do 424 bajtów później, ale jestem pewien, że dużo lepiej zrobisz).
<
napotkasz. Czy to jest obowiązkowe?
+@>#
? Użyłem #
również.