防辐射软喹


38

很简单:制作一个适当的藜,如果您删除任何字符,它仍然是藜。

此代码与防辐射的quine之间的区别在于,如果您的程序是ABA将输出防辐射的quine AB,但在这里A将输出A

编码高尔夫球,所有标准规则,标准漏洞适用,不作弊。


空程序有效吗?
Loovjo '16

4
@Loovjo
Martin Ender

3
@feersum挑战指出“在...上放奎纳”,因此AB应输出AB
Mego

1
@Mego我知道它是这么说的,但是规范并不总是那么精确,并且在示例中也没有指出。
feersum '16

4
@feersum“做一个奎纳”意为做一个奎纳。“这与防辐射的奎尼之间的区别……”意味着唯一的区别是,删除了一个字节的程序会生成奎因,而不是打印原始程序源的程序。这里没有歧义。
Mego

Answers:


22

> <>(Fish),145107字节

此答案使用> <>的跳转指令来解决此问题。

!<0078*+00~..>0[!."r43a*+8a+&{ee+00&1-:&(?.~~ol?!;4b*0.0f<>0['r3d*159*+&}7a*00&1-:&(?.~~ol?!;68a*+0.0+*a58 

这个quine实际上包含两个不同的quine生成器。它以某种跳跃逻辑开始,默认情况下使用左quine。如果从跳转逻辑或左键盘上删除了一个字符,程序将跳转到右键盘上。

你可以在这里尝试

说明

该代码可以分为以下几部分:

A: !<0078*+00~..>0[!. 
B:              >0[!."r43a*+8a+&{ee+00&1-:&(?.~~ol?!;4b*0.
C:                                                    .0f<
D:                                                        >0['r3d*159*+&}7a*00&1-:&(?.~~ol?!;68a*+0.
E:                                                                                                 .0+*a58 

不同部分的说明:

  • A:跳到C的右边。如果从A删除了任何字符,则跳到D的左边或E的右边,触发第二个奎因。如果从B或C中删除了任何字符,则代码向左移1个字符,从而使该代码跳到D的左侧。
  • C:此代码跳到B的左侧。
  • B:Quine#1
  • D:Quine#2
  • E:跳至D的左侧

奎纳的解释(以#1为例):

一旦指令指针到达任何一个提包,您就可以确定该提包是完整的。

>0[!.                                       //Fix the instruction pointer's direction and empty the stack (The '!.' is a leftover from codepart A)
     "r43a*+                                //Start reading all of the code and add the '"' character to the stack
            8a+&                            //Because the quine started reading at the 19th character instead of the first, the stack has to move 18 characters. 
                                            //This part saves the number 18 to the register.
                {ee+00&1-:&(?.              //Move the stack one to the left, decrease the stack by 1. If the stack is not empty yet, jump back to the start of this section.
                              ~~              //Clean the temporary variables from the stack. It should now contain the whole quine.
                                ol?!;4b*0.  //Print the first character from the stack. As long as the stack isn't empty, jump back to the start of this section.

请解释。
CalculatorFeline

在上面重申。
CalculatorFeline

1
这足够清楚吗?
Thijs ter Haar

36

语言,4.54×10 761字节

它具有以下数量的空字符:

453997365974271498471447945720930600149036031871190716908688344432973027776681259141680552038829875159204621651993092104775733418288411812715164994750890484868305218411129600012389568016974351721147925344946382782884546247102886167837964612372737300786173159265347137401863281368021545169383664534228503236761742285358985343373496184959796553930661837467682191561275123057706776367104142995491262443697167483190110516522677811931124842961701222425076750211774387637740969301686178545299089832300154448308384461700726890067468872402133010536518468336342175124002115991866466700174974019423711837589532744970385003356612639263433822126850314801275940879069069974437167102618471264140597777702065896715558989678487253830854848740247786166790545462769498303055791292

认真地看待这一挑战中的标准与“适当的奎因”的定义相抵触,我认为一元变种将获胜。

扩展的Brainfuck代码:

>>+++>++++++++>+++>+++>+>+>+>+>+>+>+>+++>+>+>+>+>+>+>+>+>+++>+>+>+>+>+>+>+>+>++++++++>++++>++++++++>++++>+++++++>++>+++>+>+++>++>+++>+++>+>+>+>+>+>+>+>+>++++>++++>+++++++>+>++++>++++++++>++>+++++++>+++>++++++++>++>+++++++>+++>++++++++>++>+++++++>+++>++++++++>++>+++++++>+++>+++++>++++++++>++++>+++++++>+++++++>+>+>+++>+>+>+>++++++++>+++>+++++++>+>+++>+>+++>+>+++>+>++++++++>++++>++++++++>++++>++++++++>++++>++++>+>+++>+++>++>+++++++>+++++++>+>+>+>++++++++>+++>+>++++++++>++++>+>+++>++>+++++++>++>+++++++>++++>++++>++++++++>+++>++++++++>+++>+++>+>++++>++++>++>+++++++>+++>+++>++++++++>++++>+>+++>++>+++++++>++++>++++>+++++++>+++>+++>+++>+++>++++++++>++++>++++>+>+++>+>+++>++>+++++++>+++++++
[
    [->+>+<<]
    >>>>[<<[->+<]>>[-<<+>>]>]
    <<[-[->+<]+>]+++
    [[->>+<<]<]<
]
+>+>+>+
[>]+++>++
[
    [<].
    >[-]>[-]>[-]>[-]
    <+[<<++++++++>>->+>-[<]<]
    ++++++++>++++++++>+++++++>>
]
.

如果从Lenguage程序中删除了一个字符,则最后一个字符将变为<,这将导致该程序少打印一个字符。


1
您如何找到该固定点?(或者,Brainfuck代码是如何工作的?)
Martin Ender

1
@MartinBüttner第一个大循环以“> +++ ...”的形式复制并编码数据(并反转)。另一个大循环将数据打印为一元整数。它不是那么复杂,但是很长,只是因为它是Brainfuck。
jimmy23013 '16

哦,对,这就像普通的Brainfuck奎因,但具有不同的解码功能吗?
Martin Ender

@MartinBüttner有点。但是程序的一半是“解码功能”。
jimmy23013 '16

看来您可以使用类似的技术为codegolf.stackexchange.com/q/57257/8478构造任意分数的答案(尽管其确切效果取决于我对最新评论的回答)。
Martin Ender
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.