標準入力を反転して標準出力に配置する


58

要件:

  • 無制限の長さの改行/キャリッジリターンを含む標準入力を入力します(システムメモリによってのみ制限されます。つまり、プログラムに固有の制限はありません。)
  • 入力の逆を標準出力に出力します。

例:

入力:

Quick brown fox
He jumped over the lazy dog

出力:

god yzal eht revo depmuj eH
xof nworb kciuQ

最短勝。

リーダーボード:

var QUESTION_ID=242,OVERRIDE_USER=61563;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>


5
あなたはPHPのような標準ライブラリ関数を許可してくださいstrrev
明唐

出力では、入力の最後ではなく、改行を先頭に置くことができますか?
ジョーイアダムス

@Joey Adams、うん、入力を正確に複製する必要があります。
トーマスO

53
あなたの例はやや間違っています。入力の逆は次のようになります。ƃop ʎzɐʃ ǝɥʇ ɹǝʌo pǝdɯnɾ ǝH xoɟ uʍoɹq ʞɔınΌ;-P
ninjalj

コードを実行するシステムに入力できる文字のみをサポートする必要がありますか?
黄金比

回答:


25

Golfscript-3文字

-1%

難読化されたバージョンも3文字です

0(%

ここに%の仕組みの説明があります


9
Golfscriptと競合する方法は?
トーマスO

12
@Thomas:FlogScriptを使用することで、私は推測します。いずれにせよ、些細なタスクを投稿する場合、ソリューションも同様に些細なものになると期待してください。また、Pythonで3つのメソッド呼び出しが必要な場合、Golfscriptでも3文字にすることができます。
ジョーイ

1
@トーマス:申し訳ありませんが、それは明白ではありませんでした。一部のメンバーは、このまさに言語について、一見ユーモアではないように静かな議論をすでにしていたことを考えると、ここで同様のことを仮定するのはあまりにも不合理ではありませんでした。
ジョーイ

3
@Joey GolfScriptは訓練されていない目にはノイズのように見えるので、もっとユーモラスな絶望でした。
トーマスO

36
したがって、2番目のものは難読化されていますが、最初のものはそうではありません。わかった。
C0deH4cker

45

バッシュ-7

tac|rev

tac行の順序をrev逆にし、文字の順序を逆にします。


次のステップに進み、それを1文字のbashコマンドにエイリアスしてみましょう!alias z='tac|rev'
ダニエルスタンダー

18
@Dinielこれは、マクロを定義するためにコンパイラフラグを使用するのと同じです。つまり、コードゴルフの精神に反します。
マーコグ

私はrev|tac同じスコアを持っていました-これはBashだけでなく、どのPOSIXシェルでも機能するというメモを追加するだけです。
トビー・スペイト

35

BrainFuck、10文字

,[>,]<[.<]

そのような単純な言語に対して、かなりの量の答えを打ち負かします。


2
DNAは常にその順序を逆にします。そのため、あなたが観察したものには、情報と計算の性質に関する基本的な何かがあるかもしれません。シェルワンライナーでrosalind.infoの問題を解決しているときに、このソリューションに出会いました。
ixtmixilix

9
@ixtmixilix実際には、スタックと逆転について基本的なことを言っているだけです。
ランチャー



16

パンケーキスタック342 316バイト

Put this nice pancake on top!
[]
Put this  pancake on top!
How about a hotcake?
If the pancake is tasty, go over to "".
Put this delightful pancake on top!
[#]
Eat the pancake on top!
Eat the pancake on top!
Show me a pancake!
Eat the pancake on top!
If the pancake is tasty, go over to "#".
Eat all of the pancakes!

入力がヌル文字で終了することを前提としています(^@コマンドラインで)。インタープリターを使用した実行例:

Put this nice pancake on top!
[]
Put this  pancake on top!
How about a hotcake?
If the pancake is tasty, go over to "".
Put this delightful pancake on top!
[#]
Eat the pancake on top!
Eat the pancake on top!
Show me a pancake!
Eat the pancake on top!
If the pancake is tasty, go over to "#".
Eat all of the pancakes!
~~~~~~~~~~~~~~~~~~~~~~~~
Hello, World!^@
!dlroW ,olleH

16

Python、41 40バイト

import sys;print sys.stdin.read()[::-1]

41-> 40-プログラム終了時にセミコロンを削除しました。

おそらく最適化できます!


PowerShellで何かを簡単に元に戻す方法があればいいのに;
Joey

6
火星人、いつも役に立つ。[:: - 1]
Wokの

1
だからprint raw_input()[::~0]]?それは理由でまだPythonの2だprint
CalculatorFeline

これは、ゴルフエントリの書式設定に関するヒントです。プログラムを記述した言語は、常に次の形式で記述します# Language Name, Character/Byte Count
。–ドルカハン

13

APL、2

⊖⍞

または、CircleBar QuoteQuadは、文字が通り抜けない場合、単にキーボード文字入力を逆にすることを意味します。


バイト数を半減してください!あなたも必要ありませんは、割り当てて使用できる完全な匿名関数ですf←⌽ f 'The quick brown fox'
アダム

^^^^勝者^^^^
CalculatorFeline

@Nᴮᶻ:まあ、仕様は文字列リテラルからではなく、stdinから入力を取得すると言われています:)
jpjacobs

@jpjacobs一般的なPPGCプラクティスでは、stdinをサポートしない(または使用するのが不自然な)言語に対して、stdinの代わりにインライン引数を許可します。
アダム

11

Perl-23

print scalar reverse <>

6
3番目のスペースを削除できます。
ティムウィ

6
実際、print"".reverse<>たった17文字です。Perl 5.10以降では、のsay代わりにを使用して、さらに2つの文字を保存できますprint
イルマリカロネン

4
私は、これは知っている非常に古いが、あなたも行うことができます:print~~reverse<>16文字のために
ドムヘイスティングス

5
@DomHastingsそして、Perl 5.10以降でsay~~reverse<>は動作しますか?14文字。
ティムテック


10

C-47文字

main(c){if(c=getchar(),c>=0)main(),putchar(c);}

これはO(n)スタックスペースを使用することに注意してください。オンラインでお試しください!


単に素晴らしいです!
st0le

1
ちょうどあなたのアイデアが、これは2-3キーストローク節約:main(c){(c=getchar())>0&&main(),putchar(c);}
ドンキホーテ

2
Cは数値をブール値として評価しますか?もしそうなら、c>=0なることができます~c
チョイス

9

Windows PowerShell、53 54

-join($x=[char[]]($($input)-join'
'))[($x.count)..0]

2011-01-30(54)–最初の試み

2011-01-30(53)–インライン改行は楽しいです。

2011-01-3-(52)–インライン変数の割り当ても。


-join($a="$args")[$a.Length..0]提供された例ではそれcrlf自体でうまくいくようですが、windowsで実行されている改行には問題がありません-psv2またはこれが書かれたときに使用したものについてはわかりません。
colsw

@ConnorLSW:それは標準入力からも読み取りません。そして$input、行を生成する列挙子なので、そのように文字列化することはできません。
ジョーイ


8

Befunge-93-11x2(22文字)

>~:0`v >:v
^    _$^,_@

このインタープリターを使用しテストしました


19
キーボードのランダムキーを押しただけではないのですか?
トーマスO

@Thomas-リンクされたインタープリターを使用しようとしなかったのは確かですか?あなたが何かをダウンロードすることを心配した場合のために、それはウェブベースです。
MiffTheFox

4
私は冗談です。きっと動作するはずですが、いくつかのキーをランダムに押したように見えます。これは、非常にコンパクトな言語を示しています。
トーマスO



6

核分裂16 14 12バイト

DY$\
?
[Z~K!

説明

制御フローはD、下降(1,0)アトムから始まります。?読み取り文字コードとエネルギーにに質量を設定し、STDIN、一度に一つの文字から読み込みます0。EOFに到達すると、?代わりにエネルギーをに設定し1ます。[上に原子リダイレクトZスイッチ。文字を読んでいる限り、エネルギーはになる0ので、原子はによって上方向に偏向されZます。アトムのクローンを作成し、1つのコピーをにループバックして?入力を読み取り続けます。他のコピーのエネルギーを1with $に増やし、スタックにプッシュしますK。したがって、入力ループは次のとおりです。

DY$\
?
[Z K

エネルギーが1EOFによるものである場合、Z代わりに原子は原子をまっすぐに通過させ、エネルギーを0再び減少させます。~エネルギーをさらに減少させ-1ます。負のエネルギーを持つ原子がスタックからポップされるため、文字を逆の順序で取得してで印刷できます!。ここで、グリッドがトロイダルであるため、原子が同じ行の左端に再表示されることに注意してください。でプッシュされた原子のエネルギーを先に増加させたことを思い出してください。その$ため、原子は今や1最後の出力?と同じエネルギーを持ち、再びを直進しますZ。したがって、EOFの後のパスは

?
[Z~K!

一番下の行のこのループは、スタックが空になるまで続きます。それが起こると、原子はから反射され、Kそのエネルギーは正(+1)になります。~デクリメントし、我々は今、ヒットするように、それはもう一度、(左に移動)Z非ポジティブなエネルギーと。これにより、原子が下向きに偏向Yされ、格納されている場所のくさびに到達します。移動する原子がないため、プログラムは終了します。


なぜこれがMinecraftを思い出させるのですか?
明るくしない

わあ、言語サンプルでの実装は16文字で最短だと思いました。印象的!
C0deH4cker

6

> <>、16 14バイト

@JoKingによる-2バイト

2年(!)後に、停止するためにロジックをシフトすることにより、入力の読み取りから余分な-1を削除します。

i:0(7$.
0=?;ol

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

他の> <>回答と同様に、最初の行で入力が読み取られる方法のため、スタックを逆にする必要はありません。実際には、これは他の回答の提案であるかどうかはあまりわかりません。これは、外観はかなり異なりますが、概念は似ています。

主な違いは、私の答えは入力を0と比較し、それが少ない場合(つまり、入力がないi場合-入力がない場合は-1を返します)、(1,7)にジャンプし、そうでない場合は(0、 7)。前者にジャンプすると、一番上の値(-1)がポップされ、印刷ループが開始されます。後者にジャンプすると、入力ループを継続します。

11バイト、エラーで終了

@JoKing提供

i:0(7$.
~o!

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

私はこれがメタコンセンサスを介して現在有効であると信じています。

前の回答(14バイト)

i:0(7$.
~ol0=?;!

2
エラーで終了することにより、-5バイト。それ以外の場合、-2バイト(空の入力のエラー)また、空の入力に関する元のエラーは、o後に変更することで修正できます;
ジョーキング

1
@JoKing o部分的には良いキャッチ。当時は気づかなかった。保存してくれてありがとう。最後の-1を取り除くためのゼロへの比較の巧妙な使用。
コール

1
うーん、実際にこれは 13バイト(私が簡単にスワップ逃した信じることができないため、同じようにうまく機能0=?への?!
ジョー・キング

@JoKing -1バイトザ・し?文字が0の場合、スタックの先頭をチェックするため、長さとの比較は不要で、lだけです。
ティールペリカン

@TealPelicanはい、2番目のコメントでそれを言及しました
Jo King


5

スタック猫、7バイト

<!]T[!>

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

同じバイトカウントに対して多数の代替手段がありますが、そのほとんどは動作方法が本質的に同等です。

説明

Stack Catsの短いプライマー:

  • すべてのプログラムにはミラー対称性が必要であり、コードの一部をミラーリングすることにより、逆関数を計算する新しいコードを取得します。したがって、上記のプログラムの最後の3文字は、中央のコマンド用でない場合、最初の3文字を取り消します。
  • メモリモデルはスタックの無限テープであり、暗黙の無限量のゼロを下部に保持します。初期スタックは、-1これらのゼロの上にあり、その上に入力バイトがあります(最初のバイトが最上部にあり、最後のバイトがの上にあります-1)。
  • 出力については、最後のスタックを取得し、ある-1場合は下部のa を破棄し、すべての値をバイトとしてSTDOUTに出力します。

実際のプログラムの場合:

<    Move the tape head one stack left (onto an empty stack).
!    Bitwise NOT of the implicit zero on top, giving -1.
]    Move back to the original stack, taking the -1 with the tape head.
     We're now back to the original situation, except that we have a -1
     on top.
T    Reverse the stack down to the -1 at the bottom. One of the reasons
     we needed to move a -1 on top is that T only works when the top of
     the stack is nonzero. Since the first byte of the input could have
     been a null-byte we need the -1 to make sure this does anything at
     all.
[    Push the -1 to the stack on the left.
!    Bitwise NOT, turning it back into 0 (this is irrelevant).
>    Move the tape head back onto the original stack.

Sp3000は、他のすべての7バイトソリューションを見つけるためにブルートフォース検索を設定したため、いくつかの選択肢があります。

<]!T![>
>![T]!<
>[!T!]<

これらの3つのバリアントは基本的に同じです。ただし、ビット単位のNOTが計算されるタイミングと、左または右の空のスタックを使用するかどうかが異なります。

<]T!T[>
>[T!T]<

上記の説明で述べたようにT、スタックのトップがゼロのときは何もしません。これは!、代わりに実際に中央に配置できることを意味します。すなわち、第一手段T、我々は上にゼロを入れ、何もしません-1し、その後、第2のT反転を行います。もちろん、これは最終的なメモリ状態が-1元の状態の隣のスタック上にあることを意味しますが、現在のテープヘッド位置のスタックのみが出力に影響するため、問題ではありません。

<*ITI*>

このバリアントは、の*代わりに(XOR 1)を使用する!ため、ゼロをに変換し+1I正の値と右、負の値を左にプッシュし、いずれの場合でもそれらを否定する条件付きプッシュです(結果として、-1に遭遇すると元のスタックの一番上にあるTため)、これは最終的に元の<!]T[!>ソリューションと同じように機能します。


4

PHP、82 29 24 29 28文字

<?=strrev(fread(STDIN,2e9));

82-> 29:で反転すると、改行文字が保持されstrrevます。
29-> 24:ショートカット構文を使用するようになりました
24-> 29:現在、単一行ではなくすべての行を読み取ります


1つの問題:fgets(STDIN)最初の行のみを読み取ります。
プリーズスタンド

すべての行を読み取るようにコードを更新しました。
ケビンブラウン

あなたが1000文字の人工制限してい除き
匿名の臆病者を

以下のPythonの制限に合わせて制限を更新しましたが、これほど多くの人が使用することは想像できません。
ケビンブラウン

4

Befunge-98 - 11 10

#v~
:<,_@#

(cfungeでテスト済み)

以下のバリアントは要件をわずかに破ります。タスクを実行しますが、その後NULLバイトの無限ストリームを出力します(そして終了しません)。

~#,

動作する方法は、スタックへの入力(~)を一度に1文字ずつ繰り返し読み取り#、コンマを飛び越す()ことです。EOFに達する~と、リフレクターとして機能し、PCが裏返され、チルダ,を飛び越えて(#)ながら文字()を繰り返しポップして出力します。


ここで、より短いバージョン(10文字)は:行1:#v~行2: :<,_@#jここで使用しても改善されないのは面白い。
ジャスティン14年

@Quincunxは賢明で、IP方向を一種の暗黙的否定として使用します。
ホタル14年

4

Pyth- 3 5 4バイト

したがって、元の3文字バージョンでは、行の順序は逆にならず、行だけが逆になりました。次に、この5文字バージョンを思い付きました。

_jb.z

結果として@FryAmTheEggmanのおかげで1バイト節約できました。

_j.z

ライブデモ。

説明:

  .w  read all the input into a list of strings
 j    join (j) by using a newline character
_     reverse the result
      Pyth implicitly prints the result on an expression

元の(誤った)ソリューション:

これは技術的には2014年にPythが作成されたためカウントされませんが、GolfScriptと結び付けられていることはまだきれいです。

#_w

説明:

#    loop while no errors
  w  read a line of input (throws an error on end-of-file or Control-C)
 _   reverse the input line
     Pyth implicitly prints the result on an expression

2
残念ながら仕様と一致しません。行の順序も逆にする必要があります。
DLosc

Fk_.z_k誰かがこれより短いものを手に入れることができると確信していますが、それは私が得たものです。
gcq

@gcq短いバージョン(5文字)がありますが、編集する機会がありません。
kirbyfan64sos

@DLosc修正!私はすべての入力を読み、改行を介して結合し、それを逆にしました。
kirbyfan64sos

@FryAmTheEggmanああ、はい!数ヶ月前にこれを投稿したとき、それについて知りませんでした。
kirbyfan64sos

4

Cubix9 8バイト

このゴルフのマーティン・エンダーに感謝します。

w;o@i.?\

オンラインでご覧ください!

これは次のキューブになります(>初期命令ポインターを示します)。

      w ;
      o @
> i . ? \ . . . .
  . . . . . . . .
      . .
      . .

プログラムの最初のステップは、すべての入力を取得することです。i1バイトの入力をスタックに置きます。入力が終了しない限り、?IPが右に曲がり、キューブがに到達するまでw折り返されiます。

入力が終了?すると、IPは北に向かい、出力ループに入ります。

  • o:スタックの一番上に文字を出力します
  • w: 'sidestep'右へのポインター
  • ;:印刷されたばかりのキャラクターをポップします
  • \:IPを反映し、東に送信する
  • ?:印刷する文字が残っている場合は、右に曲がってループに戻ります。

?スタックに何も残っていない場合、最後の時間がヒットし、代わりにIPが前方に進みます。

  • i:1バイトの入力を受け取ります。これは-1、入力が終了した時点です。
  • \:IPを反映して、北に送信します。
  • @:プログラムを終了します。

9バイトソリューション

..o;i?@!/

オンラインでご覧ください!

キューブ形式で:

      。。
      o;
>私?@!/。。。
  。。。。。。。。
      。。
      。。

発生する最初の文字はi、入力の文字コードを受け取ります。入力が残っていない場合、これは-1です。

次の文字は?-決定です。スタックの最上部が正の場合、それは右に曲がり、ヒット/するまでキューブを包み込みiます。ただし、TOSが負の場合、入力は終了しているため、出力ループになります。

出力ループは簡単です。o;TOSを出力およびポップします。これが最初に実行されるとき-1はスタックの一番上ですが、文字にマップされないため無視されます。/左に移動するIPを反映し、そこで遭遇します!@-スタックが空の場合、プログラムを終了します。そうでない場合、IPは継続して?再度ヒットします。スタックが空ではないため、TOSはすべて正の1の文字コードである必要があり、これによりIPが右に曲がり、出力ループが続行されます。


1両方のソリューションは、入力にヌルバイトが含まれないと想定しています。


4

05AB1E、1バイト

R

Rは入力を反転します。


1
05AB1Eをご利用いただきありがとうございます:)。,何も印刷されなかったときにスタックの一番上が自動的に印刷されるため、最後に必要はありません。
アドナン

@Adnanヒントをありがとう。
ペナロサ

4

Wumpus、12バイト

i=)!4*0.l&o@

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


マーティンの答えは、Wumpusの三角グリッド制御フローをうまく示していますが、この挑戦​​を1ライナーで試してみたいと思いました。

わかりやすいバージョン(1バイト長い)は次のとおりです。

i=)!8*0.;l&o@

次のように動作します:

[Input loop]
i        Read a byte of input (gives -1 on EOF)
=)!      Duplicate, increment then logical not (i.e. push 1 if EOF, else 0)
8*       Multiply by 8 (= x)
0        Push 0 (= y)
.        Jump to (x, y), i.e. (8, 0) if EOF else (0, 0) to continue input loop 

[Output]
;        Pop the extraneous -1 at the top from EOF
l&o      Output <length of stack> times
@        Terminate the program

それでは、途中で異なるゴルフバージョンを見てみましょう。

i=)!4*0.l&o@

ゴルフバージョンでは;、余分な-1をポップするための明示的なコマンドが不要なため、バイトが節約されます。EOFでは、このプログラムは再び実行される場所の(4, 0)代わりにジャンプします。ただし、今回は余分な-1が先頭にあります。これにより、にジャンプします。これは、ラッピングがこのグリッドの場合と同じであるため、外部の値を同時に消費しながら目的の場所に移動します。(8, 0)4*0.(-4, 0)(8, 0)


4

Wumpus13 11バイト

)?\;l&o@
=i

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

説明

Wumpusはスタックベースの言語であるため、基本的な考え方はすべてのSTDINをスタックに読み取り、スタック全体を上から下に印刷することです。ここで興味深いのは、グリッドを通る制御フローです。

制御フローを理解するには、実際の三角形のグリッドレイアウトを見る必要があります。

ここに画像の説明を入力してください

IPは、左上隅から東に向かって始まります。左側の6つのセルのグループにループがあり、から分岐していることがわかり\ます。ご想像のとおり、ループはすべての入力を読み取り、最後の線形セクションが結果をSTDOUTに書き込みます。

最初にループを見てみましょう。最初)?\のループはループの一部ではなく、実際のループはから始まると考える方が理にかなっていますi。だからここに最初のビットがあります:

)   Increment an implicit zero to get a 1.
?\  Pop the 1 (which is truthy) and execute the \, which reflects the IP
    to move southwest.

次に、ループが開始されます。

i   Read one byte from STDIN and push it to the stack (or -1 at EOF).
    Note that Wumpus's grid doesn't wrap around, instead the IP reflects
    off the bottom edge.
=   Duplicate the byte we've read, so that we can use it for the condition
    later without losing it.
)   Increment. EOF becomes zero (falsy) and everything else positive (truthy).
?\  If the incremented value is non-zero, execute the \ again, which 
    continues the loop. Otherwise (at EOF), the \ is skipped and the
    IP keeps moving east.

最後に線形セクションが残ります。

;   Get rid of the -1 we read at EOF.
l   Push the stack depth, i.e. the number of bytes we've read.
&o  Print that many bytes.



3

分裂20 15バイト

KX$ \
!
SR?J%
~

アルゴリズムはMartinのアルゴリズムと非常に似ていますが、実装は大きく異なります。

使い方

すべてがで始まり、R質量1およびエネルギー0で東向きの原子を放出します。

を押す?と、入力文字は原子の質量として保存され、stdinがEOFを返さない限りエネルギーは0のままになり、その場合エネルギーは1になります。

JFissionのジャンプコマンドであり、現在のエネルギーに相当するセル数だけ原子を前方にジャンプし、原子のエネルギーを0のままにします。今のところ、アトムのエネルギーは0であり、このコマンドは無視されます。

次に、ストライキを%切り替えます。エネルギーが0を超えると、原子は下に向けられます(\ミラーに反射されるように)が、エネルギーが正確に0であるため、反対側のミラーによって上に送られます/

私たちの原子は、2番目の鏡にぶつかるまで続き、\今回はそれを左に向けます。

で原子のエネルギーを1 に増やし、原子の複製に$使用Xします。1つのコピーは$コマンドに反映され(2つのエネルギーでそのコピーを残します)、もう1つのコピーはスタックにプッシュされますK

反映されたコピーは、%スイッチから再びスイッチに到達するまで、コピー元から逆方向に移動します。ポジティブなエネルギーが得られたので、\鏡に当たったかのように反射して、ボードを次のボードに巻き付けS、エネルギーを1に減らします。

Sこのコマンドは、当社の方向性を維持するために1つのエネルギーを消費します。エネルギーがなかったら、原子は\鏡にぶつかったかのように下にたわんでいたでしょう。代わりに、再び右に移動し、より多くの入力を?取得して、サイクルを繰り返します。

アトムがEOFに達すると、?コマンドはアトムに1つのエネルギーを保存します。したがって、J今回コマンドを実行すると、%スイッチを完全にスキップして、Sエネルギーが0 のスイッチに着地します。

今、私たちのエネルギーはジャンプで消費されたので、私たちの方向はスイッチによって保存されS、むしろ下向きになります。次に、~コマンドでエネルギーを-1に減らし、ボードをラップします。負のエネルギーでヒットすると、Kコマンドは原子を押す代わりに原子をポップします。新しくポップしたアトムをで出力し!、そのアトムの1エネルギーを使用してSスイッチをバイパスすると、サイクルが完了します。

スタックKが空だった場合、アトムのエネルギーは無効になり(エネルギーが+1になります)、~コマンドに反映され、エネルギー0のままになります。Sもう一度ヒットすると、右に偏向さ?れます。EOFに達したため?、アトムを破棄し、プログラムを終了します。


3

ラビリンス、10バイト

,)";@
:".(

通常、ラビリンスプログラムは迷路に似ているはずですが、このループを非常に緊密に圧縮することができたため、コードは1つのブロック(部屋?)になりました。以下は、制御フローを簡単に追跡できるように少し拡張したバージョンです。

,""")""""""";""@
"   "   "   "
:""""   ."""(

,EOFにヒットして戻るまで、STDINから一度に1バイトを読み取ります-1)増分は、この値となるよう、私たちは、EOFの各読み取りバイトとゼロのための肯定的な何かを得ます。:重複が各バイトを読み取ります。

EOFに達すると、命令ポインターは2番目のループに進み、1つの値;(最初はEOF、後で各バイトの2番目のコピー)を繰り返し破棄し、次の値を1ずつ減らして(、で出力し.ます。2番目のコピー(常にポジティブ)により、IPは最上部で右折し、このループを継続することがわかります。

すべてのバイトが印刷された後、スタックの最上部は再びゼロになり、IPはまっすぐに続き@、プログラムは終了します。

一見不必要な各バイトの重複により、(ゴルフバージョンのタイトループでも)IPが常に正しいターンを行い、ループ間で交差することはありません。

TheNumberOneとSp3000への帽子の先端は、独自の試みがこの高度に圧縮されたソリューションを見つけるのに大いに役立ちました。

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