ফোন মাল্টি-ট্যাপ বানান


21

গুগল কোড চ্যালেঞ্জ দ্বারা অনুপ্রাণিত :

লাতিন বর্ণমালায় 26 টি অক্ষর রয়েছে এবং টেলিফোনে কীপ্যাডে কেবল দশটি অঙ্ক থাকে। আমরা পছন্দসই অক্ষরগুলি নির্দেশ করতে কীপ্রেসগুলির ক্রম ব্যবহার করে আপনার বন্ধুর কাছে একটি বার্তা লিখতে আরও সহজ করতে চাই। বর্ণগুলি নীচে প্রদর্শিত হিসাবে অঙ্কগুলিতে ম্যাপ করা হয়। উদাহরণস্বরূপ বি চরিত্রটি সন্নিবেশ করানোর জন্য, প্রোগ্রামটি 22 টি চাপবে same একই কী থেকে ক্রমিকভাবে দুটি অক্ষর সন্নিবেশ করতে, ব্যবহারকারীর দ্বিতীয় বার কীটি টিপানোর আগে বিরতি দিতে হবে। বিরতি নির্দেশ করতে স্পেস অক্ষর '' মুদ্রণ করা উচিত। উদাহরণস্বরূপ, 2 2 এএ এবং 22 টি বি নির্দেশ করে indicates

প্রতিটি বার্তায় কেবল ছোট হাতের অক্ষর অ্যাজ এবং স্পেস অক্ষর থাকবে ''। শূন্য টিপলে একটি স্থান নির্গত হয়।

এখানে চিত্র বর্ণনা লিখুন

আপনার চ্যালেঞ্জটি হ'ল ক্ষুদ্রতম ফাংশনটি লিখুন যা ইনপুট স্ট্রিং গ্রহণ করে এবং স্ট্রিপ হিসাবে স্ট্রাউট হিসাবে আউটপুট উত্পাদন করতে প্রয়োজনীয় কীপ্রেসের ক্রমটি ফেরত দেয় বা স্টডআউটে আউটপুট দেয়। যে ফাংশনটি সর্বনিম্ন পরিমাণে বাইট জেতা।

উদাহরণ ইনপুট / আউটপুট

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

অন্যান্য ব্যাখ্যা

  • একটু থামেন আবশ্যক শুধুমাত্র যখন প্রয়োজন যোগ করা এবং ব্যবধানের '' হতে হবে।
  • প্রতিটি বার্তায় কেবল ছোট হাতের অক্ষর অ্যাজ এবং স্পেস অক্ষর থাকবে ''। 0স্পেসগুলি বোঝাতে মুদ্রণ করুন ।
  • বাহ্যিক গ্রন্থাগার নেই।
  • আপনার ফাংশনে কেবল ইনপুট স্ট্রিংই যেতে পারে।
  • অন্যান্য ভাষাগুলিকে প্রতিযোগিতামূলক করার জন্য, প্রাথমিক ফাংশন ঘোষণার গণনা হয় না এবং অন্যান্য মানক গ্রন্থাগারও আমদানি করে না। #includes, imports এবং usings গণনা করে না অন্য সব কিছু করে। এর মধ্যে #defineএস এবং সহায়ক ফাংশন অন্তর্ভুক্ত রয়েছে । আপনি বিভ্রান্ত হলে এই প্রশ্নে বিধি 2 দেখুন ।
  • একাধিক স্পেস হিসাবে চিহ্নিত করা যেতে পারে 00বা 0 0যেহেতু আপনাকে সত্যই কোনও জায়গার মাঝে বিরতি দিতে হবে না


আমরা কি অনুমান করতে পারি যে ইনপুটটি ছোট / বড় হাতের?
ফিল এইচ

@ ফিল্ম " ছোট হাতের অক্ষর এজি এবং স্পেস অক্ষর '" "
ড্যানি

আপনি বন্ধনীগুলি {}ফাংশন স্বাক্ষরের একটি অংশ বিবেচনা করেন ? উদাহরণস্বরূপ, যদি আমার কোড হয় তবে function f(){alert('hi');}আমি alert('hi');বা এর অক্ষরগুলি গণনা করব {alert('hi');}?
প্রোগ্রামফক্স

2
যতদূর আমি মনে করি t9ভিন্নভাবে কাজ করে: একটি শব্দ পেতে আপনাকে প্রতিটি কী একবারে ক্লিক করতে হবে।
ভিজিওন

উত্তর:


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

অক্ষরগুলি প্রথমে সংখ্যার সিরিজে ম্যাপ করা হয়: - একটি থেকে 2 - বি থেকে 22 - ডি থেকে 3222 - ঘন্টা 444333222

