매우 이상한 단어 카운터


13

입력 : 함수 인수, 명령 행 인수, STDIN 등을 통해 소문자로만 구성된 문자열.

출력 : 다음 메트릭에 따라 글자 거리의 합을 나타내는 숫자를 인쇄하거나 반환합니다.

당신은 첫 번째와 두 번째 문자를 가지고 그들 사이의 거리를 계산합니다. 거리는 QWERTY 키보드 레이아웃에 의해 정의되며, 동일한 행의 모든 ​​인접 문자의 거리는 1이고 동일한 열의 모든 인접 문자의 거리는 2입니다. 인접하지 않은 문자 사이의 거리를 측정하려면 가장 짧은 경로를 사용하십시오 둘 사이.

예 :

q->w is 1 distance apart
q->e is 2 distance
q->a is 2 distance
q->s is 3 distance (q->a->s or q->w->s)
q->m is 10 distance

그런 다음 입력의 끝에 도달 할 때까지 두 번째 및 세 번째 문자, 세 번째 및 네 번째 문자 등을 사용합니다. 출력은 모든 거리의 합입니다.

입력 및 출력 예 :

INPUT: qwer
OUTPUT: 3

INPUT: qsx
OUTPUT: 5

INPUT: qmq
OUTPUT: 20

INPUT: tttt
OUTPUT: 0

다음은 같은 열에있는 문자를 보여주는 이미지입니다.

열의 글자

이것은 코드 골프이므로 바이트 단위의 가장 짧은 코드가 이깁니다!


1
내가 생각하는 Q-> m는 ... 단지 8 키입니다
SuperJedi224

2
한 줄을 내려 가면 2 거리로 계산됩니다. 키 거리를 계산하지
않습니다.

그것도 거기에 :)
Vajura

입력 문자열이 항상 비어 있다고 가정 할 수 있습니까?
Alex A.

이것은 codegolf.stackexchange.com/questions/50722/… 와 매우 유사합니다 . 이 문자를 제외하고 다른 하나는 숫자를 사용했습니다.
Reto Koradi

답변:


2

CJam, 50 바이트

r{i",ÙZ°^ªýx´|"257b27b=A+Ab}%2ew::.-::z2fb:+

코드에는 인쇄 할 수없는 문자가 포함되어 있습니다.

CJam 통역사 에서 온라인으로 사용해보십시오 . 영구 링크가 작동하지 않으면이 페이스트 에서 코드를 복사하십시오 .

배경

우리는 0 에서 9 까지의 위치 를 맨 위 줄의 글자에, 10 에서 18 은 홈 줄의 글자에, 20 에서 26 은 맨 아래 줄의 글자에 할당하기 시작 합니다.

알파벳 순서로 모든 26 글자의 위치는

[10 24 22 12 2 13 14 15 7 16 17 18 26 25 8 9 0 3 11 4 6 23 1 21 5 20]

이 배열은 길이가 26 인 배열입니다. 배열이 CJam에서 둘러싸이고 문자 h 의 코드 포인트 가 104 = 4 × 26 이므로 배열의 단위를 왼쪽으로 7 단위 회전하여 각 문자의 위치에 액세스 할 수 있습니다 코드 포인트.

[15 7 16 17 18 26 25 8 9 0 3 11 4 6 23 1 21 5 20 10 24 22 12 2 13 14]

이제 우리는 기본 27 숫자의 요소 숫자를 고려 하여이 배열을 인코딩하고 결과 정수를 기본 257로 변환합니다.

[6 153 44 8 217 90 176 156 94 24 170 253 147 120 180 124]

각 정수를 해당 유니 코드 문자로 바꾸면 소스 코드에서 문자열을 얻습니다.

작동 원리

r              e# Read a whitespace separated token from STDIN.
{              e# For each character:
  i            e#   Push its code point.
  ",ÙZ°^ªýx´|" e#   Push that string.
  257b27b      e#   Convert from base 257 to base 27.
  A+Ab         e#   Add 10 and convert to base 10.
               e#   Examples: 7 -> [1 7], 24 -> [3 4]
}%             e#
2ew            e# Push all overlapping slices of length 2.
::.-           e# Subtract the corresponding components of the pairs in each slice.
::z            e# Apply absolute value to the results.
2fb            e# Convert each to integer (base 2).
               e# Example: [2 5] -> 2 × 2 + 5 = 9
