Digitando, mas à esquerda [fechado]

14

fundo

Você recebeu a tarefa de fazer anotações para uma reunião. Você começa a digitar no Google Doc, mas não tem tempo suficiente durante a reunião para olhar o teclado enquanto digita.

Felizmente para você, você pode digitar sem olhar para o teclado. Após a reunião, você percebe que tudo o que digitou foi uma chave à esquerda.

O desafio

Para esse desafio, você usará as letras, números e barra de espaço do layout do teclado QWERTY.

  • Dada a entrada de texto (de qualquer método de entrada padrão), imprima o texto resultante, onde cada caractere é movido um para a esquerda no teclado.

    • Para a maioria das letras, basta olhar para a letra e traduzi-la para a letra à esquerda ( ctorna-se x, ttorna-se r, etc.).

    • Para letra q, traduza para um caractere de tabulação literal ( \t).

    • Para letra a, ative caps lock, para que a capitalização do restante da string seja invertida.

    • Para letra z, coloque a próxima letra em maiúscula.

    • Nenhuma tradução é necessária para a barra de espaço.

  • Preserve a capitalização durante a tradução e lembre-se do caps lock (se o caps lock estiver ativado, verifique se o caso é o oposto).

  • Todos os caracteres na sequência de entrada serão letras, números ou um espaço. Nenhuma pontuação ou outros caracteres podem ser incluídos.

Casos de teste

\t é um caractere de tabulação literal

Hello world    -> Gwkki qieks
Code Golf      -> Xisw Fikd
Queried apples -> \tyweuws OOKWA

Pontuação

A menor pontuação em bytes vence. Diverta-se!

conecte seu carregador
fonte
11
Uma referência rápida das linhas relevantes do teclado QWERTY seria útil, e manter a auto-contido desafio
Jo rei
4
Os números mudam para pontuação se houver um "Z" antes deles?
ErikF 9/10/19
10
Mas Z corresponde à mudança ...?
String não relacionada
4
Caso de teste sugerido: Azerty->wERT
Jitse 9/10/19
5
Para letra z, coloque em maiúscula a próxima letra na sequência -> isso significa que precisamos apenas nos preocupar com letras maiúsculas e não ter que alternar entre dígitos e símbolos? Qual é a saída esperada para 0123456789, a0123456789e z0z1z2z3z4z5z6z7z8z9? (Além disso, em muitos teclados não-QWERTY, 'Caps Lock' realmente funciona como um 'Shift Lock'. Acredito que o QWERTY não siga esse padrão, mas deve ser especificado para aqueles que não estão familiarizados com ele. )
Arnauld

Respostas:

11

JavaScript (V8) , 271 bytes

