クインを転置する


10

このquineバリアントでは、プログラムは、左上から右下に対角線を横切って転置されたソースコードを出力する必要があります。例えば:

あなたのプログラム
オン
4行

出力

 yof
 ono
 u u
 r r
    
 p l
 r i
 o n
 g e
 r s
 a
 m

出力の空白は任意ではありません。スペースは2つの状況で表示されます。元のスペース(4列目の間rなどl)と、文字を埋め込む必要がある場合(1列目のすべてのスペースなど)の両方が必要で、スペースはどこにも表示できません。その他の出力。

出力の単一の末尾の改行はオプションで無視できます。ソースコードの末尾の改行は出力に影響を与えません。ソースコードの先頭の改行は、上記の例のように処理する必要があります。改行ではないすべての文字は、幅が1列、高さが1行であると想定します。

ソリューションには、少なくとも2つの改行以外の文字がそれぞれ2行ある必要があり、独自の転置であってはなりません(出力をソースと同一にすることはできません)。

quines浮気 URLから自分のソースコードを含むファイルから読み込まれ、プルデータを、利用ビルトインをquining、というように許可されていません。

これはコードゴルフです。バイト単位の最短コードが優先されます。


これは本当のクインである必要がありますか?
リルトシアスト2016

2
@ThomasKwaとは対照的に?
マーティンエンダー

@MartinBüttnerリテラルが転置エコーされる言語があるかもしれません。念のため。
リルトシアスト2016

@ThomasKwa指定されたすべてのルールに従う限り問題ありません。
ルーク

外部ライブラリ(JavaScriptのLodashなど)の使用は禁止されていますか?
ママファンロール

回答:


5

CJam、14バイト

{`"_~".+N*}
_~

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

短いですが、Fissionソリューションよりも少し面白くないでしょう。

説明

{       e# Quine framework. Runs the block while another copy of it is on the stack.
  `     e# Stringify the block.
  "_~"  e# Push the remaining code as a string.
  .+    e# Element-wise append... essentially puts the two strings in a grid and 
        e# transposes it.
  N*    e# Join with linefeeds.
}_~

10

分裂、17バイト

まだ私のお気に入りのクインの言語...

'"
!0
0+
;!
DN
"!

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

説明

これは基本的な分裂のクインに非常に似ています。それがためではなかった場合は実際には、ルール「少なくとも2つの非改行文字をそれぞれ有する少なくとも2つの行を持っている必要があります」、私は単にと交換することを転置している可能性がRD。ただし、次の行を印刷する必要があるので、このルールは少し面白くなります。

制御フローはD、1つの原子が南に向かってから始まります。ヒットするので、"ラップして印刷します

'!0;D

STDOUTに、通常のクインの場合と同様に。'!次に、原子の質量をの文字コードに設定し!ます。0それはまだ南動いて二列に原子を輸送テレポーターです。

+、原子の質量をの値に増やします"!N!プリントの引用、改行、引用。STDOUTは次のようになります。

'!0;D"
"

折り返した後、アトムは別のアトムをヒットし"、2行目をそのまま出力します。

'!0;D"
"0+!N!

これで完了です。アトムはもう一度テレポーターを使用し、テレポーターに着陸して;これを破壊し、プログラムを終了します。

ここで最も近いビットは、1つ"を下部に配置し、もう1つを上部に配置することで、!もう一度値を設定する必要なく、一度に印刷できるようにします(文字列モードに入ると上書きされるため)。


3

JavaScript ES6、90バイト

$=_=>[...(_=`$=${$};$()`.split`
`)[0]].map((x,y)=>_.map(v=>[...
v][y]).join``).join`
`;$()

悪くない、悪くない。

説明

標準のquineフレームワークは次のとおりです。

$=_=>`$=${$};$()`;$()

変更するには、改行と文字に沿ってクイン文字列を分割して文字の行列を作成し、2つのマップ関数を使用して転置し、結合して出力を作成します。



2

Befunge-93、57バイト

^
_^
,@
+,
5*
52
,+
*9
28
+|
9
8#
|!
 ,
##
!:
,^
#
:
^
""

これは、スタックの最初の列に各文字を入れ(引用自体は除く)、スタックから各項目を印刷することによって機能します。その後、見積もりを印刷し、改行を印刷してから、2番目の列に移動します。改行を印刷するのではなく同じことを行います。

タイトルのリンクでテストできますが、コードを自分でウィンドウにコピーして貼り付ける必要があります。「遅い」ボタンを押すと、ポインタがたどった経路とその時のスタックが表示されます。


フィションの回答で行ったように、2番目の列の見積もりを一番上に移動する方が短いでしょうか?
マーティンエンダー

私が先頭に引用符を移動し、2番目の列を並べ替えると、まだ仕事がそれを持っていますが、最初の列はまだ同じ高さにする必要がありので、それはまだ57バイトされて終わることができます
ケビンW.

うーん、私はそれがあなたが"一度だけ生成することを許すかもしれないと思ったので、あなたはいくつかのコードを最初の列から二番目の列に移すことができました。
マーティンエンダー

1

Python 2、91 75 69バイト

s='#%r;print"s#\\n="+"\\n".join(s%%s)';print"s#\n="+"\n".join(s%s)
##

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

説明:

これは、標準的なクインの修正を使用します。

s='s=%r;print s%%s';print s%s

変更後:

s='s=%r;print"\\n".join(s%%s)';print"\n".join(s%s)

単一の行が許可されている場合、これで十分です。次に、その要件を満たすために2行目に2文字を追加しました。#2行目の文字は、1行目でも変更すれば、何にでも置き換えることができ、プログラムが構文的に有効になります。

ここで正しく印刷#するには、最初の2行の終わりに印刷する必要があります。そのため、文字列から最初の2文字を削除し、印刷前にsそれらを#印刷しs%sます。の1つを#最初に置いてs、改行リテラルを削除していくつかのバイトを節約します。

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