क्लेरेंस द स्लो टाइपिस्ट


35

परिचय

क्लेरेंस एक डेटा एंट्री क्लर्क है जो इंटरनेट सेवा प्रदाता के रूप में काम करता है। उसका काम आईएसपी के सभी ग्राहकों के आईपी पते को डेटाबेस में मैन्युअल रूप से दर्ज करना है। वह एक कीपैड का उपयोग करता है जिसमें निम्न लेआउट होता है:

123
456
789
.0

क्षैतिज या लंबवत आसन्न कुंजियों के केंद्र के बीच की दूरी ठीक एक सेंटीमीटर है। उदाहरण के लिए, के केंद्रों के बीच की दूरी 3और 9दो सेंटीमीटर होगा। के केंद्रों के बीच की दूरी 3और 5√2cm होगा। पाइथागोरस प्रमेय किसी भी दो कुंजी के बीच की दूरी की गणना करने के लिए पर्याप्त है।

क्लेरेंस, जैसा कि आप आईएसपी में काम करने वाले से उम्मीद कर सकते हैं, टाइपिंग की बहुत धीमी और अक्षम प्रणाली का उपयोग करता है। वह एक उंगली का उपयोग करता है और कुंजी की खोज करता है, और फिर अपनी उंगली को कुंजी पर ले जाता है, फिर इसे दबाता है, और संख्या में सभी अंकों के लिए दोहराता है। आप इस शैली को "ईगल सर्च सिस्टम" के रूप में जान सकते हैं क्योंकि कीबोर्ड के ऊपर उंगली सही खोज के लिए कीबोर्ड से नीचे गिरने से पहले ईगल एक हत्या के लिए नीचे गिरती है।

उदाहरण के लिए, यहां बताया गया है कि क्लेरेंस नंबर कैसे टाइप करेगा 7851:

  1. वह अपनी उंगली शुरू करता है 7और चाबी को धक्का देता है।
  2. वह अपनी उंगली को दाईं ओर 1cm तक ले जाता है 8और कुंजी को धक्का देता है।
  3. वह अपनी उंगली को 1 सेमी ऊपर की ओर ले जाता है 5और चाबी को धक्का देता है।
  4. वह अपनी उंगली को तिरछे ऊपर की ओर ले जाता है 1और cm2cm को छोड़ता है और कुंजी को धक्का देता है।

इसलिए कुल दूरी जिसे क्लैरेंस ने अपनी उंगली टाइप करने के लिए स्थानांतरित किया 7851है, 1 + 1 + √2जो लगभग 3.41 सेमी है।

आपका कार्य एक कार्यक्रम लिखना है जो दूरी की गणना करता है क्लैरेंस को अपनी उंगली को मनमाने ढंग से आईपी पते में टाइप करना होगा।

इनपुट विवरण

इनपुट एक स्ट्रिंग है जो फॉर्म में होगी

().().().()

जहां प्रत्येक ()श्रेणी में एक पूर्णांक है 0- 999। यह आईपी पते का प्रतिनिधित्व करता है जो क्लेरेंस को टाइप करना चाहिए। एक उदाहरण इनपुट हो सकता है:

219.45.143.143

मैं यह भी बताना चाहूंगा कि इस तरह के इनपुट 0.42.42.42या 999.999.999.999जैसे अभी भी वैध इनपुट हैं, इस तथ्य के बावजूद कि वे अमान्य आईपी पते हैं। इसलिए आपको अपने प्रोग्राम में किसी भी आईपी एड्रेस वेरिफिकेशन कोड को शामिल करने की आवश्यकता नहीं है।

आउटपुट विवरण

निर्दिष्ट आईपी पते में टाइप करने के लिए क्लैरेंस को अपनी उंगली को उस दूरी पर ले जाना चाहिए जो उसकी उंगली को हिलाएगी। जहाँ आवश्यक हो, दो दशमलव स्थानों पर गोल उत्तर दें और cmअपने आउटपुट में यूनिट का उपयोग करें । उदाहरण इनपुट के लिए आउटपुट 27.38cm(1 + for8 + 25 + 2 + 1 + +5 + 3 + 1 + 15 + √13 + 3 + 1 + √5) है।


29
यार, आईएसपी में अजीब कीबोर्ड हैं ...
डेनिस

1
@RetoKoradi मैं एक कार्यक्रम की उम्मीद करता हूं, हां। स्टड, कमांड लाइन तर्क या उपयोगकर्ता इनपुट फ़ंक्शन स्वीकार्य हैं।
अनुपम