:+             e# Add the distances.

1
어떻게 작동
합니까

@Vajura Dennis는 일반적으로 설명을 추가하려고합니다. 기다리면 아마도 하나를 추가 할 것입니다 :) 더 모호하고 기본적인 설명을 원한다면 usandfriends는 여기에서
Kade

@ Vajura : 내 답변을 편집했습니다.
Dennis

7

파이썬 2, 220 ... 124 119 바이트

많은 바이트 를 절약 한 Sp3000 덕분에 큰 도움이되었습니다 .

f='qwertyuiopasdfghjkl zxcvbnm'.find
g=lambda i:sum(abs(f(x)%10-f(y)%10)+2*abs(f(x)/10-f(y)/10)for x,y in zip(i,i[1:]))

용법:

g("tttt") -> 0

여기서 확인하십시오.

약간 골퍼 + 설명 :

f='qwertyuiopasdfghjkl zxcvbnm'.find  # Defining keyboard rows and aliasing find
g=lambda i:                           # Defining a function g which takes variable i
    sum(                              # Sum of 
        abs(f(x)%10-f(y)%10)          # horizontal distance, and
        + 2*abs(f(x)/10-f(y)/10)      # vertical distance,
        for x,y in zip(i,i[1:]))      # for each pair in the zipped list

# Example of zipping for those unaware:
# Let i = asksis, therefore i[1:] = sksis, and zip would make
# the list of pairs [(a,s),(s,k),(k,s),(s,i),(i,s)].

5

자바, 266 바이트

int c(String q){String[]r={"qwertyuiop","asdfghjkl","zxcvbnm"};int v=0,l=q.length();int[][]p=new int[l][2];for(int i=0;i<l;i++){while(p[i][0]<1)p[i][0]=r[p[i][1]++].indexOf(q.charAt(i))+1;v+=i<1?0:Math.abs(p[i][0]-p[i-1][0])+2*Math.abs(p[i][1]-p[i-1][1]);}return v;}

언 골프 버전 :

int c(String q) {
    String[] r = {
        "qwertyuiop",
        "asdfghjkl",
        "zxcvbnm"
    };
    int v = 0, l = q.length(); // v=return value, l = a shorter way to refer to input length
    int[][] p = new int[l][2]; // an array containing two values for each
                               // letter in the input: first its position
                               // within the row, then its row number (both
                               // 1 indexed for golfy reasons)
    for(int i = 0; i<l; i++) { // loops through each letter of the input
        while (p[i][0] < 1) // this loop populates both values of p[i]
            p[i][0] = r[p[i][1]++].indexOf(q.charAt(i))+1;
        v += (i<1) ? 0 : Math.abs(p[i][0]-p[i-1][0])+2*Math.abs(p[i][1]-p[i-1][1]); // adds onto return value
    }
    return v;
}

int v=0,l=q.length(),p[][]=new int[l][2];
Ypnypn

3

SWI- 프롤로그, 162 바이트

a(A):-a(A,0).
a([A,B|C],T):-Z=`qwertyuiopasdfghjkl0zxcvbnm`,nth0(X,Z,A),nth0(Y,Z,B),R is T+(2*abs(Y//10-X//10)+abs(Y mod 10-X mod 10)),(C=[],print(R);a([B|C],R)).

예 : a(`qmq`)출력 20(그리고 그 true후에는 할 수있는 일이 없습니다).

편집 : 3 바이트를 더 사용해야했습니다. 내 원래 프로그램이 주어진 테스트 사례를 통과했지만 실제로 잘못되었습니다 (절대 값이 잘못되었거나 누락되었습니다)

참고 : Ideone 에서 사용하려면 모든 백 따옴표 `를 큰 따옴표 로 바꿔야 합니다 ". 필자의 경우 백 쿼트 (SWI-Prolog의 현재 표준)는 문자열의 코드 목록과 큰 따옴표 문자열을 나타내지 만 이전 버전의 SWI-Prolog에서는 다릅니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.