Imprimez le clavier QWERTY en utilisant des touches aussi proches que possible


19

enter image description here

Normalement, les défis sont notés en octets, ou parfois en distance Levenshtein, mais pour celui-ci, nous utilisons la distance du clavier - le nombre de touches entre les touches utilisées pour taper le programme (utilisez le clavier ci-dessus comme référence définitive). Par exemple, la distance entre Aet Fest 3, car le chemin est A=> S=> D=> F. La distance entre Net 5est de 4, car peu importe le chemin que vous empruntez, cela nécessite au moins 4 étapes. Votre tâche consiste à générer les éléments suivants (sans inclure les espaces de fin), avec une distance de clavier aussi petite que possible:

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

Emballage:

Pour vous faciliter la vie, certaines touches peuvent s'enrouler autour du clavier. Left Shiftretourne à Right Shift, Caps Lockretourne à Enter, Tabretourne à \et ~retourne à Backspace. Par exemple, la distance entre Qet Pest 5, car Q=> Tab=> \=>] => [=> P.

Remarque: emballage ne fonctionne que horizontalement - vous ne pouvez pas passer de, disons, \àCaps Lock

Notation:

Score = distance du clavier + nombre d'octets

Exemple de calcul:

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 .

Remarques:

  1. Les lettres minuscules et majuscules comptent comme la même clé. Si une clé comporte deux symboles (comme 7et& ), ils comptent également comme la même touche, pas besoin d'inclure la poussée de décalage.
  2. Malheureusement, si votre code nécessite des symboles qui ne sont pas sur le clavier, vous ne pouvez pas l'utiliser.
  3. Sur l'image du clavier, la ligne supérieure peut être ignorée. La seule clé que vous pouvez utiliser sur la ligne du bas estSpace
  4. Les clés doivent être saisies dans l'ordre, vous ne pouvez pas utiliser les touches fléchées pour déplacer le curseur, puis saisir une clé.

