Lassen Sie uns die Schlüsselsprache analysieren und verarbeiten! Schreiben Sie bei Eingabe einer Folge von Tastaturtastendrücken und / oder Sondertasten ein Programm, eine Funktion usw., die das Produkt ausgibt, wenn alle Aktionen auf der folgenden Tastatur ausgeführt werden:
+-------------------------------------------------------+
| ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | - | + | |
| ` | 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 |
+-------------------------------------------------------+
Die Schlüssel, die tatsächliche Zeichen ausgeben, die nicht aus Leerzeichen bestehen und von anderen Schlüsseln geändert werden können, werden als "Zeichentasten" bezeichnet, und diejenigen, die die Ausgabe anderer Schlüssel oder Ausgabe-Leerzeichen ändern, werden als "Sonderschlüssel" bezeichnet. Die Alphabet-Zeichentasten, die in der Eingabe mit Großbuchstaben angezeigt werden, können entweder mit Shift
oder Caps Lock
in Großbuchstaben geändert werden , und die übrigen Zeichentasten können nur mit geändert werden Shift
, um ihre alternativen Zeichen zu erzeugen. Daher entspricht A
in der Eingabe die a A
Zeichentaste, deren normale Ausgabe ist a
und deren modifizierte Ausgabe, die entweder mit der Taste Shift
oder erhältlich ist Caps Lock
, ist A
. Auf der anderen Seite,/
, die der / ?
Zeichentaste entspricht , hat eine normale Ausgabe von /
und eine modifizierte Ausgabe von ?
, die nur mit Shift
dieser Zeit erhältlich ist.
Regeln
Die Eingabe ist immer eine Zeichenfolge, die aus einer Folge von Zeichentasten und Sondertasten besteht. Der vollständige Spezialschlüssel für die Zeichenfolgenzuordnung für die Eingabe (dh das Format, in dem sie garantiert in der Eingabe enthalten sind) und die entsprechenden Aktionen / Ausgaben lauten wie folgt:
<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.
Als Eingabe ist auch eine leere Zeichenfolge möglich, für die die Ausgabe nichts sein sollte.
- Die Verwendung von jedem eingebauten dass löst dieses Problem direkt nicht zulässig ist.
- Die Verwendung von Standardlücken ist nicht zulässig.
Testfälle
Präsentiert im Format, Actual String Input -> Actual String Output
gefolgt von einer Erklärung für einige.
1<SHFT>2<TAB><CAPS>R.KAP.<SPC><SHFT>123 -> 1@ R.KAP. !23
Ausgabe,
1
wenn die1
Taste ohne Umschalten gedrückt wird, dann die Umschalttaste2
gedrückt gehalten wird und die Taste gedrückt wird, was zur@
Ausgabe führt. Dann wird die Umschalttaste losgelassen und die Tabulatortaste gedrückt, was zu einer Einrückung mit 4 Abständen führt. Nach oben wird die Caps - Lock - Taste gedrückt, wonach dasR
,.
,K
,A
,P
, und.
Tasten gedrückt werden , in der Ausgabe führtR.KAP.
. Schließlich wird ein Leerzeichen gefolgt von Ausgabeverschiebung führt in!23
ausgegeben wird, wenn das1
,2
, und3
Tasten am Ende gedrückt werden.<SHFT>ABCDEFG<SHFT>HIJK<SHFT>1<SHFT>2<SHFT>3<SHFT>4567890 -> AbcdefgHijk!@#$567890
Die Umschalttaste wird gedrückt gehalten, gefolgt von der
A
Taste. Dies führt zur Ausgabe,A
gefolgt von der Ausgabe,bcdefg
wenn dieB-G
Tasten gedrückt werden. Dann wird die Umschalttaste erneut gedrückt , gefolgt von derH
Taste, woraufhin die Ausgabe erfolgtH
, gefolgt vom Drückenijk
derI-K
Tasten. Schließlich1-4
werden alle Tasten geändert, wenn die Umschalttaste vor jedem Tastendruck gedrückt wird, was dazu führt, dass die Ausgabe!@#$
beendet wird,567890
wenn die5-0
Tasten erneut gedrückt werden.<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)
Die Löschtaste wird am Anfang gedrückt, danach passiert nichts mehr. Dann wird die Eingabetaste gedrückt, was zu einer neuen Zeile führt, die gelöscht wird, nachdem die Rücktaste erneut gedrückt wurde. Schließlich wird dieselbe Sequenz (neue Zeile gefolgt von Rücktaste) wiederholt. Nach all dem ist die Ausgabe eine leere Zeichenfolge.
<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>
Die Zeichenfolge
<RET>
sollte die tatsächliche Zeichenfolgenausgabe sein. Daher sollte dies keine neue Zeile ausgeben.<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)
Dies ist Codegolf, also gewinnt der kürzeste Code in Bytes!
AbcdefgHijk!@#$567890
? Auch in Test Nr. 8<SHFT>
befindet sich am Ende der Zeichenfolge, aber die Regeln besagen: "Es ist garantiert, dass ein Zeichenschlüssel eine <SHFT> erfolgreich ist."Antworten:
16-Bit-x86-Maschinencode,
140139 Byte1 Byte durch Ersetzen von DL durch DX im vorletzten Opcode gespeichert. Außerdem wurden die Sprungversätze bei der Demontage korrigiert, um sie an den Hex-Dump anzupassen.
Da die Art der Aufgabe einige vorinitialisierte Daten erfordert und die Antwort kein vollständiges Programm, sondern eine Funktion ist, gehe ich davon aus, dass das Programm einen Datenabschnitt enthält und der Linker die Adresse der Daten umgehend aktualisiert. Der Adressplatzhalter wird mit '????' bezeichnet.
Dies ist eine hexadezimale Darstellung des Codes. Die Parameter sind Zeiger auf Eingabezeichenfolge in SI und Zeiger auf den Ausgabepuffer in DI. Es wird angenommen, dass Zeichenfolgen NULL-terminiert sind.
Inhalt der Zuordnungstabelle (25 Bytes):
Die Byteanzahl berücksichtigt sowohl Code als auch Daten.
Demontage:
Für 32-Bit-Befehlssätze ist der Code absolut identisch, mit Ausnahme des ersten Befehls, der aufgrund der 32-Bit-Adressierung 2 Byte länger ist (8d1d ???????? lea ebx, ds: ??????? ?)
quelle
i
für den TestfallU<RET><DEL><DEL>I
und eine leere Zeichenfolge für die Eingabe zurückgibt und ausgibtRE<DEL><DEL>
? Ich habe die Regeln bezüglich des Löschschlüssels ein wenig präzisiert. Wenn diese beiden Testfälle nicht funktionieren, können Sie bitte auch Ihren Code aktualisieren, damit er die richtige Ausgabe für diese Testfälle liefert. Vielen Dank!Netzhaut, 136 Bytes
Kann wahrscheinlich weiter Golf gespielt werden.
Überprüfen Sie alle Testfälle. (Leicht modifiziert, um alle Testfälle gleichzeitig auszuführen.)
quelle
Caps+Shift+A = A
. Mann, meine Tastatur ist komisch ...JavaScript (ES6), 207
Aktualisiert, um den Fehler durch wiederholtes Löschen zu beheben, auch wenn einige Bytes kürzer sind.
weniger Golf gespielt
Prüfung
quelle
I
für den TestfallU<RET><DEL><DEL>I
und eine leere Zeichenfolge für die Eingabe zurückgibt und ausgibtRE<DEL><DEL>
? Ich habe die Regeln bezüglich des Löschschlüssels ein wenig präzisiert. Wenn diese beiden Testfälle nicht funktionieren, können Sie bitte auch Ihren Code aktualisieren, damit er die richtige Ausgabe für diese Testfälle liefert. Vielen Dank!U<RET><DEL>I
i
I