自己推定パングラム


12

パングラム

素早い茶色のキツネが怠zyな犬を飛び越えました。

これはパングラムの例です-アルファベットのすべての文字を少なくとも1回含む文。

自己列挙パングラムは、独自の文字の数の分析を生成することによってパングラムする基準を満たす文です。

これを達成する例は、文です

このパングラムには、4つのAs、1つのB、2つのC、1つのD、30のE、6つのF、5つのG、7つのH、11のI、1つのJ、1つのK、2つのL、2つのM、18のN、15のO、2つのPが含まれます、1つのQ、5つのR、27のS、18のT、2つのUs、7つのV、8つのW、2つのX、3つのY、および1つのZ。


チャレンジ

入力が文字目録につながる文字列である関数を生成します。この例では、入力は「このパングラムに含まれています」です。各文字の数量は、書面に記載され、表示される文字数に貢献する必要があります。


ルール

  • オックスフォードコンマはオプションです
  • Zの前にアンパサンドを使用します(または、ハードモードの場合、関数で「&」と「and」を切り替える機能を含めます)
  • すべての文字は合計文字数にカウントされます
  • 書かれていない数字はありません
  • これはので、バイト単位の最短コードが勝ちます
  • HONOでのuこの週末R夫婦の、数字は女王の英語で書かなければなりません。たとえばnine hundred and ninety-nine Gs、文字Gの999回の出現およびnine hundred and nine Gs909の出現。
  • 桁は、標準の短いスケールの命名規則で記述されます

エッジケース

  • コードがループでスタックする場合があります。たとえば、2つのOがある場合、コードはカウントを3つのOに増やします。これにより、コードは再び2つのOをカウントします。これに戻る前に1文字おきに計算しても問題を解決できない場合は、入力が誤ったスターターおよび出力falsenullまたは空の文字列であると考えてください。
  • 文字に999を超える出現がある場合、入力は誤ったスターターと見なされる必要があります。

テストケース

  • 「このパングラムに含まれる」は、例文を出力する必要があります

8
私はそれをテストしていませんが、有効なソリューションを構築できない場合があると確信しています。その場合、出力はどうあるべきでしょうか?たとえばo、カウントの単語なしで2つの-を含む文字列がある場合、で綴るとtwo、文字列全体に3つの- 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.
チャスブラウン

回答:


6

Python 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を(潜在的にオートグラムに似た)pangramにエンコードしますt

オートグラムであるtようなものを見つける状況t(つまり、where t==s)を期待して、プロセスをループします。場合は、我々はループに入るとき、私たちはランダムに完全にアドホックな方法で文字の数を微調整します。

ほとんどの値について p、このプロセスはTIOでタイムアウトします。通常、「勝つ」組み合わせを見つける前に、数百万の可能性が検討されます。

私はすべての任意の証拠を持っていないが、私の推測では、次のとおりです。()離れて徹底的ブルートフォースからのものと同様の検索創始リー・サローズはここに説明し、ハードウェアで実装し、ランダムなヒューリスティックのこの種は、としてについてです(!)あなたが得ることができるように良い; (b)多くの(ほとんどの?)初期フレーズに対する解決策はありませんp


map(chr,range(65,91))いくつかのバイトを節約します。
ბიმო
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.