クイン/逆クイン


26

ブールまたは非負の整数入力をとる完全なプログラムを作成します。ちがいない:

  • 入力値が偽である場合、独自のソースコードを出力します
  • 入力値が真実であれば、独自のソースコードを逆に出力します

あなたのプログラムは回文的ではありませんし、いかなる方法でもそれ自身のソースコードを読むことはできません。

これはコードゴルフです-バイト単位の最短コードが勝ちます。


6
だから...私の言語がブール値を持っていない場合。しかし、0は偽であり、正の整数は真実です。入力が0または1のみであると仮定できますか(ブール値の代用として-実際には、言語は条件演算子の結果としてこれら2つのいずれかを常に生成します)?または、「実際の」ブール値を使用できないため、整数をサポートする必要がありますか?
マーティンエンダー

回答:


9

Gol> <>、9バイト

'rd3*I?rH

これを投稿するのは少し気まずい気がします。VitsyとMinkolangの回答がすでに<>であるためです。標準クインへの唯一の追加は、I(整数入力を読み取る)、?(真の場合は次に実行する)、およびr(逆スタック)です。

オンラインでお試しください


クラブに加わる!:Dあなたはとにかく勝ちです。+1
アディソンクランプ

1
8バイト:sP#Hr?I"
ジョーキング

18

CJam、17 16バイト

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

ここでテストしてください。

標準クインのかなり簡単な修正。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
デニス

@Dennisええ、私はそれについて本当に確信がありませんでした。
マーティンエンダー

驚いたことに、私はどういうわけかこれを打ちました。でも、もっとゴルフをしていても驚かないよ。:D
アディソンクランプ

9

Pyth、17バイト

_WQjN*2]"_WQjN*2]

標準のPythクインの簡単な修正。


くそー、私はこれがサンドボックス化されてから1時間後にこれを投稿するのを待っていました。
リルトシアスト

7

> <>、17バイト

入力をスタックにプッシュするために(または事前にオンラインインタープリターでスタックに入力を置くために)-vフラグ(+1バイト)が必要です。

'rd3*$?rol?!;70.

整数入力のみが許可されている場合(つまり、偽の場合は0、真実の場合は1)、同じバイト数(フラグなし)で以下を行うことができます。

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

オンラインで試す

> <>のTruthy / falsyは、それぞれ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の修正です。長さも2倍です。


これは実際に何かを出力しますか?REPLでのみ機能する回答は許可されません。
feersum

1
@ETHproductionsこれは関数を呼び出しますが、それでも何も出力しません。また、それはもはや馬ではありません。
デニス

@デニス右。そうですね、prompt()Node.JSに切り替えない限り、その手段が必要だと思います。私は$=_=>(A=`$=${$};$(prompt())`,alert(_?A:[...A].reverse().join``));$(prompt())適切に動作すると信じていますが、おそらくもっとゴルフダウンすることができます。
ETHproductions

1
「あなたのプログラムは、いかなる手段によっても独自のソースコードを読むことができません。」このソリューションはこのカテゴリに分類されますか?
ETHproductions

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

これらのビルトインでの作業は非常にトリッキーであり、クインに関連するものを除いて誰も生産的なものに使用していません。あなたが逆の場合は++1 2、あなたが得る2 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

ハスケル、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="

0または1入力として期待します。



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(ラムダ関数として)、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 この文字列をそれ自体に入れるために使用されます s.format(...)
  • %c%1$c、および34二重引用符をフォーマットするために使用されています
  • 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è?

オンラインでお試しください。?改行なしの明示的な印刷です

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.