फोन मल्टी-टैप स्पेलिंग


21

Google कोड चुनौती से प्रेरित :

लैटिन वर्णमाला में 26 वर्ण होते हैं और टेलीफोन कीपैड पर केवल दस अंक होते हैं। हम वांछित पात्रों को इंगित करने के लिए कुंजी के अनुक्रम का उपयोग करके अपने मित्र को एक संदेश लिखना आसान बनाना चाहते हैं। अक्षरों को अंकों पर मैप किया जाता है जैसा कि नीचे दिखाया गया है। उदाहरण के लिए, चरित्र B को सम्मिलित करने के लिए, प्रोग्राम 22 को दबाएगा। एक ही कुंजी से अनुक्रम में दो वर्ण सम्मिलित करने के लिए, उपयोगकर्ता को दूसरी बार कुंजी दबाने से पहले रुकना होगा। एक ठहराव को इंगित करने के लिए अंतरिक्ष वर्ण '' को मुद्रित किया जाना चाहिए। उदाहरण के लिए, 2 2 एए इंगित करता है जबकि 22 बी इंगित करता है।

प्रत्येक संदेश में केवल लोअरकेस वर्ण az और स्पेस वर्ण '' शामिल होंगे। शून्य को दबाने से स्थान खाली हो जाता है।

यहाँ छवि विवरण दर्ज करें

आपकी चुनौती सबसे छोटे फ़ंक्शन को लिखना है जो इनपुट स्ट्रिंग लेता है, और इनपुट के उत्पादन के लिए आवश्यक कुंजी के अनुक्रम को स्ट्रिंग के रूप में देता है या इसे स्टडआउट करने के लिए आउटपुट करता है। फ़ंक्शन जो बाइट्स कम से कम राशि जीतता है।

उदाहरण इनपुट / आउटपुट

phone("hi")
44 444
phone("hello world")
4433555 555666096667775553

अन्य स्पष्टीकरण

  • विराम चाहिए केवल जब आवश्यक जोड़ दिया और एक अंतरिक्ष '' होना चाहिए।
  • प्रत्येक संदेश में केवल लोअरकेस वर्ण az और स्पेस वर्ण '' शामिल होंगे। 0रिक्त स्थान को दर्शाने के लिए प्रिंट करें ।
  • कोई बाहरी पुस्तकालय नहीं।
  • केवल इनपुट स्ट्रिंग को आपके फंक्शन में पास किया जा सकता है।
  • अन्य भाषाओं को प्रतिस्पर्धी बनाने के लिए, प्राथमिक फ़ंक्शन घोषणा की गिनती नहीं है, और न ही अन्य मानक पुस्तकालयों का आयात करता है। #includeएस, importएस, और usingएस की गिनती नहीं है। बाकी सब करता है। इसमें #defines और सहायक कार्य शामिल हैं। नियम 2 को इस प्रश्न में देखें कि क्या आप भ्रमित हैं।
  • एकाधिक रिक्त स्थान के रूप में निरूपित किया जा सकता है 00या 0 0एक स्थान के बीच थामने के बाद से तुम सच में नहीं है


क्या हम मान सकते हैं कि इनपुट कम / ऊपरी है?
फिल एच।

@PhilH " अक्षर अक्षर az और अंतरिक्ष वर्ण ''"
डैनी

क्या आप कोष्ठक {}को फ़ंक्शन हस्ताक्षर का हिस्सा मानते हैं ? उदाहरण के लिए, यदि मेरा कोड है function f(){alert('hi');}, तो क्या मुझे वर्णों की गणना करनी चाहिए alert('hi');या {alert('hi');}?
प्रोग्राम फॉक्स

2
जहाँ तक मुझे याद t9है कि अलग तरीके से काम करता है: आपको एक शब्द प्राप्त करने के लिए प्रत्येक कुंजी पर एक बार क्लिक करना होगा।
18 दिसंबर को VisioN

जवाबों:


8

माणिक, 129 122 115 111 108 107 105

गोल्फ के साथ किया ...

उफ़, पूरी तरह से अनावश्यक स्थानों को हटाने के लिए भूल गया - तय ...

पीटर टेलर की बदौलत 2 चार्ट सहेजे गए।

ऑनलाइन संस्करण

