很奇怪的单词计数器


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 2015年

它也在那里:)
Vajura

我们可以假设输入字符串将始终为非空吗?
Alex A.

这与codegolf.stackexchange.com/questions/50722/…非常相似。除了使用字母,其他使用数字。
Reto Koradi 2015年

Answers:


2

CJam,50个字节

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

请注意,该代码包含不可打印的字符。

CJam解释器中在线尝试。如果永久链接不起作用,请复制此粘贴中的代码。

背景

我们开始将位置09分配给顶行的字母,将1018分配给主行的字母,将2026分配给底行的字母。

所有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]

通过用相应的Unicode字符替换每个整数,我们从源代码中获取字符串。

怎么运行的

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 2015年

@Vajura Dennis通常会添加解释,如果您等待,他可能会添加一个:)如果您想要更模糊/基本的解释,我们的朋友们做了一个CJam解释器,您可以在这里
卡德,2015年

@Vajura:我已经编辑了答案。
丹尼斯

7

Python 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

Java,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-prolog,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`)输出20true之后,但是我无能为力)。

编辑:不得不再使用3个字节。我的原始程序通过了给定的测试用例,但实际上是不正确的(绝对值放错位置/丢失)

注意:如果要在Ideone上使用它,则必须将所有反引号替换`为双引号"。在我的情况下,反引号(这是SWI-Prolog中的当前标准)表示字符串和双引号字符串的代码列表,但这在旧版本的SWI-Prolog中是不同的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.