फोन नंबर में पत्र


23

संकट:

आप एक नया फ़ोन बना रहे हैं जहाँ लोग विशेष फ़ोन नंबरों में टाइप कर सकते हैं, उदाहरण के लिए 1-800-program, और वे स्वचालित रूप से एक प्रयोग करने योग्य फ़ोन नंबर में बदल जाएंगे, जैसे 1-800-7764726(पिछले उदाहरण के लिए)।

यदि आपका नंबर, अक्षर और डैश के साथ कोई लंबाई है, और सभी अक्षरों को उनकी संगत संख्या में बदल दें, तो आपका प्रोग्राम एक स्ट्रिंग को पुनः प्राप्त करेगा।

यहाँ एक कीपैड है, संदर्भ के लिए:

कीपैड

नियम:

  • आपके कार्यक्रम को एक स्ट्रिंग प्राप्त होगी
  • यह इसे प्रोसेस करेगा और दूसरा स्ट्रिंग प्रिंट / प्रिंट करेगा
  • किसी भी भाषा को स्वीकार किया जाता है
  • चूंकि यह , सबसे छोटा कोड जीतता है

क्या प्रोग्राम को इनपुट में ऊपरी और निचले दोनों प्रकार के अक्षरों को संभालना चाहिए?
मैटनवपोर्ट

3
@mattnewport - नहीं, मान लें कि वेरिएबल पहले से लोअरकेस में बदल गया है
TheDoctor

जवाबों:


8

GolfScript, 24 वर्ण