def t9(t)
(t.tr(" ",?`).bytes.map{|c|"09998887777666555444333222"[96-c..-1][/(.)\1*/]}*' ').gsub /(\d) (?!\1)/,'\1'
end

स्पष्टीकरण:

अंतरिक्ष का अनुवाद अध्यादेश 96 के साथ किया जाता है

(t.tr(" ",?`).bytes

वर्णों को पहले संख्याओं की श्रृंखला में मैप किया जाता है: - a से 2 - b से 22 - d से 3222 - h से 444333222

एक रेगेक्स अभिव्यक्ति तब समान अंकों के पहले समूह से मेल खाती है

map{|c|"09998887777666555444333222"[96-c..-1][/(.)\1*/]}

सरणी में शामिल हो गया है

*' ')

"अंक स्थान different_digit" की घटनाओं में सभी रिक्त स्थान हटा दिए जाते हैं

gsub /(\d) (?!\1)/,'\1'

1
100% सही काम नहीं करता है। मुझे लगता है कि 66666 को कभी भी 4 बार प्रेस करने की आवश्यकता नहीं होनी चाहिए।
डैनी

तय किया जाना चाहिए, धन्यवाद;)
डेविड हेरमैन

1
\2उस अंतिम रेगेक्स का क्या मतलब है ? निश्चित रूप से दूसरा समूह शून्य-चौड़ाई का दावा है?
पीटर टेलर

आप बिल्कुल सही कह रहे है!
डेविड हेरमैन

6

REBEL - 154 110 103

;0 2abc3def4ghi5jkl6mno7pqrs8tuv9wxyz/^;/$<;/([^\d-])(?=\D.*(\d)(\w)*\1)/$2$3-/(\d)-+\1/$1 $1/-//;/$>$`

यह 'फ़ंक्शन' स्टडिन से इनपुट स्वीकार करता है और स्टडआउट को परिणाम भेजता है।

टेस्ट रन (ताकि आपको दुभाषिए को स्थापित करने की आवश्यकता न हो):

hi
44 444

hello world
4433555 555666096667775553

yes
999337777

kthxbai
558449922 2444

