23940을 기억하기위한 니모닉


19

주요 시스템은 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 .


1
이 비디오 에서이 도전에 대한 아이디어를 얻었습니까 ? 사실 때문에 단지 어제 보았다. : P
Doorknob

1
@Doorknob 저 비디오는 아니지만 저 사람. 몇 년 전에 나는 그의 위대한 코스 강의 중 하나를 받았다 . 그는 좀 엉뚱하지만 정말 깔끔한 일을합니다. :)
Calvin 's Hobbies

1
실생활에서 니모닉 주요 시스템을 사용하는 데 관심이있는 사람들을위한 참고 사항 : 철자가 아닌 중요한 소리 입니다. 따라서 "c"는 여기에서 의미 7로 나열되어 있지만 단어에서 "s"소리로 발음되면 ( "ace"= 0과 같이) 실제로 0을 의미 할 수 있습니다. 그러나 전체 발음이 포함 된 사전은 간단한 단어 목록보다 찾기가 어렵 기 때문에 OP가 문제를 단순화했다고 확신합니다. 아, 그리고 23940의 한 렌더링은 "숫자"입니다.
ErikE

@ErikE 나는 우리가 게시물의 두 번째 문장에서 철자 기반 버전을 사용하고 있다고 말합니다 ...
Calvin 's Hobbies

나는 처음에 그것을 놓쳤지만 지금은 당신의 설명이 조금 더 잘 설명 될 수있는 것으로 보입니다.
ErikE

답변:


6

펄, 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

무엇을 A의미 open A,f합니까?
feersum

@feersum 나중에 파일을 읽는 데 사용되는 파일 핸들 ( <A>).
nutki

4

파이썬 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일반 필러 부분이다.

고마워 캘빈 이 도전으로 인해 녹슨 정규식 기술을 익힐 수있었습니다.


b=c='((?<![sc])h|[aeiouwxy])*'두 바이트를 절약합니다.
matsjoyce

t|th -> th?바이트 절약
Sp3000

int (i)를 직접 가져 와서 맵을 피할 수 있습니다.
xnor

유용한 골프 팁을 제공하는 matsjoyce, Sp3000 및 xnor에게 감사합니다. 이제 제안 사항이 구현되어 수정되었습니다.
논리 기사

2

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


정규 표현식에 sys.argv [1] 및 '[sc] h'대신 input ()을 사용하여 몇 바이트를 저장할 수 있습니다.
swstephe

@swstephe. 피드백 주셔서 감사하지만 input()루프 내부에서 호출되기 때문에 사용할 수 있다고 생각하지 않습니다 . 또한 제안 된 정규 표현식은 이미 사용중인 것과 동일합니다 (5 바이트).
ekhumoro

"z, t = input (), str.maketrans ..."와 같은 것을 생각하고 sys.argv 대신 z를 사용하십시오. 좋아, 내 정규식이 4 바이트라고 생각했습니다.
swstephe

2

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 부분은 이것이 쉘 스크립트에서 실행되어야 함을 의미합니다 (대부분의 쉘은 작동해야 함). 명령 행 인수가 필요합니다.


sedPerl의 개방 및 @ARGV오버 헤드 를 피하기 위해 대답을 순수 로 변환하는 것에 대해 생각하고 있었지만 범위가 부족하고 삭제 기능이 y///중단되었습니다. 놀랍게도 변수는 없지만 논리 자체를 직접 표현할 수 있습니다 sed. 내 92 해결책은 다음과 같습니다.sed -e'h;s/[sc]h/6/g;y/sztdnmrljkcqgfvpb/00112345677778899/;s/[^0-9]*//g;T;s/^$1$//;x;t;d' f
nutki

작동하는 것 같습니다. 왜 대답하지 않습니까?
swstephe

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
$ 

@ Calvin'sHobbies Done입니다.
Digital Trauma

예제를 업데이트하지 않은 것 같습니다.
Calvin 's Hobbies

-1

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 개의 숫자에 대해 하나 이상의 니모닉을 찾습니다.


3
질문은 단어 목록에서 모든 일치하는 단어 를 찾도록 요청 합니다. 1항상 z또는 7항상 만들 수는 없습니다 k. 이것은 유효하지 않습니다.
Calvin 's Hobbies

충분히 공정하게 답변을 제거하겠습니다.
pgy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.