2
@dacapoaria - 'ईगल सर्च' को अधिक भारी-भरकम टाइपिस्टों के लिए 'हंट एंड पेक' या 'सर्च एंड नष्ट' के रूप में भी जाना जाता है।

12
@ArtofCode क्लेरेंस एक आईएसपी पर काम करता है, और कभी-कभी आईएसपी उसे डेटाबेस में टाइप करने के लिए अमान्य डेटा भेजता है। क्लेरेंस वैसे भी डेटा टाइप करता है। वैसे भी विहित कारण है। वास्तविक कारण यह है कि मैंने कल्पना करते समय अनदेखी की थी।
अनुपस्थित

3
केवल मान्य सीमा (0-255) आईपी पते को ध्यान में रखते हुए, जो कि कम से कम पथ में सभी पते टाइप करने के लिए कीबोर्ड की इष्टतम व्यवस्था होनी चाहिए?
इज़राइल मोरालेस

जवाबों:


16

CJam, 46 44 43 38 37 34 बाइट्स

rA,sd`f#3fmd2/2ew::.-::mh:+2mO"cm"

सुझाव के लिए @ user23013 के लिए धन्यवाद mh, जिसने 5 बाइट्स को सहेजना संभव बना दिया।

CJam दुभाषिया में इसे ऑनलाइन आज़माएं ।

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

r     e# Read a token from STDIN.
A,    e# Push [0 1 2 3 4 5 6 7 8 9].
s     e# Stringify: [0 1 2 3 4 5 6 7 8 9] -> "0123456789"
d     e# Cast to Double: "0123456789" -> 123456789.0
`     e# Inspect: 123456789.0 -> "123456789.0"
f#    e# Push the index of each character from the input in "123456789.0".
3fmd  e# Push the quotient and residue of each index divided by 3.
2/    e# Split the resulting array into pairs.
2ew   e# Convert the array of pairs in the array of all overlapping pairs of pair.
::.-  e# Reduce each pair using vectorized difference: [[a b][c d]] -> [a-b c-d]
::mh  e# Reduce each reduced pair to its 2-norm distance: [a b] -> sqrt(aa + bb)
:+    e# Sum all distances.
2mO   e# Round to two decimal places.
"cm"  e# Push "cm".

2
{3fmd~@-@@-mh}%
jimmy23013

@ user23013: धन्यवाद। मुझे mhभी पता नहीं था।
डेनिस

16

पायथ, 38 35 34 बाइट्स

