자체 열거 형 팬 그램


12

팬 그램

빠른 갈색 여우가 게으른 개 위로 뛰어 들었다.

이것은 알파벳의 모든 문자를 적어도 한 번 포함하는 문장 인 팬 그램의 예입니다.

자기 열거 팬 그램은 자신의 편지 수의 분석을 생산하여 팬 그램을 할 기준을 충족 문장이다.

이것을 달성하는 예는 문장입니다

이 팬 그램에는 4 개의 As, 1 개의 B, 2 개의 C, 1 개의 D, 30 개의 Es, 6 개의 Fs, 5 개의 Gs, 7 개의 Hs, 11 개의 Is, 1 개의 J, 1 개의 K, 2 개의 Ls, 2 개의 Ms, 18 개의 Ns, 15 개의 Os, 2 개의 Ps , 1 개의 Q, 5 개의 R, 27 개의 Ss, 18 개의 Ts, 2 개의 Us, 7 개의 V, 8 개의 W, 2 개의 X, 3 개의 Y 및 1 개의 Z.


도전

입력이 문자 인벤토리로 이어지는 문자열 인 함수를 생성하십시오. 이 예에서 입력은 "This pangram contains"입니다. 각 문자의 수량은 서면으로 작성해야하며 표시된 문자 수에 기여해야합니다.


규칙

  • 옥스포드 쉼표는 선택 사항입니다
  • Z 앞에 앰퍼샌드를 사용하십시오 (또는 하드 모드의 경우 기능에서 "&"와 "and"사이를 전환하는 기능 포함)
  • 모든 문자는 총 문자 수에 포함됩니다
  • 쓰지 않은 숫자가 없습니다
  • 이것은 이므로 바이트 단위의 가장 짧은 코드가 승리합니다.
  • HONO에서 u는 결혼 한 부부의 주말 R, 숫자는 여왕의 영어로 작성되어야한다. 예 nine hundred and ninety-nine Gs를 들어 , 문자 G의 999 번 발생 및 nine hundred and nine Gs909 번.
  • 표준 단기간 명명 규칙 에 따라 차수를 기록해야합니다.

가장자리 케이스

  • 코드가 루프에 걸리는 경우가 있습니다. 예를 들어, 2 개의 Os가있는 경우 코드는 카운트를 3 개의 Os로 증가시켜 코드가 2 개의 Os를 다시 카운트하게합니다. 문제를 해결할 수 다시이 오기 전에 다른 모든 편지를 계산하는 경우, 입력이 거짓 선발 출력이라고 생각 false, null또는 빈 문자열입니다.
  • 문자가 999 개가 넘는 경우 입력을 잘못된 시작으로 간주해야합니다.

테스트 사례

  • "이 pangram contains"는 예제 문장을 출력해야합니다

8
나는 그것을 테스트하지는 않았지만 유효한 솔루션을 구성 할 수없는 경우가 있다고 확신합니다.이 경우 출력은 무엇입니까? 예를 들어, o개수에 대한 단어가없는 두 개의 - 가 포함 된 문자열이있는 경우으로 철자를 입력 two하면 전체 문자열에 세 개의 o-가 있습니다. 즉, 단어가 잘못 되었다는 뜻입니다. 등
Nit

2
솔루션이 지원해야하는 가장 큰 서면 번호는 무엇입니까? 백, 천, 백만?
Nit

7
좋은 첫 질문! 그러나 개인적으로 최대 글자 수를 999 개 또는 99 개로 제한하는 것이 좋습니다. 이렇게하면 텍스트가 내장되어있는 10 진수가없는 언어에 더 쉽게 접근 할 수있을뿐만 아니라 모든 재미를 보존 할 수 있습니다. (일부 언어로는 수백만 개의 문자가있는 항목을 테스트하는 것이 불가능할 수도 있습니다.)
Arnauld


1
Rob enjoys any sentence with two As, two Bs, two Cs, one D, thirty five Es, four Fs, three Gs, nine Hs, eight Is, two Js, one K, two Ls, one M, twenty two Ns, eighteen Os, one P, one Q, nine Rs, twenty three Ss, twenty three Ts, three Us, four Vs, eleven Ws, one X, seven Ys, & one Z.
Chas Brown

답변:


6

파이썬 2 , 615 바이트

def g(n):S=str.split;D=S('z one two three four five six seven eight nine');K=' fif six seven eigh nine';n,m=n/100,n%100;e,d=m/10,m%10;return' '.join([D[n],'hundred']*(n>0)+([S('ten eleven twelve thir four'+K)[d]+'teen'*(d>2)]if 9<m<20else[S('twen thir for'+K)[e-2]+'ty']*(e>0)+[D[d]]*(d>0)))
from random import*
X='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
def f(p):
 T=set();s='';i=0
 while 1:
	Q=s.upper().count;t=p+' '+', '.join(['& '*(c=='Z')+g(Q(c))+' '+c+'s'*(Q(c)!=1)for c in X])+'.'
        if s==t:return i,t
	if t in T:t=''.join(c*max(1,t.upper().count(c)+(randint(0,6)-3)*(random()<0.25))for c in X)
	T.add(t);s=t;i+=1

온라인으로 사용해보십시오!

이 함수 fp문자열 접두사로 사용됩니다. 수행 한 단계 수와 오토 그램을 나타내는 정수의 튜플을 반환합니다.

이 함수 g는 숫자 1<=n<=999를 영어 문자열로 인코딩 합니다. 총 바이트 수의 약 절반 인 291 바이트를 차지합니다. 코드

Q=s.upper().count
t=p+' '+', '.join(['& '*(c=='Z')+g(Q(c))+' '+c+'s'*(Q(c)!=1)for c in X])+'.'

문자열 s을 (잠재적으로 autogram-matic) pangram으로 인코딩합니다 t.

우리 는 오토 그램 (즉, where ) t과 같은 상황을 찾기를 희망하면서 프로세스를 반복합니다 . 경우 우리는 루프에 들어갈 때, 우리는 무작위로 완전히 특별 방식으로 문자의 수를 슬쩍 찌르다.tt==s

의 대부분의 p경우이 프로세스는 TIO에서 시간 초과됩니다. 일반적으로 '우승'조합을 찾기 전에 수백만 가지 가능성을 조사합니다.

전혀 증거가 없지만 내 추측은 : (a) Lee Sallows가 설명 하고 하드웨어 (!)에서 구현 것과 비슷한 철저한 무차별 대입 검색을 제외하고 이러한 종류의 무작위 휴리스틱은 다음과 같습니다. 당신이 얻을 수있는 좋은; (b) 많은 (가장?) 초기 문구에 대한 해결책이 없을 것 p입니다.


map(chr,range(65,91))일부 바이트를 저장합니다.
ბიმო
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.