Desafio de layouts de teclado

14

O layout do teclado que as pessoas costumam usar é o layout QWERTY , como mostrado abaixo.

Teclado QWERTY

Mas também existem outros layouts de teclado:

DVORAK

Teclado DVORAK

COLEMAK

Teclado COLEMAK

TRABALHADOR Teclado WORKMAN

Sua tarefa

Seu código terá duas entradas: o nome do layout do teclado e uma string para transcrever. Seu objetivo é converter sua entrada QWERTY como se você estivesse digitando com o layout do teclado fornecido como primeiro parâmetro.

Regras

O formato de entrada é gratuito, você pode usar seqüências de caracteres, matrizes etc. Além disso, você pode usar três valores distintos para representar os layouts para reduzir sua contagem de bytes, mas cada um deles deve ser representável em 10 bytes ou menos.

Você só precisa manipular as teclas com fundo branco. Especificamente, você deve transpor os caracteres ASCII imprimíveis do alfabeto QWERTY para um dos outros alfabetos:

 QWERTY: !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
 DVORAK: !_#$%&-()*}w[vz0123456789SsW]VZ@AXJE>UIDCHTNMBRL"POYGK<QF:/\=^{`axje.uidchtnmbrl'poygk,qf;?|+~
COLEMAK: !"#$%&'()*+,-./0123456789Oo<=>?@ABCSFTDHUNEIMKY:QPRGLVWXJZ[\]^_`abcsftdhuneimky;qprglvwxjz{|}~
WORKMAN: !"#$%&'()*+,-./0123456789Ii<=>?@AVMHRTGYUNEOLKP:QWSBFCDXJZ[\]^_`avmhrtgyuneolkp;qwsbfcdxjz{|}~

(Observação: isso foi transcrito à mão por @ETHproductions; portanto, se você encontrar algum erro, aponte-o!)

Exemplo

DVORAK zZxX como entrada dará como saída ;:qQ

Isso é então a resposta mais curta em bytes vence!

Nayuki
fonte
1
Além disso, mais alguns casos de teste seriam úteis.
ETHproductions
1
@Tutleman Sim, você pode tomar 0 1 2, por exemplo
1
Espere, podemos tomar, por exemplo, !_#$%&-()*}w[vz0123456789SsW]VZ@AXJE>UIDCHTNMBRL"POYGK<QF:/\=^{`axje.uidchtnmbrl'poygk,qf;?|+~como entrada do teclado Dvorak? Isso banalizaria o desafio ... Que tal introduzir uma restrição de comprimento ou algo semelhante?
ETHproductions
1
@EriktheOutgolfer Mas, então, você poderia tomar por exemplo, !_#$%&-()*}w[vz0123456789SsW]VZ@AXJE>UIDCHTNMBRL"POYGK<QF:/\‌​=^{`axje.uidchtnmbrl‌​'poygk,qf;?|+~como entrada
ETHproductions
1
@ETHproductions Sim, você pode usar esses caracteres como entradas, embora os layouts não precisem depender deles para serem construídos. O único uso para eles seria escolher qual layout usar. 10 bytes é um limite fixo (IMO muito curto), é por isso que não gosto. E sim, você diz bytes, não caracteres. Eu acho que isso deveria ter sido protegido por mais tempo.
precisa saber é o seguinte

Respostas:

3

Rubi , 258 247 238 bytes

