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:
- 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.
- Sayangnya, jika kode Anda memerlukan simbol yang tidak ada di keyboard, Anda tidak dapat menggunakannya.
- Pada gambar keyboard, baris atas dapat diabaikan. Satu-satunya kunci yang dapat Anda gunakan di baris bawah adalahSpace
- 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:
===
kecuali karena alasan tertentu Anda ingin JS secara diam-diam memaksa tipe Anda dan menyedot kinerja.