Vamos analisar e processar o idioma-chave! Dada a entrada de uma sequência de pressionamentos de tecla do teclado e / ou teclas especiais, escreva um programa, função etc. que produza o produto quando todas as ações forem processadas com base no seguinte teclado:
+-------------------------------------------------------+
| ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | - | + | |
| ` | 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 |
+-------------------------------------------------------+
As chaves que saída personagens reais não consistem de espaços em branco e são capazes de ser modificado por outras chaves serão conhecidas como "teclas de caracteres", e aqueles que modificam a saída de outras chaves ou saída de espaços em branco serão conhecidas como "teclas especiais". As teclas de caracteres do alfabeto, que serão mostradas na entrada com letras maiúsculas, podem ser modificadas com Shift
ou Caps Lock
para produzir letras maiúsculas, e o restante das teclas de caracteres só pode ser modificado com Shift
para produzir seus caracteres alternativos. Portanto, A
na entrada corresponde à a A
chave de caractere, cuja saída normal é a
e cuja saída modificada, obtida com a tecla Shift
ou Caps Lock
, é A
. Por outro lado,/
, que corresponde à / ?
chave de caractere, possui uma saída normal de /
e uma saída modificada de ?
obtenível somente com Shift
esse tempo.
Regras
A entrada sempre será uma sequência que consiste em uma sequência de teclas de caracteres e teclas especiais. A chave especial completa para o mapeamento de strings da entrada (ou seja, o formato que eles garantem estar na entrada) e suas ações / saídas correspondentes são as seguintes:
<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.
Uma string vazia também é possível como entrada, para a qual a saída não deve ser nada.
- O uso de qualquer built-in que resolva esse problema diretamente não é permitido.
- O uso de brechas padrão não é permitido.
Casos de teste
Apresentado no formato Actual String Input -> Actual String Output
seguido de uma explicação para alguns.
1<SHFT>2<TAB><CAPS>R.KAP.<SPC><SHFT>123 -> 1@ R.KAP. !23
Saída
1
como a1
tecla é pressionada sem alternar, então Shift é mantido pressionado e a2
tecla é pressionada, resultando na@
saída. Em seguida, a tecla Shift é liberada e a tecla Tab é pressionada, resultando em um recuo com 4 espaços. Na sequência, a tecla Caps Lock está pressionado, após o qual oR
,.
,K
,A
,P
, e.
teclas são pressionadas, resultando na saídaR.KAP.
. Finalmente, um único espaço de saída, seguido por deslocamento, resultando em!23
ser emitidos quando as1
,2
e3
as teclas são pressionadas no final.<SHFT>ABCDEFG<SHFT>HIJK<SHFT>1<SHFT>2<SHFT>3<SHFT>4567890 -> AbcdefgHijk!@#$567890
A tecla Shift é mantida pressionada, seguida pela
A
tecla, resultando na saídaA
seguida pela saídabcdefg
quando asB-G
teclas são pressionadas. Em seguida, a tecla Shift é pressionada novamente , seguida pelaH
tecla, após a qual a saída éH
, seguida porijk
quando asI-K
teclas são pressionadas. Finalmente, todas as1-4
teclas são modificadas à medida que a tecla Shift é mantida pressionada antes de cada pressionamento de tecla, resultando na saída!@#$
final567890
quando as5-0
teclas são pressionadas.<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)
A tecla Delete é pressionada no começo, após o que nada acontece. Em seguida, a tecla Return é pressionada, resultando em uma nova linha, que é excluída após a tecla backspace ser pressionada novamente. Finalmente, a mesma sequência (nova linha seguida por backspace) é repetida. Depois de tudo isso, a saída é uma string vazia.
<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>
A string
<RET>
deve ser a saída real da string. Portanto, isso não deve gerar uma nova linha.<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)
Este é um codegolf, e o código mais curto em bytes vence!
AbcdefgHijk!@#$567890
? Além disso, no teste 8,<SHFT>
está no final da cadeia, mas as regras declaram: "É garantido que uma chave de caractere terá êxito em <SHFT>."Respostas:
Código de máquina x86 de 16 bits,
140139 bytesEconomizou 1 byte substituindo DL por DX no penúltimo opcode. Correções de salto corrigidas também na desmontagem para corresponder ao despejo hexadecimal.
Como a natureza da tarefa requer alguns dados pré-inicializados e a resposta não é um programa completo, mas uma função, presumo que exista uma seção de dados no programa e o vinculador atualiza prontamente o endereço dos dados. O espaço reservado para o endereço é indicado por '????'.
Esta é uma representação hexadecimal do código. Os parâmetros são ponteiro para inserir a string no SI e ponteiro para o buffer de saída no DI. Presume-se que as seqüências sejam terminadas em NULL.
Conteúdo da tabela de mapeamento (25 bytes):
A contagem de bytes é responsável pelo código e pelos dados.
Desmontagem:
Para o conjunto de instruções de 32 bits, o código é absolutamente o mesmo, exceto para a primeira instrução, que possui 2 bytes a mais devido ao endereçamento de 32 bits (8d1d ???????? lea ebx, ds: ??????? ?)
fonte
i
para o caso de testeU<RET><DEL><DEL>I
e uma sequência vazia para a entradaRE<DEL><DEL>
? Esclarei as regras um pouco sobre a chave de exclusão. Portanto, se esses dois casos de teste não funcionarem, você também pode atualizar seu código para que ele produza a saída correta para esses casos de teste? Obrigado!Retina, 136 bytes
Provavelmente pode ser jogado mais.
Verifique todos os casos de teste. (Ligeiramente modificado para executar todos os casos de teste de uma vez.)
fonte
Caps+Shift+A = A
. Man meu teclado é estranho ...JavaScript (ES6), 207
Atualizado para corrigir o erro com exclusões repetidas, até alguns bytes mais curtos.
menos golfe
Teste
fonte
I
para o caso de testeU<RET><DEL><DEL>I
e uma sequência vazia para a entradaRE<DEL><DEL>
? Esclarei as regras um pouco sobre a chave de exclusão. Portanto, se esses dois casos de teste não funcionarem, você também pode atualizar seu código para que ele produza a saída correta para esses casos de teste? Obrigado!U<RET><DEL>I
deve dari
nãoI