मुझे इसे कितनी बार दबाना चाहिए?


24

हम सभी पुराने स्कूल के टेलीफोन कीपैड के लिए उपयोग किए जाते हैं, है ना? संदर्भ के लिए, यहाँ ऐसा दिखता है:

टेलीफोन कीपैड


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

जो लोग इस बात से अपरिचित हैं, उनके लिए यहां बताया गया है कि यह कैसे काम करता है:

  • 2उदाहरण के लिए, कुंजी के साथ , उस abcपर नीचे लिखा स्ट्रिंग भी है । टाइप करने के लिए a, आपको इस कुंजी को एक बार bप्रेस करना होगा , क्योंकि आपको दो बार प्रेस करना होगा और इसके लिए cआपको तीन बार प्रेस करना होगा।

  • समान कुंजी पर लगातार अक्षरों के लिए, आपको फिर से दबाने से पहले 1 सेकंड इंतजार करना होगा। इसलिए, यदि आप टाइप करना चाहते हैं, तो आपको cb3 बार प्रेस करना होगा c, एक सेकंड इंतजार करना होगा और फिर दो बार प्रेस करना होगा b, इसलिए अभी भी 5 टैप करें।

  • एक ही स्थान को छोड़कर, सभी अन्य कुंजियों के लिए भी यही लागू होता है, जिसमें केवल 1 प्रेस की आवश्यकता होती है। यह भी ध्यान दें कि चाबियाँ 7और 9उन पर चार अक्षर हैं। एक ही एल्गोरिदम लागू किया जाता है, केवल अंतर अक्षरों की संख्या है। प्रत्येक कुंजी के अनुरूप तार ऊपर की छवि (लेकिन लोअरकेस) में या निम्न सूची में पाए जा सकते हैं, जिसमें आपके द्वारा प्राप्त सभी वर्ण हो सकते हैं:

    "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz", " "
    

परीक्षण के मामलों

इनपुट -> आउटपुट (स्पष्टीकरण)

"" -> 0 (कुछ भी टैप नहीं किया जाना चाहिए)
"पानी" -> 8 ("डब्ल्यू, ए, टी" प्रत्येक को 1 टैप की आवश्यकता होती है (कुंजी 9, 2 और 8 पर), "ई" के लिए 2 नल (कुंजी 3 पर), "आर" के लिए 3 नल (कुंजी 7 पर) की आवश्यकता होती है ), 1 + 1 + 1 + 2 + 3 = 8)
"साबुन" -> ९ (४ + ३ + १ + १)
"कैंडेला" -> १३ (३ + १ + २ + १ + २ + ३ + १)
"कोड गोल्फ" -> 20 (3 + 3 + 1 + 2 + 1 (स्थान के लिए) + 1 + 3 + 3 + 3)
"पहाड़ी का राजा" -> 33 (2 + 3 + 2 + 1 + 1 + 3 + 3 + 1 + 1 + 2 + 2 + 2 + 1 + 2 + 3 + 3 + 3)

चश्मा

  • मानक I / O नियम और डिफ़ॉल्ट लूपोल्स लागू होते हैं।

  • आप अपनी भाषा के मूल स्ट्रिंग प्रकार में केवल इनपुट ले सकते हैं। आउटपुट या तो पूर्णांक या उस पूर्णांक का एक स्ट्रिंग प्रतिनिधित्व हो सकता है।

  • यह , हर भाषा में सबसे कम जवाब जीतता है।




2
मुझे लगता है कि यह एक और दिलचस्प सवाल होगा अगर आपने 1 टैप प्रति सेकंड किया, और 1 सेकंड इंतजार करना पड़ा, और टैप के बजाय सेकंड गिने ।
यमक

@ यक वह बहुत अधिक जटिल होगा
श्री एक्सकोडर

@ Mr.Xcoder हालांकि आप सुनिश्चित हैं? मैंने देखा है कि कोड-जादूगर यहां एक ट्वीट की तुलना में कम जगह में असंभव सामान करते हैं।
J_F_B_M

