In bàn phím QWERTY bằng các phím càng gần nhau càng tốt


19

nhập mô tả hình ảnh ở đây

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 AFlà 3, vì đường dẫn là A=> S=> D=> F. Khoảng cách giữa N5là 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 \~kết thúc tốt đẹp Backspace. Ví dụ: khoảng cách giữa QPlà 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ú:

  1. 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ư 7&), 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.
  2. 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ó.
  3. 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
  4. 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:


9
chúng ta nên thực hiện một thử thách khác: mã ngắn nhất để ghi câu trả lời như thế này. Tôi nghĩ rằng phương pháp cho điểm thú vị hơn câu hỏi.
Cyoce

2
Ngoài ra, xin vui lòng cho tình yêu của thần sử dụng ===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.
Cyoce

5
Bất kỳ bài nộp nào trong Unary / Lenguage sẽ có điểm 0.
Dennis

1
@Dennis Có thể trả lời điều này bằng các ngôn ngữ đó không? Tôi có thể đặt một giới hạn về độ dài chương trình tối đa.
geokavel

3
idk Tôi nghĩ rằng nó thực sự không phải là tinh thần của mọi thứ để loại bỏ một ngôn ngữ hợp lệ, sáng tạo trên nền tảng mà nó ... hoạt động? ngôn ngữ có tốt không? Điều này dường như không khác biệt gì so với việc loại bỏ CJam hoặc Pyth vì câu trả lời của họ chỉ hơi ngắn hoặc loại bỏ Retina cho các câu hỏi khớp văn bản, và vâng, thật lạ khi câu trả lời hàng đầu trở nên không hợp lệ sau khi được đăng lên mặc dù đã đóng đinh thử thách. Tôi thực sự thích chia sẻ câu trả lời như thế này khi ngôn ngữ thực sự được thể hiện.
djechlin

Câu trả lời:



33

Unary , điểm ~ 6.1 * 10 618

6103247739090735580402225797524292167653462388595033897325606983093527722629493568418069722646005695215642120674994001348606253869287599178270707482456199630901069511698694317195626565008736452130034232375778047932461822258369348260249011643486476832847755830117284465136723525376668555270734061914837886192012601522703308221225195058283657800958507281265116257152529161080096092081620384043514820427911786442536988705847468796481108000358361636640985892696216392434604543586511103835032034494033598102606339253132146827455065586119645920456668064941286708686113567081095434338440184737976711767750474398662381256908308 zeros

Không phải là giải pháp "sáng tạo" nhất nhưng máy tính của tôi mất ~ 3 phút để chuyển đổi đại diện cơ sở 2 của cơ sở này sang cơ sở 10


Điều này từngđiểm 0 , nhưng quy tắc tính điểm đã thay đổi.

Độ dài mã: ~ 6.1 * 10 618

Khoảng cách chính: 0


3
Lol, tôi không hiểu làm thế nào điều này hoạt động, nhưng điều này sẽ sớm không hợp lệ.
geokavel

1
@geokavel aww :( nhưng không hợp lệ, nó sẽ chỉ có điểm rất cao
Downgoat

Vâng, tôi cung cấp cho bạn một upvote.
geokavel


2
Tôi cuộn đến cuối khối mã của bạn. Tôi nghĩ mã là 61032477390907355804 ...., không phải là 61032477390907355804 ... số không. : P
Rɪᴋᴇʀ

6

Japt , điểm 123 119 118 116 106

42 41 40 byte + 81 78 77 75 66 khoảng cách

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

(đầu ra thích hợp trong hộp "đầu ra")


1
Điểm của bạn vẫn giữ nguyên.
geokavel

@geo đã recalced :)
nicael

@geo Btw, bạn có thể chỉnh sửa điểm số ngay lập tức.
nicael

Một lần nữa tốt đẹp Bạn có thể làm "QWERTYUIOP<br>ASDFGHJKL<br>ZXCVBNM"¬¸r'Z" Z( <br>đại diện cho ngắt dòng), nhưng điều đó đòi hỏi hai ký tự không phải bàn phím, vì vậy tôi đoán nó không hợp pháp. Nhưng ít nhất bạn có thể xóa dấu phẩy, vì nó được chèn tự động.
Sản xuất ETH

@Eth Tuyệt vời, cảm ơn! Đối với ngắt dòng, đừng nghĩ tôi là một người mới trong html; D
nicael

6

JavaScript (ES6), điểm 188

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

Chỉ vừa mới đạt được điểm cao hơn so với alerting chuỗi đầu ra nhưng đó là cách tiếp cận tốt nhất tôi có thể tìm thấy ...: /

Byte: 60

Khoảng cách chính: 128


Tôi đã thử một phiên bản sửa đổi của apporach này: alert(`QWERTYUIOP<br>ASDFGHJKL<br> ZXCVBNM`.match(/\n| ?./g).join` `)Trong khi nó hoạt động, nó là 65 byte (điểm 231).
Sản phẩm ETH

2
Điểm số của bạn là 1 điểm nhỏ hơn bây giờ ..
geokavel

5

Bash + Sed, 151

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

Xin chúc mừng, điểm của bạn thấp hơn 1 điểm với bản sửa lỗi đếm mới.
geokavel

1
@geokavel Cảm ơn - đã sửa.
Alexander Vogt

5

Con trăn, 157 , 156 , 211 , 221 điểm

Khoảng cách chính: 157

Byte: 64

Ergo, tổng số điểm là 221.

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

In chuỗi nhưng phải thêm một khoảng trắng. :( bây giờ lâu hơn.

Tại sao @Pietu, tại sao bạn làm điều này với tôi?


3
Điểm của bạn thấp hơn 1 điểm.
geokavel

Ôi, tuyệt quá. Cảm ơn @geokavel. Điều gì đã thay đổi trong các quy tắc?
Rɪᴋᴇʀ

Không quy tắc, đã có một lỗi trong máy tính
geokavel

Điều này in quá nhiều khoảng trắng ở đầu dòng thứ ba.
PurkkaKoodari

Bạn đã đè bẹp hy vọng của tôi bằng những lời nói thật của bạn. Nhưng cảm ơn đã chỉ ra rằng.
Rɪᴋᴇʀ

5

JavaScript, điểm 156 187

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

Không tệ cho JavaScript

Dùng thử trực tuyến


Với cảnh báo, điểm 186

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


Nhưng nó không in chuỗi, không?
nicael

@nicael tôi có thể khẳng định tôi đang sử dụng này môi trường trong đó có tiềm ẩn in / đầu ra.
Hạ cấp

1
Điểm bây giờ thấp hơn 1 điểm.
geokavel

@geokavel nhờ cố định
Downgoat

3
Phát minh ra môi trường của riêng bạn để có được đầu ra, hmm? Dù sao, có thể rút ngắn điều này bằng một byte .
Sản xuất ETH

4

Jolf , 118 + 51 = 169

Hãy thử nó ở đây! (gạch dưới trong giải thích được sử dụng để biểu thị một không gian được sử dụng)

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, cập nhật câu hỏi sau, 76 + 21 = 97

Hãy thử nó ở đây ! Một lần nữa, tôi không thường xuyên cập nhật mã của mình cho đến khi có liên quan. Vẫn vui.

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


0

Con trăn, điểm 185

print" ".join("QWERTYUIOP\nASDFGHJKL\n")+"  Z X C V B N M"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.