f=(s,k='~!@#$%^&*()_+`1234567890-=\tQWERTYUIOP{}|\tqwertyuiop[]\\ASDFGHJKL:"\n\\asdfghjkl;\'ZXCVBNM<>?zxcvbnm,./')=>s.replace(/[^ ]/g,c=>k[k.indexOf(c)-1]).replace(/\\([^\\]*)\\?/g,(m,c)=>c.replace(/[a-zA-z]/g,l=>l>'Z'?l.toUpperCase():l.toLowerCase())).replace(/[?']/,"")

Experimente online! Meu primeiro código JavaScript de golfe. Definitivamente poderia ser mais curto, mas acho que este é um bom começo.
Ele basicamente encontra cada caractere na kstring e o substitui pelo anterior, depois troca o caso de tudo entre Aor ou aremove todas as ocorrências de Zor z(como a tecla shift não faz nada por si só).
Esse deve ser um layout de teclado QWERTY normal, mas me informe se não.

Matthew Jensen
fonte
No seu próprio link TIO, zebras=>wveAo caso de teste parece estar errado. O primeiro zdeve fazer ecom que imprima uma letra maiúscula w. Do OP: "Para letra z, coloque a próxima letra em maiúscula na cadeia."
Night2 9/10/19
@ Night2 Cheers, postei antes do OP fazer o esclarecimento. Presumi que pressionar a tecla Shift uma vez não fará nada.
Matthew Jensen
5

Python 3 , 211 bytes

d=' ~!@#$%^&*()`~1!2@3#4$5%6^7&8*9(0)		qQwWeErRtTyYuUiIoOpPaAsSdDfFgGhHjJkKlLzZxXcCvVbBnNmM  '
c=s=0
for i in input():k=d.find(i);print(end=d[k-2+(c*i.isalpha()^s)*(1-k%2*2)][i in'aAzZ':]);c^=i in'aA';s=i in'zZ'

Experimente online!

Usa uma sequência de pesquisa na qual o caractere normal e sua versão modificada por turno são agrupados. Para cada caractere na entrada, ele recuperará o caractere dois lugares à esquerda. Altera a capitalização adicionando 1(ou -1se o caractere atual estiver em maiúsculas) ao valor da pesquisa quando o shift XOR caps lock estiver ativo. Os números não são influenciados pelo modificador caps lock.

Jitse
fonte
2

PHP , 227 bytes

for(;''<$s=$argn[$i++];)$s!=a&&$s!=A?$s!=z&&$s!=Z?($t=$m[stripos($m='~1!2@3#4$5%6^7&8*9(0	qwertyuiopasdfghjklzxcvbnm',$s)-1])+(print$s>' '?$s<A?!$h?$s-1?$s?$s-1:9:'`':$t:($t>=A&&(($s<a)+$h+$c)%2?$t^' ':$t):$s)+$h=0:$h=1:$c=!$c;

Experimente online!

Eu criei uma string de mapeamento ( ~1!2@3#4$5%6^7&8*9(0 qwertyuiopasdfghjklzxcvbnm) que para cada dígito tem o modo SHIFT à esquerda e para cada letra tem a letra / tecla à esquerda.

Eu faço um loop sobre os caracteres de entrada e para cada caractere:

  • Se o caractere for aou A, o sinalizador caps lock será revertido (não é lógico).
  • Se o caractere for zou Z, o sinalizador de deslocamento está definido como 1.
  • Quando o personagem não está em aAzZ:
    • O caractere à esquerda do caractere atual na sequência de mapeamento é armazenado $t.
    • Se o caractere atual for um espaço, ele será impresso.
    • Se o caractere atual for um dígito, e se o sinalizador shift for 1, $tfor impresso, caso contrário, se o dígito for 1, `será impresso, se o dígito for 0, 9será impresso e, caso contrário, digit-1será impresso.
    • Se o caractere atual for uma letra, com base no status do sinalizador de mudança, o sinalizador de maiúsculas e minúsculas do caractere atual (inferior / superior) $tserá impresso em letras minúsculas ou maiúsculas. O único caso especial aqui é o caractere de tabulação, que é impresso como está.
    • A marcação Shift é sempre definida 0no final.
Night2
fonte
2

Vermelho , 218 bytes

func[t][c: z: 0 rejoin collect[foreach s t[case[find"Aa"s[c: c xor 32]find"Zz"s[z: 32]on
[keep(select/case"  poiuytrewq^-lkjhgfdsamnbvcxzPOIUYTREWQ^-LKJHGFDSAMNBVCXZ0987654321~"s)xor either s <#"Z"[0][c xor z]z: 0]]]]]

Experimente online!

Atualmente AaZznão afetam dígitos.

Galen Ivanov
fonte
Isso parece não funcionar'A pear' -> ' OWe'
Jitse 9/10
@Jitse Hmm
Galen Ivanov
@Jitse Mas realmente não funciona bem com dígitos, não está totalmente claro no OP
Galen Ivanov
2
Eu concordo, o desafio é muito ambíguo.
Jitse 9/10/19
2

C (gcc) , 276 bytes

i;j;k;h;l;m;n;o;f(char*b){char*c=calloc(m=strlen(b),1),*a=" \tqwertyuiop\aasdfghjkl\nzxcvbnm\tQWERTYUIOP\aASDFGHJKL\nZXCVBNM`1234567890";for(i=k=j=n=0;j<=m;l=a[i=index(a,b[j++])-a-1])k=l^7?k:!k,o=l>64&l<91?a[i-30*k]:l<97?h=i?l^7?l?l^10?l:0:32:0:0:a[i+29*k],o?c[n++]=o:n;b=c;}

Graças ao ceilingcat por -33 bytes.

Experimente online!

girobuz
fonte
Sugerir em k^=!(l^7)vez dek=l^7?k:!k
ceilingcat 26/02