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>.”Odpowiedzi:
16-bitowy kod maszynowy x86,
140139 bajtówZaoszczędzono 1 bajt, zastępując DL przez DX w przedostatnim kodzie operacji. Poprawiono także przesunięcia przeskoku podczas demontażu, aby dopasować zrzut heksowy.
Ponieważ charakter zadania wymaga pewnych wstępnie zainicjowanych danych, a odpowiedź nie jest pełnym programem, ale funkcją, zakładam, że w programie znajduje się sekcja danych, a linker niezwłocznie aktualizuje adres danych. Symbol zastępczy adresu jest oznaczony przez „????”.
To jest szesnastkowa reprezentacja kodu. Parametry to wskaźnik do łańcucha wejściowego w SI i wskaźnik do bufora wyjściowego w DI. Przyjmuje się, że ciągi znaków kończą się wartością NULL.
Zawartość tabeli mapowania (25 bajtów):
Liczba bajtów uwzględnia zarówno kod, jak i dane.
Demontaż:
W przypadku zestawu instrukcji 32-bitowych kod jest absolutnie taki sam, z wyjątkiem pierwszej instrukcji, która jest o 2 bajty dłuższa z powodu 32-bitowego adresowania (8d1d ???????? lea ebx, ds: ???????? ?)
źródło
i
dla przypadku testowegoU<RET><DEL><DEL>I
i pusty ciąg wejściowyRE<DEL><DEL>
? Wyjaśniłem trochę zasady dotyczące klucza usuwania, więc jeśli te 2 przypadki testowe nie działają, czy możesz również zaktualizować kod, aby wygenerował prawidłowe dane wyjściowe dla tych przypadków testowych? Dziękuję Ci!Siatkówka, 136 bajtów
Prawdopodobnie można dalej grać w golfa.
Sprawdź wszystkie przypadki testowe. (Nieznacznie zmodyfikowany, aby uruchomić wszystkie przypadki testowe jednocześnie).
źródło
Caps+Shift+A = A
. Człowieku, moja klawiatura jest dziwna ...JavaScript (ES6), 207
Zaktualizowano, aby naprawić błąd przy wielokrotnym usuwaniu, nawet niektórych bajtów krótszych.
mniej golfa
Test
źródło
I
dla przypadku testowegoU<RET><DEL><DEL>I
i pusty ciąg wejściowyRE<DEL><DEL>
? Wyjaśniłem trochę zasady dotyczące klucza usuwania, więc jeśli te 2 przypadki testowe nie działają, czy możesz również zaktualizować kod, aby wygenerował prawidłowe dane wyjściowe dla tych przypadków testowych? Dziękuję Ci!U<RET><DEL>I
żei
nie powinienem dawaćI