Thông thường, các thử thách được tính theo byte hoặc đôi khi là khoảng cách Levenshtein, nhưng đối với điều này, chúng tôi đang sử dụng khoảng cách bàn phím - số lượng phím giữa các phím được sử dụng để nhập chương trình (sử dụng bàn phím trên làm tham chiếu chính xác). Ví dụ: khoảng cách giữa Avà Flà 3, vì đường dẫn là A=> S=> D=> F. Khoảng cách giữa Nvà 5là 4, vì cho dù bạn đi theo con đường nào, nó cũng cần ít nhất 4 bước. Nhiệm vụ của bạn là xuất ra các mục sau (không bao gồm dấu cách), với khoảng cách bàn phím càng nhỏ càng tốt:
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
Bao bì:
Để làm cho cuộc sống của bạn dễ dàng hơn, một số phím nhất định có thể quấn quanh bàn phím. Left Shiftkết thúc tốt đẹp Right Shift, Caps Lockkết thúc tốt đẹp Enter, Tabkết thúc tốt đẹp \và ~kết thúc tốt đẹp Backspace. Ví dụ: khoảng cách giữa Qvà Plà 5, vì Q=> Tab=> \=> ]=> [=> P.
Lưu ý: Gói chỉ hoạt động theo chiều ngang - bạn không thể bước từ, nói, \đếnCaps Lock
Ghi điểm:
Điểm = Khoảng cách bàn phím + số byte
Tính toán ví dụ:
print(5);
- p=> r== 6
- r=> i== 4
- i=> n== 2
- n=> t== 3
- t=> (== 4
- (=> 5== 4
- 5=> )== 5
- )=> ;== 2
Tổng cộng: 30 + 9 = 39 .
Ghi chú:
- Chữ thường và chữ hoa được tính là cùng một khóa. Nếu một khóa có hai ký hiệu trên đó (như 7và &), chúng cũng được tính là cùng một khóa, không cần bao gồm dịch chuyển đẩy.
- Thật không may, nếu mã của bạn yêu cầu các ký hiệu không có trên bàn phím, bạn không thể sử dụng nó.
- Trên hình ảnh bàn phím, hàng trên cùng có thể được bỏ qua. Khóa duy nhất bạn có thể sử dụng ở hàng dưới cùng làSpace
- Các phím phải được nhập theo thứ tự, bạn không thể sử dụng các phím mũi tên để di chuyển dấu mũ và sau đó nhập khóa.
Máy tính điểm:
- Cập nhật vào ngày 27/12 để sửa `=> ]và tính toán sai liên quan. Kiểm tra điểm số của bạn một lần nữa, và chúng có thể sẽ nhỏ hơn (hy vọng không lớn hơn!)
Dán mã của bạn vào đây để tính điểm. Hãy cho tôi biết nếu bạn gặp lỗi hoặc in sai số.
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>
Liên quan:
===
trừ khi vì lý do nào đó bạn muốn JS lén lút cưỡng chế các loại của bạn và tăng hiệu suất.