23940을 기억하기위한 니모닉 있도록 단어로 숫자를 변환하는 장치입니다. 단어의

주요 시스템은 A는 니모닉 들이보다 쉽게 기억 될 수 있도록 단어로 숫자를 변환하는 장치입니다.

단어의 발음이 소리 나는 방식을 기반으로하지만 문제의 단순성을 유지하기 위해 단어의 철자에 대해서만 관심을 갖습니다. 즉, 잘못된 전환이 발생하지만 괜찮습니다.

단순화 된 주요 시스템을 사용하여 숫자를 단어로 변환하려면 :

  • 각각 0s또는로 교체하십시오 z. (일부 일 수도 있고 s일부 일 수도 있습니다 z. 아래도 마찬가지입니다.)
  • 각각의 교체 1와 함께 t또는 dth.
  • 각각을 2로 바꿉니다 n.
  • 각각을 3로 바꿉니다 m.
  • 각각을 4로 바꿉니다 r.
  • 각각을 5로 바꿉니다 l.
  • 각각의 교체 6와 함께 j또는 shch.
  • 각각의 교체 7와 함께 k하거나 c또는 gq.
  • 각각 8f또는로 교체하십시오 v.
  • 각각 9p또는로 교체하십시오 b.
  • 가능한 경우aehiouwxy 아무 곳에 나 문자를 추가하여 실제 영어 단어를 만드 십시오 .
    유일한 예외는 또는 h뒤에 삽입 할 수 없다는 것 입니다.sc

숫자는 실제로 0-9 사이의 숫자 (십진수 또는 쉼표 또는 부호 없음) 일 수 있습니다.
단어는 소문자 az 만 포함 할 수 있습니다.

숫자 32는로 변환해야합니다 ?m?n?. 여기서 ?문자로 만든 유한 문자열을 나타냅니다 aehiouwxy( 원하는 경우 자유 모노 이드 의 문자열 ). 진짜 영어 단어로 만들 수있는이 방법은 여러 가지가 있습니다 : mane, moon, yeoman, 등

숫자 05?s?l?또는 로 변환 될 수 있습니다 ?z?l?. 가능성은 easily, hasslehazel입니다. 단어 shawlh뒤에 배치 될 수 없으므로 허용되지 않습니다 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

입력 0123456789zdnmrlshchvband를 제외한 모든 긴 단어를 제공해야합니다 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(이 같은 번호로 매핑하기 때문에 중복 th패딩 문자입니다).

정적 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은 줄 번호와 함께 모든 일치 항목을 인쇄합니다
  • 우리가 제거 했으므로 aeiouwxyh단어리스트에서 마지막 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 개의 숫자에 대해 하나 이상의 니모닉을 찾습니다.