->c,t{c.tr"#{$f='\'"+,-./<=>?[]{'}}:;B-Z_b-z",%W(-_}w[vzW]VZ/=?+SsXJE>UIDCHTNMBRL"POYGK<QF:{xje.uidchtnmbrl'poygk,qf;
#$f}OoBCSFTDHUNEIMKY:QPRGLVWXJZ_bcsftdhuneimky;qprglvwxjz
#$f}IiVMHRTGYUNEOLKP:QWSBFCDXJZ_vmhrtgyuneolkp;qwsbfcdxjz)[t]}

Experimente online!

Esta é uma função que aceita dois argumentos: a mensagem a ser trocada e um valor 0-2 representando o layout a ser trocado, onde 0 corresponde a Dvorak, 1 a Colemak e 2 a Workman.

Fundamentalmente, não acho que isso seja muito diferente das outras respostas. Mais facilmente, fica assim:

def swap_layout(message, layout)
    keyboards = [DVORAK, COLEMAK, WORKMAN] # Omitted here for brevity
    return message.tr(QWERTY, keyboards[layout])
end

A string#trfunção Ruby usa dois argumentos: uma string contendo caracteres a serem substituídos e uma string contendo suas substituições. Ajuda, permite especificar intervalos de caracteres usando a a-zsintaxe. A outra realização importante de economia de espaço é que não é necessário incluir caracteres iguais nos quatro layouts, o que me permitiu livrar-me de todos os dígitos, a letra "A" em maiúsculas e minúsculas e algumas caracteres especiais.

Um outro pedaço estranho de sintaxe é o uso de %W(). Isso cria uma matriz de cadeias contendo tudo dentro dos parênteses, separados por espaços em branco. Todas as quebras de linha no envio realmente funcionam como separadores de elementos. %W()também permite interpolação de strings (o que é feito com o #{}operador) - %w()teria sido a mesma coisa, mas sem interpolação de strings.

Eu também gostaria de ter um momento para culpar Dvorak por mexer com meus planos de otimização por insistir em ser totalmente diferente de todos os outros, o tempo todo; uma solução Qwerty / Colemak / Workman poderia ter sido tão lindamente curta ...

Tutleman
fonte
Tomar um número inteiro como representação do teclado para mapear para atender aos requisitos? O caso de teste parece exigir explicitamente o nome do teclado, mas as regras parecem permitir que qualquer entrada represente o teclado.
Shaggy
@Shaggy Para citar um dos comentários do autor da postagem, "você pode usar 0 1 2 por exemplo", que é exatamente o que eu fiz.
precisa saber é o seguinte
5

JavaScript (ES7), 282 273 251 250 bytes

Leva um ID de layout do teclado ke uma matriz de caracteres ana sintaxe de curry (k)(a). Retorna uma matriz de caracteres traduzidos.

Os IDs de layout são:

  • -32.
  • 64
  • 160
k=>a=>a.map(c=>1/(t=`1_3-2}w[vz8SsW]VZ1XJE>UIDCHTN0BRL"POYGK<QF:/0=0{1xje.uidchtn0brl'poygk,qf;?0+995Oo6SFTD0UNEI0KY:0PRGL2J8sftd0unei0ky;0prgl2j998Ii5VMHRT0YUNEOLKP:0W0BFCD0J6vmhrt0yuneolkp;0w0bfcd0j5`.replace(/\d/g,n=>15**n)[c.charCodeAt()+k])?c:t)

Experimente online!

Como funciona

Compressão

Todos os três layouts de destino são armazenados em uma única sequência compactada, em que cada caractere é:

  • um caractere de tradução de QWERTY
  • um dígito representando o número de caracteres consecutivos que não precisam ser traduzidos

n15n10

n | 15**n       | length
--+-------------+-------------
0 | 1           | 1
1 | 15          | 2
2 | 225         | 3
3 | 3375        | 4
4 | 50625       | 5 (not used)
5 | 759375      | 6
6 | 11390625    | 8
7 | 170859375   | 9 (not used)
8 | 2562890625  | 10
9 | 38443359375 | 11

Por exemplo, #$%&-()*no DVORAK é armazenado como 3-2porque #$%&e ()*possui mapeamentos idênticos no QWERTY e -é apenas uma tradução real.

Em particular, 0123456789é mapeado da mesma maneira em todos os layouts e nunca precisa ser traduzido. Portanto, não há ambiguidade possível entre um dígito usado para compactação e um dígito usado para tradução.

Descompressão

n15n3-23375-225

Tradução

Para cada personagem c, em a, extraímos o caráter de tradução t, usando kcomo uma compensação na cadeia de layout não-comprimido, e testar se é um dígito com 1/t. Nesse caso, produzimos o caractere original c.

Arnauld
fonte
Eu tive que descer as escadas para colocar um chapéu para poder tirar com você! Eu sabia que alguém iria me derrotar, mas estou feliz por ter sido derrotado em grande estilo. Você terá meu voto positivo assim que terminar de digerir exatamente como você conseguiu essa obra-prima.
Shaggy
4

Retina , 273 270 bytes

T`p` !_#-&\-()*}\w[vzdSsW]VZ@AXJ\E>UIDC\HTNMBR\L"P\OYGK<QF:/\\=^{\`axje.ui\dc\htnmbr\l'\p\oygk,qf;?|+~`^D.*
T`p` -9\O\o<-CSFTD\HUN\EIMKY:QPRG\LVWXJZ-csft\d\huneimky;q\prg\lv-xjz-~`^C.*
T`p` -9Ii<-AVM\HRTGYUN\E\O\LKP:QWSBFCDXJZ-avm\hrtgyune\o\lk\p;q\wsbfc\dxjz-~`^W.*
^.

Experimente online! Prefixar a mensagem com uma única letra D, Cou Wpara o layout de teclado desejado. Infelizmente, Retina suporta um monte de letras mágicas ( psendo a óbvia, mas eu consegui inserir uma d) que todas precisam ser citadas, exceto que eu era capaz de usar em v-xvez de v\wx. Editar: salvou 3 bytes graças a @ETHproductions.

Neil
fonte
Se os -s representam intervalos de caracteres, acho que você pode salvar alguns alterando <-@ABCpara <-C.
ETHproductions
@ETHproductions Huh, eu me pergunto por que eu negligenciei-lo na versão em maiúsculas ...
Neil
3

PHP, 364 bytes

echo strtr($argv[2],($t=[[":;BCDEFHIJKLMNOPRTUVWYbcdefhijklmnoprtuvwy","IiVMHRTYUNEOLKP:WBFCDJvmhrtyuneolkp;wbfcdj"],[":;DEFGIJKLNOPRSTUYdefgijklnoprstuy","OoSFTDUNEIKY:PRGLJsftduneiky;prglj"],["\"'+,-./:;<=>?BCDEFGHIJKLNOPQRSTUVWXYZ[]_bcdefghijklnopqrstuvwxyz{}","_-}w[vzSsW]VZXJE>UIDCHTNBRL\"POYGK<QF:/={xje.uidchtnbrl'poygk,qf;?+"]][ord($argv[1])%3])[0],$t[1]);

Matriz contém 3 matrizes em que chave representa 0 = W, 1 = C, 2 = D

Experimente online!

Jörg Hülsermann
fonte
2

Python 2, 422 bytes

Tentou combinar layouts com uma maneira inteligente, mas não ajudou muito.
Experimente online

from string import*
Q=' '+printable
D=' '+digits
p,P=punctuation.split(':;')
w='avmhrtgyuneolkp;qwsbfcdxjz'
c='abcsftdhuneimky;qprglvwxjz'
d="uidchtnmbrl'poygk"
K={'C':D+c+c.upper().replace('Y;','Y:')+p+'Oo'+P,'W':D+w+w.upper().replace('P;','P:')+p+'Ii'+P,'D':D+'axje.'+d+',qf;AXJE>'+d.upper().replace("L'",'L"')+'<QF:!_#$%&-()*}w[vzSsW]VZ@/\=^{`?|+~'}
k,s=input().split()
print''.join(map(lambda x:K[k[0]][Q.index(x)],s))
Gambá morto
fonte
Bem jogado :) Eu não sou tão bom em python, então não posso realmente ajudá-lo golf este ^^
2

JavaScript (ES6), 461 409 404 395 385 bytes

Eu escrevi a versão original do texto abaixo no meu telefone enquanto estava sentado em um ônibus e, em seguida, fiquei sem tempo para jogar corretamente, para que houvesse mais problemas a seguir. Obrigado a @ETHproductions pela ajuda até agora.

As seqüências de teclado foram copiadas diretamente da pergunta, então culpe Antoine ETH por qualquer erro!

Isso leva um número inteiro representando o layout do teclado (0 para DVORAK, 94 para COLEMAK & 188 para WORKMAN) e uma matriz da string como argumentos ao currying - por exemplo, f(0)(["z","Z","x","X"])saídas ;:qQ.

k=>s=>s.map(c=>`!_#$%&-()*}w[vz${a="0123456789"}SsW]VZ@AXJE>UIDCHTNMBRL"POYGK<QF:/\\=^{\`axje.uidchtnmbrl'poygk,qf;?|+~${b="!\"#$%&'()*+,-./"+a}Oo<=>?@ABCSFTDHUNEIMKY:QPRGLVWXJ${d="Z[\\]^_\`a"}bcsftdhuneimky;qprglvwxjz{|}~${b}Ii<=>?@AVMHRTGYUNEOLKP:QWSBFCDXJ${d}vmhrtgyuneolkp;qwsbfcdxjz{|}~`[`${b}:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXY${d}bcdefghijklmnopqrstuvwxyz{|}~`.search(c)+k]).join``

Tente

f=
k=>s=>s.map(c=>`!_#$%&-()*}w[vz${a="0123456789"}SsW]VZ@AXJE>UIDCHTNMBRL"POYGK<QF:/\\=^{\`axje.uidchtnmbrl'poygk,qf;?|+~${b="!\"#$%&'()*+,-./"+a}Oo<=>?@ABCSFTDHUNEIMKY:QPRGLVWXJ${d="Z[\\]^_\`a"}bcsftdhuneimky;qprglvwxjz{|}~${b}Ii<=>?@AVMHRTGYUNEOLKP:QWSBFCDXJ${d}vmhrtgyuneolkp;qwsbfcdxjz{|}~`[`${b}:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXY${d}bcdefghijklmnopqrstuvwxyz{|}~`.search(c)+k]).join``
o.innerText=f(j.value=0)([...i.value="zZxX"])
i.oninput=j.oninput=_=>o.innerText=f(+j.value)([...i.value].filter(c=>`!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_\`abcdefghijklmnopqrstuvwxyz{|}~`.includes(c)))
<select id=j><option value=0>DVORAK<option value=94>COLEMAK<option value=188>WORKMAN</select><input id=i><pre id=o>

Shaggy
fonte
Na verdade eu compilei as strings: P
ETHproductions
Vamos ver ... você nunca terá QWERTYcomo entrada, então eu acho que você poderia salvar alguns bytes não armazenando o objeto em uma variável. Seria algo parecido coms=>[...s].map(c=>({D:"...",C:"...",W:"..."}[k[0]]["...".indexOf(c)]).join``
ETHproductions
Ah, sim, eu sabia que havia uma maneira de trabalhar diretamente com o objeto, dentro do prazo, map()mas fiquei sem tempo - acredite ou não, escrevi isso enquanto estava sentado no ônibus para o cinema. Vou atualizá-lo com sua sugestão e algumas melhorias que me vi amanhã.
Shaggy
1

05AB1E , 199 192 187 bytes

žQDIiA¦'mKDuì“"'+,-./:;<=>?[]_{}“«.•4Zl˜η‡#ûwj˜ÐAδO•Duìð“>"<:.',;“S.;“_-}w[vzSsW]VZ/={?+“«ë¹<i.•2¸3'ÐQïK¤)•Duì„:;©ì.•C^ÿ¶₆*γŽ¨ï•Duì„Ooìë.•Brì·=ζW˜ΛlÝδ•Duì®ì.•]X)àƒ₆ä¤QúØM•Duì„Iiì}ð®S.;}‡‡

Usa IDs 1para DVORAK; 2para COLEMAK e 3WORKMAN.
Empurra o ID primeiro e depois a string que queremos transliterar.

Experimente online ou verifique a gama ASCII completa para todos os três .

Explicação:

žQ                    # Push printable ASCII builtin string:
                      #  “ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~“
  D                   # Duplicate it
   Ii                 # If the input-integer is 1:
     A                #  Push the lowercase alphabet
      ¦'mK           '#  Remove the first character (the 'a') and 'm'
          Duì         #  Prepend an uppercase copy
     "'+,-./:;<=>?[]_{}“«
                     "#  And then append the string “"'+,-./:;<=>?[]_{}“
     .•4Zl˜η‡#ûwj˜ÐAδO 
                      #  Push compressed string "xje uidchtnbrl poygk qf "
        Duì           #  Prepend an uppercase copy
     ð                #  Push a space " "
      “>"<:.',;“S    "#  Push the characters [">",'"',"<",":",".","'",",",";"]
                 .;   #  Replace the first space with ">", second with '"', etc.
     _-}w[vzSsW]VZ/={?+“«
                      #  And then append the string “_-}w[vzSsW]VZ/={?+“
   ë                  # Else:
    ¹<i               #  If the input-integer is 2 instead: 
       .•2¸3'ÐQïK¤)• '#   Push compressed string "defgijklnoprstuy"
          Duì         #   Prepend an uppercase copy
       „:;            #   Push string ":;"
          ©           #   Store it in the register (without popping)
           ì          #   And then prepend this ":;" in front of the "DEF...def..."-string
       .•C^ÿ¶₆*γŽ¨ï•  #   Push compressed string "sftduneiky prglj"
          Duì         #   Prepend an uppercase copy
       Ooì           #   And then prepend "Oo"
    ë                 #  Else (so the input-integer is 3):
     .•Brì·=ζW˜ΛlÝδ•  #   Push compressed string "bcdefhijklmnoprtuvwy"
        Duì           #   Prepend an uppercase copy
     ®ì               #   And then prepend ":;" (from the register)
     .•]X)àƒ₆ä¤QúØM  #   Push compressed string "vmhrtyuneolkp wbfcdj"
        Duì           #   Prepend an uppercase copy
     Iiì             #   And then prepend "Ii"
    }                 #  After the inner if-else:
     ð                #  Push a space " "
      ®S              #  Push the characters [":",";"] (from the register)
        .;            #  Replace the first space with ":" and the second space with ";"
   }                  # After the outer if-else:
                     # Transliterate the two strings we created,
                      #  in the duplicate printable ASCII string
                     # And then transliterate the printable ASCII string with this string,
                      #  in the (implicit) string-input
                      # (after which the result is output implicitly)

