도전에 대한 짧고 달콤한 설명 :
이 사이트의 다른 몇 가지 질문에 대한 아이디어를 바탕으로 영어로 작성된 숫자를 입력하고 정수 형식으로 변환하는 프로그램에서 가장 창의적인 코드를 작성해야합니다.
건조하고 길고 철저한 사양 :
- 프로그램은 소문자 영어
zero
와 정수 사이 의 정수를 입력으로받습니다nine hundred ninety-nine thousand nine hundred ninety-nine
. - 그것은 사이의 수의 출력 만 정수 형태로해야
0
하고999999
아무것도 다른 (어떤 공백). - 입력이됩니다 NOT 포함
,
또는and
같이,one thousand, two hundred
또는five hundred and thirty-two
. - 10 자리와 1 자리가 모두 0이 아닌 10 자리보다 큰 경우 공백 대신
1
HYPHEN-MINUS 문자로 구분됩니다-
. 수만 곳을위한 Ditto. 예를 들면 다음과 같습니다six hundred fifty-four thousand three hundred twenty-one
. - 프로그램이 다른 입력에 대해 정의되지 않은 동작을 가질 수 있습니다.
잘 작동하는 프로그램의 예 :
zero
-> 0
fifteen
-> 15
ninety
-> 90
seven hundred four
-> 704
sixty-nine thousand four hundred eleven
-> 69411
five hundred twenty thousand two
->520002
답변
애플 스크립트
일부 쿠퍼 티노 / 마운틴 뷰 사람들을 화나게 할 수있는 어리석은 해키 매쉬업이지만 창의적인 어리 석고 해키 매쉬업 이라고 생각 합니다.
set myNumber to text returned of (display dialog ¬
"Enter number as text:" buttons {"Continue…"} ¬
default answer "" default button 1)
tell application "Google Chrome"
activate
open location "https://www.google.com"
end tell
delay 5
say "ok google. " & myNumber
delay 2
tell application "System Events"
tell application process "Google Chrome"
set fullURL to value of text field 1 of toolbar 1 of window 1
end tell
end tell
set AppleScript's text item delimiters to "="
display alert item 2 of text items of fullURL
OSX 텍스트를 사용하여 음성을 사용하여 텍스트 번호를 말하고 Google 오디오 검색을 통해 텍스트를 듣고 정수로 변환합니다.
요구 사항
- OSX
- 구글 크롬
- Google 계정에서 음성 인식 사용
- 적당한 수준으로 볼륨을 올렸다
크롬로드 시간과 Google 조회 시간에 따라 지연 시간을 조정해야 할 수도 있습니다.
입력 예 :
출력 예 :
답변
배쉬, 93 64 55 문자 *
bsd-games
대부분의 Linux 운영 체제에서 사용할 수 있는 환상적인 패키지에는라는 작은 명령 줄 장난감이 number
있습니다. 숫자를 영어 텍스트로 바꿉니다. 즉,이 질문과 정반대입니다. 그것은 실제로 정반대입니다. 질문의 모든 규칙은 뒤에옵니다 number
. 우연의 일치가 거의 너무 좋습니다.
$ number 42
forty-two.
물론 number
질문에 대답하지 않습니다. 우리는 그것을 다른 방향으로 원합니다. 나는 이것에 대해 잠시 동안 생각하고 문자열 파싱과 그 모든 것을 시도한 다음 number
모든 999.999 숫자를 호출 하고 무언가가 입력과 일치하는지 확인할 수 있음을 깨달았습니다 . 그렇다면 첫 번째 줄과 일치하는 줄 번호는 내가 찾는 줄 번호의 두 배입니다 ( number
모든 번호 뒤에 점을 인쇄합니다). 그렇게 간단합니다. 따라서 더 이상 고민하지 않고 다음은 내 항목에 대한 전체 코드입니다.
seq 0 999999|number -l|awk "/$1/{print (NR-1)/2;exit}"
심지어 단락되기 때문에 “2”를 변환하는 것은 매우 빠르며 더 높은 숫자는 대개 내 상자에서 1 초 이내에 해독됩니다. 다음은 예제 실행입니다.
wn@box /tmp> bash unnumber.sh "zero"
0
wn@box /tmp> bash unnumber.sh "fifteen"
15
wn@box /tmp> bash unnumber.sh "ninety"
90
wn@box /tmp> bash unnumber.sh "seven hundred four"
704
wn@box /tmp> bash unnumber.sh "sixty-nine thousand four hundred eleven"
69411
wn@box /tmp> bash unnumber.sh "five hundred twenty thousand two"
520002
물론 number
이것이 작동하려면 설치 해야합니다 .
* : 예, 저는 이것이 code-golf
도전 이 아니라는 것을 알고 있습니다. 그러나 부족함은 저의 입장에서 가장 독보적 인 품질입니다.
답변
자바 스크립트
(function parse(input) {
var pat = "ze/on/tw/th.?r/fo/fi/ix/se/ei/ni/ten/ele".split("/");
var num = "", last = 0, token = input.replace(/-/g, " ").split(" ");
for(var i in token) {
var t = token[i];
for(var p in pat) if(t.match(RegExp(pat[p])) !== null) num += "+" + p;
if(t.indexOf("een") >= 0) num += "+10";
if(t.indexOf("lve") >= 0) num += "+10";
if(t.indexOf("ty") >= 0) num += "*10";
if(t.indexOf("dr") >= 0) { last = 100; num += "*100"; }
if(t.indexOf("us") >= 0) {
if(last < 1000) num = "(" + num + ")"; last = 0;
num += "*1000";
}
}
alert(eval(num));
})(prompt());
당신은 일부를 좋아 eval()
합니까?
브라우저 콘솔에서이 스크립트를 실행하십시오.
편집 : 의견 주셔서 감사합니다. 버그 수정 (다시).
답변
파이썬
공을 굴리기 위해.
import re
table = {'zero':0,'one':1,'two':2,'three':3,'four':4,'five':5,'six':6,'seven':7,'eight':8,'nine':9,
'ten':10,'eleven':11,'twelve':12,'thirteen':13,'fourteen':14,'fifteen':15,'sixteen':16,'seventeen':17,'eighteen':18,'nineteen':19,
'twenty':20,'thirty':30,'forty':40,'fifty':50,'sixty':60,'ninety':90}
modifier = {'hundred':100,'thousand':1000}
while True:
text = raw_input()
result = 0
tmp = 0
last_multiplier = 1
for word in re.split('[- ]', text):
multiplier = modifier.get(word, 1)
if multiplier > last_multiplier:
result = (result+tmp)*multiplier
tmp = 0
else:
tmp *= multiplier
if multiplier != 1:
last_multiplier = multiplier
tmp += table.get(word,0)
print result+tmp
답변
펄 + CPAN
바퀴가 이미 완성 된 이유는 무엇입니까?
use feature 'say';
use Lingua::EN::Words2Nums;
say words2nums $_ while <>;
이 프로그램은 표준 입력 (또는 명령 행 인수로 지정된 하나 이상의 파일)에서 영어 문자열을 한 줄에 하나씩 읽고 해당 숫자를 표준 출력으로 인쇄합니다.
도전 과제의 샘플 입력과 bsd-games number
유틸리티 (감사, Wander Nauta!)를 사용하여 텍스트로 변환 된 0에서 999999까지의 숫자로 구성된 철저한 테스트 스위트를 사용 하여이 코드를 테스트 했으며 올바르게 구문 분석합니다 그들 모두. 보너스로서, 또한 그러한 예로서 이해 입력 minus seven
(-7), four and twenty
(24), four score and seven
(87), one gross
(144), a baker's dozen
(13), eleventy-one
(111) 및 googol
(10 (100) ).
( 참고 : Perl 인터프리터 자체 이외에도이 프로그램에는 CPAN 모듈 Lingua :: EN :: Words2Nums 가 필요합니다. CPAN 모듈 설치에 대한 지시 사항 은 다음과 같습니다 . Debian / Ubuntu Linux 사용자는 APT 패키지 관리자를 통해이 모듈을 설치할 수도 있습니다. 같은 liblingua-KO-words2nums – 펄 .)
답변
파이썬
유효성 검사가 포함 된 일반적인 재귀 솔루션입니다. 필요한 숫자 범위를 단순화 할 수는 있지만 여기에 나와 있습니다.
terms = 'zero one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen'.split()
tee = 'twenty thirty forty fifty sixty seventy eighty ninety'.split()
for t in tee:
terms.append(t)
for s in terms[1:10]:
terms.append(t+'-'+s)
terms = dict(zip(terms, range(100)))
modifiers = [('hundred', 100), ('thousand', 1000), ('million', 10**6), ('billion', 10**9)]
def read_num(words):
if len(words) == 0: return 0
elif len(words) == 1:
if words[0] in terms:
return terms[words[0]]
else:
raise ValueError(words[0]+' is not a valid english number.')
else:
for word, value in reversed(modifiers):
if word in words:
i = words.index(word)
return read_num(words[:i])*value+read_num(words[i+1:])
raise ValueError(' '.join(words)+' is not a valid english number.')
while True:
try:
print(read_num(input().split()))
except ValueError as e:
print(e)
답변
VBScript 474
이것은 매우 일상적인 답변입니다 … 불행히도, @Snack이 거의 동일한 프로세스를 게시했지만 내 앞에 있습니다.
i=split(REPLACE(REPLACE(inputbox(""),"lve","een"),"tho","k"))
o=split("z on tw th fo fi si se ei ni ten ele")
y=split("red *100) k )*1000 ty *10) een +10)")
z=""
p=0
for t=0 to UBOUND(i)
s=split(i(t),"-")
u=ubound(s)
r=s(0)
for x=0 to UBOUND(o)
IF INSTR(r,o(x)) THEN
z=z+"+"+CSTR(x)
END IF
IF u Then
IF INSTR(s(1),o(x)) THEN
z=z+CSTR(x)
END IF
END IF
next
for m=0 to UBOUND(y)
IF INSTR(r,y(m))AND u=0 THEN
z=z+y(m+1)
p=p+1
END IF
next
next
Execute("MSGBOX "+String(p,"(")+z)