बहुत अजीब शब्द काउंटर


13

INPUT: फ़ंक्शन स्ट्रिंग, कमांड लाइन तर्क, STDIN या इसी तरह के लोअरकेस अक्षरों से युक्त कोई भी स्ट्रिंग।

OUTPUT: निम्नलिखित मीट्रिक के अनुसार अक्षरों की दूरियों के योग को दर्शाने वाली संख्या को प्रिंट या वापस करें:

आप पहले और दूसरे अक्षर को लेते हैं और उनके बीच की दूरी को गिनते हैं। दूरी को QWERTY कीबोर्ड लेआउट द्वारा परिभाषित किया गया है, जहां एक ही पंक्ति में प्रत्येक आसन्न पत्र में दूरी 1 है और उसी कॉलम में प्रत्येक आसन्न पत्र में दूरी है। उन अक्षरों के बीच की दूरी को मापने के लिए जो आसन्न नहीं हैं, आप सबसे छोटा रास्ता लेते हैं। दोनों के बिच में।

उदाहरण:

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 दूरी के रूप में गिना जाता है, आप महत्वपूर्ण दूरी की गिनती नहीं करते हैं
वजुरा

इसके ऊपर भी :)
वजुरा

क्या हम मान सकते हैं कि इनपुट स्ट्रिंग हमेशा गैर-रिक्त होगी?
एलेक्स ए।

यह काफी कुछ codegolf.stackexchange.com/questions/50722/… के समान है । सिवाय इसके कि यह अक्षरों का उपयोग करता है, जबकि दूसरे ने संख्याओं का उपयोग किया है।
रेटो कोराडी

जवाबों:


2

सीजेएम, 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 की एक सरणी है। चूंकि सरणियाँ सीजेएम में चारों ओर लपेटती हैं, और पत्र एच का कोड बिंदु 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]

संबंधित यूनिकोड वर्ण द्वारा प्रत्येक पूर्णांक को बदलकर, हम स्रोत कोड से स्ट्रिंग प्राप्त करते हैं।

यह काम किस प्रकार करता है

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 डेनिस आमतौर पर स्पष्टीकरण जोड़ने के लिए चारों ओर हो जाता है, अगर आप प्रतीक्षा करते हैं कि वह शायद एक जोड़ देगा :) यदि आप एक अधिक अस्पष्ट / बुनियादी स्पष्टीकरण चाहते हैं, तो usandfriends ने एक सीजेएम व्याख्याता बनाया जिसे आप यहां
केड

@ वजूरा: मैंने अपना उत्तर संपादित कर लिया है।
डेनिस

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

जावा, 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;}

Ungolfed संस्करण:

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

एसडब्ल्यूआई-प्रोलॉग, 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 (जो SWI-Prolog में वर्तमान मानक है) स्ट्रिंग्स और डबल-कोट्स वर्ण स्ट्रिंग्स के लिए कोड सूची का प्रतिनिधित्व करता है, लेकिन यह SWI-Prolog के पुराने संस्करणों में भिन्न है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.