전화 번호의 문자


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'+-문자가 q및 문자뿐만 아니라 ASCII 코드가 91 미만인 모든 문자를 목록에서 필터링 x합니다. 따라서, 예를 들어, 캐릭터는 a6 자리스트로 점등되고 [\]^_`동시에 z29 문자 목록으로 점등되고[\]^_`abcdefghijklmnoprstuvwy .

  • 두 번째 ,는 목록에 남아있는 요소를 3/세고이 수를 3으로 나눕니다 (내림차순). 마지막으로 `결과 숫자 (2 – 9 범위)를 문자열로 바꿉니다.

따라서 사양에 따라 하이픈과 숫자는 변경되지 않은 채로 있으며 소문자는 참조 키패드 다이어그램에 따라 숫자로 매핑됩니다. 코드는 실제로 소문자 (설명 된대로 매핑 됨)와 문자 {( |}2 자 문자열에 매핑 됨)를 제외한 모든 인쇄 가능한 ASCII 문자를 깨끗하게 전달 합니다 10. 비 ASCII 8 비트 입력은 모든 종류의 이상한 숫자 출력을 생성합니다.

결국, 이것은 단지 6 문자로 사소한 bash 솔루션 을 능가한다는 것은 약간 실망 스럽습니다 .


50

배쉬, 30

편집 : 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
좋은 수학. EOF가 -1이라고 가정하여 1 개의 문자를 줄일 수 있다고 말하고 싶을 것입니다~(c=getchar())
user12205

getch()대신 사용할 수 getchar()없습니까?
starsplusplus

엄밀히 말하면 getch()표준 C가 아니기 때문에 이것이 아이디어로 연결되지 않는다고 생각합니다. 어쨌든 MSVC에서 테스트했지만 실제로 슬프게도 작동하지 않습니다. 키보드 입력을 직접 소비하므로 프로그램을 종료 할 수있는 방법이 없습니다.
mattnewport

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로 그것을 할 수 있다는 것을 몰랐습니다. 당신을 위해 투표하십시오!
SuperJedi224

당신은 대체 할 수 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 자)

@ace에서 눈을 훔쳐;)

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

변수 s를 문자열로 사용하여 IRB에서 실행할 수 있다면 8 문자를 제거 하십시오.

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

@Danny C ++는 code-golf에 적합하지 않습니다 . Java와 C #은 내가 아는 유일한 언어입니다 (모든 클래스, 객체 생성 및 출력을위한 긴 이름 ...).
Hosch250

난 당신이 "가장 긴 해결책"을 언급 한 것이 재미 있다고 생각했습니다.
Danny

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입니다. 좋은 터치.
Jonathan Van Matre 14

2

스몰 토크, 79 70

입력은 s입니다.

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

이것은 @ace 솔루션의 논리를 따릅니다.

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

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

8437889


당신의 화살표 문자 표현은 복사 / 붙여 넣기에서 Mma에 의해 받아 들여지지 않습니다
Dr. belisarius

또한, 당신은 필요가 없습니다 1#1:)
벨리 사리우스 박사를

Belisarius, 나는 화살표를 뒤로 바꾸고를 제거했다 1. 여전히 90 자이지만 잘라서 붙여 넣기가 작동합니다. 물론 단일 문자 화살표를 사용하려는 동기를 이해합니다.
DavidC

거기에
갔다

2

펄, 50

Ace의 bash 답변의 또 다른 명백한 사본

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

1
이 코드는 올바르게 작동하지만 개선의 여지가 있습니다. $ ARGV [0]를 제거하고 -p대신 stdin의 각 줄을 통과 할 수있는 switch를 사용합시다 . 우리가 그 동안 y ///의 범위를 대괄호 안에 넣을 필요는 없습니다. 우리는 또한 하나의 9를 남기고 3 개의 9를 제거하고 마지막 세미콜론을 제거 -p y/a-z/22233344455566677778889/ 할 수 있습니다 -p. Enterprise Chinese Perl Golfing and Optimization Services를 이용해 주셔서 감사하며 즐거운 하루를 보내십시오.
중국 펄 고트

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

자바 스크립트, 85

JavaScript는 결코 골프 전쟁에서 이길 수 없지만, 나는 그것을 좋아하고 @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

파이썬 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

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 속임수 (SELECT @ p = @ p ​​+ columnValue)를 사용하여 CTE에서 문자열을 재구성 할 필요가 없습니다. 또 다른 재귀 구조.

산출:

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,


@anakata의 답변에 대해 언급 할만 큼 평판이 충분하지 않으므로 여기에 별도의 게시물을 작성했습니다. 나는 같은 생각 (법률 계수 3을 취함)을 가지고 있었지만 s-z에 올바른 숫자를 인쇄하는 방법을 알 수 없었습니다 .

어쨌든, 내가 개선 한 골프 :

  • 변경 raw_inputinput

  • 외부 '\b'및 괄호와 작은 따옴표를 제거했습니다.

  • +2오프셋을 제거하고 원래 빼기에 배치합니다 (97-(3 * 2) = 91)

Python 2.7.6 인터프리터로 테스트되었습니다. 규칙에 따라 문자열 입력을 가정합니다.


)와 if 사이의 간격을 제거 할 수도 있습니다
Willem

네가 옳아. 좋은 캐치 willem
zheshishei

1

PHP, 87

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

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

매우 골치 아픈 파이썬

모두가 에이스를 복사하고 있기 때문에 질문을 제출하기 전에 작성한 코드를 게시하기로 결정했습니다.

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에서 사용해보십시오. 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

하스켈, 93C

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

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

펄, 54

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

@RobHoare는 여전히 4자를 넘기고 있습니다. :)


0

Q 기본, 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문장을 허용하지 않고 변수를 of으로 남겨두면 이상하게 동작 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.