เคาน์เตอร์คำที่แปลกมาก


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

ขึ้นมีมากเกินไป :)
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]

โดยการแทนที่แต่ละจำนวนเต็มด้วยอักขระ 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

@Vajura Dennis มักจะเพิ่มคำอธิบายถ้าคุณรอเขาอาจจะเพิ่มอีก :) ถ้าคุณต้องการคำอธิบายที่คลุมเครือ / เป็นพื้นฐานมากกว่านี้เราและเพื่อน ๆ ทำ CJam explainer ซึ่งคุณสามารถใช้ที่นี่ได้
Kade

@Vajura: ฉันได้แก้ไขคำตอบของฉัน
Dennis

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`)เอาท์พุท20(และtrueหลังจากนั้น แต่ไม่มีอะไรที่ฉันสามารถทำได้)

แก้ไข:ต้องใช้อีก 3 ไบต์ โปรแกรมดั้งเดิมของฉันผ่านการทดสอบกรณีที่กำหนด แต่ไม่ถูกต้องจริง (ค่าสัมบูรณ์ถูกวางผิด / ขาดหายไป)

หมายเหตุ: หากคุณต้องการที่จะใช้ในการพูดIdeoneคุณต้องเปลี่ยน backquotes ทุกคำพูดคู่` "Backquotes ในกรณีของฉัน (ซึ่งเป็นมาตรฐานปัจจุบันใน SWI-Prolog) แสดงรายการรหัสสำหรับสตริงและสตริงอักขระอัญประกาศคู่ แต่นี่แตกต่างใน SWI-Prolog รุ่นเก่า

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.