ตัวอักษรในหมายเลขโทรศัพท์


23

ปัญหา:

คุณกำลังสร้างโทรศัพท์ใหม่ที่ผู้คนสามารถพิมพ์หมายเลขโทรศัพท์พิเศษ1-800-programและพวกเขาจะถูกแปลงเป็นหมายเลขโทรศัพท์ที่ใช้งานได้โดยอัตโนมัติเช่น1-800-7764726(สำหรับตัวอย่างก่อนหน้า)

โปรแกรมของคุณจะได้รับสตริงหากความยาวของตัวเลขตัวอักษรและขีดกลางและแปลงตัวอักษรทั้งหมดให้เป็นตัวเลขที่เกี่ยวข้อง

นี่คือปุ่มกดสำหรับการอ้างอิง:

ปุ่มกด

กฎ:

  • โปรแกรมของคุณจะได้รับสตริง
  • มันจะประมวลผลและกลับ / พิมพ์สตริงอื่น
  • ยอมรับภาษาใดก็ได้
  • เนื่องจากเป็นรหัสที่สั้นที่สุดจะเป็นผู้ชนะ

โปรแกรมควรจัดการกับตัวอักษรตัวพิมพ์ใหญ่และตัวเล็กในอินพุตหรือไม่
mattnewport

3
@mattnewport - ไม่สมมติว่าตัวแปรได้กลายเป็นตัวพิมพ์เล็กแล้ว
TheDoctor

คำตอบ:


8

GolfScript 24 ตัวอักษร

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

ทดสอบอินพุต:

0123456789-abcdefghijklmnopqrstuvwxyz

ผลการทดสอบ:

0123456789-22233344455566677778889999