একটি রেজেক্স এক্সপ্রেশন তখন সমান সংখ্যার প্রথম গোষ্ঠীর সাথে মেলে

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

অ্যারে যোগ দেওয়া হয়েছে

*' ')

"ডিজিট স্পেস আলাদা_ডিজিট" এর উপস্থিতিতে সমস্ত স্থান ফাঁকা হয়ে যায়

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

1
সঠিকভাবে কাজ করার জন্য 100% দেখায় না। আমি দেখতে পাচ্ছি যে 66666 টি কখনও টানা 4 বার টিপতে হবে না।
ড্যানি

স্থির করা উচিত, ধন্যবাদ;)
ডেভিড হারম্যান

1
\2চূড়ান্ত রেইগেক্সের মূল বিষয় কী ? অবশ্যই দ্বিতীয় গ্রুপটি একটি শূন্য প্রস্থের জোর?
পিটার টেলর

তুমি একদমই সঠিক!
ডেভিড হার্মান

6

বিদ্রোহী - 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

আমি আপনার লিঙ্কগুলি কখনই লোড করতে পারব না! :(
লুসার ড্রাগ

4

জাভাস্ক্রিপ্ট (124)

ফায়ারফক্সে চালান।

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

4

গল্ফস্ক্রিপ্ট, 46 টি অক্ষর

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

যথারীতি স্ট্যান্ডিন থেকে স্টপআউট প্রিন্ট করে input অনলাইন ডেমো দেখুন (টিনজাত ইনপুট সহ)।

নোট করুন যে এই কোডটি ইনপুট স্পপের (কেবলমাত্র ছোট অক্ষর এবং ফাঁকা স্থানগুলি) খুব কঠোর ব্যাখ্যার উপর নির্ভর করে: বিশেষত ইনপুটটির যে কোনও নতুন লাইন এটি ক্র্যাশ করবে! n-কোনও নতুনলাইন আউট ফিল্টার করার কোডটি প্রিপেন্ড করে এই সমস্যাটি দুটি অতিরিক্ত অক্ষরের বিনিময়ে স্থির করা যেতে পারে ।


3

সি ++ - 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.
ব্যবহারকারী 12205

@ অবশ্যই নিশ্চিত জিনিস।
হোশেচ 5050

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

এখানে আমার পূর্ববর্তী সমাধানটি 12 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

সি, 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

সি: 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

জাভা - 243

বেশ নিষ্পাপ জাভা সমাধান। পরামর্শের জন্য মন্তব্যকারীদের ধন্যবাদ।

একটি বাগ ঠিক করা হয়েছে যা কখনও কখনও অপ্রয়োজনীয় স্পেস inোকায়, যেমন ইনপুটটির জন্য "হ্যালো ওয়ার্ল্ডস সাপ"।

    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
খুব ভাল, তবে আপনাকে এটি গল্ফ করে স্কোর সরবরাহ করা দরকার।
হোসচ 250

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বা, নিরবচ্ছিন্ন, y←(0.315×⍳25),7.99 ◇ 2+⌊y1 থেকে 25 পর্যন্ত পয়েন্টগুলিতে উপযুক্ত কাত হওয়া লাইন (y = 0.315 x) নমুনাগুলি; লাইনটি এমনভাবে কাত হয়ে থাকে যে এই y মানেরগুলির তলটি পুনরাবৃত্তি প্যাটার্নটি অনুসরণ করে 000111 ... 777 সংখ্যার ষষ্ঠ গ্রুপ বাদে 5555; চতুর্থ 7 পেতে একটি সংখ্যা শেষে সংযোজন করা হয়েছে, যাতে চূড়ান্ত অ্যারে প্লাস 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 হয়;
  • { ... }/( ... )[ ... ] পরবর্তী ফলাফলটি গ্রহণ করে প্রতিটি ইনপুট চরের জন্য সূচক, প্রতিটি চরকে অঙ্কের সংশ্লিষ্ট স্ট্রিংয়ে অনুবাদ করতে, তারপরে বন্ধনীগুলিতে ফাংশনটি ব্যবহার করে স্ট্রিংগুলি সংযুক্ত করে;
  • {⍵,⍨⍺,''↑⍨=/↑¨⍺⍵}বা {(⍺,(=/↑¨⍺,⍵)↑''),⍵}প্রতিটি নতুন স্ট্রিং সংযোজনকারীকে end সংযুক্ত করে a কেবলমাত্র দুটি আর্গুমেন্ট একই চর দিয়ে শুরু করলে একটি একক স্পেস ইন্টারপোস করে।

উদাহরণ

      {{⍵,⍨⍺,''↑⍨=/↑¨⍺⍵}/('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='')
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.