非常に奇妙な単語カウンター


13

INPUT:関数の引数、コマンドラインの引数、STDINなどの小文字のみで構成される文字列。

出力:次のメトリックに従って、文字の距離の合計を表す数値を印刷または返します。

最初と2番目の文字を取り、それらの間の距離を数えます。距離は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

次に、入力の最後に到達するまで、2番目と3番目の文字、次に3番目と4番目などを取ります。出力は、これらすべての距離の合計です。

入力と出力の例:

INPUT: qwer
OUTPUT: 3

INPUT: qsx
OUTPUT: 5

INPUT: qmq
OUTPUT: 20

INPUT: tttt
OUTPUT: 0

同じ列にある文字を示す画像を次に示します。

列の文字

これはコードゴルフなので、バイト単位の最短コードが勝ちです!


1
q-> mは8つのキーだけだと思います
...-SuperJedi224

2
1行下がった場合、2つの距離としてカウントされますが、重要な距離はカウントされません
バジュラ

その上も:)
バジュラ

入力文字列は常に空ではないと仮定できますか?
アレックスA.

これはcodegolf.stackexchange.com/questions/50722/…と非常によく似ています。これは文字を使用し、もう一方は数字を使用したことを除きます。
レトコラディ

回答:


2

CJam、50バイト

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

コードに印刷できない文字が含まれていることに注意してください。

CJamインタプリタでオンラインで試してください。パーマリンクが機能しない場合は、このpasteからコードをコピーします。

バックグラウンド

我々は、位置割り当て開始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 Dennisは通常、説明を追加します。しばらく待つと、おそらく説明が追加されます:)もっと曖昧で基本的な説明が必要な場合は、usandfriendsがここで
カデ

@Vajura:回答を編集しました。
デニス

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

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-プロローグ、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.