Consulte esta dica 05AB1E (seção Como compactar cadeias de caracteres que não fazem parte do dicionário? ) Para entender como as cadeias compactadas funcionam.

Kevin Cruijssen
fonte
1

C ++, 528 bytes

#include <map>
#define M(a,b)a!='\0'?a:b
std::map<char,char>t[3];char*c[]={"\"'+,-./:;<=>?BCDEFGHIJKLMNOPQRSTUVWXYZ[]_bcdefghijklmnopqrstuvwxyz{}","_-}w[vzSsW]VZXJE>UIDCHTNMBRL\"POYGK<QF:/={xje.uidchtnmbrl'poygk,qf;?+","\"'+,-./Oo<=>?BCSFTDHUNEIMKY:QPRGLVWXJZ[]_bcsftdhuneimky;qprglvwxjz{}","\"'+,-./Ii<=>?VMHRTGYUNEOLKP:QWSBFCDXJZ[]_vmhrtgyuneolkp;qwsbfcdxjz{}"};int main(int d,char*v[]){for(int i=1;i<4;i++)for(int j=0;j<68;j++)t[i-1][c[0][j]]=c[i][j];for(int k=0;v[2][k];k++)printf("%c",M(t[v[1][0]-'0'][v[2][k]],v[2][k]));}