{.96>{,91,'qx'+-,3/`}*}%

टेस्ट इनपुट:

0123456789-abcdefghijklmnopqrstuvwxyz

परीक्षण उत्पादन:

0123456789-22233344455566677778889999

स्पष्टीकरण:

  • { }% इनपुट के प्रत्येक वर्ण में ब्रेसिज़ के बीच कोड लागू करता है।

  • .96>{ }* आंतरिक ब्रेसिज़ के बीच कोड निष्पादित करता है अगर और केवल अगर चरित्र का ASCII कोड 96 से अधिक है (यानी यह एक लोअरकेस अक्षर है)।

  • पहले ,अक्षर को कम ASCII कोड के साथ सभी वर्णों की सूची में बदल देता है, और 91,'qx'+-ASCII कोड के साथ सभी वर्णों को 91 से कम, साथ ही अक्षरों qऔर xसूची से फ़िल्टर करता है । इस प्रकार, उदाहरण के लिए, चरित्र a6-वर्ण सूची में बदल जाता है [\]^_`, जबकि z29-वर्ण सूची में बदल जाता है [\]^_`abcdefghijklmnoprstuvwy

  • दूसरा ,सूची में शेष तत्वों को गिनता है, और 3/इस गिनती को तीन (राउंडिंग डाउन) से विभाजित करता है। अंत में, `परिणामी संख्या (सीमा 2 - 9 में) एक स्ट्रिंग में बदल जाती है।

इस प्रकार, कल्पना के अनुसार, हाइफ़न और संख्याओं को अपरिवर्तित छोड़ दिया जाता है, जबकि लोअरकेस अक्षरों को संदर्भ कीपैड आरेख के अनुसार संख्याओं में मैप किया जाता है। कोड वास्तव में निचले अक्षरों (जो वर्णित के रूप में मैप किया गया है) और पात्रों को छोड़कर {, |और }(जो दो-वर्ण स्ट्रिंग के लिए मैप किए गए हैं ) को छोड़कर सभी मुद्रण योग्य ASCII वर्णों के माध्यम से आसानी से गुजरेंगे 10। गैर-एएससीआईआई 8-बिट इनपुट सभी प्रकार के अजीब संख्यात्मक आउटपुट का उत्पादन करेगा।

इस सब के बाद, यह थोड़ा निराशाजनक है कि यह केवल छह वर्णों द्वारा तुच्छ bash समाधान को धड़कता है ।


50

बैश, ३०

संपादित करें: 3 वर्णों को खत्म करने के लिए Doorknob धन्यवाद

tr a-z 22233344455566677778889

उदाहरण:


10
क्या आप अंतिम 3 9एस नहीं निकाल सकते ?
दरवाज़े

16

सी, 83 78 77 65 63 62

main(c){for(;~(c=getchar());putchar(c>96?20-c/122+5*c/16:c));}

http://ideone.com/qMsIFQ


3
अच्छा गणित। सिर्फ यह कहना है कि आप EOF मानकर 1 char को कम कर सकते हैं -1 और करते हैं~(c=getchar())
user12205

क्या आप getch()इसके बजाय उपयोग नहीं कर सकते getchar()?
स्टारप्लस 10

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

4

जावास्क्रिप्ट - 103 वर्ण

alert(prompt().replace(/[a-z]/g,function(y){y=y.charCodeAt(0)-91;return y>27?9:y>24?8:y>20?7:~~(y/3)}))

1
मुझे नहीं पता था कि आप .replace के साथ ऐसा कर सकते हैं। अप वोट फॉर यू!
सुपरजेडिय २२४

आप के charCodeAt(0)साथ बदल charCodeAt()सकते हैं और आप function(y)...कुछ बाइट्स को बचाने के लिए तीर फ़ंक्शन का उपयोग कर सकते हैं और आप उपयोग ~~(y/3)कर सकते हैंy/3|0
चाऊ जियांग

3

रूबी, 75 वर्ण

gets.chars{|c|$><<"22233344455566677778889999#{c}"[[*?a..?z].index(c)||-1]}

charsब्लॉक के साथ हटाए गए का उपयोग करता है , और प्रत्येक पत्र को व्यक्तिगत रूप से प्रिंट करता है $><<। मुझे भी पसंद है [[*?a..?z].index(c)||-1]; यदि यह एक अक्षर है, तो वर्ण के समान अक्षर को पकड़ लेता है यदि यह एक अक्षर है, और अंतिम वर्ण (जो कि परीक्षण वर्ण अपरिवर्तित होता है) यदि नहीं।

रूबी, 43 (या 35) वर्ण

Blatantly @ace से चोरी करना;)

puts gets.tr'a-z','22233344455566677778889'

अगर मैं sस्ट्रिंग के रूप में वैरिएबल के साथ IRB में चल सकता हूं, तो 8 वर्णों को बंद करें :

s.tr'a-z','22233344455566677778889'

3

सी ++ - 222 चार्ट

अब तक का सबसे लंबा समाधान:

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

1
लोल, मुझे नहीं लगता कि सबसे लंबा समाधान यहां लक्ष्य है ...
डैनी

@ डैनी सी ++ खुद को कोड-गोल्फ के लिए अच्छी तरह से उधार नहीं देता है । जावा और C # एकमात्र ऐसी भाषाएं हैं जो बदतर हैं, जो मुझे पता है (सभी वर्ग, ऑब्जेक्ट निर्माण, और आउटपुट के लिए लंबे नाम ...)।
होशो

मुझे पता है, मुझे लगा कि यह मज़ेदार है कि आपने "सबसे लंबे समाधान" का उल्लेख किया।
डैनी

3

फ्रिंक, 92

बल्कि क्रियात्मक भाषा, मुझे पता है। यह तुलना करने के लिए 26 के बजाय 8 मानों की जाँच करता है। क्या उपरोक्त में से कोई भी "222333444 .." समाधान इसी तरह से कम किया जा सकता है?

निर्मित संरचनाओं का उपयोग करते हुए, 107

co=new OrderedList
co.insertAll[charList["cfilosv{"]]
println[input[""]=~%s/([a-z])/co.binarySearch[$1]+2/eg]

एक कस्टम पुनरावर्ती फ़ंक्शन का उपयोग करना, 92

fn[x,a]:=x<=(charList["cfilosv{"])@a?a+2:fn[x,a+1]
println[input[""]=~%s/([a-z])/fn[$1,0]/eg]

एक 8-वर्ण खोज के लिए स्ट्रिंग-अनुवाद विधि को कम करने के लिए +1। अच्छा स्पर्श।
जोनाथन वान मैट्रे

2

स्मालटाक, 79 70

इनपुट है:

s collect:[:c|' 22233344455566677778889999'at:1put:c;at:(($ato:$z)indexOf:c)+1]

शायद सबसे छोटा उम्मीदवार नहीं है - लेकिन एक पुरानी शर्त के लिए ब्याज की हो सकती है, जो कि एक नहीं-पाया स्थिति के लिए परीक्षण से बचने के लिए है (indexOf: रिटर्न 0 इस मामले में)। इसलिए पत्रों के लिए किसी विशेष परीक्षण की आवश्यकता नहीं है। कुछ स्मॉलटैक्स में हालांकि अपरिवर्तनीय तार होते हैं, और हमें 4 और चार्ट ("कॉपी") की आवश्यकता होती है।

ओह, एक बेहतर संस्करण, जो 70 वर्णों में अपरिवर्तनीय स्ट्रिंग्स से भी निपटता है:

s collect:[:c|c,'22233344455566677778889999'at:(($ato:$z)indexOf:c)+1]

2

गणितज्ञ 90

यह @ इक्का समाधान के तर्क का अनुसरण करता है:

StringReplace[#,Thread[CharacterRange["A","Z"]->Characters@"22233344455566677778889999"]]&

उदाहरण

StringReplace[#1,Thread[CharacterRange["A","Z"]-> 
Characters@"22233344455566677778889999"]]&["VI37889"]

8437889


आपका तीर वर्ण प्रतिनिधित्व
मम्मा

इसके अलावा, आपको :) 1में जरूरत नहीं है#1
डॉ। Belisarius

