使用尽可能靠近的键打印QWERTY键盘


19

在此处输入图片说明

通常,挑战以字节计分,有时以Levenshtein距离计分,但是对于这一点,我们使用键盘距离-用来键入程序的键之间的键数(使用上面的键盘作为权威参考)。例如,之间的距离AF为3时,因为路径A=> S=> D=> F。之间的距离N,并5为4,因为无论你采取什么样的路径,它至少需要4个步骤。您的任务是输出以下内容(不包括尾部空格),并尽可能减小键盘距离:

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

包装:

为了使您的生活更轻松,某些键可以环绕键盘。Left Shift余套Right ShiftCaps Lock余套EnterTab余套\~余套Backspace。例如,之间的距离QP为5,因为Q=> Tab=> \=> ]=> [=> P

注:包装只能水平-你可以不从,步说,\Caps Lock

得分:

分数=键盘距离+字节数

计算示例:

print(5);

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

总计: 30 + 9 = 39

笔记:

  1. 小写字母和大写字母都视为相同的键。如果一个键上有两个符号(如7&),它们也算作同一键,而无需包括推入移位。
  2. 不幸的是,如果您的代码要求键盘上没有的符号,则无法使用它。
  3. 在键盘图像上,第一行可以忽略。您可以在底行使用的唯一键是Space
  4. 必须按顺序输入键,您不能使用箭头键移动插入符号然后输入键。

分数计算器:

  • 更新于12/27修复`=> ]和相关的错误计算。再次检查您的分数,它们可能会更小(希望不会更大!)

在此处粘贴您的代码以计算分数。如果您遇到错误或打印出错误的号码,请告诉我。

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>

有关:


9
我们应该提出另一个挑战:用最短的代码为这样的答案打分。我认为计分方法比问题更有趣。
Cyoce

2
另外,请出于对上帝的热爱而使用,===除非出于某种原因您希望 JS偷偷地强迫您的类型并吸收性能。
Cyoce

5
一元/语言的任何提交内容都将获得0分。–
Dennis

1
@Dennis可以用这些语言回答吗?我可以限制最大程序长度。
geokavel

3
idk我认为,以……有效为由,消除一种创造性的,有效的语言,实际上不是出于精神。语言最擅长的事情吗?这与消除CJam或Pyth似乎没有什么不同,因为他们的答案太短了,或者消除了Retina进行文本匹配的问题,是的,我感到震惊,奇怪的是,尽管钉了挑战。当语言真正展现出来时,我非常喜欢分享这样的答案。
djechlin

Answers:



33

一元,得分〜6.1 * 10618

6103247739090735580402225797524292167653462388595033897325606983093527722629493568418069722646005695215642120674994001348606253869287599178270707482456199630901069511698694317195626565008736452130034232375778047932461822258369348260249011643486476832847755830117284465136723525376668555270734061914837886192012601522703308221225195058283657800958507281265116257152529161080096092081620384043514820427911786442536988705847468796481108000358361636640985892696216392434604543586511103835032034494033598102606339253132146827455065586119645920456668064941286708686113567081095434338440184737976711767750474398662381256908308 zeros

不是最“创意”的解决方案,但是我的计算机花了大约3分钟的时间将这个2的表示形式转换为10


这个 用于得分为0,但计分规则改变了。

码长:〜6.1 * 10 10618

键距:0


3
大声笑,我不知道它是如何工作的,但是这很快就会失效。
geokavel

1
@geokavel噢:(但不是无效的,它只是有一个非常高的分数
Downgoat

是的,请给我点赞。
geokavel

3分钟?您需要一个更好的转换器。:P
丹尼斯

2
我滚动到了代码块的末尾。我以为代码是61032477390907355804 ....,而不是61032477390907355804 ...零。:P
Rɪᴋᴇʀ

6

Japt,得分123 119 118 116 106

42 41 40字节+ 81 78 77 75 66距离

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

(在“输出”框中正确输出)


1
您的分数保持不变。
geokavel

@geo已经被重新计算:)
nicael

@geo Btw,您可以立即编辑分数。
nicael

再次好!您可以这样做"QWERTYUIOP<br>ASDFGHJKL<br>ZXCVBNM"¬¸r'Z" Z<br>代表换行符),但这需要两个非键盘字符,因此我认为这是不合法的。但是至少您可以删除逗号,因为它会自动插入。
ETHproductions 2015年

@Eth太好了,谢谢!至于换行符,不要以为我是html的
菜鸟

6

JavaScript(ES6),得分188

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

仅比alert获得输出字符串好一点点的分数,但这是我能找到的最好方法...:/

字节数: 60

关键距离: 128


我尝试了此方法的修改版本:alert(`QWERTYUIOP<br>ASDFGHJKL<br> ZXCVBNM`.match(/\n| ?./g).join` `)在此方法有效的同时,它的大小为65个字节(得分231)。
ETHproductions 2015年

2
你的分数是1分越小现在..
geokavel


5

Python中,157156211,221点

键距:157

位元组:64

Ergo,总成绩为221。

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

打印字符串,但必须添加额外的空间。:(现在更长了。

为什么是@Pietu,为什么对我这样做?


3
您的分数现在降低了1。
geokavel

哦,酷。谢谢@geokavel。规则发生了什么变化?
Rɪᴋᴇʀ

没有规则,计算器中有一个错误
geokavel

这在第三行的开头打印了太多空格。
PurkkaKoodari 2015年

你用你的真实话语粉碎了我的希望。但是感谢您指出这一点。
Rɪᴋᴇʀ

5

JavaScript,得分156187

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

对于JavaScript来说还不错

在线尝试


有警报,得分186

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


但是它不打印字符串,不是吗?
nicael

@nicael我可以要求我使用这个环境中具有隐含打印/输出。
Downgoat

1
分数现在低1。
geokavel

@geokavel感谢已修复
Downgoat

3
发明自己的环境来获得输出,嗯?无论如何,可以将其缩短一个字节
ETHproductions 2015年

4

Jolf,118 + 51 = 169

在这里尝试!(下划线表示用来表示已使用的空间)

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,更新问题后,76 + 21 = 97

在这里尝试!同样,在相关之前,我不会经常更新代码。还是好玩。

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

击+ sed的,得分202 200

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

1
您的分数下降了2!
geokavel

@geokavel,谢谢,现在已修复。
user2064000

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.