जवाबों:


11

जावास्क्रिप्ट (ईएस 6) 77 66 64 60 बाइट्स

(@Johan Karlsson और @Arnauld के लिए कुछ बाइट्स को सहेजा गया)।

s=>[...s].map(l=>s=~~s+2+'behknquxcfilorvysz'.search(l)/8)|s


(s,t=0)=>[...s].map(l=>t+=(1+'behknquxcfilorvysz'.indexOf(l)/8|0)+1)&&t71 बाइट्स के लिए
जोहान कार्लसन ने

धन्यवाद, @JohanKarlsson, मुझे शावर में एक ही चीज़ लगी! 5 और बाइट्स को शेव करने के लिए एक और अनुकूलन मिला।
रिक हिचकॉक

6
मुझे 71 बाइट्स के लिए एक शुद्ध अंकगणितीय समाधान मिला f=s=>[...s].map(c=>t+=((c=parseInt(0+c,36))>23?c+3:c&&~-c%3)%7%4+1,t=0)|t:।
नील

1
@ नील, जबकि यह कम नहीं हो सकता है, यह निश्चित रूप से चतुर है।
रिक हिचकॉक

1
@ नील आपको इसे पोस्ट करना चाहिए।
श्री एक्सकोडर

7

05AB1E , 29 26 25 बाइट्स

ð¢svA•22ā₂•S£ð«øðδKy.åƶOO

इसे ऑनलाइन आज़माएं!

व्याख्या

ð¢                         # count spaces in input
  sv                       # for each char y in input
    A                      # push the lowercase alphabet
     •22ā₂•S               # push the base-10 digit list [3,3,3,3,3,4,3,4]
            £              # split the alphabet into pieces of these sizes
             ð«            # append a space to each
               ø           # transpose
                ðδK        # deep remove spaces
                   y.å     # check y for membership of each
                      ƶ    # lift each by their index in the list
                       O   # sum the list
                        O  # sum the stack

क्षमा करें, लेकिन एक खाली इनपुट के लिए यह 10. देता है। यह कहीं और ठीक है
श्री एक्सकोडर

@ Mr.Xcoder: खाली स्ट्रिंग कोई आउटपुट नहीं देता है, लेकिन यह अभी भी गलत है। अधिसूचित करने के लिए धन्यवाद, मैं इसे ठीक करूँगा।
इमीना

2
यह TIO पर 10 देता है।
श्री एक्सकोडर

@ Mr.Xcoder: हाँ, आपको खाली स्ट्रिंग स्पष्ट रूप से देनी होगी। कोई इनपुट खाली स्ट्रिंग के समान नहीं है। यह थोड़ा भ्रामक है मुझे पता है। हालांकि अब निश्चित है :)
Emigna

@ Mr.Xcoder: खाली स्ट्रिंग इनपुट इस
Emigna

7

पायथन 2 , 56 बाइट्स

@ रिकहिचॉक के जावास्क्रिप्ट समाधान के समान एल्गोरिथ्म का उपयोग करता है

lambda x:sum('behknquxcfilorvysz'.find(c)/8+2for c in x)

इसे ऑनलाइन आज़माएं!


दिलचस्प समाधान। यह रिक्त स्थान के लिए कैसे काम करता है, मुझे यह नहीं मिलता है>? <।
श्री एक्सकोडर

@ स्ट्रिंग '...'.find(c)रिटर्न में कुछ भी नहीं के लिए Mr.Xcoder -1। 2 जोड़कर हमें एक keypress मिलता है।
अंडा

मुझे पता था कि यह वापस आ गया है -1, लेकिन आपको पता नहीं है कि आपके पास +2बॉयलरप्लेट के बाद ... वैसे भी, अब तक का सबसे छोटा पायथन समाधान।
श्री एक्सकोडर

Oml, मैंने अपने प्रोग्राम को धीरे-धीरे नीचे करने के बाद ठीक वैसा ही घोल बनाने के लिए हुआ, जब तक कि मैंने महसूस नहीं किया कि आपने इसे पोस्ट किया है :( इस समाधान को खोजने के लिए अच्छा काम :)
Mario Ishac

