python找假硬币二分法_编程二分法(从字面上看)

Rebmu:79个字符或(37 +长度(p1)+ 2 *最大(长度(p2),长度(p3)))

首先,我将提供一个79个字符的解决方案,询问您必须学习哪种语言?(熵4.0,不包括30个字母?),并为您提供

DD 11 DD :do dd {dd {p{Which languages must you learn?}qt}} pp{{[RReebdo]l}}

此处使用的一种独特的策略不是其他语言,它是利用了花括号是一个不对称的字符串定界符的事实,它可以合法地嵌套:

my-string: {"It's cool," said {Dr. Rebmu}, "for MANY reasons--like less escaping."}

这让我产生了一个通用的解决方案,该解决方案可以在不使用转义序列的任何程序上轻松工作。79个字符的版本足以简化快捷方式,但是要正确地包含程序p2和p3的任意程序源,则需要完整的模板。如果我们使用了它,那将是87个字符:

DD 11 DD :do dd {dd {p{Which languages must you learn?}qt}} ddoo{{pp{{[RReebdo]l}}}}

使用这种一般形式的模式是,如果你有一个可变长度的连续字符三个源文本(让我们用一个例子一样AAA,BBBBB,CCCCCCC)你可以编码它们沿着线的东西:

DD 11 DD :do dd {dd {AAAqt}} ddoo{{BCBCBCBCBC C C}}

