Parsujmy i przetwarzajmy Key-Language! Biorąc pod uwagę sekwencję naciśnięć klawiszy i / lub klawiszy specjalnych, napisz program, funkcję itp., Która wyświetli produkt, gdy wszystkie działania zostaną przetworzone w oparciu o następującą klawiaturę:
+-------------------------------------------------------+
| ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | - | + | |
| ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | _ | = |Del|
+-------------------------------------------------------+
|TAB| q | w | e | r | t | y | u | i | o | p | [ | ] | \ |
| | Q | W | E | R | T | Y | U | I | O | P | { | } | | |
+-------------------------------------------------------+
|CAPS | a | s | d | f | g | h | j | k | l | ; | ' | RET |
| | A | S | D | F | G | H | J | K | L | : | " | |
+-------------------------------------------------------+
| SHIFT | z | x | c | v | b | n | m | , | . | / | SHIFT |
| | Z | X | C | V | B | N | M | < | > | ? | |
+-------------------------------------------------------+
| |
| SPACEBAR |
+-------------------------------------------------------+
Klawisze że wyjściowe rzeczywiste znaki nie składające się z białych znaków i są w stanie być modyfikowane przez inne klawisze będą znane jako „klucze charakter”, a te, które modyfikują wyjście z innymi klawiszami lub wyjście spacje będą znane jako „specjalne klucze”. Klawisze znaków alfabetu, które będą wyświetlane na wejściu wielkimi literami, można modyfikować za pomocą jednego Shift
lub w Caps Lock
celu tworzenia wielkich liter, a pozostałe klawisze znaków można modyfikować tylko za pomocą Shift
ich alternatywnych znaków. Dlatego A
w danych wejściowych odpowiada a A
klawisz znaku, którego normalnym wyjściem jest a
i którego zmodyfikowanym wyjściem, które można uzyskać za pomocą klawisza Shift
lub Caps Lock
, jest A
. Z drugiej strony,/
, który odpowiada / ?
kluczowi znaków, ma normalne wyjście /
i zmodyfikowane wyjście ?
możliwe do uzyskania tylko z Shift
tym czasem.
Zasady
Dane wejściowe zawsze będą ciągiem znaków składającym się z sekwencji klawiszy znaków i klawiszy specjalnych. Pełny specjalny klucz do mapowania ciągów dla danych wejściowych (tzn. Format, w którym mają gwarancję, że znajdują się na wejściu) oraz odpowiadające im działania / wyniki są następujące:
<DEL> -> Delete the previous character (including whitespace). If called when string is empty, nothing happens. If called 2 or more times in a row, 2 consecutive deletes happen. For instance, "RE<DEL><DEL>" should return an empty string ("") and also "R<RET><DEL><DEL>E" should return just "E".
<CAPS> -> Enable Caps Lock until <CAPS> appears again, upon which it is disabled, although it is not guaranteed to be disabled by the end of the input. Enabling this only modifies the upcoming alphabet keys resulting in them outputting only uppercase letters. For instance, "<CAPS>RE<CAPS>" results in the output "RE", but <CAPS>.<CAPS> would still result in a ".".
<RET> -> Add a new line.
<SPC> -> Add a single blank space.
<TAB> -> Add 4 spaces.
<SHFT> -> Shift is held down resulting in the alternate character of the upcoming keypress to be output, after which the key is released. For instance, "<SHFT>A" results in the output "A", "<SHFT>1" results in the output "!", and "<SHFT>1234" results in the output "!234" as only the first upcoming keypress is modified and nothing else. It is guaranteed that a character key will succeed a <SHFT>. Therefore, <SHFT><SPC> is not a possible input.
Pusty ciąg jest również możliwy jako wejście, dla którego wyjście powinno być niczym.
- Użycie jakiegokolwiek wbudowanego rozwiązania, które bezpośrednio rozwiązuje ten problem, jest niedozwolone.
- Stosowanie standardowych luk jest niedozwolone.
Przypadki testowe
Przedstawione w formacie, Actual String Input -> Actual String Output
po którym następuje kilka wyjaśnień.
1<SHFT>2<TAB><CAPS>R.KAP.<SPC><SHFT>123 -> 1@ R.KAP. !23
Wyjście,
1
gdy1
klawisz jest wciśnięty bez przełącznika, następnie Shift jest przytrzymywany, a2
klawisz jest wciśnięty, co daje@
wynik. Następnie klawisz Shift zostaje zwolniony i klawisz Tab jest wciśnięty, co powoduje wcięcie w 4 odstępach. Idąc za ciosem, klawisz Caps Lock naciśnięty, po upływie któregoR
,.
,K
,A
,P
, i.
są naciskane klawisze, w wyniku czego na wyjściuR.KAP.
. Wreszcie, pojedyncza przestrzeń wyjście następuje przesunięcie powoduje!23
jest wysyłany, kiedy1
,2
i3
naciśnięcie klawisza na końcu.<SHFT>ABCDEFG<SHFT>HIJK<SHFT>1<SHFT>2<SHFT>3<SHFT>4567890 -> AbcdefgHijk!@#$567890
Klawisz Shift jest przytrzymywany, a następnie
A
klawisz, co powoduje, że dane wyjścioweA
są wyświetlanebcdefg
poB-G
naciśnięciu klawiszy. Następnie klawisz Shift jest wciśnięty ponownie zastąpiony przezH
klucz, po czym wyjściowyH
, a następnieijk
, gdyI-K
są naciskane klawisze. Na koniec wszystkie1-4
klawisze są modyfikowane , gdy klawisz Shift jest przytrzymywany przed każdym naciśnięciem klawisza, co powoduje, że wyjście!@#$
kończy się567890
po5-0
ponownym naciśnięciu klawiszy.<CAPS>THIS<SPC>IS<SPC>IN<SPC>ALL<SPC>CAPS<CAPS><SPC>NOW<SPC>THIS<SPC>IS<SPC>IN<SPC>ALL<SPC>LOWERCASE -> THIS IS IN ALL CAPS now this is in all lowercase
<TAB><SPC><TAB><SHFT>1 -> !
<CAPS>WWW<CAPS>.CODEGOLF.STACKEXCHANGE<SHFT>.COM -> WWW.codegolf.stackexchange>com
PROGRAMMING<CAPS><SPC>IS<SPC><CAPS>AWESOME -> programming IS awesome
<DEL><RET><DEL><RET><DEL> -> "" (Empty String)
Klawisz usuwania jest wciskany na początku, po czym nic się nie dzieje. Następnie naciśnięty jest klawisz Return, co powoduje powstanie nowego wiersza, który jest usuwany po ponownym naciśnięciu klawisza Backspace. Wreszcie ta sama sekwencja (nowa linia, po której następuje backspace) jest powtarzana. Po tym wszystkim wynik jest pusty.
<SHFT>HI<SPC>HOW<SPC>ARE<SPC>YOU<SHFT>/<RET><SHFT>I<SPC><SHFT>AM<SPC>O<DEL><SHFT>GOOD<SHFT>1 -> Hi how are you?\nI Am Good!
<SHFT>,<CAPS>RET<CAPS><SHFT>. -> <RET>
Ciąg
<RET>
powinien być faktycznym wyjściem łańcucha. Dlatego nie powinno to generować nowego wiersza.<CAPS>67890,.;'[]<CAPS> -> 67890,.;'[]
<CAPS><SHFT>A -> A
RE<DEL><DEL> -> "" (Empty String)
U<RET><DEL><DEL>I -> i
<DEL><DEL><DEL>5<DEL> -> "" (Empty string)
"" (Empty String) -> "" (Empty String)
To jest codegolf więc wygrywa najkrótszy kod w bajtach!
AbcdefgHijk!@#$567890
? Ponadto w teście nr 8 <SHFT>
znajduje się na końcu ciągu, ale reguły mówią: „Zagwarantowane jest, że klucz znaku zastąpi <SHFT>.”