가능한 한 가까운 키를 사용하여 QWERTY 키보드를 인쇄하십시오


19

여기에 이미지 설명을 입력하십시오

일반적으로 도전 과제는 바이트 또는 때로는 레 벤슈 테인 거리로 점수가 매겨 지지만,이 거리에서는 프로그램을 입력하는 데 사용되는 키 사이의 키 수 인 키보드 거리를 사용합니다 (위의 키보드를 최종 참조로 사용하십시오). 예를 들어 경로가 => => => 이기 때문에 A와 사이의 거리는 F3 입니다. 경로 와 거리는 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 Shift, Caps Lock줄 바꿈 Enter, Tab줄 바꿈 \~줄 바꿈 Backspace. 예를 들어 => => => => => 이기 때문에 Q와 사이의 거리는 P5 입니다.QTab\][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&)가있는 경우 동일한 키로 계산되므로 Shift 키를 누를 필요가 없습니다.
  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
Unary / Lenguage로 제출 한 모든 작품의 점수는 0 점입니다.
Dennis

1
@Dennis 해당 언어로 대답 할 수 있습니까? 최대 프로그램 길이에 캡을 넣을 수 있습니다.
geokavel

3
idk 그것은 실제로 그것이 작동하는 근거로 창의적이고 유효한 언어를 제거하는 것이 사물의 정신에 있지 않다고 생각합니다. 언어가 능숙합니까? 답변이 너무 짧거나 텍스트 일치 질문에 대한 Retina를 제거하기 때문에 CJam 또는 Pyth를 제거하는 것과 다르지 않습니다. 그렇습니다. 도전. 나는 언어가 실제로 드러날 때 이와 같은 답변을 공유하는 것을 정말로 즐깁니다.
djechlin

답변:



33

단항 , 점수 ~ 6.1 * 10 618

6103247739090735580402225797524292167653462388595033897325606983093527722629493568418069722646005695215642120674994001348606253869287599178270707482456199630901069511698694317195626565008736452130034232375778047932461822258369348260249011643486476832847755830117284465136723525376668555270734061914837886192012601522703308221225195058283657800958507281265116257152529161080096092081620384043514820427911786442536988705847468796481108000358361636640985892696216392434604543586511103835032034494033598102606339253132146827455065586119645920456668064941286708686113567081095434338440184737976711767750474398662381256908308 zeros

가장 "창의적인"솔루션은 아니지만 기본 2 표현을 기본 10으로 변환하는 데 약 3 분이 걸렸습니다.


이것은 하는 데 사용0의 점수를 하지만, 채점 규칙이 변경되었습니다.

코드 길이 : ~ 6.1 * 10 618

키 거리 : 0


3
롤, 나는 이것이 어떻게 작동하는지 얻지 못하지만 이것은 곧 무효화 될 것입니다.
geokavel

1
@geokavel aww :( 그러나 유효하지는 않지만 매우 높은 점수를 얻었습니다
Downgoat

그렇습니다.
geokavel

3 분? 더 나은 변환기 가 필요 합니다 . : P
Dennis

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 님은 이미 recalced :)
nicael

@geo Btw, 당신은 즉시 점수를 편집 할 수 있습니다.
nicael

다시 좋은! 당신은 할 수 있지만 "QWERTYUIOP<br>ASDFGHJKL<br>ZXCVBNM"¬¸r'Z" Z( <br>줄 바꿈을 나타냄) 키보드가 아닌 두 문자가 필요하므로 합법적이지 않은 것 같습니다. 그러나 적어도 쉼표는 자동으로 삽입되므로 제거 할 수 있습니다.
ETHproductions

@Eth Great, 감사합니다! 줄 바꿈에 관해서는, 내가 HTML에서 멍청한 사람이라고 생각하지 마십시오 .D
nicael

6

자바 스크립트 (ES6), 188 점

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

alert출력 문자열을 입력하는 것보다 단지 더 나은 점수를 얻지 못하지만 내가 찾을 수있는 가장 좋은 방법입니다 ... : /

바이트 : 60

주요 거리 : 128


이 apporach의 수정 된 버전을 시도했습니다. alert(`QWERTYUIOP<br>ASDFGHJKL<br> ZXCVBNM`.match(/\n| ?./g).join` `)이 작동하는 동안 65 바이트 (점수 231)입니다.
ETHproductions

2
당신의 점수는 지금 1 포인트 작습니다 ..
geokavel 18.

5

배쉬 + Sed, 151

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

축하합니다. 새 계산 수정으로 점수가 1 점 낮아졌습니다.
geokavel

1
@geokavel 감사합니다-수정되었습니다.
Alexander Vogt

5

파이썬, 157 , 156 , 211 , 221 점

키 거리 : 157

바이트 : 64

Ergo, 총점은 221입니다.

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

문자열을 인쇄하지만 추가 공간을 추가해야합니다. :( 지금은 더 길다.

왜 @Pietu인가, 왜 나에게 이걸 했니?


3
당신의 점수는 지금 1 더 낮습니다.
geokavel

오, 멋지다. @geokavel 감사합니다. 규칙에서 무엇이 바뀌 었습니까?
Rɪᴋᴇʀ

규칙이 아니라, 계산기에 버그가있었습니다
geokavel

세 번째 줄의 시작 부분에 너무 많은 공백이 인쇄됩니다.
PurkkaKoodari

당신은 당신의 진정한 말로 나의 희망을 부 버렸습니다. 그러나 지적 해 주셔서 감사합니다.
Rɪᴋᴇʀ

5

자바 스크립트, 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

@nicael 나는 암묵적인 인쇄 / 출력 이있는이 환경을 사용 하고 있다고 주장 할 수 있습니다 .
Downgoat

1
이제 점수가 1 낮아집니다.
geokavel

@geokavel 감사 수정
Downgoat

3
출력을 피하기 위해 자신의 환경을 고안하는 것, 흠? 어쨌든, 이것을 바이트 단위로 줄일 수 있습니다.
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

배쉬 +는 나오지 점수 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.