(注意:虽然这种模式必须在使用转义符的程序上进行调整,否则将无法正常工作,但这并不是致命的缺陷。在用大括号分隔的字符串中获得不匹配的左大括号需要类似{Foo ^{ Bar}...的操作,但是您可以轻松地使用可选的字符串表示法"Foo { Bar"和合并的案例可以通过将未转义的字符串混合在一起来管理。)

所以...怎么样?一旦有了通用的表格,这个573个字符的程序就可以在短短几分钟内从3种先前的代码高尔夫解决方案中进行组装:

DD 11 DD:do dd {dd {rJ N 0%rN Wa1m2j S {\ x /} D00 Hc&[u [Ze?Wa Qs〜rpKw [isEL00c [skQd2k] [eEV?kQ [tlQ]] pcSeg--b00 [ eZ 1 5] 3] prRJ [si〜dSPscSqFHs] eZ 1 [s + dCa + wM2cNO]] Va | [mpAp2j] prSI〜w { } Ls2w Wl h01tiVsb01n -1 chRVs { } hLceVn01qt}} ddoo {{BrdS [sn [{N sbeo [tIt0l1eV} 0e5gXN1 01L {5s0} C {1} 0 {0 Do5f0 0bMe1e0r0} 0]]] tMw9C9 Numz Jl [paN + [KperlCJBn [[ba sWS {B noJn Jt] aCn] {K,j} b P {。} lf EZ--n [N m {G otothestoreandbuysome more}] {警音和passitar声} c B w P lf]]}}

如果仅使用奇数字符并运行,那么它将打印出99瓶啤酒诗

只有偶数字符会为您进行一点罗马数字转换。

如果有人想尝试使用自己选择的语言编写该程序,并且认为自己可以胜过573,请告诉我。如果您愿意,我将为您赢得很多声誉-假设您选择的语言不是Rebmu,因为我知道这些程序并不是最低限度的。:-)

当p2和p3的长度不平衡时,会发生最后的“浪费”间距。但是在这种情况下,所有3个程序的大小都不同,因此对于p2 / p3没有特别好的配对。(我之所以选择它们,是因为没有外部数据作为输入,例如迷宫之类的东西,而不是它们的长度相似。虽然我可以编写更优化的新程序,但我花了足够的时间,重点是您不必编写新程序...)

怎么运行的

(注意:我从一种更“创意”的方法开始,这种方法不是简化的,而是看起来更有趣。由于描述了这种方法已经很长了,因此将其移至博客上的一个条目中。)

像其他条目一样,这里的关键是“以字符串形式的等效代码”的骗术,它只有不对称字符串定界符的王牌。我将从解释80个字符的情况开始。

这是“整体”程序,用于调整此案例的可读性的空白:

DD 11 ; assign 11 to dd (about to overwrite again)

DD :do ; make dd a synonym for DO (a.k.a. "eval")

; eval a string as source code that ends with QUIT (QT)

dd {dd {p{Which languages must you learn?}qt}}

; we'll never get here, but whatever's here must be legally parseable

pp{{[RReebdo]l}}

在这里,我们将DD设置为DO(也称为“ eval”)的同义词。但是诀窍在于,当减半的程序运行时,它们结束正在运行的代码,其唯一作用是将D定义为无害的文字1。

这是奇数字符代码的内容,再次调整了空格:

D 1 ; assign 1 to d

D d ; assign d to itself, so it's still 1

d ; evaluates to integer, no side effect

{d pWihlnugsms o er?q} ; string literal, no side effect

p {Rebol} ; print "Rebol"

这是偶数字符代码:

D 1 ; assign 1 to d

D:od ; URL-literal (foo:...), no side effect

d ; evaluates to integer, no side effect

{{hc agae utyulan}t} ; string literal (well-formed!), no side effect

p {[Red]} ; print "[Red]"

对于非平分程序,实际上就是这样,dd {dd {(arbitrary code)qt}}它将执行您想要的任何代码。但是,有两个评估请求,而不仅仅是一个。这是因为尽管嵌套括号在交错的代码中很好用,但它们却扰乱了DO的评估行为。因为:

do {{print "Hello"}}

将字符串作为程序加载,但是该程序只是字符串常量{print "Hello"}。因此,我在这里使用的技巧是获取DD(与DO保持相同的函数值)并运行两次。减法器咀嚼着琴弦的不同部分,但是如果内容的偶数/奇数正确,它们就不会咀嚼,而且减半后在琴弦外留下的只是积分常数,d因此它们是无害的。

有了这种模式,编写程序行为时即使没有切成两半也不成问题-您可以输入任何东西,只要代码的字符长度是偶数即可(如果要计算QT,则为奇数,即QUIT)。如果您需要从奇数中获得偶数,请在空格中添加一个空格(因此,对于p1的奇数程序长度,我在上面的公式中p1上实际上存在+1)。诀窍似乎是写出交错的代码,如果不加倍,则必须通过解析器。(由于QT,它不会运行,但是在执行之前必须是可加载的。)

这种情况是微不足道的。pp即使未定义也可以很好地作为符号加载,并p在每个半个程序中拆分为打印。但是,只要再次使用字符串文字,我们就可以做另一种技巧。减半后的程序仍然具有正常定义的DO,因此我们也可以这样说:

ddoo{{pp{{[RReebdo]l}}}}

通过在整个情况下让解析器选择的唯一部分是符号词ddoo和字符串文字,我们可以然后在该字符串文字中插入我们希望的任何两个程序,而不会激怒解析器。减半的版本只会说:

do{p{Rebol}}

..和...

do{p{[Red]}}

就像我说的那样,对于将程序视为字符串并将其评估的其他解决方案,这部分看起来很熟悉。但是在比赛的情况下,当您要打包的程序包含嵌套的字符串时,就会为它们带来麻烦。在这里,唯一会困扰您的就是通过插入符号(^)进行转义...这很容易解决。

(小小的“作弊”注释:为响应此问题,我为“ QUIT”添加了QT。实际上,我之前故意删除了quit的缩写...因为某种原因,我认为这仅适用于控制台,并且占用了如果不是REPL,则使用两个字母的空格。我添加它是因为我发现我错了,尤其是在这种情况下不添加它。但是,在此更改之前,它要长2个字符。当我第一次发布解决方案时,Rebmu中存在一个错误,即使该错误应该存在,该错误也无法使它真正起作用。)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值