Bộ đếm từ rất lạ


13

INPUT: Bất kỳ chuỗi nào chỉ bao gồm các chữ cái thường thông qua đối số hàm, đối số dòng lệnh, STDIN hoặc tương tự.

OUTPUT: In hoặc trả về một số sẽ biểu thị tổng khoảng cách của các chữ cái theo số liệu sau:

Bạn lấy chữ cái thứ nhất và thứ hai và đếm khoảng cách giữa chúng. Khoảng cách được xác định bởi bố cục bàn phím QWERTY, trong đó mỗi chữ cái liền kề trong cùng một hàng có khoảng cách 1 và mọi chữ cái liền kề trong cùng một cột có khoảng cách 2. Để đo khoảng cách giữa các chữ cái không liền kề, bạn đi theo con đường ngắn nhất giữa hai người.

Ví dụ:

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

Sau đó, bạn lấy chữ cái thứ hai và thứ ba, rồi thứ ba và thứ tư, v.v., cho đến khi bạn đạt đến cuối của đầu vào. Đầu ra là tổng của tất cả các khoảng cách.

Ví dụ đầu vào và đầu ra:

INPUT: qwer
OUTPUT: 3

INPUT: qsx
OUTPUT: 5

INPUT: qmq
OUTPUT: 20

INPUT: tttt
OUTPUT: 0

Dưới đây là hình ảnh cho thấy các chữ cái trong cùng một cột:

chữ cái trong cột

Đây là mã golf, vì vậy mã ngắn nhất tính bằng byte sẽ thắng!


1
Tôi nghĩ rằng q-> m chỉ có 8 phím ...
SuperJedi224

2
nếu bạn đi xuống một hàng thì nó được tính là 2 khoảng cách, bạn không tính khoảng cách chính
Vajura

nó cũng ở đó :)
Vajura

Chúng ta có thể giả định rằng chuỗi đầu vào sẽ luôn luôn không trống?
Alex A.

Điều này khá giống với codegolf.stackexchange.com/questions/50722/ . Ngoại trừ việc này sử dụng các chữ cái, trong khi một số khác sử dụng các số.
Reto Koradi

Câu trả lời:


2

CJam, 50 byte

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

Lưu ý rằng mã chứa các ký tự không thể in được.

Hãy thử trực tuyến trong trình thông dịch CJam . Nếu permalink không hoạt động, sao chép mã từ dán này .

Lý lịch

Chúng tôi bắt đầu gán các vị trí 0 đến 9 cho các chữ cái ở hàng trên cùng, 10 đến 18 cho các chữ cái ở hàng chủ và 20 đến 26 cho các chữ cái ở hàng dưới cùng.

Vị trí của tất cả 26 chữ cái, theo thứ tự bảng chữ cái, là

[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]

Đây là một mảng có chiều dài 26. Vì các mảng bao quanh trong CJam và điểm mã của chữ h104 = 4 × 26 , chúng tôi xoay mảng 7 đơn vị sang trái, để có thể truy cập vị trí của từng chữ cái điểm mã.

[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]

Bây giờ chúng tôi mã hóa mảng này bằng cách xem xét các chữ số phần tử của một số cơ sở 27 và chuyển đổi số nguyên kết quả thành cơ sở 257.

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

Bằng cách thay thế mỗi số nguyên bằng ký tự Unicode tương ứng, chúng tôi có được chuỗi từ mã nguồn.

Làm thế nào nó hoạt động

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
Làm thế nào mà nó thậm chí hoạt động
Vajura

@Vajura Dennis thường được xung quanh để giải thích thêm, nếu bạn chờ đợi ông có thể sẽ thêm một :) Nếu bạn muốn có một lời giải thích mơ hồ hơn / cơ bản, usandfriends đã explainer CJam mà bạn có thể sử dụng ở đây.
Kade

@Vajura: Tôi đã chỉnh sửa câu trả lời của mình.
Dennis

7

Python 2, 220 ... 124 119 byte

Rất cảm ơn Sp3000 vì đã tiết kiệm rất nhiều byte.

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:]))

Sử dụng:

g("tttt") -> 0

Kiểm tra nó ở đây.

Hơi vô lý + giải thích:

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

Java, 266 byte

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;}

Phiên bản bị đánh cắp:

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;
}

Bạn có thể lưu một vài byte bằng cách sử dụngint v=0,l=q.length(),p[][]=new int[l][2];
Ypnypn

3

SWI-prolog, 162 byte

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)).

Ví dụ: a(`qmq`)đầu ra 20(Và truesau nó nhưng tôi không thể làm gì về điều đó).

Chỉnh sửa: phải sử dụng thêm 3 byte. Chương trình ban đầu của tôi đã vượt qua các trường hợp thử nghiệm được đưa ra nhưng thực sự không chính xác (giá trị tuyệt đối bị đặt sai / thiếu)

Lưu ý: nếu bạn muốn sử dụng nó trên Ideone , bạn phải thay thế tất cả các backquote `thành dấu ngoặc kép ". Backquote trong trường hợp của tôi (là tiêu chuẩn hiện tại trong SWI-Prolog) đại diện cho danh sách mã cho chuỗi và chuỗi ký tự trích dẫn kép, nhưng điều này khác với các phiên bản cũ hơn của SWI-Prolog.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.