बेलिसियस, मैंने तीर वापस बदल दिया और हटा दिया 1। अभी भी ९ ० चर लेकिन कट और पेस्ट काम करेगा। आप निश्चित रूप से एकल चार तीर का उपयोग करने की प्रेरणा को समझते हैं।
डेविड एफसी

वहाँ किया गया, कि :)
डॉ। Belisarius

2

पर्ल, 50

ऐस के बैश जवाब की एक और स्पष्ट प्रति

($_)=@ARGV;y/a-z/22233344455566677778889999/;print

1
यह कोड सही ढंग से काम कर रहा है लेकिन इसमें सुधार की गुंजाइश है। आइए $ ARGV [0] से छुटकारा पाएं और -pइसके बजाय स्विच का उपयोग करें जो आपको स्टड की प्रत्येक पंक्ति के माध्यम से जाने देता है। जब हम इस पर होते हैं, तो y /// में सीमा को वर्ग कोष्ठक में रखने की आवश्यकता नहीं होती है। हम तीन 9 को सिर्फ एक छोड़ने से छुटकारा पा सकते हैं और अंतिम अर्ध-बृहदान्त्र को हटा -p y/a-z/22233344455566677778889/ सकते हैं : वहां आप जाते हैं, 30 + 1 के लिए -p। एंटरप्राइज चीनी पर्ल गोल्फिंग और ऑप्टिमाइज़ेशन सर्विसेज का उपयोग करने के लिए धन्यवाद और आपका दिन शुभ हो।
चीनी पर्ल गोथ

2

आर, बहुत लंबा लेकिन मजेदार

foo <- '1-800-splurghazquieaobuer57'
oof <- unlist(strsplit(foo,''))
#don't count that part - it's input formatting :-) 
digout <- unlist(strsplit('22233344455566677778889999','')) 
oof[oof%in%letters[1:26]] <- unlist(sapply(oof[oof%in%letters[1:26]], function(j) digout[which(letters[1:26]==j)] ))

2

k [32 शुल्क]

