Cetak keyboard QWERTY menggunakan tombol yang sedekat mungkin

19

masukkan deskripsi gambar di sini

Biasanya, tantangan diberi skor dalam byte, atau kadang-kadang jarak Levenshtein, tetapi untuk yang ini kami menggunakan jarak keyboard - jumlah tombol di antara tombol yang digunakan untuk mengetik program (gunakan keyboard di atas sebagai referensi definitif). Misalnya, jarak antara Adan Fadalah 3, karena jalurnya adalah A=> S=> D=> F. Jarak antara Ndan 5adalah 4, karena apa pun jalur yang Anda ambil, diperlukan setidaknya 4 langkah. Tugas Anda adalah menampilkan yang berikut (tidak termasuk spasi tambahan), dengan jarak keyboard sekecil mungkin:

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

Pembungkus:

Untuk membuat hidup Anda lebih mudah, tombol-tombol tertentu dapat membungkus keyboard. Left Shiftwraps to Right Shift, Caps Lockwraps to Enter, Tabwraps to \dan ~wraps to Backspace. Misalnya, jarak antara Qdan P5, karena Q=> Tab=> \=> ]=> [=> P.

Catatan: Membungkus hanya berfungsi secara horizontal - Anda tidak dapat melangkah dari, misalnya, \keCaps Lock

Mencetak:

Nilai = Jarak keyboard + jumlah byte

Contoh Perhitungan:

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 .

Catatan:

  1. Huruf kecil dan huruf besar dihitung sebagai tombol yang sama. Jika kunci memiliki dua simbol di atasnya (seperti7 dan &), mereka juga dihitung sebagai kunci yang sama, tidak perlu memasukkan tombol shift.
  2. Sayangnya, jika kode Anda memerlukan simbol yang tidak ada di keyboard, Anda tidak dapat menggunakannya.
  3. Pada gambar keyboard, baris atas dapat diabaikan. Satu-satunya kunci yang dapat Anda gunakan di baris bawah adalahSpace
  4. Kunci harus dimasukkan agar, Anda tidak dapat menggunakan tombol panah untuk memindahkan tanda sisipan dan kemudian memasukkan kunci.

Skor Kalkulator:

  • Diperbarui pada 12/27 untuk memperbaiki `=> ]dan salah perhitungan terkait. Periksa kembali skor Anda, dan nilainya akan lebih kecil (semoga tidak lebih besar!)

Rekatkan kode Anda di sini untuk menghitung skor. Beri tahu saya jika Anda pernah mendapatkan kesalahan atau mencetak nomor yang salah.

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>

Terkait:

geokavel
sumber
9
kita harus membuat tantangan lain: kode terpendek untuk mencetak jawaban seperti ini. Saya pikir metode penilaian lebih menarik daripada pertanyaan.
Cyoce
2
Juga, mohon untuk cinta penggunaan dewa ===kecuali karena alasan tertentu Anda ingin JS secara diam-diam memaksa tipe Anda dan menyedot kinerja.
Cyoce
5
Setiap pengajuan dalam Unary / Bahasa akan memiliki skor 0.
Dennis
1
@ Dennis Mungkinkah menjawab ini dalam bahasa-bahasa itu? Saya bisa memberi batas pada panjang program maks.
geokavel
3
idk saya pikir itu benar-benar tidak dalam semangat hal untuk menghilangkan bahasa yang valid dan kreatif dengan alasan itu ... bekerja? apakah hal bahasanya bagus? Ini sepertinya tidak ada bedanya dengan menghilangkan CJam atau Pyth karena jawaban mereka agak terlalu pendek atau menghilangkan Retina untuk pertanyaan pencocokan teks, dan ya saya merasa aneh bahwa jawaban teratas menjadi tidak valid beberapa saat setelah diposting meskipun dipaku meskipun tantangan. Saya sangat menikmati berbagi jawaban seperti ini ketika bahasa tersebut benar-benar dipertontonkan.
djechlin

Jawaban:

5

Pyth, skor 107 106 102

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

Cobalah online.

PurkkaKoodari
sumber
2
Skor Anda turun 2!
geokavel
Cngrt vry gd job.
geokavel
33

Unary , skor ~ 6.1 * 10 618

6103247739090735580402225797524292167653462388595033897325606983093527722629493568418069722646005695215642120674994001348606253869287599178270707482456199630901069511698694317195626565008736452130034232375778047932461822258369348260249011643486476832847755830117284465136723525376668555270734061914837886192012601522703308221225195058283657800958507281265116257152529161080096092081620384043514820427911786442536988705847468796481108000358361636640985892696216392434604543586511103835032034494033598102606339253132146827455065586119645920456668064941286708686113567081095434338440184737976711767750474398662381256908308 zeros

Bukan solusi yang paling "kreatif" tetapi butuh komputer saya ~ 3 menit untuk mengubah representasi basis 2 ini ke basis 10


Ini digunakan untuk memiliki skor 0 , tetapi aturan penilaian berubah.

Panjang Kode: ~ 6.1 * 10 618

Jarak Kunci: 0

Downgoat
sumber
3
Lol, saya tidak mengerti bagaimana ini bekerja, tetapi ini akan menjadi tidak valid segera.
geokavel
1
@geokavel aww :( tetapi tidak tidak valid, itu hanya akan memiliki skor yang sangat tinggi
Downgoat
Ya, sakit memberi Anda suara positif.
geokavel
3 menit? Anda memerlukan konverter yang lebih baik . : P
Dennis
2
Saya menggulir ke ujung blok kode Anda. Saya pikir kode itu 61032477390907355804 ...., bukan 61032477390907355804 ... nol. : P
R
6

Japt , skor 123 119 118 116 106

42 41 40 byte + 81 78 77 75 66 jarak

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

(output yang tepat di kotak "output")

nicael
sumber
1
Skor Anda tetap sama.
geokavel
@geo sudah dihitung ulang :)
nicael
@ gt Btw, Anda dapat mengedit skor segera.
nicael
Baik lagi! Anda bisa melakukannya "QWERTYUIOP<br>ASDFGHJKL<br>ZXCVBNM"¬¸r'Z" Z( <br>mewakili penghentian baris), tetapi itu membutuhkan dua karakter non-keyboard, jadi saya rasa itu tidak sah. Tetapi setidaknya Anda dapat menghapus koma, karena dimasukkan secara otomatis.
Produk ETH
@ Bagus, terima kasih! Sedangkan untuk jeda baris, jangan pikir saya seorang noob di html; D
nicael
6

JavaScript (ES6), skor 188

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

Hanya saja nyaris mendapat skor lebih baik dari alert menggunakan string output tetapi itu pendekatan terbaik yang bisa saya temukan ...: /

Bytes: 60

Jarak kunci: 128

pengguna81655
sumber
Saya mencoba versi modifikasi dari apporach ini: alert(`QWERTYUIOP<br>ASDFGHJKL<br> ZXCVBNM`.match(/\n| ?./g).join` `)Sementara ini berfungsi, itu adalah 65 byte (skor 231).
Produk ETH
2
Skor Anda 1 poin lebih kecil sekarang ..
geokavel
5

Bash + Sed, 151

sed 'sb *.b& bg'<<<'QWERTYUIOP
 ASDFGHJKL
  ZXCVBNM'
Alexander Vogt
sumber
Selamat, skor Anda 1 poin lebih rendah dengan perbaikan penghitungan yang baru.
geokavel
1
@geokavel Terima kasih - diperbaiki.
Alexander Vogt
5

Python, 157 , 156 , 211 , 221 poin

Jarak Kunci: 157

Bytes: 64

Ergo, skor total 221.

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

Mencetak string tetapi harus menambahkan ruang ekstra. :( sekarang lebih lama.

Kenapa @Pietu, kenapa kamu melakukan ini padaku?

Rɪᴋᴇʀ
sumber
3
Skor Anda 1 lebih rendah sekarang.
geokavel
Ooh, keren. Terima kasih @geokavel. Apa yang berubah dalam aturan?
R
Bukan aturan, ada bug di kalkulator
geokavel
Ini mencetak satu terlalu banyak ruang di awal baris ketiga.
PurkkaKoodari
Anda telah menghancurkan harapan saya dengan kata-kata Anda yang sebenarnya. Tapi terima kasih sudah menunjukkannya.
Rɪᴋᴇʀ
5

JavaScript, skor 156 187

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

Tidak buruk untuk JavaScript

Cobalah online


Dengan waspada, skor 186

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

Downgoat
sumber
Tapi itu tidak mencetak string, bukan?
nicael
@nicael Saya dapat mengklaim saya menggunakan lingkungan ini yang memiliki pencetakan / keluaran implisit.
Downgoat
1
Skor 1 lebih rendah sekarang.
geokavel
@geokavel terima kasih telah diperbaiki
Downgoat
3
Menciptakan lingkungan Anda sendiri untuk menyiasati keluaran, hmm? Bagaimanapun, dimungkinkan untuk mempersingkat ini dengan satu byte .
Produksi ETH
4

Jolf , 118 + 51 = 169

Coba di sini! (menggarisbawahi dalam penjelasan yang digunakan untuk menunjukkan ruang yang digunakan)

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

Coba di sini ! Sekali lagi, saya tidak sering memperbarui kode saya sampai relevan. Masih menyenangkan.

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
sumber
4

Bash + sed, skor 202 200

sed 's/\([^ ]\)/\1 /g'<<F
QWERTYUIOP
 ASDFGHJKL
  ZXCVBNM
F
pengguna2064000
sumber
1
Skor Anda turun 2!
geokavel
@geokavel, terima kasih, dan sudah diperbaiki sekarang.
user2064000
0

Python, skor 185

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