5

पायथन 3 , 69 67 65 64 बाइट्स

1 बाइट मिस्टर एक्सकोडर की बदौलत।

फेलिप नारदी बतिस्ता के लिए 1 बाइट धन्यवाद।

lambda x:sum((ord(i)+~(i>"s"))%3+3*(i in"sz")+(i>" ")for i in x)

इसे ऑनलाइन आज़माएं!


के i==" "साथ प्रतिस्थापित करके एक बाइट सहेजें i<"a", क्योंकि आप केवल अक्षर और स्थान प्राप्त करते हैं
श्री Xcoder

4
61 मिनट ... बहुत देर हो गई!
आउटगोल्फर

5

डायलाग एपीएल, 37 बाइट्स

+/⌈9÷⍨'adgjmptw behknqux~cfilorvy~'⍳⍞

इसे ऑनलाइन आज़माएं!

कैसे?

स्ट्रिंग में इनपुट के प्रत्येक चार का ndex प्राप्त करें 'adgjmptw behknqux~cfilorvy~'( sऔर z28 को डिफ़ॉल्ट होगा), 9 से विभाजित करें, राउंड अप और योग करें।


आप 'adgjmptw ' 'behknqux' 'cfilorvy' 'sz'कुछ बाइट्स को बचाने के लिए उपयोग कर सकते हैं
क्रिति लिथोस


@LeakyNun onice
ऊरीएल

आप स्ट्रिंग में जगह छोड़ सकते हैं
क्रिति लिथोस

@ यूरेल प्रतीक्षा, आपको गिनने की जरूरत नहीं है f←इसलिए यह 47 बाइट्स है
लीक नून

4

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

f=
s=>[...s].map(c=>t+=((c=parseInt(0+c,36))>23?c+3:c&&~-c%3)%7%4+1,t=0)|t
<input oninput=o.textContent=f(this.value)><pre id=o>

देखो कोई पत्र तालिका नहीं! मुझे @ LeakyNun का सूत्र बिल्कुल समझ में नहीं आया इसलिए मैं अपने साथ आया।


शुद्ध अंकगणित :)
श्री एक्सकोडर

क्या s=>[...s]क्यों नहीं करता हैs=>s.map()...
इवान कैरोल

1
@ EvanCarroll sएक स्ट्रिंग है, इसलिए आप mapइसे सीधे नहीं कर सकते । ...sइससे अधिक पुनरावृति होती है s, जबकि [...s]पुनरावृति को एक sवर्ण में परिवर्तित करता है, प्रभावी रूप से वर्णों की एक श्रेणी में विभाजित करता है।
नील

4

सी, 211 196 बाइट्स

यहाँ पहले प्रस्तुत ... काफी लंबा दिखता है और मैं देखता हूं कि यह एक कुशल दृष्टिकोण नहीं है, लेकिन कम से कम यह काम करता है :)

f(char*n){char*k=" abcdefghijklmnopqrstuvwxyz";int t[]={0,3,3,3,3,3,4,3,4};int l=0,s,j,i;while(*n){i=0;while(k[i]){if(k[i]==*n){s=0;for(j=0;s<i-t[j];s+=t[j++]);*n++;l+=(!i?1:i-s);}i++;}}return l;}

Ungolfed संस्करण:

int f(char *n){
  char *k=" abcdefghijklmnopqrstuvwxyz";
  int t[]={0,3,3,3,3,3,4,3,4};
  int l=0,s,j,i;
  while(*n){                          // loop through input characters
    i=0;
    while(k[i]){
      if(k[i]==*n){                   // find matching char in k
        s=0;
        for(j=0;s<i-t[j];s+=t[j++]);  // sum up the "key sizes" up to the key found
        *n++;
        l+=(!i?1:i-s);                // key presses are i-s except for space (1)
      }
      i++;
    }
  }
  return l;
}

