Imprima el teclado QWERTY con las teclas que estén lo más juntas posible

19

ingrese la descripción de la imagen aquí

Normalmente, los desafíos se puntúan en bytes o, a veces, en la distancia de Levenshtein, pero para esto usamos la distancia del teclado: la cantidad de teclas entre las teclas utilizadas para escribir el programa (use el teclado anterior como referencia definitiva). Por ejemplo, la distancia entre Ay Fes 3, porque la ruta es A=> S=> D=> F. La distancia entre Ny 5es 4, porque no importa qué camino tome, requiere al menos 4 pasos. Su tarea es generar lo siguiente (sin incluir espacios finales), con la menor distancia posible del 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

Envase:

Para hacerte la vida más fácil, ciertas teclas pueden envolver el teclado. Left Shiftenvuelve Right Shift, Caps Lockenvuelve Enter, Tabenvuelve \y ~envuelve Backspace. Por ejemplo, la distancia entre Qy Pes 5, porque Q=> Tab=> \=> ]=> [=>P .

Nota: El ajuste solo funciona horizontalmente; no puede pasar, por ejemplo,\ aCaps Lock

Puntuación:

Puntuación = distancia del teclado + recuento de bytes

Ejemplo 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. Las letras minúsculas y mayúsculas cuentan como la misma clave. Si una tecla tiene dos símbolos (como 7y& ), también cuentan como la misma tecla, no es necesario incluir el cambio de pulsación.
  2. Desafortunadamente, si su código requiere símbolos que no están en el teclado, no puede usarlo.
  3. En la imagen del teclado, se puede ignorar la fila superior. La única clave que puede usar en la fila inferior esSpace
  4. Las claves deben ingresarse en orden, no puede usar las teclas de flecha para mover el cursor y luego ingresar una clave.

Calculadora de puntaje:

  • Actualizado el 27/12 para corregir `=> ]y errores de cálculo relacionados. Verifique sus puntajes nuevamente, y probablemente serán más pequeños (¡con suerte no más grandes!)

Pegue su código aquí para calcular la puntuación. Avíseme si alguna vez recibe un error o si imprime el número incorrecto.

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:

geokavel
fuente
99
deberíamos hacer otro desafío: el código más corto para obtener respuestas como esta. Creo que el método de puntuación es más interesante que la pregunta.
Cyoce
2
Además, por amor de Dios, a ===menos que por alguna razón quieras que JS coaccione furtivamente a tus tipos y absorba el rendimiento.
Cyoce
55
Cualquier presentación en Unary / Lenguage tendrá una puntuación de 0.
Dennis
1
@ Dennis ¿Es posible responder esto en esos idiomas? Puedo poner un límite a la longitud máxima del programa.
geokavel
3
idk Creo que realmente no está en el espíritu de las cosas eliminar un lenguaje creativo y válido sobre la base de que ... ¿funciona? ¿En qué es bueno el idioma? Esto no parece ser diferente de eliminar CJam o Pyth porque sus respuestas son demasiado cortas o eliminan Retina para las preguntas de coincidencia de texto, y sí, me pareció extraño que la respuesta principal se volviera inválida en algún momento después de ser publicada a pesar de haber desafío. Realmente disfruto compartiendo respuestas como esta cuando el idioma realmente se muestra.
djechlin

Respuestas:

5

Pyth, puntaje 107 106 102

:jd"QWERTYUIOP
ASDFGHJKL
]XCVBNM""]"" Z

Pruébalo en línea.

PurkkaKoodari
fuente
2
¡Tu puntaje ha bajado en 2!
geokavel
Cngrt vry gd trabajo.
geokavel
33

Unario , puntaje ~ 6.1 * 10 618

6103247739090735580402225797524292167653462388595033897325606983093527722629493568418069722646005695215642120674994001348606253869287599178270707482456199630901069511698694317195626565008736452130034232375778047932461822258369348260249011643486476832847755830117284465136723525376668555270734061914837886192012601522703308221225195058283657800958507281265116257152529161080096092081620384043514820427911786442536988705847468796481108000358361636640985892696216392434604543586511103835032034494033598102606339253132146827455065586119645920456668064941286708686113567081095434338440184737976711767750474398662381256908308 zeros

No es la solución más "creativa", pero a mi computadora le tomó ~ 3 minutos convertir la representación de base 2 de esto a base 10


Esta solía tener una puntuación de 0 , pero las reglas de puntuación cambiaron.

Longitud del código: ~ 6.1 * 10 618

Distancia clave: 0

Downgoat
fuente
3
Lol, no entiendo cómo funciona esto, pero esto será inválido pronto.
geokavel
1
@geokavel aww :( pero no inválido, solo tendría una puntuación muy alta
Downgoat
Sí, te daré un voto positivo.
geokavel
¿3 minutos? Necesitas un mejor convertidor . : P
Dennis
2
Me desplacé hasta el final de su bloque de código. Pensé que el código era 61032477390907355804 ...., no 61032477390907355804 ... ceros. : P
Rɪᴋᴇʀ
6

Japt , la puntuación de 123 119 118 116 106

42 41 40 bytes + 81 78 77 75 66 distancia

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

(salida adecuada en el cuadro "salida")

nicael
fuente
1
Tu puntaje permanece igual.
geokavel
@geo ya recordó :)
nicael
@geo Btw, puedes editar los puntajes de inmediato.
nicael
Agradable de nuevo! Podría hacerlo "QWERTYUIOP<br>ASDFGHJKL<br>ZXCVBNM"¬¸r'Z" Z( <br>representa un salto de línea), pero eso requiere dos caracteres que no sean de teclado, por lo que supongo que no es legal. Pero al menos puede eliminar la coma, ya que se inserta automáticamente.
ETHproductions
@Eth Genial, gracias! En cuanto al salto de línea, no creas que soy un novato en html; D
nicael
6

JavaScript (ES6), puntaje 188

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

Solo apenas obtiene una mejor puntuación que alertla cadena de salida, pero es el mejor enfoque que pude encontrar ...: /

Bytes: 60

Distancia clave: 128

usuario81655
fuente
Intenté una versión modificada de este apporach: alert(`QWERTYUIOP<br>ASDFGHJKL<br> ZXCVBNM`.match(/\n| ?./g).join` `)mientras esto funciona, son 65 bytes (puntaje 231).
ETHproductions
2
Su puntuación es 1 punto menor ahora ..
geokavel
5

Bash + Sed, 151

sed 'sb *.b& bg'<<<'QWERTYUIOP
 ASDFGHJKL
  ZXCVBNM'
Alexander Vogt
fuente
Felicidades, su puntaje es 1 punto más bajo con la nueva corrección de conteo.
geokavel
1
@geokavel Gracias - arreglado.
Alexander Vogt
5

Python, 157 , 156 , 211 , 221 puntos

Distancia clave: 157

Bytes: 64

Ergo, el puntaje total es 221.

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

Imprime la cadena pero tiene que agregar un espacio extra. :( ahora más largo.

¿Por qué @Pietu, por qué me hiciste esto?

Rɪᴋᴇʀ
fuente
3
Su puntaje es 1 más bajo ahora.
geokavel
Ooh, genial Gracias @geokavel. ¿Qué cambió en las reglas?
Rɪᴋᴇʀ
No hay reglas, hubo un error en la calculadora
geokavel
Esto imprime demasiados espacios al comienzo de la tercera línea.
PurkkaKoodari
Has aplastado mis esperanzas con tus verdaderas palabras. Pero gracias por señalar eso.
Rɪᴋᴇʀ
5

JavaScript, puntuación 156187

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

Nada mal para JavaScript

Pruébalo en línea


Con alerta, puntúa 186

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

Downgoat
fuente
Pero no imprime la cadena, ¿no?
nicael
@nicael Puedo afirmar que estoy usando este entorno que tiene impresión / salida implícita.
Downgoat
1
La puntuación es 1 más baja ahora.
geokavel
@geokavel gracias arreglado
Downgoat
3
Inventar su propio entorno para evitar la producción, ¿hmm? De todos modos, es posible acortar esto por un byte .
ETHproductions
4

Jolf , 118 + 51 = 169

Pruébalo aquí! (subrayado en la explicación utilizada para denotar un espacio utilizado)

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, actualización posterior a la pregunta, 76 + 21 = 97

Pruébalo aquí ! Nuevamente, no suelo actualizar mi código hasta que sea relevante. Sigue siendo 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
Conor O'Brien
fuente
4

Bash + sed, puntaje 202 200

sed 's/\([^ ]\)/\1 /g'<<F
QWERTYUIOP
 ASDFGHJKL
  ZXCVBNM
F
usuario2064000
fuente
1
¡Tu puntaje bajó en 2!
geokavel
@geokavel, gracias, y ya está arreglado.
user2064000
0

Python, puntaje 185

print" ".join("QWERTYUIOP\nASDFGHJKL\n")+"  Z X C V B N M"
JuanPatata
fuente