Analysons et traitons le langage clé! Étant donné l'entrée d'une séquence de touches clavier et / ou de touches spéciales, écrivez un programme, une fonction, etc. qui génère le produit lorsque toutes les actions sont traitées sur la base du clavier suivant:
+-------------------------------------------------------+
| ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | - | + | |
| ` | 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 |
+-------------------------------------------------------+
Les clés qui génèrent des caractères réels non constitués d'espaces et qui peuvent être modifiées par d'autres clés seront appelées "clés de caractères", et celles qui modifient la sortie d'autres clés ou les espaces de sortie seront appelées "clés spéciales". Les touches de caractères alphabétiques, qui seront affichées dans l'entrée avec des lettres majuscules, peuvent être modifiées avec Shift
ou Caps Lock
pour produire des lettres majuscules, et le reste des touches de caractères ne peut être modifié qu'avec Shift
pour produire leurs caractères alternatifs. Par conséquent, A
dans l'entrée correspond à la a A
clé de caractère, dont la sortie normale est a
et dont la sortie modifiée, pouvant être obtenue avec la touche Shift
ou Caps Lock
, est A
. D'autre part,/
, qui correspond à la / ?
touche de caractère, a une sortie normale de /
et une sortie modifiée de ?
pouvant être obtenue avec uniquement avec Shift
ce temps.
Règles
L'entrée sera toujours une chaîne composée d'une séquence de touches de caractères et de touches spéciales. La clé spéciale complète pour le mappage de chaîne pour l'entrée (c'est-à-dire le format dans lequel ils sont garantis) et leurs actions / sorties correspondantes sont les suivantes:
<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.
Une chaîne vide est également possible en entrée, pour laquelle la sortie ne doit être rien.
- L'utilisation de tout intégré qui résout directement ce problème est interdite.
- L'utilisation de failles standard est interdite.
Cas de test
Présenté dans le format Actual String Input -> Actual String Output
suivi d'une explication pour quelques-uns.
1<SHFT>2<TAB><CAPS>R.KAP.<SPC><SHFT>123 -> 1@ R.KAP. !23
Appuyez
1
sur la1
touche sans basculer, puis2
appuyez sur la touche Maj et maintenez la touche enfoncée, ce qui donne la@
sortie. Ensuite, la touche Maj est relâchée et Tab est enfoncée, ce qui entraîne une indentation espacée de 4. Faisant suite, la touche Verr Maj est pressée, après quoi leR
,.
,K
,A
,P
, et les.
touches sont enfoncées, entraînant la sortieR.KAP.
. Enfin, un seul espace est sortie suivi par décalage résultant en!23
étant émis lorsque les1
,2
et les3
touches sont enfoncées à la fin.<SHFT>ABCDEFG<SHFT>HIJK<SHFT>1<SHFT>2<SHFT>3<SHFT>4567890 -> AbcdefgHijk!@#$567890
La touche Maj est maintenue enfoncée suivie de la
A
touche, ce qui entraîne la sortieA
suivie de la sortiebcdefg
lorsque lesB-G
touches sont enfoncées. Ensuite, la touche Shift est maintenue enfoncée , suivie de laH
touche, après quoi la sortie estH
, suivieijk
lorsque lesI-K
touches sont enfoncées. Enfin, les1-4
touches sont toutes modifiées lorsque la touche Maj est maintenue enfoncée avant chaque pression de touche, ce qui entraîne la fin de la sortie!@#$
au567890
moment où les5-0
touches sont enfoncées.<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)
La touche de suppression est pressée au début, après quoi rien ne se passe. Ensuite, la touche Retour est enfoncée, ce qui entraîne une nouvelle ligne, qui est supprimée après avoir appuyé à nouveau sur la touche Retour arrière. Enfin, la même séquence (nouvelle ligne suivie d'un retour arrière) est répétée. Après tout cela, la sortie est une chaîne vide.
<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>
La chaîne
<RET>
doit être la sortie de chaîne réelle . Ainsi, cela ne devrait pas produire une nouvelle ligne.<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)
C'est codegolf donc le code le plus court en octets gagne!
AbcdefgHijk!@#$567890
? En outre, dans le test # 8, se<SHFT>
trouve à la fin de la chaîne, mais les règles stipulent: "Il est garanti qu'une clé de caractère réussira un <SHFT>."Réponses:
Code machine x86 16 bits,
140139 octets1 octet enregistré en remplaçant DL par DX dans l'avant-dernier opcode. Corrections de sauts également corrigées lors du démontage pour correspondre au vidage hexadécimal.
Étant donné que la nature de la tâche nécessite des données pré-initialisées et que la réponse n'est pas un programme complet mais une fonction, je suppose qu'il existe une section de données dans le programme et l'éditeur de liens met rapidement à jour l'adresse des données. L'espace réservé d'adresse est désigné par «????».
Il s'agit d'une représentation hexadécimale du code. Les paramètres sont le pointeur sur la chaîne d'entrée dans SI et le pointeur sur le tampon de sortie dans DI. Les chaînes sont supposées se terminer par NULL.
Contenu de la table de mappage (25 octets):
Le nombre d'octets représente à la fois le code et les données.
Démontage:
Pour le jeu d'instructions 32 bits, le code est absolument le même, sauf pour la première instruction qui est plus longue de 2 octets en raison de l'adressage 32 bits (8d1d ???????? lea ebx, ds: ??????? ?)
la source
i
pour le cas de testU<RET><DEL><DEL>I
et une chaîne vide pour l'entréeRE<DEL><DEL>
? J'ai clarifié un peu les règles concernant la clé de suppression, donc si ces 2 cas de test ne fonctionnent pas, pourriez-vous également mettre à jour votre code afin qu'il produise la sortie correcte pour ces cas de test? Je vous remercie!Rétine, 136 octets
Peut probablement être joué au golf plus loin.
Vérifiez tous les cas de test. (Légèrement modifié pour exécuter tous les tests en même temps.)
la source
Caps+Shift+A = A
. Mec mon clavier est bizarre ...JavaScript (ES6), 207
Mis à jour pour corriger le bogue avec des suppressions répétées, même quelques octets plus courts.
moins golfé
Tester
la source
I
pour le cas de testU<RET><DEL><DEL>I
et une chaîne vide pour l'entréeRE<DEL><DEL>
? J'ai clarifié un peu les règles concernant la clé de suppression, donc si ces 2 cas de test ne fonctionnent pas, pourriez-vous également mettre à jour votre code afin qu'il produise la sortie correcte pour ces cas de test? Je vous remercie!U<RET><DEL>I
ne devraisi
pas donnerI