*(k+i)हो सकता है k[i]
कैलक्यूलेटरफैनलाइन

आप किसी स्थान *(जैसे char*n) के बाद स्थान में कटौती कर सकते हैं , और अपनी घोषणाओं को अपने खाली forविवरण में जोड़ सकते हैं ( int s=0,j=0;(for(;आपके पास for(int s=0,k=0;) और i==0उपयोग के बजाय!i
Tas

उन संकेतों के लिए धन्यवाद। मैं sलूप के लिए नहीं डाल सकता क्योंकि मैं इसे बाद में उपयोग करता हूं, लेकिन मैंने intघोषणाओं को एक साथ रखा और असाइनमेंट्स का उपयोग किया जहां मुझे उनकी आवश्यकता थी।
dbuchmann

एक साथी सी गोल्फर! वैसे भी, कुछ संकेत: छोरों के लिए कड़ाई से बेहतर हैं जबकि लगभग सभी परिस्थितियों में छोरों - मुक्त अर्धविराम का लाभ उठाते हैं, विशेष रूप से पुनरावृत्ति अभिव्यक्ति में। अधिकांश स्थानों पर अर्धविरामों के बजाय अल्पविरामों का उपयोग करें, इससे आप अधिकांश स्थानों पर घुंघराले ब्रेसिज़ नहीं पा सकते हैं। अन्य अनुकूलन भी हैं, लेकिन वे अधिक निर्भर हैं कि आप सी के किस संस्करण का संकलन करते हैं।
dj0wns

4

हास्केल - 74 71 62 बाइट्स

संपादित करें: फ़िल्टर के बजाय सूची समझ का उपयोग करके 3 बाइट्स निकाले

संपादित करें: Siracusa, Laikoni और Zgarb के लिए 9 बाइट्स सहेजें!

f=sum.(>>= \x->1:[1|y<-"bcceffhiikllnooqrrsssuvvxyyzzz",y==x])

प्रयोग

λ> f "candela"
13
λ>

इसे ऑनलाइन आज़माएं!


डुप्लिकेट पत्रों का उद्देश्य क्या है?
श्री Xcoder

@ Mr.Xcoder यह नलों को गिनने के लिए उपयोग किया जाता है, मैं एक स्पष्टीकरण जोड़ूंगा।
हेनरी

आप दोबारा लिख कर एक बाइट बचा सकते हैं fकरने के लिए f=length.(=<<)(\x->x:[y|y<-l,y==x])है, जहां (=<<)है concatMapयहाँ।
सिरकुसा

और एक और एक के साथ वापस जाने के लिए filter:f=length.(=<<)(\x->x:filter(==x)l)
सिराकुसा

1
जैसा कि आप lकेवल एक बार उपयोग करते हैं, यह इनलेट हो सकता है।
लकोनी


3

क्लोजर, 82 76 बाइट्स

#(apply +(for[c %](+(count(filter #{c}"bcceffhiikllnooqrrsssuvvxyyzzz"))1)))

ओह, यह सिर्फ filterऔर केवल countउपयोग करने के लिए सरल है frequencies। मूल:

#(apply +(count %)(for[c %](get(frequencies"bcceffhiikllnooqrrsssuvvxyyzzz")c 0)))

स्ट्रिंग एक बार दिए गए वर्ण के लिए कुंजी को दबाने के लिए केवल एक बार कितनी बार एनकोड करती है :)





2

जावा, 95 73 बाइट्स

a->a.chars().map(b->1+(b<64?0:b+(Math.abs(b-115)<4?4:5))%(3+b/112)).sum()

समारोह को लंबोदर अभिव्यक्ति (जहां aप्रकार का है String) बनाने के लिए केविन क्रूज़सेन का धन्यवाद । 95 बाइट्स बन गए 73 बाइट्स!

एक लैम्ब्डा एक्सप्रेशन से प्रत्येक वर्ण के प्रेस काउंट को प्रयोग किया जाता है map()map()इस गणित का उपयोग करके प्रत्येक चरित्र (ASCII को लोअर केस रेंज में 97-122) में स्ट्रीम किया जाता है (सरल आरी की लहर की तरह दिखता है, लेकिन दोनों चक्रों को ध्यान में रखते हुए) 1+(b<64?0:b+(Math.abs(b-115)<4?4:5))%(3+b/112)यहाँ उस मॉडल का एक ग्राफ ग्राफ है।


लूपहोल सूची कहती है कि कोड स्निपेट पोस्ट नहीं करना चाहिए, भले ही ऐसा लगता है कि अब तक सभी ने ऐसा किया है। किसी भी तरह से, मेरा पूरा कार्यक्रम 130 बाइट्स है । यहाँ यह है:interface Z{static void main(String a){System.out.print(a.chars().map(b->1+(b<64?0:b+(Math.abs(b-115)<4?4:5))%(3+b/112)).sum());}}
एडम मेंडेनहॉल

1
PPCG में आपका स्वागत है! आप वास्तव में सही हैं कि स्निपेट्स की अनुमति नहीं है, लेकिन डिफ़ॉल्ट प्रोग्राम या फ़ंक्शन है । और जावा 8 के साथ आप लैम्ब्डा का उपयोग कर सकते हैं। तो इस मामले a->{return a.chars().map(b->1+(b<64?0:b+(Math.abs(b-115)<4?4:5))%(3+b/112)).sum();}में अनुमति है। और चूंकि यह एक एकल वापसी विवरण है, a->a.chars().map(b->1+(b<64?0:b+(Math.abs(b-115)<4?4:5))%(3+b/112)).sum()( 73 बाइट्स ) आपका उत्तर होगा। इसके अलावा, यहाँ आपके उत्तर का एक TryItOnline- लिंक है जिसे आप अपने उत्तर में जोड़ना चाहते हैं। फिर से: आपका स्वागत है, और अच्छा जवाब है। मुझ से +1।
केविन क्रूज़सेन

2
मेमनों के बारे में कुछ बातें ध्यान दें। आपको न तो f=अग्रणी अर्ध-उपनिवेश की गिनती करनी है और न ही करनी है ;। और तुम भी रूप में आप का उल्लेख किस प्रकार है (ताकि बजाय पैरामीटर के प्रकार के लंबे समय के रूप में जोड़ने के लिए की जरूरत नहीं है (String a)->आप उपयोग कर सकते हैं a->और उल्लेख है कि इनपुट aएक है Stringआपका जवाब में)। ओह, और युक्तियों के लिए जावा और गोल्फ में गोल्फ के लिए युक्तियाँ <सभी भाषाओं> पढ़ने के लिए दिलचस्प हो सकता है, अगर आपने अभी तक नहीं किया है।
केविन क्रूज़सेन

1

मैथेमेटिका, 83 बाइट्स

c=Characters;Tr[Tr@Mod[c@"bc1def1ghi1jkl1mno1pqrstuv1wxyz "~Position~#,4]+1&/@c@#]&

यह आम तौर पर स्वीकार किया जाता है कि गणित के जवाबों को स्ट्रिंग चर के लिए वर्णों की सूची का उपयोग करने की अनुमति है, जैसे कि इस फ़ंक्शन के इनपुट। (इसके अलावा aशुरू में एक लापता है "bc1..."?)
ग्रेग मार्टिन

यह कोड है। गोल्फ बिना सही परिणाम देता है। "Tr" काम करता है
J42161217

1

QBIC , 94 बाइट्स

[_l;||_SA,a,1|p=p-(instr(@sz`,B)>0)-(instr(@cfilorvy`+C,B)>0)-(instr(@behknqux`+C+D,B)>0)+1}?p

व्याख्या

[    |      FOR a = 1 TO
 _l |         the length of
   ;            the input string (A$)
_SA,a,1|    Take the a'th char of A$ and assign it to B$
p=p         p is our tap-counter, and in each iteration it gets increased by the code below
            which consist of this pattern:
                instr(@xyz`,B)>0    where 
                - instr tests if arg 2 is in arg 1 (it either returns 0 or X where X is the index of a2 in a1)
                - @...` defines the letters we want to test as arg1
                - B is the current letter to count the taps for
            Each of these blocks adds 1 tap to the counter, and each block has the letters of its level
            (4-taps, 3-taps or 2-taps) and the level 'above' it.
    -(instr(@sz`,B)>0)              <-- letters that require 4 taps
    -(instr(@cfilorvy`+C,B)>0)      <-- 3 or 4 taps
    -(instr(@behknqux`+C+D,B)>0)    <-- 2, 3,or 4 taps
    +1                              <-- and always a 1-tap
}           NEXT
?p          PRINT the number of taps

1

बैश ,69 68 बाइट्स

bc<<<`fold -1|tr "\n "adgjmptwbehknquxcfilorvysz +[1*9][2*8][3*8]44`

इसे ऑनलाइन आज़माएं!

प्रति पंक्ति एक फोल्ड, प्रत्येक न्यूलाइन के साथ +, प्रत्येक स्थान के साथ 1और प्रत्येक अक्षर को पुशर्स की संबंधित संख्या के साथ अनुवाद करता है। bc योग करता है।


आपकी मशीन पर आपको जरूरत पड़ सकती हैbc <(fold -1|tr "\n "adgjmptwbehknquxcfilorvysz +[1*9][2*8][3*8]44;echo 0)
marcosm

1

सी, 92 88 बाइट्स

c,n;f(char*s){n=0;while(c=*s++)n+=(c=='s')+3*(c>'y')+1+(c+1+(c<'s'))%3-(c<33);return n;}

आप के साथ s=nबदलने के लिए return n, और गठबंधन कर सकते हैं । यह 9 बाइट्स छोटा हो सकता है। s++;c=*s
कीउ गण

@KeyuGan s=nकाम नहीं करेगा, क्योंकि sएक स्थानीय है। और *s=nकाम नहीं करेगा क्योंकि केवल CHAR_BITबिट्स हैं *s, जो कुछ संदेशों के लिए पर्याप्त नहीं होंगे। लेकिन आप इसके बारे में सही हैं s++। धन्यवाद।
रे

1

एपीएल (डायलॉग) , 36 बाइट्स

{+/(3×⍵∊'sz'),1+31+⍵⍳⍨819⌶⎕A~'SZ'}

इसे ऑनलाइन आज़माएं!

S और Z के बिना वर्णमाला में mod-3 सूचकांकों को ढूँढता है । चूंकि अंतरिक्ष, एस , और जेड नहीं पाए जाते हैं, उनके पास "सूचकांक 25" (अधिकतम सूचकांक से एक अधिक) है, जो अंतरिक्ष के लिए अच्छा है। फिर हमें प्रत्येक एस या जेड के लिए 3 जोड़ने की आवश्यकता है ।

{ अनाम फ़ंक्शन जहां तर्क को is द्वारा दर्शाया गया है :

⎕A~'SZ' अपरकेस एक lphabet, के अलावा एस और जेड

819⌶ लोअरकेस

⍵⍳⍨ɩ कि में तर्क के ndices

¯1+ नकारात्मक जोड़ें

3| आधुनिक -3

1+ एक जोड़ें (यह सभी 0-mods को 3 में कनवर्ट करता है)

(... ), आगे जोड़ते:

  ⍵∊'sz' बूलियन जहां तर्क या तो एस या जेड है

   3 से गुणा करें

+/ योग



1

पिप , 100 90 बाइट्स

a:qb:["abc""def""ghi""jkl""mno""pqrs""tuv""wxyz"s]Fc,#a{Fd,#b{e:((bd)@?(ac))e<4?i+:e+1x}}i

बी के प्रत्येक तत्व में एक मैच के लिए इनपुट के प्रत्येक चरित्र की जांच करें। उस मैच का सूचकांक प्लस 1 कुल में जुड़ जाता है।

इसे ऑनलाइन आज़माएं!

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