{(.Q.a!|,/(4 3 4,5#3)#'|$2+!8)x}

प्रयोग

{(.Q.a!|,/(4 3 4,5#3)#'|$2+!8)x}"stack exchange"
"78225 39242643"

2

जावास्क्रिप्ट, 85

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

alert(prompt().replace(/[a-z]/g,function(a){for(i=7;a<"dgjmptw{"[i--];);return i+4}))

2

PHP, 141

सबसे छोटा नहीं, लेकिन अधिक मजेदार:

<?php foreach(str_split($argv[1])as$c){$v=ord($c);if($v>114){$v--;}if($v==121){$v--;}if($v<123&$v>96){echo chr(ceil($v/3+17));}else{echo$c;}}

अधिक पठनीय:

<?php 
foreach (str_split($argv[1]) as $c) {
  $v=ord($c);
  if ($v>114) {$v--;}
  if ($v==121){$v--;}
  if ($v<123 & $v>96){
    echo chr(ceil($v/3+17));
    } else {echo $c;}
}

ओ पी ने कहा कि इनपुट लोअरकेस में पहले से ही है, तो आप निकाल सकते हैंstrtolower
Einacio

2

पायथन 2.7, 80

for c in raw_input():print'\b'+(`(ord(c)-97)/3+2-(c in('svyz'))`if c>'`'else c),

मैं अजगर के लिए नया हूं, इसलिए मुझे यकीन है कि आगे भी इसे गोल्फ के लिए एक रास्ता होना चाहिए , यह एक अलग aproach है, आशा है कि आप लोग इसे पसंद करेंगे, मेरे भगवान, अजगर सुंदर है!

उदाहरण चलाएँ:

  • इनपुट: 01-800-abcdefghijklmnopqrstuvwxyz
  • आउटपुट: 01-800-22233344455566677778889999

2

टी-एसक्यूएल, 216 बाइट्स

मैंने पिछले कुछ समय में कुछ समय व्यतीत किया था, जो एक गणितीय अनुक्रम फ़ंक्शन का निर्माण करता था, जो वर्णमाला के ASCII कोड से संख्याओं के लिए उचित ASCII कोड उत्पन्न करने के लिए सही ढंग से गोल होगा। यह गुणांक में दशमलव स्थानों की एक हास्यास्पद संख्या थी, लेकिन यह काम किया।

हालाँकि, बट्टे की बहुत कम कीमत पर, एसक्यूएल में भी मैटनवपोर्ट का तर्कसंगत दृष्टिकोण काम करता है, इसलिए मैं बेशर्मी से अपना गणित उसके पक्ष में कर रहा हूं। उसे वोट दें, यह एक सुंदर समाधान है!

ये मेरा:

DECLARE @p VARCHAR(MAX)='';WITH t AS(SELECT ASCII(LEFT(@s,1))c,2 i UNION ALL SELECT ASCII(SUBSTRING(@s,i,1)),i+1FROM t WHERE i<=LEN(@s))SELECT @p=@p+CHAR(CASE WHEN c>96THEN 20-c/122+5*c/16 ELSE c END)FROM t;SELECT @p

यह फ़ोन नंबर में वर्णों का एक आवेगपूर्ण स्टैक बनाने और फ़्लाई पर अक्षरों का अनुवाद करने के लिए एक पुनरावर्ती CTE का उपयोग करता है, फिर CTE से स्ट्रिंग को पुनः प्राप्त करने के लिए SQL ट्रिकरी (SELECT @ p = @ p ​​+ columnValue) का एक बिट आवश्यक नहीं है एक और पुनरावृत्ति निर्माण।

आउटपुट:

DECLARE @s VARCHAR(MAX)='1-800-abcdefghijklmnopqrstuvwxyz'
--above code runs here
1-800-22233344455566677778889999

2

पायथन 2.7, 66 65


अनकटा का मूल

for c in raw_input():print'\b'+(`(ord(c)-97)/3+2-(c in('svyz'))`if c>'`'else c),


आगे गोल्फ है

for c in input():print(ord(c)-91)/3-(c in('svyz'))if c>'`'else c,


मेरे पास @ आकटा के जवाब पर टिप्पणी करने के लिए पर्याप्त प्रतिष्ठा नहीं है, इसलिए मैंने यहां एक अलग पोस्ट बनाई। मेरे पास एक ही विचार था (अध्यादेश मापांक 3 को लेते हुए) लेकिन यह पता नहीं लगा सका कि s - z के लिए सही संख्याओं को कैसे प्रिंट किया जाए ।

वैसे भी, गोल्फ सुधार मैंने किया:

  • में बदल raw_inputगयाinput

  • बाहरी '\b'और कोष्ठक और एकल उद्धरण हटा दिया

  • +2ऑफसेट को हटा दिया और मूल घटाव (97 - (3 * 2) = 91) में रखा

पायथन 2.7.6 दुभाषिया के साथ परीक्षण किया गया। मान लें, नियमों के अनुसार, एक स्ट्रिंग इनपुट।


तुम भी और) के बीच की जगह को हटा सकते हैं
विलेम

आप सही हे। अच्छा कैच
विलेम

1

PHP, 87

echo str_ireplace(range('a','z'),str_split('22233344455566677778889999'),fgets(STDIN));

1

q [38 शुल्क]

{(.Q.a!"22233344455566677778889999")x}

@ इक्का के समाधान से प्रेरित

उदाहरण

{(.Q.a!"22233344455566677778889999")x}"stack exchange"
"78225 39242643"


1

अजगर, बहुत ही अपराजित

चूंकि हर कोई इक्का की नकल कर रहा है, इसलिए मैंने प्रश्न प्रस्तुत करने से पहले मेरे द्वारा बनाए गए कोड को पोस्ट करने का निर्णय लिया:

def phonekeypad(text):
    c = ['','','abc','def','ghi','jkl','mno','pqrs','tuv','wxyz']
    st = ""
    for i in list(text):
        a = False
        for t in range(len(c)):
            if i in c[t]:
                st += str(t)
                a=True
        if a == False:
            st += str(i)
    return st

1

EcmaScript 6 (103 बाइट्स):

i.replace(/[a-z]/g,x=>keys(a='00abc0def0ghi0jkl0mno0pqrs0tuv0wxyz'.split(0)).find(X=>a[X].contains(x)))

iस्ट्रिंग शामिल करने की उम्मीद है।

फ़ायरफ़ॉक्स के किसी भी हाल के संस्करण में इसे आज़माएं। मैंने Google Chrome की कोशिश नहीं की है।


1

अजगर 3, 121

print("".join((lambda x:"22233344455566677778889999"[ord(x)-97] if ord(x)>96 and ord(x)<123 else x)(i) for i in input()))

1

हास्केल, 93 सी

t[]_ a=a
t(b:c)(d:e)a
 |a==b=d
 |True=t c e a
y=map(t['a'..'z']"22233344455566677778889999")

प्रयोग

y "1-800-program"

1

सी # 140

using System.Linq;class P{static void Main(string[]a){System.Console.Write(string.Concat(a[0].Select(d=>(char)(d>96?20-d/122+5*d/16:d))));}}

0

अजगर

import string          
trans = str.maketrans(string.ascii_lowercase,
                      '22233344455566677778889999')                                                                                         
print("1-800-ask-usps".translate(trans))

0

ECMASCRIPT, 101 (इनपुट के साथ)

"1-800-PROGRAM".replace(/./g,function(c){
return "22233344455566677778889999"[c.charCodeAt(0)-65]||c})

न्यूलाइन को स्पष्टता के लिए जोड़ा गया। 85 वर्ण यदि इनपुट एक चर में है।


0

पर्ल, 54

print map{/[a-y]/?int(5/16*ord)-28:/z/?9:$_}<>=~/./gs

मारो, @RobHare अभी भी मुझे 4 वर्णों से हराता है। :)


0

QBasic, 155

आह, यादें ...

INPUT n$
FOR i=1 TO LEN(n$)
c$=MID$(n$,i,1)
a=ASC(c$)
IF 97>a THEN
PRINT c$;
ELSE IF 122>a THEN
PRINT STR$(a\3.2-28);
ELSE
PRINT 9;
END IF
NEXT i

यह कम होना चाहिए था, लेकिन मैं repl.it के साथ परीक्षण कर रहा था , जो सिंगल-लाइन IFस्टेटमेंट की अनुमति नहीं देता है और यदि आप वैरिएबल को छोड़ देते हैं तो अजीब व्यवहार करते हैं NEXT i। यह ASCफ़ंक्शन को भी नहीं पहचानता है , इसलिए कोड को चलाने के लिए आपको शुरुआत में इस वर्कअराउंड को जोड़ना होगा:

DECLARE FUNCTION ASC(s$)
FUNCTION ASC(s$)
FOR j=1 TO 255
IF CHR$(j)=LEFT$(s$,1) THEN
ASC=j
END IF
NEXT j
END FUNCTION

(दूसरी बार जब आप इसे चलाते हैं, तो दुभाषिया शिकायत करेगा जब तक आप DECLARE FUNCTIONलाइन को हटा नहीं देते हैं , आंकड़ा जाना है।)


0

आर, 110

s=strsplit(scan(,""),"")[[1]];i=grep("[a-z]",s);s[i]=sort(c(1:24%%8+2,7,9))[match(s[i],letters)];cat(s,sep="")

उदाहरण:

> s=strsplit(scan(,""),"")[[1]];i=grep("[a-z]",s);s[i]=sort(c(1:24%%8+2,7,9))[match(s[i],letters)];cat(s,sep="")
1: 1-800-program
2: 
Read 1 item
1-800-7764726
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.