自枚举的pangram


12

gram

敏捷的棕色狐狸跳过了那只懒狗。

这是一个连字符(pangram)的例子-一个句子,至少包含一次字母表中的每个字母。

一个自枚举全字母短句是符合标准的生产自己的信件数量的分析是一个全字母短句的句子。

实现这一目标的一个例子是

该Pangram包含四个As,一个B,两个C,一个D,三十个E,六个F,五个G,七个H,十一个Is,一个J,一个K,两个L,两个Ms,十八个Ns,十五个Os,两个Ps ,一个Q,五个R,二十七个S,十八个T,两个Us,七个V,八个W,两个X,三个Y和一个Z。


挑战

产生一个函数,输入是通向字母清单的字符串。在示例中,输入将为“此pangram包含”。每个字母的数量必须采用书面形式,并有助于显示的字母数。


规则

  • 牛津逗号是可选的
  • 在Z之前使用&号(或在硬模式下,包括在函数中的“&”和“ and”之间切换的功能)
  • 每个字母都计入总字母数
  • 没有非书面数字
  • 这是因此以字节为单位的最短代码获胜
  • 在亚硝酸ü本周末r是已婚夫妇,这个数字是在女王的英语编写。例如,nine hundred and ninety-nine Gs对于出现的999个字母G和nine hundred and nine Gs909。
  • 数量级应以标准的小规模命名约定编写

边缘情况

  • 在某些情况下,代码会陷入循环中-例如,如果有两个O,则代码会将计数增加到三个O,这会使代码再次对两个O计数。如果在返回到该值之前计算出其他所有字母都不能解决问题,请认为输入是错误的启动器和输出falsenull或者是空字符串。
  • 如果一个字母出现999次以上,则该输入应视为错误的启动器。

测试用例

  • “此pangram包含”应输出例句

8
我还没有测试过,但是我很确定在某些情况下您无法构建有效的解决方案,在这种情况下输出应该是什么?例如,如果您有一个包含两个o-s 的字符串,但没有用于计数的单词,那么当您使用拼写出来时two,整个字符串现在具有三个o-s,这意味着该单词现在不正确,将其切换会使它再次不正确等等
-Nit

2
解决方案必须支持的最大书面数量是多少?一百,一千,一百万?
Nit

7
不错的第一个问题!但是,我个人建议将最大字母数限制为999,甚至99个。这将使这种挑战对于没有内置十进制文本的语言更易解决,同时保留所有乐趣。(此外,甚至可能无法测试某些语言中包含数百万个字母的条目。)
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 '18

Answers:


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

在线尝试!

该函数f采用p字符串前缀;并返回一个整数元组(代表所采取的步骤数)和自动图。

该函数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为(可能是自动图)t

我们遍历整个过程,希望找到一种t这样的情况,t即一个自动图(即where t==s)。如果进入循环,则以完全临时的方式随机推算字母数。

对于的大多数值p,此过程将在TIO上超时。通常,在找到“获胜”组合之前会检查数百万种可能性。

我根本没有任何证据,但是我的猜测是:(a)除了穷举蛮力搜索(类似于鼻祖李·萨洛斯(Lee Sallows)在此处描述并以硬件实现)之外,这种随机启发式算法的含义如下:尽你所能 (b)对于许多(大多数?)初始短语,将没有解决方案p


map(chr,range(65,91))保存一些字节。
ბიმო
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.