Drucken Sie die QWERTZ-Tastatur mit möglichst nahe beieinander liegenden Tasten


19

Bildbeschreibung hier eingeben

Normalerweise werden Herausforderungen in Bytes oder manchmal in Levenshtein-Entfernung gewertet, aber für diese verwenden wir die Tastaturentfernung - die Anzahl der Tasten zwischen den Tasten, die zum Eingeben des Programms verwendet werden (verwenden Sie die obige Tastatur als endgültige Referenz). Zum Beispiel ist der Abstand zwischen Aund F3, weil der Pfad A=> S=> D=> ist F. Der Abstand zwischen Nund 5beträgt 4, da unabhängig vom eingeschlagenen Weg mindestens 4 Schritte erforderlich sind. Ihre Aufgabe ist es, Folgendes (ohne nachfolgende Leerzeichen) mit möglichst geringem Tastaturabstand auszugeben:

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

Verpackung:

Um Ihnen das Leben zu erleichtern, können bestimmte Tasten die Tastatur umschließen. Left Shiftwickelt sich auf Right Shift, Caps Lockwickelt sich auf Enter, Tabwickelt sich auf \und ~wickelt sich auf Backspace. Zum Beispiel ist der Abstand zwischen Qund P5, weil Q=> Tab=> \=> ]=> [=> P.

Hinweis: Das Umwickeln funktioniert nur horizontal - Sie können beispielsweise nicht von \zu gehenCaps Lock

Wertung:

Score = Tastaturabstand + Byteanzahl

Beispielberechnung:

print(5);

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

Gesamt: 30 + 9 = 39 .

Anmerkungen:

  1. Klein- und Großbuchstaben gelten als derselbe Schlüssel. Wenn auf einer Taste zwei Symbole (wie 7und &) stehen, gelten diese auch als dieselbe Taste, ohne dass Sie die Umschalttaste drücken müssen.
  2. Wenn Ihr Code Symbole erfordert, die sich nicht auf der Tastatur befinden, können Sie ihn leider nicht verwenden.
  3. Auf dem Tastaturbild kann die obere Zeile ignoriert werden. Der einzige Schlüssel, den Sie in der unteren Reihe verwenden können, istSpace
  4. Die Schlüssel müssen der Reihe nach eingegeben werden. Sie können die Pfeiltasten nicht zum Bewegen des Einfügemarke und dann zum Eingeben eines Schlüssels verwenden.

Punkterechner:

  • Aktualisiert am 27.12., Um `=> ]und damit verbundene Fehlkalkulationen zu beheben . Überprüfe deine Punktzahlen noch einmal und sie werden wahrscheinlich kleiner sein (hoffentlich nicht größer!)

Fügen Sie hier Ihren Code ein, um die Punktzahl zu berechnen. Lassen Sie mich wissen, wenn Sie jemals eine Fehlermeldung erhalten oder die falsche Nummer ausgedruckt wird.

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>

Verbunden:


9
Wir sollten uns einer weiteren Herausforderung stellen: dem kürzesten Code, um Antworten wie diese zu erhalten. Ich denke, die Bewertungsmethode ist interessanter als die Frage.
Cyoce

2
Bitte auch aus Liebe zu Gott, es ===sei denn, Sie möchten aus irgendeinem Grund, dass JS Ihre Typen heimlich dazu zwingt, Leistung zu erbringen.
Cyoce

5
Alle Einsendungen in Unary / Lenguage werden mit 0 bewertet.
Dennis

1
@ Tennis Ist es möglich, dies in diesen Sprachen zu beantworten? Ich kann die maximale Programmlänge begrenzen.
Geokavel

3
idk Ich denke, es liegt nicht im Geiste der Dinge, eine kreative, gültige Sprache zu eliminieren, weil sie ... funktioniert? ist das Ding, in dem die Sprache gut ist? Dies unterscheidet sich anscheinend nicht von CJam oder Pyth zu eliminieren, da ihre Antworten nur ein bisschen zu kurz sind oder Retina für Text-Matching-Fragen eliminiert wurde Herausforderung. Ich teile wirklich gerne Antworten wie diese, wenn die Sprache wirklich vorgeführt wird.
Djechlin

Antworten:



33

Unär , Punktzahl ~ 6,1 * 10 618

6103247739090735580402225797524292167653462388595033897325606983093527722629493568418069722646005695215642120674994001348606253869287599178270707482456199630901069511698694317195626565008736452130034232375778047932461822258369348260249011643486476832847755830117284465136723525376668555270734061914837886192012601522703308221225195058283657800958507281265116257152529161080096092081620384043514820427911786442536988705847468796481108000358361636640985892696216392434604543586511103835032034494033598102606339253132146827455065586119645920456668064941286708686113567081095434338440184737976711767750474398662381256908308 zeros

Nicht die "kreativste" Lösung, aber es dauerte ungefähr 3 Minuten, bis mein Computer die Darstellung von Basis 2 auf Basis 10 konvertierte


Dies hatte früher eine Punktzahl von 0 , aber die Bewertungsregeln wurden geändert.

Codelänge: ~ 6,1 * 10 618

Tastenabstand: 0


3
Lol, ich verstehe nicht, wie das funktioniert, aber das wird bald ungültig.
Geokavel

1
@geokavel aww :( aber nicht ungültig, es hätte nur eine sehr hohe Punktzahl
Downgoat

Ja, ich gebe dir eine Gegenstimme.
Geokavel

3 Minuten? Du brauchst einen besseren Konverter . : P
Dennis

2
Ich habe bis zum Ende Ihres Codeblocks gescrollt. Ich dachte, der Code wäre 61032477390907355804 ..., nicht 61032477390907355804 ... Nullen. : P
Rɪᴋᴇʀ

6

Japt , Punktzahl 123 119 118 116 106

42 41 40 Bytes + 81 78 77 75 66 Entfernung

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

(richtige Ausgabe im Feld "Ausgabe")


1
Ihre Punktzahl bleibt gleich.
Geokavel

@geo bereits neu berechnet :)
nicael

@geo Übrigens können Sie die Partituren sofort bearbeiten.
Nicael

Schon wieder schön! Sie könnten dies tun "QWERTYUIOP<br>ASDFGHJKL<br>ZXCVBNM"¬¸r'Z" Z( <br>stellt einen Zeilenumbruch dar), aber das erfordert zwei Zeichen, die nicht auf der Tastatur stehen. Ich denke, das ist nicht legal. Sie können aber zumindest das Komma entfernen, da es automatisch eingefügt wird.
ETHproductions

@Eth Super, danke! Was den Zeilenumbruch
betrifft

6

JavaScript (ES6), Punktzahl 188

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

Nur knapp eine bessere Punktzahl als alertdie Ausgabe-Zeichenfolge, aber es ist der beste Ansatz, den ich finden konnte ...: /

Bytes: 60

Schlüsselabstand: 128


Ich habe eine modifizierte Version dieses Ansatzes ausprobiert: alert(`QWERTYUIOP<br>ASDFGHJKL<br> ZXCVBNM`.match(/\n| ?./g).join` `)Während dies funktioniert, sind es 65 Bytes (231 Punkte).
ETHproductions

2
Ihre Punktzahl ist jetzt 1 Punkt kleiner ..
Geokavel

5

Bash + Sed, 151

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

Herzlichen Glückwunsch, Ihre Punktzahl ist mit der neuen Zählkorrektur um 1 Punkt niedriger.
Geokavel

1
@geokavel Danke - behoben.
Alexander Vogt

5

Python, 157 , 156 , 211 , 221 Punkte

Schlüsseldistanz: 157

Bytes: 64

Ergo ist die Gesamtpunktzahl 221.

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

Druckt die Zeichenfolge, muss jedoch ein zusätzliches Leerzeichen einfügen. :( jetzt länger.

Warum @Pietu, warum hast du mir das angetan?


3
Ihre Punktzahl ist jetzt 1 niedriger.
Geokavel

Oh, cool. Vielen Dank @geokavel. Was hat sich an den Regeln geändert?
27.

Keine Regeln, es gab einen Fehler im Rechner
Geokavel

Dies druckt ein zu viele Leerzeichen am Anfang der dritten Zeile.
PurkkaKoodari

Du hast meine Hoffnungen mit deinen wahren Worten zermalmt. Aber danke, dass Sie darauf hingewiesen haben.
28.

5

JavaScript, Score 156 187

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

Nicht schlecht für JavaScript

Probieren Sie es online aus


Mit Alarm, Punktzahl 186

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


Aber der String wird nicht gedruckt, oder?
nicael

@nicael Ich kann behaupten, ich benutze diese Umgebung, die implizites Drucken / Ausgeben hat.
Downgoat

1
Punktzahl ist jetzt 1 niedriger.
Geokavel

@geokavel Danke behoben
Downgoat

3
Erfinden Sie Ihre eigene Umgebung, um die Ausgabe zu umgehen, hmm? Wie auch immer, es ist möglich, dies um ein Byte zu verkürzen .
ETHproductions

4

Jolf , 118 + 51 = 169

Probieren Sie es hier aus! (Unterstriche in der Erklärung, die verwendet wird, um einen verwendeten Raum zu bezeichnen)

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, Update nach der Frage, 76 + 21 = 97

Probieren Sie es hier aus ! Auch hier aktualisiere ich meinen Code nicht oft, bis er relevant ist. Immer noch Spaß.

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

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

1
Ihre Punktzahl ist um 2 gesunken!
Geokavel

@geokavel, danke, und es ist jetzt behoben.
User2064000

0

Python, Punktzahl 185

print" ".join("QWERTYUIOP\nASDFGHJKL\n")+"  Z X C V B N M"
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.