Penghitung kata yang sangat aneh

13

INPUT: Setiap string yang hanya terdiri dari huruf kecil melalui argumen fungsi, argumen baris perintah, STDIN, atau yang serupa.

OUTPUT: Cetak atau kembalikan angka yang akan mewakili jumlah jarak huruf sesuai dengan metrik berikut:

Anda mengambil huruf pertama dan kedua dan menghitung jarak di antara mereka. Jarak ditentukan oleh tata letak keyboard QWERTY, di mana setiap huruf yang berdekatan di baris yang sama memiliki jarak 1 dan setiap huruf yang berdekatan di kolom yang sama memiliki jarak 2. Untuk mengukur jarak antara huruf yang tidak berdekatan, Anda mengambil jalur terpendek antara keduanya.

Contoh:

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

Kemudian Anda mengambil huruf kedua dan ketiga, lalu yang ketiga dan keempat, dll, hingga Anda mencapai akhir input. Outputnya adalah jumlah dari semua jarak tersebut.

Contoh input dan output:

INPUT: qwer
OUTPUT: 3

INPUT: qsx
OUTPUT: 5

INPUT: qmq
OUTPUT: 20

INPUT: tttt
OUTPUT: 0

Berikut adalah gambar yang menunjukkan huruf mana yang berada di kolom yang sama:

huruf dalam kolom

Ini kode golf, jadi kode terpendek dalam byte menang!

Vajura
sumber
1
Saya pikir q-> m hanya 8 kunci ...
SuperJedi224
2
jika Anda turun satu baris yang dihitung sebagai 2 jarak, Anda tidak menghitung jarak kunci
Vajura
di atas sana juga :)
Vajura
Bisakah kita mengasumsikan bahwa string input akan selalu kosong?
Alex A.
Ini sangat mirip dengan codegolf.stackexchange.com/questions/50722/… . Kecuali bahwa ini menggunakan huruf, sedangkan yang lainnya menggunakan angka.
Reto Koradi

Jawaban:

2

CJam, 50 byte

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

Perhatikan bahwa kode tersebut mengandung karakter yang tidak dapat dicetak.

Cobalah online di penerjemah CJam . Jika permalink tidak berfungsi, salin kode dari tempel ini .

Latar Belakang

Kami mulai menetapkan posisi 0 hingga 9 untuk huruf-huruf di baris atas, 10 hingga 18 untuk huruf-huruf di baris rumah, dan 20 hingga 26 untuk huruf-huruf di baris bawah.

Posisi semua 26 huruf, dalam urutan abjad, adalah

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

Ini adalah array dengan panjang 26. Karena array membungkus dalam CJam, dan titik kode huruf h adalah 104 = 4 × 26 , kami memutar array 7 unit ke kiri, sehingga setiap posisi huruf dapat diakses dengan nya titik kode.

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

Sekarang kita menyandikan array ini dengan mempertimbangkan digit elemennya dari nomor basis 27 dan mengkonversi bilangan bulat yang dihasilkan menjadi basis 257.

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

Dengan mengganti setiap bilangan bulat dengan karakter Unicode yang sesuai, kami memperoleh string dari kode sumber.

Bagaimana itu bekerja

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.
Dennis
sumber
1
man bagaimana itu bahkan bekerja
Vajura
@Vajura Dennis biasanya berkeliling untuk menambahkan penjelasan, jika Anda menunggu dia mungkin akan menambahkan satu :) Jika Anda ingin penjelasan yang lebih kabur / dasar, kami dan teman membuat penjelajah CJam yang dapat Anda gunakan di sini.
Kade
@ Vajura: Saya sudah mengedit jawaban saya.
Dennis
7

Python 2, 220 ... 124 119 Bytes

Terima kasih banyak kepada Sp3000 karena telah menghemat banyak 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:]))

Pemakaian:

g("tttt") -> 0

Lihat disini.

+ Penjelasan sedikit berubah warna:

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)].
Kade
sumber
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;}

Versi tidak disatukan:

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;
}
vijrox
sumber
Anda dapat menyimpan beberapa byte dengan menggunakanint 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)).

Contoh: a(`qmq`)output 20(Dantrue setelah itu tetapi tidak ada yang bisa saya lakukan tentang itu).

Edit: harus menggunakan 3 byte lagi. Program asli saya melewati test case yang diberikan tetapi sebenarnya salah (nilai absolut salah tempat / hilang)

Catatan: jika Anda ingin menggunakannya di say Ideone , Anda harus mengganti semua backquote` tanda kutip menjadi dua tanda kutip ". Backquotes dalam kasus saya (yang merupakan standar saat ini di SWI-Prolog) mewakili daftar kode untuk string, dan string karakter tanda kutip ganda, tetapi ini berbeda pada versi SWI-Prolog yang lebih lama.

Fatalisasi
sumber