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.