Quine /反向Quine


26

编写一个接受布尔或非负整数输入的完整程序。它必须:

  • 如果输入值错误,则输出其自己的源代码
  • 如果输入值为真,则反向输出其自己的源代码

您的程序不能是回文的,也不能以任何方式读取其自己的源代码。

这是代码高尔夫-以字节为单位的最短代码获胜。


6
所以...如果我的语言没有布尔值。但是0是虚假的,正整数是真实的。我是否可以假设输入将仅为0或1(作为布尔值的替代品-实际上,由于条件运算符的结果,该语言始终会产生这两者之一)?还是因为我不能使用“实际”布尔值,所以我必须支持任何整数吗?
马丁·恩德

Answers:


9

Gol> <>,9个字节

'rd3*I?rH

我发布这个消息有点尴尬,因为我们已经有了> <>,​​Vitsy和Minkolang的答案。标准quine的唯一添加项是I(读取整数输入),?(如果为真,则执行下一个)和r(反向堆栈)。

在线尝试


加入俱乐部!:D无论如何你都赢了。+1
艾迪生·克兰普

1
8个字节:sP#Hr?I"
Jo King

18

CJam,17 16字节

{`"_~"+Wq~g#%}_~

在这里测试。

标准quine的一个相当简单的修改。17字节的其他解决方案:

{`"_~"+q~{W%}&}_~
{`"_~"+q~!2*(%}_~

如果我可以假设输入仅为0或1(作为布尔值的替代,在CJam中没有专用的类型),则通过省略以下内容得到15 g

{`"_~"+Wq~#%}_~

说明

{`"_~"+  e# Standard generalised quine framework. Leaves the source code on the stack. 
  W      e# Push a -1.
  q~     e# Read and evaluate input.
  g      e# signum, turning truthy values into 1 (leaving 0 unchanged).
  #      e# Power. -1^0 == 1, -1^1 == -1.
  %      e# Select every Nth element: a no-op for 1 and reverses the string for -1.
}_~

由于0和1是CJam的布尔值,因此我认为您不需要g
丹尼斯2015年

@Dennis是的,我对此不太确定。
马丁·恩德

令人惊讶的是,我以某种方式击败了这个。oo,如果您再打下去,我也不会感到惊讶。:D
艾迪生·克伦普

9

Pyth,17个字节

_WQjN*2]"_WQjN*2]

对标准Pyth quine的直接修改。


该死,自从沙盒装了一个小时以来,我一直在等待发布。
lirtosiast

7

> <>,​​17个字节

需要-v标志(+1个字节)将输入推入堆栈(或将输入事先放在在线解释器上)。

'rd3*$?rol?!;70.

如果只允许整数输入(例如,对于falsy为0,对于true为1),则可以对相同数量的字节(不带标志)执行以下操作。

'rd3*ic%?rol?!;80.

在线尝试

> <>的“真” /“假”分别不是0和0。


6

Vitsy,15字节

...我...我在击败CJam!(大喊)妈妈!妈,我行了!

'rd3 * i86 *-)rl \ O

说明:

'rd3 * i86 *-(rl \ O
标准奎因,但有一点曲折:

'将源代码捕获为字符串
 rd3 *在ASCII中创建'字符
     i86 *-以ASCII格式获取输入字符,然后从中减去48。 
                    如果为零,则if语句将跳过下一条指令。
          (r如果堆栈的第一项为零,请不要执行下一项。
                    这里的下一项是相反的。
            l \ O打印出堆栈。

较新版本的Vitsy,11字节

v'rd3 *} v)rZ
v将输入捕获为变量。
 '捕获源,直到遇到另一个'
  r反转堆栈。
   d3 *将'推入堆栈。
      }将堆栈旋转到右侧。
       v)将变量(输入)压入堆栈并测试其是否不为零。
         r如果是这样,请反转堆叠。
          Z输出堆栈中的所有内容。

2

Javascript(ES6),42个字节

$=_=>'$='+(_?$:[...''+$].reverse().join``)

这是我对Bling Quine的修改。也是两倍长。


这实际上输出什么吗?不允许仅在REPL中有效的答案。
feersum 2015年

1
@ETHproductions会调用该函数,但仍然不会打印任何内容。而且,它不再是一个提包了。
丹尼斯2015年

@丹尼斯·右。好吧,我想这prompt()是必要的,除非我们切换到Node.JS。我相信$=_=>(A=`$=${$};$(prompt())`,alert(_?A:[...A].reverse().join``));$(prompt())它可以正常工作,尽管也许可以降低更多。
ETHproductions'2015-10-30

1
“您的程序无法以任何方式读取其自己的源代码。” 此解决方案是否属于此类?
ETHproductions 2015年

2

滑稽,40字节

ri#Q2 SH ~- "ri#Q" \/ .+ j "<-" ps if sh

说明:

Burlesque具有内置的高级堆栈和代码操作。实际上,您无法访问该程序的源代码,但可以访问将来将要执行的其余代码。这意味着#Q将返回其后的所有代码,这就是为什么我们必须将所有内容添加到#Q正在执行的代码中的原因ri#Q

blsq ) #Q1 2++
12 -- this is the result of 1 2++
{1 2 ++} -- this is the result of #Q

++1 2从技术上讲是非法代码,因为它是基于堆栈的。但是我们可以操纵代码以使其执行为1 2++

blsq ) #Q<-#q++1 2 
12

使用这些内置程序非常棘手,除与quine相关的东西外,没有人将它们用于任何有生产力的工作。如果颠倒++1 22 1++将产生21,而不是12。上面的代码产生的原因12是因为#Q还包含了<-这样的代码,所以最终我们执行的不仅是2 1++:p。我们最终执行2 1++#q<-产生的结果12

我们实际上可以替换代码中的内容,例如,此代码将?+自身中所有出现的内容替换为?*

blsq ) #Q(?+)(?*)r~5.-#q5 5?+
25

用法:

$ echo "1" | blsq --stdin 'ri#Q2 SH ~- "ri#Q" \/ .+ j "<-" ps if sh'
hs fi sp "-<" j +. /\ "Q#ir" -~ HS 2Q#ir
$ echo "0" | blsq --stdin 'ri#Q2 SH ~- "ri#Q" \/ .+ j "<-" ps if sh'
ri#Q2 SH ~- "ri#Q" \/ .+ j "<-" ps if sh

2

Haskell中,126 118 108个字节

main=readLn>>=putStr.([t,reverse t]!!);t=s++show s;s="main=readLn>>=putStr.([t,reverse t]!!);t=s++show s;s="

期望01作为输入。



2

Python 2,51字节

s="print('s=%r;exec s'%s)[::1-2*0**input()]";exec s

0

Java 10(完整程式),282位元组

interface N{static void main(String[]a){var s="interface N{static void main(String[]a){var s=%c%s%1$c;s=s.format(s,34,s);System.out.print(new Boolean(a[0])?new StringBuffer(s).reverse():s);}}";s=s.format(s,34,s);System.out.print(new Boolean(a[0])?new StringBuffer(s).reverse():s);}}

在线尝试。

Java 10(作为lambda函数),154个字节

b->{var s="b->{var s=%c%s%1$c;s=s.format(s,34,s);return b?new StringBuffer(s).reverse():s;}";s=s.format(s,34,s);return b?new StringBuffer(s).reverse():s;}

在线尝试。

说明:

interface N{                          // Class
  static void main(String[]a){        //  Mandatory main-method
    var s="interface N{static void main(String[]a){var s=%c%s%1$c;s=s.format(s,34,s);System.out.print(new Boolean(a[0])?new StringBuffer(s).reverse():s);}}";
                                      //   Unformatted source code
    s=s.format(s,34,s);               //   Format the source code (the quine-String)
    System.out.print(                 //   Print:
      new Boolean(a[0])?              //    If the input is true:
       new StringBuffer(s).reverse()  //     Print the quine-String reversed
      :                               //    Else:
       s);}}                          //     Print the quine-String as is

说明:

  • var s包含未格式化的源代码
  • %s 用于将String本身放入 s.format(...)
  • %c%1$c34用于格式化双引号
  • s.format(s,34,s) 放在一起

然后new StringBuffer(s).reverse()根据需要根据输入布尔值反转quine-String。


0

05AB1E,21 字节

0"D34çý‚sè"D34çý‚sè

在线尝试。

通过添加修改默认0"D34çý"D34çý‚sè

说明:

0                        # Push 0 to the stack
                         #  STACK: [0]
 "D34çý‚sè"             # Push the string 'D34çý‚sè' to the stack
                         #  STACK: [0, 'D34çý‚sè']
            D            # Duplicate this string
                         #  STACK: [0, 'D34çý‚sè', 'D34çý‚sè']
             34ç         # Push '"' to the stack
                         #  STACK: [0, 'D34çý‚sè', 'D34çý‚sè', '"']
                ý        # Join the stack with '"' delimiter
                         #  STACK: ['0"D34çý‚sè"D34çý‚sè']
                 Â       # Bifurcate (short for Duplicate & Reverse)
                         #  STACK: ['0"D34çý‚sè"D34çý‚sè', 'ès‚Âýç43D"ès‚Âýç43D"0']
                        # Pair them up:
                         #  STACK: [['0"D34çý‚sè"D34çý‚sè','ès‚Âýç43D"ès‚Âýç43D"0']]
                   s     # Swap to get the boolean input (0 or 1)
                         #  STACK: [['0"D34çý‚sè"D34çý‚sè','ès‚Âýç43D"ès‚Âýç43D"0'], 1]
                    è    # Index the input into the list
                         #  STACK: ['ès‚Âýç43D"ès‚Âýç43D"0']
                         # (Output the top of the stack implicitly)

PS:自动打印尾随换行符。如果这也应该反向,则改为23字节:

0"D34çý‚sè?"D34çý‚sè?

在线尝试。?不带换行符的显式Print

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.