คำอธิบาย:

  • { }% ใช้รหัสระหว่างวงเล็บปีกกากับตัวละครแต่ละตัวของอินพุต

  • .96>{ }* เรียกใช้งานโค้ดระหว่างวงเล็บปีกกาด้านในหากว่ารหัส ASCII ของตัวละครมีค่ามากกว่า 96 (เช่นเป็นอักษรตัวพิมพ์เล็ก)

  • วิธีแรก,เปลี่ยนอักขระเป็นรายการของอักขระทั้งหมดด้วยรหัส ASCII ที่ต่ำกว่าและ91,'qx'+-กรองอักขระทั้งหมดด้วยรหัส ASCII ที่น้อยกว่า 91 รวมถึงตัวอักษรqและxจากรายการ ดังนั้นสำหรับตัวอย่างเช่นตัวละครaที่ได้รับกลายเป็นรายการที่ 6 ของตัวละคร[\]^_`ในขณะที่ได้รับกลายเป็นรายการที่z 29 ตัวอักษร[\]^_`abcdefghijklmnoprstuvwy

  • องค์ประกอบที่สอง,นับองค์ประกอบที่เหลืออยู่ในรายการและ3/หารจำนวนนี้ด้วยสาม (ปัดเศษลง) ในที่สุดการ`เปลี่ยนจำนวนผลลัพธ์ (ในช่วง 2 - 9) เป็นสตริง

ดังนั้นตามข้อมูลจำเพาะยัติภังค์และตัวเลขจะไม่มีการเปลี่ยนแปลงในขณะที่ตัวอักษรตัวเล็กจะถูกแมปเป็นตัวเลขตามแผนภาพปุ่มกดอ้างอิง รหัสจะจริงหมดจดผ่านทุกตัวอักขระ ASCII ยกเว้นอักษรตัวพิมพ์เล็ก (ซึ่งเป็นแมปตามที่อธิบายไว้) และตัวอักษร{, |และ}(ซึ่งจะจับคู่กับสองสายตัวอักษร10) อินพุตที่ไม่ใช่ ASCII 8 บิตจะสร้างเอาต์พุตตัวเลขแปลก ๆ ทุกประเภท

หลังจากทั้งหมดนี้มันเป็นเรื่องที่น่าผิดหวังเล็กน้อยว่านี่เป็นเพียงการแก้ปัญหาทุบตีเล็กน้อยโดยเพียงหกตัวอักษร


50

Bash, 30

แก้ไข: ขอบคุณ Doorknob สำหรับการกำจัด 3 ตัวอักษร

tr a-z 22233344455566677778889

ตัวอย่าง:


10
คุณลบ 3 9วินาทีสุดท้ายไม่ได้ใช่ไหม
Doorknob

16

C, 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
คณิตศาสตร์ที่ดี แค่อยากบอกว่าคุณสามารถลด 1 ตัวอักษรโดยสมมติว่า EOF คือ -1 และทำ~(c=getchar())
12205

คุณไม่สามารถใช้getch()แทนได้getchar()หรือ
starsplusplus

การพูดอย่างเคร่งครัดgetch()ไม่ใช่มาตรฐาน C ดังนั้นฉันคิดว่ามันไม่ได้เชื่อมโยงในอุดมคติ ฉันทดสอบมันใน MSVC ต่อไปแม้ว่ามันจะไม่ได้ผลจริง ๆ เพราะมันใช้แป้นพิมพ์โดยตรงไม่มีทางที่จะออกจากโปรแกรมได้แม้ว่ามันจะแปลสิ่งที่คุณพิมพ์ได้ทันทีซึ่งเป็นเรื่องที่เรียบร้อย
mattnewport

4

Javascript - 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
ฉันไม่รู้ว่าคุณสามารถทำได้ด้วย. แทนที่ โหวตให้คุณ!
SuperJedi224

คุณสามารถแทนที่charCodeAt(0)ด้วยcharCodeAt()และคุณสามารถใช้ฟังก์ชั่นลูกศรfunction(y)...เพื่อบันทึกไม่กี่ไบต์และสำหรับ~~(y/3)คุณสามารถใช้y/3|0
chau giang

3

ทับทิม 75 ตัวอักษร

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

ใช้เลิกกับบล็อกและพิมพ์ตัวอักษรแต่ละตัวบุคคลกับchars $><<ฉันก็ชอบ[[*?a..?z].index(c)||-1]; มันคว้าตัวอักษรที่สอดคล้องกับตัวอักษรของตัวอักษรนั้นถ้ามันเป็นตัวอักษรและตัวอักษรสุดท้าย (ซึ่งเกิดขึ้นเป็นตัวละครทดสอบไม่เปลี่ยนแปลง) ถ้าไม่

Ruby ตัวอักษร 43 (หรือ 35)

โจ๋งครึ่มอย่างโจ๋งครึ่มจาก @ace;)

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

โกนออก 8 ตัวอักษรถ้าฉันสามารถเรียกใช้ใน IRB ด้วยตัวแปรsเป็นสตริง:

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

3

C ++ - 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
ฮ่า ๆ ผมไม่คิดว่าการแก้ปัญหาที่ยาวที่สุดเป็นเป้าหมายที่นี่ ...
แดนนี่

@Danny C ++ ไม่สามารถยืมรหัสกอล์ฟได้ดี Java และ C # เป็นภาษาเดียวที่แย่กว่านั้นคือฉันรู้ (ทุกคลาส, การสร้างออบเจ็กต์และชื่อแบบยาวสำหรับเอาต์พุต ... )
Hosch250

ฉันรู้ว่าฉันแค่คิดว่ามันตลกที่คุณพูดถึง "ทางออกที่ยาวที่สุด"
แดนนี่

3

Frink, 92

ฉันรู้ภาษาที่ค่อนข้างละเอียด สิ่งนี้จะตรวจสอบ 8 ค่าแทนที่จะเป็น 26 โดยไม่ต้องพิมพ์การเปรียบเทียบ จะสามารถลดวิธีการใด ๆ ข้างต้น "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]

+1 สำหรับการลดวิธีการแปลสตริงเป็นการค้นหา 8 ตัวอักษร สัมผัสที่ดี
Jonathan Van Matre

2

สมอลล์ทอล์ค, 79 70

อินพุตคือ s:

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

อาจไม่ใช่ผู้สมัครที่สั้นที่สุด แต่อาจเป็นเรื่องน่าสนใจสำหรับกลอุบายเก่าเพื่อหลีกเลี่ยงการทดสอบสำหรับเงื่อนไขที่ไม่พบ (indexOf: ส่งคืน 0 ในกรณีนี้) ดังนั้นไม่จำเป็นต้องทำการทดสอบพิเศษสำหรับตัวอักษร อย่างไรก็ตาม Smalltalk บางอันมีสตริงที่ไม่เปลี่ยนรูปและเราต้องการตัวอักษรเพิ่มอีก 4 ตัว ("copy")

โอ้รุ่นที่ดีกว่าซึ่งเกี่ยวข้องกับสตริงที่ไม่เปลี่ยนรูปแบบใน 70 ตัวอักษร:

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

2

Mathematica 90

นี่เป็นไปตามตรรกะของโซลูชันของ @ ace:

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

ตัวอย่าง

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

8437889


การเป็นตัวแทนลูกศรของคุณไม่ได้รับการยอมรับจาก Mma ในการคัดลอก / วาง
ดร. เบลิซาเรียส

นอกจากนี้คุณไม่จำเป็นต้องใช้1ใน#1:)
ดร. เบลิซาเรีย

1เบลิซาเรีผมเปลี่ยนกลับลูกศรและออก ยังคงถ่าน 90 แต่ตัดและวางจะทำงาน คุณเข้าใจถึงแรงจูงใจในการใช้ลูกศรแบบเดี่ยว
DavidC

เคยไปทำแบบนั้น :)
ดร. เบลิซาเรีย

2

Perl, 50

อีกสำเนาที่ชัดเจนของคำตอบทุบตีของ Ace

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

1
รหัสนี้ทำงานอย่างถูกต้อง แต่มีที่ว่างสำหรับการปรับปรุง ลองกำจัด $ ARGV [0] และใช้-pสวิตช์แทนซึ่งจะช่วยให้คุณผ่านแต่ละบรรทัดของ stdin ได้ ในขณะที่เราอยู่ที่นั้นช่วงใน y /// ไม่จำเป็นต้องใส่ในวงเล็บเหลี่ยม นอกจากนี้เรายังสามารถกำจัดสาม 9 ออกเพียงหนึ่งและลบสุดท้ายกึ่งลำไส้ใหญ่: -p y/a-z/22233344455566677778889/ มีคุณไป 30 + 1 -pสำหรับ ขอขอบคุณที่ใช้บริการ Chinese Perl Perl และการเพิ่มประสิทธิภาพของ Enterprise Chinese และขอให้มีความสุขในวันนี้
จีนชาวเยอรมัน

2

R นานมาก แต่สนุก

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

JavaScript, 85

จาวาสคริปต์ไม่เคยชนะการแข่งขันกอล์ฟ แต่ฉันชอบมันและฉันต้องการทำสิ่งที่แตกต่างจากการกระโดดบน @ace bandwagon

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;}
}

OP กล่าวว่าการป้อนข้อมูลมีตัวพิมพ์เล็กอยู่แล้วดังนั้นคุณสามารถลบstrtolower
Einacio

2

Python 2.7, 80

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

ฉันยังใหม่กับงูหลามดังนั้นฉันแน่ใจว่าต้องมีวิธีในการตีกอล์ฟให้ดียิ่งขึ้นไปอีกมันเป็นสนามแข่งที่ต่างออกไปหวังว่าพวกคุณจะชอบพระเจ้าของฉันมันน่ารักมาก!

เรียกใช้ตัวอย่าง:

  • อินพุต: 01-800-abcdefghijklmnopqrstuvwxyz
  • เอาท์พุท: 01-800-22233344455566677778889999

2

T-SQL, 216 ไบต์

ฉันใช้เวลาค่อนข้างตลอดสองสามคืนที่ผ่านมาพยายามสร้างฟังก์ชันลำดับทางคณิตศาสตร์ที่จะปัดเศษอย่างถูกต้องเพื่อสร้างรหัส ASCII ที่เหมาะสมสำหรับตัวเลขจากรหัส ASCII ตามตัวอักษร มันมีจำนวนทศนิยมที่ไร้สาระในค่าสัมประสิทธิ์ แต่ใช้งานได้

อย่างไรก็ตามวิธีการที่มีเหตุผลของ Mattnewport นั้นทำงานใน SQL ด้วยราคาที่ต่ำกว่ามาก ๆ ดังนั้นฉันจึงเขียนคณิตศาสตร์ของฉันเองเพื่อเขา ขึ้นคะแนนเขามันเป็นทางออกที่สง่างาม!

นี่คือของฉัน:

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 แบบเรียกซ้ำเพื่อสร้างตัวอักษรสแต็กกะทันหันของตัวละครในหมายเลขโทรศัพท์และแปลตัวอักษรได้ทันทีจากนั้นก็ใช้ SQL trickery (SELECT @ p = @ p ​​+ columnValue) เพื่อจัดเรียงสตริงใหม่จาก CTE โดยไม่ต้องใช้ สร้างการสอบถามซ้ำอีกครั้ง

เอาท์พุท:

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

2

Python 2.7, 66 65


ต้นฉบับของ Anakata

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,


ฉันไม่มีชื่อเสียงพอที่จะแสดงความคิดเห็นในคำตอบของ @ anakata ดังนั้นฉันจึงโพสต์แยกต่างหากที่นี่ ฉันมีความคิดเดียวกัน (ใช้โมดูลัสของกฤษฎีกา 3) แต่ไม่สามารถหาวิธีพิมพ์ตัวเลขที่ถูกต้องสำหรับs - zZ

อย่างไรก็ตามการปรับปรุงสนามกอล์ฟที่ฉันทำ:

  • เปลี่ยนraw_inputเป็นinput

  • ลบ'\b'เครื่องหมายส่วนเกินและวงเล็บและเครื่องหมายคำพูดเดี่ยวออก

  • ลบ+2ออฟเซ็ตและวางไว้ในการลบดั้งเดิม (97 - (3 * 2) = 91)

ทดสอบกับ Python 2.7.6 interpreter สมมติว่าเป็นอินพุตสตริงตามกฎ


คุณสามารถลบช่องว่างระหว่างเครื่องหมาย) และ if
Willem

คุณถูก. จับดีวิลเล็ม
zheshishei


1

q [38 ตัวอักษร]

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

แรงบันดาลใจจากโซลูชันของ @ ace

ตัวอย่าง

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

1

XQuery, 71

BaseXถูกใช้เป็นตัวประมวลผล XQuery $iเป็นอินพุต

translate($i,"abcdefghijklmnopqrstuvwxyz","22233344455566677778889999")

ไม่ใช่คำตอบที่สั้นที่สุด แต่ค่อนข้างสั้นและอ่านง่ายมาก


1

Python ไม่ได้รับพรมาก

เนื่องจากทุกคนกำลังคัดลอกเอซฉันจึงตัดสินใจโพสต์รหัสที่ฉันสร้างขึ้นก่อนที่ฉันจะส่งคำถาม:

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จะมีสตริง

ลองใช้ใน Firefox เวอร์ชันล่าสุด ฉันไม่ได้ลอง Google Chrome


1

Python 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

C # 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

Perl, 54

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

ยิง @ RobHoare ยังคงเอาชนะฉัน 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

R, 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.