Imprima o teclado QWERTY usando as teclas o mais próximas possível


19

insira a descrição da imagem aqui

Normalmente, os desafios são pontuados em bytes ou, às vezes, na distância de Levenshtein, mas neste caso estamos usando a distância do teclado - o número de teclas entre as teclas usadas para digitar o programa (use o teclado acima como referência definitiva). Por exemplo, a distância entre Ae Fé 3, porque o caminho é A=>S => D=> F. A distância entre Ne 5é 4, porque, independentemente do caminho que você percorrer, são necessários pelo menos 4 etapas. Sua tarefa é gerar o seguinte (sem incluir espaços à direita), com a menor distância possível do teclado:

Q W E R T Y U I O P
 A S D F G H J K L
  Z X C V B N M

Invólucro:

Para facilitar sua vida, certas teclas podem envolver o teclado. Left Shiftenvolve Right Shift, Caps Lockenvolve Enter, Tabenvolve \e ~envolve Backspace. Por exemplo, a distância entre Qe Pé 5, porque Q=> Tab=> \=> ]=> [=> P.

Nota: O agrupamento funciona apenas horizontalmente - você não pode avançar, digamos, \paraCaps Lock

Pontuação:

Pontuação = distância do teclado + contagem de bytes

Exemplo de cálculo:

print(5);

  • p=> r== 6
  • r=> i== 4
  • i=> n== 2
  • n=> t== 3
  • t=> (== 4
  • (=> 5== 4
  • 5=> )== 5
  • )=> ;== 2

Total: 30 + 9 = 39 .

Notas:

  1. Letras minúsculas e maiúsculas contam como a mesma chave. Se uma tecla tiver dois símbolos (como7 e &), eles também contam como a mesma tecla, sem a necessidade de incluir pressionar Shift.
  2. Infelizmente, se o seu código exigir símbolos que não estão no teclado, você não poderá usá-lo.
  3. Na imagem do teclado, a linha superior pode ser ignorada. A única chave que você pode usar na linha inferior éSpace
  4. As teclas devem ser inseridas em ordem; você não pode usar as setas do teclado para mover o cursor e, em seguida, inserir uma tecla.

Calculadora de pontuação:

  • Atualizado em 27/12 para corrigir `=> ]e erros de cálculo relacionados. Verifique suas pontuações novamente, e elas provavelmente serão menores (espero que não sejam maiores!)

Cole seu código aqui para calcular a pontuação. Avise-me se você receber algum erro ou ele imprimir o número errado.

var keys = ["~1234567890-=←","\tqwertyuiop[]\\","↑asdfghjkl;\'\n","Lzxcvbnm,./R",
"AB      CDEF"];
var con =["`!@#$%^&*()_+{}|:\"<>?","~1234567890-=[]\\;\',./"];
function hexagon(k) {
  if(k === " ") return ["x","c","v","b","n","m",","];
  var p = pos(k);
  if(p === -1) return false;
  var row = p[0],col = p[1];
  var hexagon = [char(row,col-1,1),char(row-1,col),char(row-1,col+1),char(row,col+1,1),char(row+1,col),char(row+1,col-1)];
  return hexagon;
}

function char(r,c,wrap) {
  if(r < 0 || r >= keys.length) return "";
  if(r === keys.length-1 && 1 < c && c < 8) return " ";
  if(wrap) {
    if(c === -1) c = keys[r].length-1;
    if(c === keys[r].length) c = 0;
  }
  return keys[r].charAt(c);
}

function pos(c) {
    var row = -1, col = -1;
  for(var i = 0;i<keys.length;i++) {
    col = keys[i].indexOf(c)
    if( col != -1) { row = i; break;}
  }
  if(row === -1) return -1;
  return [row,col];
}


function dist(a,b,s,w) {
  if(typeof a === "object") {
    var list = [];
    for(var i = 0;i<a.length;i++) {
      list[i] = dist(a[i],b,s,w);
    }
    return list;
  }
  
	if(a==="") return Infinity;
  if(a===b) return 0;
  
 

  var p = pos(a);
  var q = pos(b);
  
  if(!w && a!==" ") {
    var chars = keys[p[0]].length;
    var opp = char(p[0],p[1] < chars/2 ? chars-1 : 0);
    return Math.min(dist(a,b,s,true),dist(a,opp,s,true)+dist(opp,b,s,true));
  }
  
   if(!s) { return Math.min(dist(a,b,true,w),dist(a," ",true,w)+dist(" ",b,true,w));}
  

   var h = hexagon(a);
  if(a === " ") return 1 + Math.min(...dist(h,b,true,w));
 if(p[0]<q[0]) {
  return 1 + Math.min(dist(h[4],b,s,w),dist(h[5],b,s,w)); 
  }
  else if(p[0] > q[0]) {
  return 1 + Math.min(dist(h[1],b,s,w),dist(h[2],b,s,w));
    }
  	if(b===" ") return Math.min(Math.abs(p[1]-7),Math.abs(2 - p[1]));
    var d = Math.abs(p[1]-q[1]);
    return Math.min(d,keys[p[0]].length-d);

  
  
  
  
}

function getTotalDistance(str) {
	for(var i = 0;i<con[0].length;i++)
  	str = str.replace(new RegExp("\\"+con[0].charAt(i),"g"),con[1].charAt(i));
  str = str.toLowerCase();
  var total = 0;
  for(var i = 0;i<str.length-1;i++) {
  	total += dist(str[i],str[i+1]);
  }
  return total;
} 
enter.onclick = function() {
 var a = getTotalDistance(program.value);
 var b = program.value.length;
 len.textContent = a;
 count.textContent = b;
 total.textContent = a+b;
};
<textarea rows=15 cols=40 id="program"></textarea>
<input type="submit" id="enter"/>
<div>
<div>Key distance: <span id="len"></span></div>
<div>Byte count: <span id="count"></span></div>
<div>Total: <span id="total"></span></div>
</div>

Relacionado:


9
devemos fazer outro desafio: o código mais curto para obter respostas como essa. Eu acho que o método de pontuação é mais interessante que a questão.
Cyoce

2
Além disso, por favor, use o amor de Deus, a ===menos que, por algum motivo, você queira que o JS coagir furtivamente seus tipos e melhorar o desempenho.
Cyoce

5
Qualquer submissão em Unary / Lenguage terá uma pontuação igual a 0.
Dennis

11
@ Dennis É possível responder isso nesses idiomas? Posso colocar um limite no tamanho máximo do programa.
geokavel

3
idk Eu acho que realmente não está no espírito das coisas eliminar uma linguagem criativa e válida com o fundamento de que ... funciona? a coisa em que o idioma é bom? Isso não parece diferente de eliminar CJam ou Pyth porque as respostas deles são curtas demais ou eliminam a Retina para perguntas de correspondência de texto, e sim me pareceu estranho que a resposta principal se tornasse inválida algum tempo depois de ser publicada, apesar de ter sido desafio. Gosto muito de compartilhar respostas como essa quando o idioma é realmente exibido.
djechlin

Respostas:



33

Unário , pontuação ~ 6,1 * 10 618

6103247739090735580402225797524292167653462388595033897325606983093527722629493568418069722646005695215642120674994001348606253869287599178270707482456199630901069511698694317195626565008736452130034232375778047932461822258369348260249011643486476832847755830117284465136723525376668555270734061914837886192012601522703308221225195058283657800958507281265116257152529161080096092081620384043514820427911786442536988705847468796481108000358361636640985892696216392434604543586511103835032034494033598102606339253132146827455065586119645920456668064941286708686113567081095434338440184737976711767750474398662381256908308 zeros

Não é a solução mais "criativa", mas o meu computador levou cerca de 3 minutos para converter a representação da base 2 disso na base 10


Isso costumava ter uma pontuação de 0 , mas as regras de pontuação foram alteradas.

Comprimento do código: ~ 6.1 * 10 618

Distância chave: 0


3
Lol, eu não entendo como isso funciona, mas isso será inválido em breve.
geokavel

11
@geokavel aww :( mas não é inválido, ele teria apenas uma pontuação muito alta #
Downgoat 27/12/15

Sim, eu vou te dar uma votação.
geokavel

3 minutos? Você precisa de um conversor melhor . : P
Dennis

2
Eu rolei até o final do seu bloco de código. Eu pensei que o código era 61032477390907355804 ...., não 61032477390907355804 ... zeros. : P
Rɪᴋᴇʀ

6

Japt , pontuação 123 119 118 116 106

42 41 40 bytes + 81 78 77 75 66 distância

"QWERTYUIOP
ASDFGHJKL
'ZXCVBNM"q qS r''"

(saída adequada na caixa "saída")


11
Sua pontuação permanece a mesma.
geokavel

@geo já recalcou :)
nicael

@geo Btw, você pode editar as pontuações imediatamente.
Nicael 27/12/15

Bom de novo! Você pode fazer "QWERTYUIOP<br>ASDFGHJKL<br>ZXCVBNM"¬¸r'Z" Z( <br>representa uma quebra de linha), mas isso requer dois caracteres que não sejam do teclado, então acho que não é legal. Mas pelo menos você pode remover a vírgula, pois ela é inserida automaticamente.
ETHproductions

@ Etth Ótimo, obrigado! Quanto à quebra de linha, não pense que eu sou um noob em html; D
nicael

6

JavaScript (ES6), pontuação 188

alert([...`QWERTYUIOP
ASDFGHJKL
`," Z",..."XCVBNM"].join` `)

Apenas mal obtém uma pontuação melhor do que alerta string de saída, mas é a melhor abordagem que eu poderia encontrar ...: /

Bytes: 60

Distância chave: 128


Eu tentei uma versão modificada deste apporach: alert(`QWERTYUIOP<br>ASDFGHJKL<br> ZXCVBNM`.match(/\n| ?./g).join` `)Enquanto isso funciona, é de 65 bytes (pontuação 231).
ETHproductions

2
Sua pontuação é 1 ponto menor agora ..
geokavel 27/12

5

Bash + Sed, 151

sed 'sb *.b& bg'<<<'QWERTYUIOP
 ASDFGHJKL
  ZXCVBNM'

Parabéns, sua pontuação é 1 ponto menor com a nova correção de contagem.
geokavel

11
@geokavel Obrigado - corrigido.
Alexander Vogt

5

Python, 157 , 156 , 211 , 221 pontos

Distância chave: 157

Bytes: 64

Portanto, a pontuação total é 221.

l=' '.join('QWERTYUIOP\nASDFGHJKL\nZXCVBNM')
print l[:42],l[42:]

Imprime a sequência, mas precisa adicionar um espaço extra. :( agora mais tempo.

Por que @Pietu, por que você fez isso comigo?


3
Sua pontuação é 1 mais baixa agora.
geokavel

Legal. Obrigado @geokavel. O que mudou nas regras?
Rɪᴋᴇʀ

Não governa, houve um erro na calculadora
geokavel

Isso imprime muitos espaços no início da terceira linha.
PurkkaKoodari

Você esmagou minhas esperanças com suas verdadeiras palavras. Mas obrigado por apontar isso.
Rɪᴋᴇʀ

5

JavaScript, pontuação 156 187

[...`QWERTYUIOP
ASDFGHJKL`].join` `+`
  Z X C V B N M`

Nada mal para JavaScript

Experimente online


Com alerta, pontuação 186

alert([...`QWERTYUIOP
ASDFGHJKL`].join` `+`
  Z X C V B N M`)


Mas não imprime a sequência, não?
Nicael 27/12

@nicael Posso afirmar que estou usando esse ambiente que tem impressão / saída implícita.
Downgoat

11
A pontuação é 1 menor agora.
geokavel

@geokavel obrigado corrigido
Downgoat

3
Inventando seu próprio ambiente para contornar a produção, hum? De qualquer forma, é possível reduzi-lo em um byte .
ETHproductions

4

Jolf , 118 + 51 = 169

Experimente aqui! (sublinhados na explicação usada para denotar um espaço usado)

R m{"QWERTYUIOP'ASDFGHJKL'ZXCVBNM"#DN+*S' RH' }"\n"
 _m                                                 map
   {"QWERTYUIOP'ASDFGHJKL'ZXCVBNM"#                  that array
                                   DN         }      with this function
                                     +*S'_            that concats (index many) spaces
                                          RH'_         with the inner array joined by spaces
R                                                    and join that
                                                      "\n"  with newlines

Jolf, atualização pós-pergunta, 76 + 21 = 97

Experimente aqui ! Novamente, nem sempre atualizo meu código até ser relevante. Ainda divertido.

R mpHDN+*S' RH' }"\n"
 _m                   map
   pH                 the keyboard array [["Q","W",...,"P"],["A",...,"L"],["Z",...,"M"]]
     DN         }      with this function
       +*S'_            that concats (index many) spaces
            RH'_         with the inner array joined by spaces
R                     and join that
                 "\n"  with newlines

4

Bash + sed, pontuação 202 200

sed 's/\([^ ]\)/\1 /g'<<F
QWERTYUIOP
 ASDFGHJKL
  ZXCVBNM
F

11
Sua pontuação caiu 2!
geokavel

@geokavel, obrigado, e está corrigido agora.
user2064000

0

Python, pontuação 185

print" ".join("QWERTYUIOP\nASDFGHJKL\n")+"  Z X C V B N M"
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.