Execute com ./multitrans <0-2> <string>onde 0 = Dvorak, 1 = Colemak e 2 = Operário.

Eu adicionei novas linhas no meio para tornar o código um pouco mais legível abaixo. Esse código gera um mapa de conversão a partir das seqüências de caracteres onde procurar o caractere Qwerty retorna a tradução ( t[0]['s'] = 'o'por s para Dvorak) e, em seguida, usa o mapa para traduzir. As cadeias de tradução são reduzidas porque alguns caracteres não precisam ser alterados. Provavelmente poderia ser reduzido ainda mais.

#include <map>
#define M(a,b)a!='\0'?a:b
std::map<char,char>t[4];
char*c[4]={
"\"'+,-./:;<=>?BCDEFGHIJKLMNOPQRSTUVWXYZ[]_bcdefghijklmnopqrstuvwxyz{}",
"_-}w[vzSsW]VZXJE>UIDCHTNMBRL\"POYGK<QF:/={xje.uidchtnmbrl'poygk,qf;?+",
"\"'+,-./Oo<=>?BCSFTDHUNEIMKY:QPRGLVWXJZ[]_bcsftdhuneimky;qprglvwxjz{}",
"\"'+,-./Ii<=>?VMHRTGYUNEOLKP:QWSBFCDXJZ[]_vmhrtgyuneolkp;qwsbfcdxjz{}"};
int main(int d,char*v[]){
    for(int i=1;i<4;i++)
        for(int j=0;j<68;j++)
            t[i-1][c[0][j]]=c[i][j];
    for(int k=0;v[2][k];k++)
        printf("%c",M(t[v[1][0]-'0'][v[2][k]],v[2][k]));
}

