できるだけ近くにあるキーを使用してQWERTYキーボードを印刷します


19

ここに画像の説明を入力してください

通常、チャレンジはバイト単位、または時にはレーベンシュタイン距離でスコア付けされますが、これにはキーボード距離(プログラムの入力に使用されるキー間のキーの数)を使用します(上記のキーボードを最終的な参照として使用します)。たとえば、パスは=> => => であるため、Aとの間の距離Fは3 です。間の距離とは、あなたが取るどのようなパスに関係なく、それは少なくとも4つのステップを必要とするため、4です。あなたの仕事は、可能な限り短いキーボード距離で、次のものを出力することです(末尾のスペースは含みません):ASDFN5

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ます。例えば、の間の距離QとはP、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. 小文字と大文字は同じキーとしてカウントされます。キーに2つのシンボルがある場合(たとえば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
別の課題を作成する必要があります。このような回答を獲得するための最短コードです。採点方法は質問よりも面白いと思います。
チョイス

2
また、===何らかの理由でJSにあなたのタイプをこっそりと強制してパフォーマンスを吸い込ませたくない限り、神の使用に対する愛情のためにどうぞ。
チョイス

5
単項/ Lenguage内の任意の提出が0のスコアを持っています
デニス・

1
@Dennisこれらの言語でこれに答えることは可能ですか?プログラムの最大長に上限を設けることができます。
geokavel

3
idk私は、それが機能するという理由で創造的で有効な言語を排除することは本当に物事の精神ではないと思います。言語が得意なことは何ですか?これは、CJamやPythを排除するのと違いはないようです。なぜなら、彼らの答えが少し短すぎるか、テキストマッチングの質問に対してRetinaを排除しているからです。チャレンジ。言語が本当に誇示されているとき、私はこのような答えを共有することを本当に楽しんでいます。
djechlin

回答:



33

単項、スコア〜6.1 * 10 618

6103247739090735580402225797524292167653462388595033897325606983093527722629493568418069722646005695215642120674994001348606253869287599178270707482456199630901069511698694317195626565008736452130034232375778047932461822258369348260249011643486476832847755830117284465136723525376668555270734061914837886192012601522703308221225195058283657800958507281265116257152529161080096092081620384043514820427911786442536988705847468796481108000358361636640985892696216392434604543586511103835032034494033598102606339253132146827455065586119645920456668064941286708686113567081095434338440184737976711767750474398662381256908308 zeros

最も「創造的な」ソリューションではありませんが、コンピューターのベース2表現をベース10に変換するのに約3分かかりました。


これがために使用される Aを持っています 0のスコアを、しかし、スコアリングルールが変更されました。

コード長:〜6.1 * 10 618

キー距離:0


3
笑、私はこれがどのように機能するかわかりませんが、これはすぐに無効になるでしょう。
geokavel

1
@geokavel AWW :(ではなく、無効な、それだけだろう非常に高いスコア
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、スコアをすぐに編集できます。
ニカエル

またいいね!あなたはできます"QWERTYUIOP<br>ASDFGHJKL<br>ZXCVBNM"¬¸r'Z" Z<br>改行を表します)が、それは2つの非キーボード文字を必要とするので、それは合法ではないと思います。ただし、少なくともコンマは自動的に挿入されるため、削除できます。
ETHproductions

@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

2
あなたのスコアは...今1ポイント小さい
geokavel


5

パイソン、157156211、221点

キー距離:157

バイト:64

エルゴ、合計スコアは221です。

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

文字列を出力しますが、余分なスペースを追加する必要があります。:(長くなりました。

なぜ@Pietu、なぜあなたは私にこれをしたのですか?


3
あなたのスコアは現在1つ低くなっています。
geokavel

ああ、かっこいい。ありがとう@geokavel。ルールの変更点は何ですか?
Rɪᴋᴇʀ

ない計算にバグがあった、ルール
geokavel

これにより、3行目の先頭に1つのスペースが多すぎます。
PurkkaKoodari

あなたは本当の言葉で私の希望を打ち砕いた。しかし、それを指摘してくれてありがとう。
Rɪᴋᴇʀ

5

JavaScript、スコア156 187

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

JavaScriptには悪くない

オンラインで試す


アラートで、スコア186

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


しかし、それは文字列を出力しません。
ニカエル

@nicael 暗黙の印刷/出力があるこの環境を使用しいると主張できます。
ダウンゴート

1
スコアは現在1つ低くなっています。
geokavel

@geokavelのおかげで修正
Downgoat

3
出力を回避するための独自の環境を発明しますか?とにかく、これをbyteだけ短くすることができます
ETHproductions

4

ヨルフ、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

Bash + sed、スコア202 200

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

1
あなたのスコアは2つ下がった!
geokavel

@geokavel、ありがとう、今は修正されています。
user2064000

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.