Calculatrice de score:

  • Mis à jour le 27/12 pour corriger `=> ]et les erreurs de calcul associées. Vérifiez à nouveau vos scores, et ils seront probablement plus petits (espérons-le pas plus grands!)

Collez ici votre code pour calculer le score. Faites-moi savoir si vous obtenez une erreur ou s'il imprime le mauvais numéro.

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>

En relation:


9
nous devrions faire un autre défi: le code le plus court pour marquer des réponses comme celle-ci. Je pense que la méthode de notation est plus intéressante que la question.
Cyoce

2
Aussi, s'il vous plaît pour l'amour de Dieu, ===sauf si pour une raison quelconque vous voulez que JS contraigne sournoisement vos types et augmente les performances.
Cyoce

5
Toute soumission en Unary / Lenguage aura un score de 0.
Dennis

1
@Dennis Est-il possible de répondre à cela dans ces langues? Je peux limiter la durée maximale du programme.
geokavel

3
idk Je pense que ce n'est vraiment pas dans l'esprit des choses d'éliminer un langage créatif et valable au motif que cela ... fonctionne? est-ce que la langue est bonne? Cela ne semble pas différent d'éliminer CJam ou Pyth parce que leurs réponses sont juste un peu trop courtes ou d'éliminer Retina pour les questions de correspondance de texte, et oui, il m'a semblé étrange que la réponse du haut devienne invalide quelque temps après avoir été publiée malgré le clouage du défi. J'aime vraiment partager des réponses comme celle-ci lorsque la langue est vraiment mise en valeur.
djechlin

Réponses:



33

Unaire , score ~ ​​6,1 * 10 618

6103247739090735580402225797524292167653462388595033897325606983093527722629493568418069722646005695215642120674994001348606253869287599178270707482456199630901069511698694317195626565008736452130034232375778047932461822258369348260249011643486476832847755830117284465136723525376668555270734061914837886192012601522703308221225195058283657800958507281265116257152529161080096092081620384043514820427911786442536988705847468796481108000358361636640985892696216392434604543586511103835032034494033598102606339253132146827455065586119645920456668064941286708686113567081095434338440184737976711767750474398662381256908308 zeros

Ce n'est pas la solution la plus "créative" mais il a fallu à mon ordinateur ~ 3 minutes pour convertir la représentation en base 2 de celle-ci en base 10


Cela avait un score de 0 , mais les règles de notation changé.

Longueur du code: ~ 6,1 * 10618

Distance clé: 0


3
Lol, je ne comprends pas comment cela fonctionne, mais cela ne sera bientôt plus valide.
geokavel

1
@geokavel aww :( mais pas invalide, il aurait juste un score très élevé
Downgoat

Oui, je vais vous donner un upvote.
geokavel

3 minutes? Vous avez besoin d' un meilleur convertisseur . : P
Dennis

2
J'ai défilé jusqu'à la fin de votre bloc de code. Je pensais que le code était 61032477390907355804 ...., pas 61032477390907355804 ... zéros. : P
Rɪᴋᴇʀ

6

Japt , partition 123 119 118 116 106

42 41 40 octets + 81 78 77 75 66 distance

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

(sortie correcte dans la case "sortie")


1
Votre score reste le même.
geokavel

@geo déjà recalculé :)
nicael

@geo Btw, vous pouvez modifier les scores immédiatement.
nicael

Encore sympa! Vous pouvez le faire "QWERTYUIOP<br>ASDFGHJKL<br>ZXCVBNM"¬¸r'Z" Z( <br>représente un saut de ligne), mais cela nécessite deux caractères non-clavier, donc je suppose que ce n'est pas légal. Mais au moins, vous pouvez supprimer la virgule, car elle est automatiquement insérée.
ETHproductions du

@Eth Super, merci! Quant à la rupture de ligne, ne pensez pas que je suis un noob en html; D
nicael

6

JavaScript (ES6), score 188

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

Obtient à peine un meilleur score que alert la chaîne de sortie, mais c'est la meilleure approche que j'ai pu trouver ...: /

Octets: 60

Distance clé: 128


J'ai essayé une version modifiée de cette approche: alert(`QWERTYUIOP<br>ASDFGHJKL<br> ZXCVBNM`.match(/\n| ?./g).join` `)Pendant que cela fonctionne, c'est 65 octets (score 231).
ETHproductions

2
Votre score est maintenant 1 point plus petit ..
geokavel

5

Bash + Sed, 151

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

Félicitations, votre score est inférieur de 1 point avec le nouveau correctif de comptage.
geokavel

1
@geokavel Merci - corrigé.
Alexander Vogt

5

Python, 157 , 156 , 211 , 221 points

Distance clé: 157

Octets: 64

Ergo, le score total est de 221.

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

Imprime la chaîne mais doit ajouter un espace supplémentaire. :( maintenant plus longtemps.

Pourquoi @Pietu, pourquoi m'as-tu fait ça?


3
Votre score est désormais inférieur de 1.
geokavel

Ooh, cool. Merci @geokavel. Qu'est-ce qui a changé dans les règles?
Rɪᴋᴇʀ

Pas de règles, il y avait un bug dans la calculatrice
geokavel

Cela imprime un trop grand nombre d'espaces au début de la troisième ligne.
PurkkaKoodari

Vous avez écrasé mes espoirs avec vos vrais mots. Mais merci de l'avoir signalé.
Rɪᴋᴇʀ

5

JavaScript, score 156187

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

Pas mal pour JavaScript

Essayez-le en ligne


Avec alerte, marque 186

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


Mais il n'imprime pas la chaîne, non?
nicael

@nicael Je peux affirmer que j'utilise cet environnement qui a une impression / sortie implicite.
Downgoat

1
Le score est désormais inférieur de 1.
geokavel

@geokavel thanks fixed
Downgoat

3
Inventer votre propre environnement pour contourner la sortie, hmm? Quoi qu'il en soit , il est possible de raccourcir cela d'un octet .
ETHproductions

4

Jolf , 118 + 51 = 169

Essayez-le ici! (souligne l'explication utilisée pour désigner un espace utilisé)

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, mise à jour post-question, 76 + 21 = 97

Essayez-le ici ! Encore une fois, je ne mets pas souvent à jour mon code tant qu'il n'est pas pertinent. Toujours amusant.

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, score 202 200

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

1
Votre score a baissé de 2!
geokavel

@geokavel, merci, et c'est résolu maintenant.
user2064000

0

Python, score 185

print" ".join("QWERTYUIOP\nASDFGHJKL\n")+"  Z X C V B N M"
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.