Extra: Qwerty -> Somente Dvorak (197 bytes)

Recentemente, escrevi esse código que transforma Qwerty em Dvorak, embora as capitais não sejam traduzidas.

#include<string>
char*d="\',.pyfgcrlaoeuidhtns;qjkxbmwvz ";std::string t="qwertyuiopasdfghjkl;zxcvbnm,./ ";int main(int c,char*v[]){for(int j=0;j<strlen(v[1]);j++)printf("%c",d[t.find(v[1][j])]);}
JackMacWindows
fonte
0

C, 394 bytes

Experimente on-line

char*K[3]={"!_#$%&-()*}w[vz0123456789SsW]VZ@AXJE>UIDCHTNMBRL\"POYGK<QF:/\\=^{`axje.uidchtnmbrl'poygk,qf;?|+~",
"!\"#$%&'()*+,-./0123456789Oo<=>?@ABCSFTDHUNEIMKY:QPRGLVWXJZ[\\]^_`abcsftdhuneimky;qprglvwxjz{|}~",
"!\"#$%&'()*+,-./0123456789Ii<=>?@AVMHRTGYUNEOLKP:QWSBFCDXJZ[\\]^_`avmhrtgyuneolkp;qwsbfcdxjz{|}~"};
main(int c,char**v){char*t=v[2];while(*t)putchar(*t>32?K[atoi(v[1])][*t-33]:*t),t++;}
Khaled.K
fonte