मुझे आपके लिंक लोड करने के लिए कभी नहीं मिल सकते हैं! :(
लूसर ने 6

4

जावास्क्रिप्ट (124)

फ़ायरफ़ॉक्स में चलाएं।

t9=s=>s.replace(/./g,c=>'099998887777666555444333222'.slice(36-parseInt(c,36)).match(/(.)\1*/)[0]+' ').replace(/(.) (?!\1)/g,'$1')

4

GolfScript, 46 वर्ण

{).," adgjmptw"&.,.1>*`@@)\;-*}/]{.2$^!" "*\}*

हमेशा की तरह, स्टड से इनपुट पढ़ता है, प्रिंट से स्टडआउट करता है। देखें (डिब्बा बंद इनपुट के साथ) ऑनलाइन डेमो।

ध्यान दें कि यह कोड इनपुट युक्ति (केवल लोअरकेस अक्षर और रिक्त स्थान) की बहुत सख्त व्याख्या पर निर्भर करता है: विशेष रूप से, इनपुट में कोई भी नया अंक इसे क्रैश कर देगा! यह मुद्दा दो अतिरिक्त वर्णों की कीमत पर तय किया जा सकता है, n-किसी भी नई रूपरेखा को फ़िल्टर करने के लिए कोड को प्रस्तुत करने से।


3

C ++ - 365 वर्ण बिना int main(){}

#include<iostream>
#include<string>
#include<cmath>
#define o std::cout<<
int main(){std::string s;getline(std::cin,s);for(int i=0;i<s.size();i++){if(s[i]==32)o 0;int j=s[i]-97;if(i>0&&j/3==(s[i-1]-97)/3)o ' ';if(-1<j&j<15){for(int k=j-j%3-1;k<j;k++)o 2+j/3;}if(14<j&j<19){for(int k=14;k<j;k++)o 7;}if(18<j&j<22){for(int k=18;k<j;k++)o 8;}if(21<j&j<26){for(int k=21;k<j;k++)o 9;}}}

यहाँ मेरे उत्तर के रूप में एक ही तर्क का उपयोग करता है , केवल forप्रत्येक अक्षर को आउटपुट करने के लिए लूप का उपयोग करके उपयुक्त संख्या में।


आप उपयोग कर सकते हैं s[i]==32के बजाय s[i]==' '। अंतरिक्ष का ASCII मान 32 है।
user12205

@ पासी बात।
होशो

3

पर्ल - 107 110

$_=<>;y/ /0/;$z='a';$==2;for$l((3)x5,4,3,4){for$q(1..$l){s/$z/$=x$q.$"/ge,$z++}$=++}s/(.) (?!\1)/\1/g;print

120 128 130 155 में मेरा पिछला समाधान यहां है :

$_=<>;s//_/g;y/sz/79/;for$x(cfilorvy,behknqux,adgjmptw){s/(\d)_/\1\1_/g,eval"y/$x/2-9/"}y/ _/0 /;s/(.) (?!\1)/\1/g;print

टेस्ट:

hi
 44 444

hello world
 4433555 555666096667775553

jackdaws loves my big sphinx
 52 222553297777055566688833777706999022444 407777 744 4446699

3

VBA 220 253/258/219

Functionयहां लाइनों की गिनती नहीं :

साथ String, 253 :

Function t(s)
For Each c In Split(StrConv(s,64),Chr(0))
If c<>""Then If c=" "Then t=t & 0 Else b=Asc(c)-91:n=String(IIf(b>27,(b-4)Mod 4+1,IIf(b>23,(b-1)Mod 4+1,b Mod 3+1)),Trim(Str(Int(b/3)-IIf(b=24Or b=27Or b>29,1,0)))):t=t &IIf(Right(t,1)=Left(n,1)," " &n,n)
Next
End Function

Forलूप के साथ 258 :

7/9 कुंजी के लिए सुधार जोड़े गए (धन्यवाद, डैनी), जिसमें बहुत सारे वर्ण जोड़े गए थे।

Function t(s)
For Each c In Split(StrConv(s,64),Chr(0))
If c<>""Then
n=""
b=Asc(c)-91
For i=1To IIf(b>27,(b-4)Mod 4+1,IIf(b>23,(b-1)Mod 4+1,b Mod 3+1))
n=n &Int(b/3)-IIf(b=24Or b=27Or b>29,1,0)
Next
t=t &IIf(c=" ",0,IIf(Right(t,1)=Left(n,1)," " &n,n))
End If
Next
End Function

Choose 219 का उपयोग करना :

मैं, यह एक साथ चलाने के लिए नहीं करना चाहता था के बाद से कार्यक्षमता में और अधिक बुनियादी है, लेकिन यह है कम कोड ...

Function t(s)
For Each c In Split(StrConv(s,64),Chr(0))
If c<>"" Then:b=Asc(c)-96:n=Choose(b,2,22,222,3,33,333,4,44,444,5,55,555,6,66,666,7,77,777,7777,8,88,888,9,99,999,9999):t=t &IIf(c=" ",0,IIf(Right(t,1)=Left(n,1)," " &n,n))
Next
End Function

yesहोना चाहिए 999337777। मैं 10338आपके फ़ंक्शन का उपयोग कर रहा हूं ।
डैनी

3

C, 165 163 153 149 138 चार

k(char*s){char*m="`cfilosvz",l=0,i,c;while(*s^0){for(i=0;*s>m[i];i++);c=*s-m[i-1];i==0?i=-1,c=1:i==l?putchar(32):1;while(c--)putchar(i+49);l=i;s++;}}

कोड गोल्फिंग में मेरा पहला प्रयास, किसी भी सुझाव की सराहना की है।


2

सी ++ - 170 168 160

golfed:

#define t std::cout<< 
void g(char*s){char v,p,b,l=1;while(*s){v=*s++-97;p=(v==18)+(v==25)+(v-=v/18+v/25)%3;b=v<0?48:v/3+50;if(l==b)t' ';while(p--+1){t(l=b);}}}

Ungolfed

void numpresses(char* s)
{
char lastbutton = 1;
const char asciiOffset = 97;

while(*s)
{
    char val = *s++ - asciiOffset;

    char presses = 
        (val == 18) + (val == 25)           //Z and S are special cases. Check for their ascii codes.
        + (val -= val / 18 + val / 25) % 3; //Simple mod 3 for number of presses. Also apply offset for characters above s and z.

    char button =
        val < 0                             //If the character is a space...
        ? '0'                               //The button character needs to be 0
        : val / 3 + '2';                    //Buttons are offset by the ascii code for the number 2


    if (lastbutton == button)               //Add a space if we need to pause
    {
        std::cout << ' ';
    }

    while (presses-- + 1)                   //Print the button once for each press required
    {
        std::cout << button;
        lastbutton = button;            
    }
}
}

2

C: 136 वर्ण

p(char*s){int i,c,l=1;while(c=*s%32,*s++)for(i=l!=(l=(c+149-c/18-c/25)/3-!c);i++<(c-!!c-c/18-c/25)%3+(c==19)+c/26+2;putchar(i^1?l:32));}

और थोड़ा असंतुष्ट (हाँ, यह इस तरह लिखा गया था):

p(char*s){
        int i,c,l=1;
        while(c=*s%32,*s++)for(
                i=l!=(l=(c+149-c/18-c/25)/3-!c);
                i++<(c-!!c-c/18-c/25)%3+(c==19)+c/26+2;
                putchar(i^1?l:32)
        );
}

मैं कुछ पुनरावृत्ति, काला जादू और उचित मात्रा में मिर्च पाउडर लगाकर इसे थोड़ा कम करने में सक्षम हो सकता हूं।


2

जावा - २४३

सुंदर भोला जावा समाधान। सुझाव के लिए टिप्पणीकारों को धन्यवाद।

एक बग फिक्स्ड जो कभी-कभी अनावश्यक स्थानों को सम्मिलित करता है, उदाहरण के लिए "हेलो वर्ल्ड्स सुपर" इनपुट के लिए।

    private static void t9(String s) {
        String[]t=",,abc,def,ghi,jkl,mno,pqrs,tuv,wxyz".split(",");String o="";int i,j,k,l=0;for(char c:s.toCharArray()){if(c==32){o+='0';l=0;}else for(j=0;j<10;j++){int n=t[j].indexOf(c);if(n>=0){if(j==l)o+=' ';for(k=0;k<n+1;k++)o+=j;l=j;}}}return o;
    }

4
बहुत अच्छा है, लेकिन आपको इसे गोल करने और स्कोर प्रदान करने की आवश्यकता है।
१२:२४ बजे होसच

1
मुझे लगता है कि यह है java। क्या आप इसे अपनी हेडिंग में रख सकते हैं, जैसे अन्य उत्तर देते हैं?
डिजिटल ट्रामा

1
एक गोल्फ: की जगह t.lengthके साथ10
जस्टिन

इसके अलावा, इस पर विचार करने के iलिए केवल इसका उपयोग करने के लिए उपयोग किया जाता है String, इसे हटा दें और एक फाड़नेवाला लूप करें:for(char c:s.toCharArray())
जस्टिन

इसके अलावा, परिवर्तन if(c==' '){o+='0';continue;}करने के लिए if(c==' ')o+='0';else{और उचित जोड़ने }
जस्टिन

1

कॉफीस्क्रिप्ट - 202 (210 - 8)

t9=(s)->
    t=[3,3,3,3,3,4,3,4];l=-1;r=""
    for c in s
        n="";d=c.charCodeAt(0)-96
        if c is ' '
            n=0
        else((n+=k+2 for x in[0...d];break)if d<=v;d-=v)for v,k in t
        r+=if n[0]is l[0] then " "+n else n
        l=n
    r

1

एपीएल, 77 चार्ट

{{⍵,⍨⍺,''↑⍨=/↑¨⍺⍵}/('0',⍨(⌈3.1×y-⌊y)/¨⍕¨2+⌊y←7.99,⍨.315×⍳25)[⍵⍳⍨⎕UCS 96+⍳26]}

व्याख्या

  • 2+⌊y←7.99,⍨.315×⍳25या, ungolfed, y←(0.315×⍳25),7.99 ◇ 2+⌊y1 से 25 तक के बिंदुओं पर एक उपयुक्त रूप से झुकी हुई रेखा (y = 0.315 x) का नमूना लेता है ; लाइन इस तरह से झुकी हुई है कि इन y मानों की मंजिल दोहराव पैटर्न 000111 ... 777 को छठे अंकों के 5555 समूह को छोड़कर; चौथे नंबर को पाने के लिए अंत में एक नंबर जोड़ा जाता है, ताकि अंतिम सरणी प्लस 2 22233344455566677778889999 हो;
  • ⌈3.1×y-⌊y उन y मानों और उनकी मंजिलों के बीच अंतर को बढ़ाता है, ताकि मतभेदों की छत पैटर्न को 123123 दें ... 4 अंकों के दो समूहों के अंतिम अंकों पर 4 के साथ;
  • '0',⍨( ... )/¨⍕¨ ...या (( ... ) /¨ ⍕¨ ...),'0' बाद के परिणाम को पूर्व से डुप्लिकेट अंकों का उपयोग करता है, ताकि आउटपुट स्ट्रिंग्स "2" "22" "222" "3" "33" "333" ... सही "7777" और "के साथ है। 9999 "जगह में, और एक" 0 "अंत तक संलग्न;
  • ⍵⍳⍨⎕UCS 96+⍳26या (⎕UCS 96+⍳26)⍳⍵प्रत्येक इनपुट चार के सूचकांक की गणना करता है, जहां "ए" 1 है, "जेड" 26 है, और अंतरिक्ष (और हर दूसरे चार्ट) 27 है;
  • { ... }/( ... )[ ... ] बाद के परिणाम को लेता है, प्रत्येक इनपुट चार के लिए सूचकांक, प्रत्येक चर को अंकों के संबंधित स्ट्रिंग में अनुवाद करने के लिए, फिर ब्रेसिज़ में फ़ंक्शन का उपयोग करके तारों को समेटता है;
  • {⍵,⍨⍺,''↑⍨=/↑¨⍺⍵}या {(⍺,(=/↑¨⍺,⍵)↑''),⍵}प्रत्येक नए स्ट्रिंग को जमाकर्ता में जोड़ देता है, एक ही स्थान को इंटरप्रोज़ करता है यदि दोनों तर्क एक ही वर्ण से शुरू होते हैं।

उदाहरण

      {{⍵,⍨⍺,''↑⍨=/↑¨⍺⍵}/('0',⍨(⌈3.1×y-⌊y)/¨⍕¨2+⌊y←7.99,⍨.315×⍳25)[⍵⍳⍨⎕UCS 96+⍳26]} 'hello world'
 4433555 555666096667775553 
      {{⍵,⍨⍺,''↑⍨=/↑¨⍺⍵}/('0',⍨(⌈3.1×y-⌊y)/¨⍕¨2+⌊y←7.99,⍨.315×⍳25)[⍵⍳⍨⎕UCS 96+⍳26]} 'the quick brown fox jumped over the lazy dog'
 84433077884442225502277766696603336669905886733 3066688833777084433055529999 999036664 

1

पायथन 155 150

काश मैं इस एक्सडी पर बेहतर होता। कार्य की परिभाषा नहीं गिनी गई। पहला इंडेंटेशन स्तर एक स्थान है, दूसरा एक टैब है, और तीसरा 2 टैब है।

def p(s,l=None):
 for c in s:
    for i,g in enumerate(" ,,abc,def,ghi,jkl,mno,pqrs,tuv,wxyz".split(",")):
        if c in g:print"\b"+[""," "][l==i]+str(i)*(g.index(c)+1),;l=i

0

जावास्क्रिप्ट 234

for(l=-1,r="",I=0,y=(s=prompt()).length;I<y;I++){c=s[I];n="";d=c.charCodeAt(0)-96;if(0>d)n=0;else for(k=J=0;J<8;k=++J){v="33333434"[k];if(d<=v){for(x=K=0;0<=d?K<d:K>d;x=0<=d?++K:--K)n+=k+2;break}d-=v}r+=n[0]==l[0]?" "+n:n;l=n}alert(r)


0

आर 224

मुझे यकीन है कि ऐसा करने का एक बेहतर तरीका है, इसलिए मैं इस पर काम करता रहूंगा।

a=strtoi(charToRaw(scan(,'',sep='\n')),16L)-95;a[a<0]=1;b=c(0,2,22,222,3,33,333,4,44,444,5,55,555,6,66,666,7,77,777,7777,8,88,888,9,99,999,9999)[a];c=append(b[-1],0)%%10;d=b%%10;b[c==d]=paste(b[c==d],'');paste(b,collapse='')
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.