드보락이나 네오와 같은 새로운 키보드 레이아웃을 정통하게 배우는 사람들이 생산성을 높이기 때문에 이러한 열풍이 계속되고있는 것 같습니다. 키보드 레이아웃을 전환하는 것은 속도가 빠르기까지 몇 개월이 걸릴 수 있기 때문에 나쁜 생각이라고 주장합니다. 나머지보다 5 % 빠르면 컴퓨터에 입력해야 할 경우 문제가 발생합니다 당신 만의 것이 아닙니다.
또한이 모든 사람들 은 현대 통신 의 실제 병목 현상이있는 곳 ( 전화 키패드)을 잊어 버립니다 .
일반적인 전화 키패드는 다음과 같습니다.
문자 'r'은 버튼 7의 세 번째 문자입니다. 따라서 휴대폰에 문자 'r'을 입력하려면 버튼 7을 세 번 누르고 's'는 4 번, 'a'는 버튼 2를 한 번 누릅니다.
이것을 고려할 때 'd'뒤에 'e'를 넣는 것은 잘못된 결정일 것입니다. 'e'는 영어 알파벳에서 가장 일반적으로 사용되는 문자이므로 "DEF"대신 버튼 3 "EDF"에 레이블을 지정하려면 많은 키 입력을 절약 할 수 있습니다.
또한, 같은 버튼을 공유하는 2 개의 문자를 입력하는 것이 번거 롭다는 것을 스스로 경험했을 것입니다. "TU"를 쓰려면 8을 세 번 누르기 만하면 'V'가됩니다. 따라서 일반적으로 'T'를 쓴 다음 스페이스를 누른 다음 백 스페이스를 누른 다음 'U'를 쓰십시오. 이는 3 대신 5 버튼 누름과 같습니다.
TL; DR
이 두 가지 규칙이 주어집니다.
- 버튼을 n 번 누르면 문자가 입력됩니다. 여기서 n은 버튼의 레이블에서 문자가있는 위치입니다.
- 같은 버튼을 사용하여 입력 한 두 글자를 쓰려면 추가로 두 번의 버튼 누름이 필요합니다
특정 텍스트가 주어지면 최소한의 버튼 누름이 필요한 전화 키보드 레이아웃은 무엇입니까? 2-9, 1 및 0 버튼 만 특수 기호로 예약되어 있어야합니다.
입력
최적의 레이아웃을 찾아야하는 텍스트는 stdin을 통해 제공됩니다. 소문자 알파벳 이외의 다른 것을 처리 할 필요가 없으며 입력만으로 구성되어 있다고 가정 할 수 있습니다. 입력 텍스트가 상당히 크고 모든 문자가 적어도 한 번 있으면 거기에 있다고 가정 할 수 있습니다.
산출
출력에 너무 많은 제약을두기를 원하지 않습니다. 때로는 일부 언어가 다른 언어보다 유리하기 때문입니다. 그러나 귀하의 언어는 배열이 훌륭하다는 것을 보여 주거나, 또는 각 줄을 개행으로 분리 할 수 있습니다.
여러 가지 최적의 레이아웃이있을 수 있으며 그 중 하나를 인쇄 할 수 있습니다. 다음은 간단한 예입니다.
>> echo "jackdawslovemybigsphinxofquartz" | foo.sh
ojpt
avhz
cen
skm
dyf
wbq
ixu
lgr
보너스 포인트
알고리즘이 모든 가능한 레이아웃을 강제하지 않는 경우 -35 (여기서는 Haskell의 '순열'을보고 있습니다)
-3 코드가 문자 메시지 (140 자) 안에 들어가고 친구에게 코드를 보내는 사진을 게시하면 -3 입니다.
이것이 StackExchange의 첫 번째 도전입니다. 당신이 그것을 좋아하는지, 그것에 대해 다른 의견이 있으시면 기쁘겠습니다.
26! / (2! * 6!) = 280,063,514,671,253,913,600,000 > 2^77
간단한 재 배열을 한 번만 계산 하는 고유 한 순열 이 있습니다 .