주요 시스템은 A는 니모닉 들이보다 쉽게 기억 될 수 있도록 단어로 숫자를 변환하는 장치입니다.
단어의 발음이 소리 나는 방식을 기반으로하지만 문제의 단순성을 유지하기 위해 단어의 철자에 대해서만 관심을 갖습니다. 즉, 잘못된 전환이 발생하지만 괜찮습니다.
단순화 된 주요 시스템을 사용하여 숫자를 단어로 변환하려면 :
- 각각
0을s또는로 교체하십시오z. (일부 일 수도 있고s일부 일 수도 있습니다z. 아래도 마찬가지입니다.)- 각각의 교체
1와 함께t또는d나th.- 각각을
2로 바꿉니다n.- 각각을
3로 바꿉니다m.- 각각을
4로 바꿉니다r.- 각각을
5로 바꿉니다l.- 각각의 교체
6와 함께j또는sh나ch.- 각각의 교체
7와 함께k하거나c또는g나q.- 각각
8을f또는로 교체하십시오v.- 각각
9을p또는로 교체하십시오b.- 가능한 경우
aehiouwxy아무 곳에 나 문자를 추가하여 실제 영어 단어를 만드 십시오 .
유일한 예외는 또는h뒤에 삽입 할 수 없다는 것 입니다.sc숫자는 실제로 0-9 사이의 숫자 (십진수 또는 쉼표 또는 부호 없음) 일 수 있습니다.
단어는 소문자 az 만 포함 할 수 있습니다.
예
숫자 32는로 변환해야합니다 ?m?n?. 여기서 ?문자로 만든 유한 문자열을 나타냅니다 aehiouwxy( 원하는 경우 자유 모노 이드 의 문자열 ). 진짜 영어 단어로 만들 수있는이 방법은 여러 가지가 있습니다 : mane, moon, yeoman, 등
숫자 05는 ?s?l?또는 로 변환 될 수 있습니다 ?z?l?. 가능성은 easily, hassle및 hazel입니다. 단어 shawl는 h뒤에 배치 될 수 없으므로 허용되지 않습니다 s. 로 잘못 읽힐 것 65입니다.
도전
숫자 0-9의 문자열을 받아 단순화 된 주 시스템 니모닉을 사용하여 변환 할 수있는 모든 단어를 찾는 프로그램 또는 함수를 작성하십시오.
프로그램은 모든 “실제”영어 단어를 정의하는 단어 목록 텍스트 파일에 액세스 할 수 있습니다. 이 파일의 각 줄에는 하나의 소문자 az 단어가 있으며 선택적으로 후행 줄 바꿈이 있다고 가정 할 수 있습니다. 다음은 테스트에 사용할 수있는 실제 단어 목록입니다. 이 단어 목록 파일이 f(또는 더 긴 것) 호출 되고 편리한 디렉토리에 있다고 가정 할 수 있습니다 .
35 바이트 페널티 (점수에 35를 더함)의 경우 단어 목록이 이미 문자열 목록으로 변수에로드되었다고 가정 할 수 있습니다. 주로 파일을 읽을 수없는 언어를위한 것이지만 제출시 파일을 활용할 수 있습니다.
프로그램은 입력 번호를 변환 할 수있는 단어 목록의 모든 단어를 출력해야합니다 . 그것들은 줄마다 하나씩 stdout (또는 이와 유사한)으로 인쇄되거나 (선택적인 후행 줄 바꿈과 함께) 함수를 작성하기로 선택한 경우 문자열 목록으로 리턴 될 수 있습니다. 단어 목록은 반드시 알파벳순 일 필요는 없으며 출력도 필요하지 않습니다.
가능한 단어가 없으면 출력 (또는 목록)이 비어 있습니다. 빈 문자열이 입력되면 출력도 비어 있습니다.
stdin, 명령 행 또는 함수에 대한 문자열 인수로 입력하십시오. 단어 목록 또는 파일 이름은 입력의 일부가 아닌 숫자 문자열이어야합니다.
단어 목록이 아닌 단어 목록에서 하나의 단어 만 일치시킵니다. 단어 noon는에 대한 결과 중 하나 일 수 22있지만 단어 순서 no one는 그렇지 않습니다.
테스트 사례
이것이 단어 목록이라고 가정하십시오.
stnmrljkfp
zthnmrlshqfb
asatanamaralajakafapa
aizxydwwwnhimouooraleshhhcavabe
zdnmrlshcvb
zdnmrlshchvb
sthnmrlchgvb
shthnmrlchgvb
bob
pop
bop
bopy
boppy
입력 0123456789은 zdnmrlshchvband를 제외한 모든 긴 단어를 제공해야합니다 shthnmrlchgvb.
stnmrljkfp
zthnmrlshqfb
asatanamaralajakafapa
aizxydwwwnhimouooraleshhhcavabe
zdnmrlshcvb
sthnmrlchgvb
입력 99은 다음을 제공해야합니다.
bob
pop
bop
bopy
(출력 단어는 순서가 상관 없습니다.)
채점
바이트 단위 의 최단 제출 이 이깁니다. Tiebreaker는 먼저 게시 된 제출물로 이동합니다.
멋진 관련 사이트 : numzi.com .
답변
펄, 87 84
open A,f;"@ARGV"eq s/[cs]h/j/gr=~y/stnmrljkfpzdcgqvb\0-z/0-90177789/dr&&print for<A>
명령 행 매개 변수로 입력을받습니다.
$perl m.pl 23940
표준 입력에서 단어 목록이 허용되는 경우 다소 짧아 질 수 있습니다.
$perl -lnE'INIT{$;=pop}$;eq s/[cs]h/j/gr=~y/stnmrljkfpzdcgqvba-z/0-90177789/dr&&say' 99 <f
답변
파이썬 2, 215208 바이트
이 Python 솔루션은 명령 줄 인수로 인덱스 된 부분에서 정규식을 작성한 다음 각 단어를 그 (대규모) 정규식으로 테스트합니다.
import re,sys
a='[sz] (d|th?) n m r l (j|sh|ch) [kcgq] [fv] [pb]'.split()
b=z='((?<![sc])h|[aeiouwxy])*'
for i in sys.argv[1]:b+=a[int(i)]+z
for d in open('f'):
d=d.strip()
if re.match('^'+b+'$',d):print d
축소 기 이전의 원본 소스 :
import re,sys
regexbits = '[sz] (d|th?) n m r l (j|sh|ch) [kcgq] [fv] [pb]'.split()
regex = other = '((?<![sc])h|[aeiouwxy])*'
for i in sys.argv[1] :
regex += regexbits[int(i)] + other
print regex # DEBUG
for word in open('f'):
word = word.strip()
if re.match('^'+regex+'$', word) :
print word
예를 들어, 테스트 정규식 99은 다음과 같습니다.
^((?<![sc])h|[aeiouwxy])*[pb]((?<![sc])h|[aeiouwxy])*[pb]((?<![sc])h|[aeiouwxy])*$
(?<![sc])h비트 확실히 만드는 요소는 “부정적인 주장 뒤에 모습”입니다 h를 따라하지 않습니다 s또는 c일반 필러 부분이다.
고마워 캘빈 이 도전으로 인해 녹슨 정규식 기술을 익힐 수있었습니다.
답변
파이썬 3, 170
import sys,re
t=str.maketrans('sztdnmrljkcgqfvpb','00112345677778899','aehiouwxy\n')
for s in open('f'):re.sub('sh|ch','j',s).translate(t)!=sys.argv[1] or print(s,end='')
읽을 수있는 버전 :
import sys, re
table = str.maketrans('sztdnmrljkcgqfvpb', '00112345677778899', 'aehiouwxy\n')
for line in open('f'):
line = re.sub('sh|ch', 'j', line)
if line.translate(table) == sys.argv[1]:
print(line, end='')
코드 차종은 사실 사용 th(이 같은 번호로 매핑하기 때문에 중복 t및 h패딩 문자입니다).
정적 maketrans함수는 첫 번째 인수의 문자를 두 번째 인수의 문자에 맵핑하고 세 번째 인수의 문자를 None(그러한 문자가 삭제되도록) 맵핑하는 테이블을 작성합니다 .
최종 코드는의 직접 인수로 테이블을 작성하여 몇 바이트 더 짧아 질 수 있습니다 translate.
답변
sed, paste, grep, 잘라 내기-109
sed -e 's/[sc]h/6/g;s/[aehiouwxy]//g;y/sztdnmrljkcqgfvpb/00112345677778899/' w|paste w -|grep " $1$"|cut -f1
파일 “w”를 가져 와서 각 단어를 숫자로 변환하고 원래 단어로 다시 붙여넣고 숫자를 grep 한 다음 일치하는 단어를 반환합니다. grep 이후 인용 부호 뒤에있는 공백은 붙여 넣기의 기본 분리 문자 인 탭입니다.
나는 Perl이 앞서 있다는 것을 알고 있습니다. 예를 들어 더 나은 쉘 버전을 원했습니다.
예, $ 1 부분은 이것이 쉘 스크립트에서 실행되어야 함을 의미합니다 (대부분의 쉘은 작동해야 함). 명령 행 인수가 필요합니다.
답변
배쉬 + coreutils, 216
sed -n "$(sed 's/[aeiouwxy]//g
:l
s/\([^sc]\)h/\1/g
tl'<w|grep -nf <(eval printf '%s\\n' `sed 's/0/{s,z}/g
s/1/{t,th,d}/g
y/2345/nmrl/
s/6/{j,sh,ch}/g
s/7/{k,c,g,q}/g
s/8/{f,v}/g
s/9/{p,b}/g'<<<$1`)|sed s/:.\*/p/)" w
- 라는 파일의 단어 목록
w - 가장 안쪽
sed은 가능한 대체로 숫자를 대체합니다. eval printf사용 가능한 모든 대체를 확장 중괄호 확장 쉘- 첫 번째
sed줄 의 두 번째 줄은 단어 목록에서를 제거aeiouwxy하고h(앞에없는 경우[sc]) - grep은 줄 번호와 함께 모든 일치 항목을 인쇄합니다
- 우리가 제거 했으므로
aeiouwxy및h단어리스트에서 마지막sed다른 권선 (각각의 매치 라인 번호)를 그렙 결과sed최 의해 처리 식은,sed단어 목록에서 모든 가능한 단어들을 공개한다.
산출:
단어 목록 파일은 명령 행 인수로 지정되고 그 다음에 니모닉으로 표시되는 숫자가 지정됩니다.
ubuntu@ubuntu:~$ ./numzi.sh 99
bob
pop
bop
bopy
boppy
$ ./numzi.sh 0123456789
stnmrljkfp
zthnmrlshqfb
asatanamaralajakafapa
aizxydwwwnhimouooraleshhhcavabe
zdnmrlshcvb
sthnmrlchgvb
$
답변
tr, sed, grep, xargs, sh, 77
tr 0123456789 ztnmrljkfp|sed 's/ */[aehiouwxy]*/g'|xargs sh -c 'grep -x $0 f'
stdin의 숫자가 필요하며 단어 목록이 파일에 저장되어야합니다 f.
모든 대체를 사용하지는 않으며 (1은 항상 z, 7은 항상 k 임) 게으른 솔루션이라고 할 수 있지만 [1-100]에서 95 개의 숫자에 대해 하나 이상의 니모닉을 찾습니다.