Stampa la tastiera QWERTY usando i tasti il ​​più vicino possibile


19

inserisci qui la descrizione dell'immagine

Normalmente, le sfide sono segnate in byte, o talvolta distanza di Levenshtein, ma per questo stiamo usando la distanza della tastiera - il numero di tasti tra i tasti usati per digitare il programma (usare la tastiera sopra come riferimento definitivo). Ad esempio, la distanza tra Ae Fè 3, perché il percorso è A=> S=> D=> F. La distanza tra Ne 5è 4, perché non importa quale percorso prendi, richiede almeno 4 passaggi. Il tuo compito è produrre quanto segue (esclusi gli spazi finali), con una distanza quanto più piccola possibile dalla tastiera:

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

Confezione:

Per semplificarti la vita, alcuni tasti possono avvolgere la tastiera. Left Shiftesegue il wrapping Right Shift, il Caps Lockwrapping Enter, il Tabwrapping \e il ~wrapping Backspace. Ad esempio, la distanza tra Qe Pè 5, perché Q=> Tab=> \=> ]=> [=> P.

Nota: l' avvolgimento funziona solo in senso orizzontale: non è possibile passare da, per esempio, \aCaps Lock

punteggio:

Punteggio = Distanza tastiera + conteggio byte

Esempio di calcolo:

print(5);

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

Totale: 30 + 9 = 39 .

Appunti:

  1. Le lettere minuscole e maiuscole contano come la stessa chiave. Se una chiave ha due simboli (come 7e &), contano anche come la stessa chiave, non è necessario includere il tasto shift.
  2. Sfortunatamente, se il tuo codice richiede simboli che non sono sulla tastiera non puoi usarlo.
  3. Sull'immagine della tastiera, la riga superiore può essere ignorata. L'unica chiave che puoi usare nella riga inferiore èSpace
  4. I tasti devono essere inseriti in ordine, non è possibile utilizzare i tasti freccia per spostare il cursore e quindi inserire un tasto.

Calcolatore del punteggio:

  • Aggiornato il 27/12 per correggere `=> ]e relativi errori di calcolo. Controlla di nuovo i tuoi punteggi e probabilmente saranno più piccoli (speriamo non più grandi!)

Incolla qui il tuo codice per calcolare il punteggio. Fammi sapere se hai mai avuto un errore o stampa il numero sbagliato.

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>

Relazionato:


9
dovremmo fare un'altra sfida: il codice più breve per ottenere risposte come questa. Penso che il metodo di punteggio sia più interessante della domanda.
Cyoce,

2
Inoltre, per favore, per amore dell'uso di dio, a ===meno che per qualche motivo tu non voglia che JS costringa furtivamente i tuoi tipi e aumenti le prestazioni.
Cyoce,

5
Qualsiasi presentazione in Unary / Lenguage avrà un punteggio di 0.
Dennis

1
@Dennis È possibile rispondere a questa domanda in quelle lingue? Posso mettere un limite alla lunghezza massima del programma.
geokavel,

3
idk Penso che non sia davvero nello spirito delle cose eliminare un linguaggio creativo e valido per il fatto che ... funziona? fa bene la lingua? Questo non sembra affatto diverso dall'eliminazione di CJam o Pyth perché le loro risposte sono solo un po 'troppo brevi o eliminano Retina per le domande di corrispondenza del testo e sì, mi è sembrato strano che la risposta migliore sia diventata non valida dopo essere stata pubblicata nonostante inchiodasse il sfida. Mi piace molto condividere le risposte in questo modo quando la lingua è davvero messa in mostra.
Djechlin,

Risposte:



33

Unario , punteggio ~ 6.1 * 10 618

6103247739090735580402225797524292167653462388595033897325606983093527722629493568418069722646005695215642120674994001348606253869287599178270707482456199630901069511698694317195626565008736452130034232375778047932461822258369348260249011643486476832847755830117284465136723525376668555270734061914837886192012601522703308221225195058283657800958507281265116257152529161080096092081620384043514820427911786442536988705847468796481108000358361636640985892696216392434604543586511103835032034494033598102606339253132146827455065586119645920456668064941286708686113567081095434338440184737976711767750474398662381256908308 zeros

Non è la soluzione più "creativa", ma il mio computer ha impiegato circa 3 minuti per convertire la rappresentazione di base 2 di questa in base 10


Questo usato per avere un punteggio di 0 , ma le regole di punteggio cambiato.

Lunghezza del codice: ~ 6.1 * 10 618

Distanza chiave: 0


3
Lol, non capisco come funzioni, ma presto non sarà valido.
geokavel,

1
@geokavel aww :( ma non invalido, avrebbe solo un punteggio molto alto
Downgoat

Sì, ti darò un voto.
geokavel,

3 minuti? Hai bisogno di un convertitore migliore . : P
Dennis,

2
Ho fatto scorrere fino alla fine del tuo blocco di codice. Ho pensato che il codice fosse 61032477390907355804 ...., non 61032477390907355804 ... zeri. : P
Rɪᴋᴇʀ

6

Japt , punteggio 123 119 118 116 106

42 41 40 byte + 81 78 77 75 66 distanza

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

(output corretto nella casella "output")


1
Il tuo punteggio rimane lo stesso.
geokavel,

@geo già rivalutato :)
nicael

@geo A proposito, puoi modificare subito i punteggi.
nicael,

Di nuovo gentile! Potresti farlo "QWERTYUIOP<br>ASDFGHJKL<br>ZXCVBNM"¬¸r'Z" Z( <br>rappresenta un'interruzione di riga), ma ciò richiede due caratteri non da tastiera, quindi immagino che non sia legale. Ma almeno puoi rimuovere la virgola, poiché viene automaticamente inserita.
Produzioni ETH il

@Est, grazie! Per quanto riguarda l'interruzione di riga, non pensare che io sia un noob in HTML; D
nicael,

6

JavaScript (ES6), punteggio 188

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

Solo a malapena ottiene un punteggio migliore rispetto alertalla stringa di output, ma è l'approccio migliore che ho trovato ...: /

byte: 60

Distanza chiave: 128


Ho provato una versione modificata di questo apporach: alert(`QWERTYUIOP<br>ASDFGHJKL<br> ZXCVBNM`.match(/\n| ?./g).join` `)mentre funziona, sono 65 byte (punteggio 231).
Produzioni ETH il

2
Il tuo punteggio è più piccolo di 1 punto ora ..
geokavel,

5

Bash + Sed, 151

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

Complimenti, il tuo punteggio è inferiore di 1 punto con la nuova correzione del conteggio.
geokavel,

1
@geokavel Grazie - risolto.
Alexander Vogt,

5

Python, 157 , 156 , 211 , 221 punti

Distanza chiave: 157

Byte: 64

Ergo, il punteggio totale è 221.

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

Stampa la stringa ma deve aggiungere uno spazio aggiuntivo. :( ora più a lungo.

Perché @Pietu, perché mi hai fatto questo?


3
Il tuo punteggio è inferiore di 1 ora.
geokavel,

Ooh, fico. Grazie @geokavel. Cosa è cambiato nelle regole?
Rɪᴋᴇʀ

Non regole, c'era un bug nel calcolatore
geokavel,

Ciò stampa troppi spazi all'inizio della terza riga.
PurkkaKoodari,

Hai distrutto le mie speranze con le tue vere parole. Ma grazie per averlo sottolineato.
Rɪᴋᴇʀ

5

JavaScript, punteggio 156 187

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

Non male per JavaScript

Provalo online


Con avviso, segna 186

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


Ma non stampa la stringa, no?
nicael,

@nicael Posso affermare che sto usando questo ambiente che ha una stampa / output impliciti.
Downgoat,

1
Il punteggio ora è 1 più basso.
geokavel,

@geokavel thanks fixed
Downgoat

3
Inventare il proprio ambiente per aggirare l'output, hmm? Ad ogni modo, è possibile accorciarlo di un byte .
Produzioni ETH il

4

Jolf , 118 + 51 = 169

Provalo qui! (sottolineatura nella spiegazione usata per indicare uno spazio usato)

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, aggiornamento post-domanda, 76 + 21 = 97

Provalo qui ! Ancora una volta, non aggiorno spesso il mio codice fino a quando non è pertinente. Ancora divertente.

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

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

1
Il tuo punteggio è sceso di 2!
geokavel,

@geokavel, grazie, e ora è stato risolto.
user2064000,

0

Python, punteggio 185

print" ".join("QWERTYUIOP\nASDFGHJKL\n")+"  Z X C V B N M"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.