+.Rs.aM-M.:m.jF.Dx`ciUTT1b3z2 2"cm

प्रदर्शन।

@Dennis के लिए एक फ्लोट विचार के स्ट्रिंग में अनुक्रमण।

स्पष्टीकरण, फोनी इनपुट पर 15.0:

  • सबसे पहले, हम इनपुट लेते हैं। यह अंतर्निहित रूप से संग्रहीत है z। '15 .0 '
  • इस प्रकार हम इस सूची को मैप: m.jF.Dx`ciUTT1k3z

    • UT: हम सूची तैयार करते हैं [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    • iUTT: इसके बाद, हम इस सूची को आधार संख्या के रूप में मानते हैं जो हमें दे रही है 123456789
    • ciUTT1: अगला, हम इस संख्या को फ्लोटिंग पॉइंट द्वारा फ्लोट में बदलकर 1 से विभाजित करते हैं, देते हैं 123456789.0
    • `: एक स्ट्रिंग में कनवर्ट करें। '123456789.0'
    • x k: उस स्ट्रिंग में इनपुट वर्ण का सूचकांक लें। [0, 4, 9, 10]
    • .D 3: .Dडिमॉड फंक्शन है, जो अपने पहले इनपुट को विभाजित करता है और दूसरे इनपुट द्वारा मोड्यूलो को विभाजित करता है। दूसरा इनपुट 3 है, यहाँ। यह सुन्नत पर चरित्र का भौतिक स्थान देता है। [(0, 0), (1, 1), (3, 0), (3, 1)]
    • .jF: .jकॉम्प्लेक्स नंबर कंस्ट्रक्टर है। Fइसे टपल पर लागू होता है। [0j, (1+1j), (3+0j), (3+1j)]
  • .: 2: अब, हम इस सूची के 2 एंट्री सबस्ट्रिंग लेते हैं, ताकि हम जोड़ीदार दूरी पा सकें। [[0j, (1+1j)], [(1+1j), (3+0j)], [(3+0j), (3+1j)]]
  • -M: दो जटिल संख्याओं का अंतर लेता है। [(-1-1j), (-2+1j), -1j]
  • .aM: परिणाम का पूर्ण मूल्य लेता है। यह कीपैड स्थानों के बीच की दूरी है।[1.4142135623730951, 2.23606797749979, 1.0]
  • s: दूरियों का योग। 4.650281539872885
  • .R 2: 2 दशमलव स्थानों पर गोल। 4.65
  • + "cm: 'cm'अंत में जोड़ें और प्रिंट करें। 4.65cm

7

PHP - 108 बाइट्स

<?for(;$v=strpos(-.987654321,fgetc(STDIN));$l=$v)$l&&$t+=hypot($l/3%4-$v/3%4,$l%3-$v%3);printf('%.2fcm',$t);

इनपुट स्टड से लिया गया है। -.987654321के लिए भेजा strposसमारोह का मूल्यांकन '-0.987654321'एक स्ट्रिंग संदर्भ में।


नमूना उपयोग:

$ echo 219.45.143.143 | php isp.php
27.38cm

5

सी, 192 177 159 बाइट्स

अद्यतन संस्करण, अब कमांड लाइन तर्क का उपयोग करके पूरा कार्यक्रम। एक ही समय में, पिछले संस्करण की तुलना में कम होने के लिए बेहतर:

#define G c=*a[1]++,c=c>48?c-49:c/2-14,u=c%3,v=c/3
float r;c,u,v,p,q;main(int n,char**a){for(G;*a[1];)p=u,q=v,G,p-=u,q-=v,r+=sqrt(p*p+q*q);printf("%.2fcm",r);}

Ungolfed:

#include <stdio.h>
#include <math.h>

float r;
int c, u, v, p, q;

int main(int n, char** a) {
    c = *a[1]++;
    c = c > 48 ? c - 49 : c / 2 - 14;
    u = c % 3;
    v = c / 3;
    for ( ; *a[1]; ) {
        p = u;
        q = v;
        c = *a[1]++;
        c = c > 48 ? c - 49 : c / 2 - 14;
        u = c % 3;
        v = c / 3;
        p -= u;
        q -= v;
        r += sqrt(p * p + q * q);
    }

    printf("%.2fcm",r);

    return 0;
}

#defineपूर्ण संस्करण में दोहराया कोड के कुछ को छोटा करने के लिए गोल्फ संस्करण एक प्रीप्रोसेसर का उपयोग करता है ।


2
1. आपका गोल्फ संस्करण अंत में एक अर्धविराम याद कर रहा है। 2. आपका गोल्फ संस्करण गलत परिणाम पैदा कर रहा है, क्योंकि आप गैर-शून्य की sजाँच करने से पहले वेतन वृद्धि करते हैं *s। 3. ओपी ने अपने पद पर कार्यक्रम कहा। मुझे यकीन नहीं है कि एक फ़ंक्शन स्वीकार किया जाता है। 4. जीसीसी के साथ, आपको शामिल करने की आवश्यकता नहीं है। 5. sqrtसे छोटा है sqrtf। 6. pow(u-p,2)से छोटा है (u-p)*(u-p)। 7. मुझे यकीन नहीं है, लेकिन मुझे लगता है कि एक ही तार और सेटिंग में दोनों निर्देशांक स्टोर करना u=x[c]/3और v=x[c]%3छोटा होना चाहिए।
डेनिस

शुद्धता की समस्या का समाधान किया। पता चलता है कि मैंने ठीक ट्यूनिंग करते हुए पहले के संस्करण को संकलित किया। उसके लिए माफ़ करना। 1, 2. निश्चित। मुझे वास्तव में आश्चर्य हुआ कि मैं उन्हें छोड़ सकता हूं। टूटी हुई टेस्टिंग इसे समझाएगी ... 3. विकी / मेटा पर मैंने जो देखा, उसके आधार पर यह लग रहा था कि इनपुट को फ़ंक्शन आर्ग्युमेंट्स के रूप में लिया जाना चाहिए, अगर इनपुट स्पष्ट रूप से निर्दिष्ट नहीं है। अगर मेरी व्याख्या गलत है तो मैं इसे बदल दूंगा। 4. मैंने हमेशा सोचा था कि केवल ऐसे फ़ंक्शन जो वापसी intका उपयोग अघोषित रूप से किया जा सकता है। लेकिन वास्तव में, क्लैंग इसे एक चेतावनी के साथ भी स्वीकार करता है, इसलिए मुझे इससे छुटकारा मिला।
रेटो कोराडी

विकी बताता है कि फ़ंक्शन डिफ़ॉल्ट रूप से अनुमत हैं, हाँ, लेकिन ओपी ने लिखा है कि आपका कार्य एक प्रोग्राम लिखना है ... आपको ब्रैकेट्स की आवश्यकता नहीं है यदि आप लूप लिखते हैं p=u,q=v,G,r+=...
डेनिस

मैंने इनपुट आवश्यकताओं पर स्पष्टीकरण के लिए ओपी से पूछा। कोड पर, मैंने इसे गलत में अनुकूलित करने से पहले इसे थोड़ा पुराने संस्करण में वापस रोल किया। मैं कल इसे ट्यूनिंग में एक और शॉट लूंगा, लेकिन मैं एक टूटे हुए संस्करण को बहुत लंबे समय तक नहीं छोड़ना चाहता था। संकेत के लिए धन्यवाद।
रेटो कोराडी

@ डेनिस ओके, अपडेटेड वर्जन हर तरह से बेहतर होना चाहिए। अब एक पूरा कार्यक्रम, और कुछ अनुकूलन के लिए अभी भी कम धन्यवाद। प्रारंभिक संस्करण के साथ समस्याओं के बारे में बताने के लिए फिर से धन्यवाद।
रेटो कोराडी

3

जावास्क्रिप्ट ( ईएस 6 ), 132

मैं / ओ पॉपअप के माध्यम से। परीक्षण करने के लिए स्निपेट चलाएं (केवल फ़ायरफ़ॉक्स)

[for(a of prompt(d=''))[p,q,d]=[x=(a=a<'0'?9:-a?a-1:10)%3,y=a/3|0,d!==''?d+Math.sqrt((p-=x)*p+(q-=y)*q):0]],alert(d.toFixed(2)+'cm')


3

पायथन 3, 108 बाइट्स

L=[x//3*1j+x%3for x in map("123456789.0".find,input())]
print("%.2fcm"%sum(abs(a-b)for a,b in zip(L,L[1:])))

बेशक बहुत अच्छी तरह से गोल्फ नहीं है, लेकिन कम से कम यह PHP के साथ संबंध रखता है।



2

पायथन 199 171 166

SP3000 के लिए इसके लिए एक छोटा पायथन कोड (108) है:

https://codegolf.stackexchange.com/a/50854/41163

import sys
p=r=0
for i in sys.argv[1]:
 c=3,0
 if i!=".":c=divmod(int(i)-1,3)
 if i<1:c=3,1
 if p:r+=((p[1]-c[1])**2+(p[0]-c[0])**2)**0.5
 p=c
print"%.2fcm"%r

नमूना उपयोग:

$ python isp.py 219.45.143.143
27.38cm

ऑनलाइन रन करें: http://codepad.org/h9CWCBNO

टिप्पणी कोड

import sys

# p - last position as (y,x) tuple - initialized with 0, because "if 0" -> equals to "False"
p = 0
# r - result of adding all distances - ini with 0, because not moved any distances on start
r = 0

# Loop over chars
for char in sys.argv[1]:
   # c - current position of typist as (y,x) tuple

   # Always set c to position of "." key 
   c = 3,0 # lazy for c=(3,0)

   # Check if char is not the "." key
   if char !=".":

      # Get position of char on keypad
      c=divmod(int(char)-1,3)

      if char<1:
         c=3,1  

   # If this is the first char, 
   # then STORE_OPERATION has not been executed, 
   # so p is still p=0 from original initialization 
   # calling "if 0" evaluates to False,
   # so we jump this code block, for the first char
   if p:                           
      # calculate delta of x, y from current and last position, 
      # then add both deltas squared (**2),
      # then get square root of it (**0.5 = **1/2)
      # add to r (+=)
      r+=( (p[1]-c[1])**2 + (p[0]-c[0])**2 )**0.5

   # STORE_OPERATION - Store current position as last position
   p = c

# .2f returns r with 2 trailing digits
print"%.2fcm"%r

1
आप कुछ बाइट्स ifको एक लाइन पर if i<1:c=3,1
क्लॉस

1
आप अपनी पोस्ट के शीर्ष पर इस टिप्पणी को डालकर वाक्य रचना हाइलाइटिंग जोड़ सकते हैं:<!-- language: lang-python -->
मार्टिन एंडर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.