簡単な猫プログラム


84

最も一般的な標準タスクの1つ(特に難解なプログラミング言語を紹介する場合)は、「catプログラム」を実装することです。STDINをすべて読み取り、STDOUTに出力します。これは、Unixシェルユーティリティにちなんで命名されていますcatが、もちろん、ディスクから読み取られたいくつかのファイルを印刷(および連結)するために通常使用される本物よりもはるかに強力ではありません。

仕事

標準入力ストリームの内容を読み取り、それらを逐語的に標準出力ストリームに書き込む完全なプログラムを作成する必要があります。(ほとんどの言語で理解されているように)あなたの言語には、標準入力および/または出力ストリームをサポートしていない場合にのみ、あなたの代わりにあなたの言語での彼らの最も近い同等のものを意味するためにこれらの用語を取る可能性がある場合(例えばJavaScriptののpromptalert)。これらはI / O の唯一の許容される形式です。他のインターフェイスはタスクの性質を大幅に変更し、回答の比較をはるかに少なくするためです。

出力には、正確に入力のみが含まれている必要があります。この規則の唯一の例外は、挨拶、ANSIカラーコード、インデントなど、抑制できない言語のインタープリターの一定の出力です。これは、末尾の改行にも適用されます。入力に末尾の改行が含まれていない場合、出力にも改行を含めるべきではありません!(唯一の例外は、実行後に言語が常に末尾の改行を出力する場合です。)

標準出力ストリームに期待される出力が含まれている限り、標準エラーストリームへの出力は無視されます。特に、これは、標準出力ストリームを汚染しない限り、ストリームの終わり(EOF)に達すると、プログラムがエラーで終了できることを意味します。これを行う場合は、エラーのないバージョンも回答に追加することをお勧めします(参照用)。

これは、言語間ではなく各言語内の課題として意図されているため、言語固有のルールがいくつかあります。

  • 言語で標準入力ストリームのヌルバイトをEOFと区別できる場合、プログラムは他のバイトと同様にヌルバイトをサポートする必要があります(つまり、標準出力ストリームにも書き込む必要があります)。
  • 言語で任意の無限入力ストリームをサポートできる場合(つまり、入力でEOFをヒットする前に出力へのバイト出力を開始できる場合)、この場合、プログラムは正しく動作する必要があります。例として、sのyes | tr -d \\n | ./my_cat無限ストリームを出力する必要がありますy。標準出力ストリームを印刷およびフラッシュする頻度はユーザー次第ですが、ストリームに関係なく、有限時間後に発生することを保証する必要があります(これは、特に、次のような特定の文字を待つことができないことを意味します印刷前の改行)。

nullバイト、無限ストリーム、および無関係な出力に関する正確な動作についての回答にメモを追加してください。

追加のルール

  • これは、これに対する最短の解決策で言語を見つけることではありません(空のプログラムがトリックを行う場所があります)-これは、すべての言語で最短の解決策を見つけることです。したがって、回答は承認済みとしてマークされません。

  • ほとんどの言語での提出は、適切な既存のエンコーディングでバイト単位でスコアリングされます。通常は(必ずしもそうではありませんが)UTF-8です。

    Foldersのような一部の言語は、スコア付けが少し難しいです。疑問がある場合は、Metaで質問してください。

  • このチャレンジよりも新しい言語(または言語バージョン)を使用しても構いません。この課題に対する0バイトの回答を提出するために特別に作成された言語は、公正なゲームですが、特に興味深いものではありません。

    提出物をテストできるようにインタープリターが必要であることに注意してください。以前に未実装の言語用にこのインタープリターを自分で作成することは許可されています(推奨されます)。

    また、プログラミング言語の通常の基準を満たす必要があることにも注意してください。

  • 選択した言語が、すでに回答を持っている別の(潜在的により人気のある)言語の些細なバリアントである場合(BASICまたはSQL方言、Unixシェル、またはHeadsecksやUnaryのような些細なBrainfuck派生語を考えてください)、既存の回答にメモを追加することを検討してください同じまたは非常に類似したソリューションは、他の言語でも最短です。

  • 以前に無効にされていない限り、http://meta.codegolf.stackexchange.com/q/1061を含む、すべての標準規則が適用されます。

副次的な注意として、ゴルフにそれほど多くない言語で退屈な(しかし有効な)答えを採点しないでください。これらは、カタログを可能な限り完全にコンパイルしようとするので、この質問には依然として有用です。ただし、主に作成者がコードのゴルフに力を入れなければならない言語では、主に回答を支持してください。

カタログ

この投稿の下部にあるスタックスニペットは、a)言語ごとの最短ソリューションのリストとして、b)全体的なリーダーボードとして、回答からカタログを生成します。

回答が表示されるようにするには、次のマークダウンテンプレートを使用して、見出しから回答を開始してください。

## Language Name, N bytes

N提出物のサイズはどこですか。スコアを改善する場合、古いスコアを打つことで見出しに残すことができます。例えば:

## Ruby, <s>104</s> <s>101</s> 96 bytes

ヘッダーに複数の数字を含める場合(たとえば、スコアが2つのファイルの合計であるか、インタープリターフラグペナルティーを個別にリストする場合)、実際のスコアがヘッダーの最後の数字であることを確認します。

## Perl, 43 + 2 (-p flag) = 45 bytes

言語名をリンクにして、スニペットに表示することもできます。

## [><>](http://esolangs.org/wiki/Fish), 121 bytes


52
バッシュ、3バイトcat
TheDoctor

3
@TheDoctorこれは「必要なものを正確に実行するビルトインを使用しない」ルールに該当すると思います。
パエロエベルマン

5
@PaŭloEbermannそのようなルールはなく、対応する標準の抜け穴はもはや受け入れられません。(実際には、すでにそこにあるsh使用して答えcatも使って短いソリューションが含まれていますdd。)
マーティン・エンダー

1
入出力の標準メソッドを使用した場合のみ:///、0 bytes
同志SparklePony

1
@SparklePony例外として、スラッシュとバックスラッシュをエスケープする必要があります。
マーティンエンダー

回答:


73

sed、0


空のsedプログラムは、ここで必要なことを正確に行います。

$ printf "abc\ndef" | sed ''
abc
def$ 

3
書いたらどうなりますyes | tr -d \\n | sed ''か?
ベンゴールドバーグ

@BenGoldbergデフォルトでは、sedは行ごとに機能するため、この場合yes、メモリを使い果たすまでesを1つのパターンバッファーに丸lurみします。私が思うの注意点...
デジタルトラウマ

POSIXでは、パターンスペースのサイズを少なくとも8192バイト、IIRCにする必要があります。GNUの実装には、使用可能なメモリによってのみ制限される動的なパターンスペースがあるので、それについてはかなり安全です。
トビー

59

Ziim222の 201 196 185 182バイト

    ↓ ↓

 ↓ ↓     ↓
 ↗ ↗↙↔↘↖ ↖
 ↓↓⤡⤢  ⤢↙
↘ ↖⤡ ↖
  ↙
  ↕↘ ↑ ↙
→↘↖↑ ↙ ↑
→↖   ↑
→↖↘ ↙
  ↑↓↑

   ⤡

これはおそらくブラウザで正しく表示されないため、コードの図を次に示します。

enter image description here

Ziimの問題を解決するための単純な構造を考えることはできませんが、実際のコードはまだかなりゴルフに適していると確信しています。

Ziimは無限ストリームを処理できない可能性があります。プログラムの最後でしか何も印刷できないからです。

説明

Ziimにはかなりユニークで宣言的な制御フローモデルがあるため、命令型の擬似コードアルゴリズムはここでそれをカットしません。代わりに、Ziimの基本を説明し、ASCIIコードとして上記のコードの構造を(同様のグラフィカルな方法で)提示します。

Ziimの制御フローはあらゆる場所で発生します。別の矢印で指されていない各矢印は、他とは独立して処理される「スレッド」を初期化します(実際には並列ではありませんが、処理される順序は保証されません) 、連結を介して同期しない限り)。そのような各スレッドは、から始まる2進数のリストを保持し{0}ます。これで、コード内の各矢印は、1つまたは2つの入力と1つまたは2つの出力を持つ何らかのコマンドです。正確なコマンドは、いくつの矢印がどの方向からそれを指しているかによって異なります。

コマンドのリストを次にm -> n示します。ここで、コマンドはm入力をn受け取り、出力を生成することを示します。

  • 1 -> 1no-op:単にスレッドをリダイレクトします。
  • 1 -> 1invert:スレッド内の各ビットを無効にします(またリダイレクトします)。
  • 1 -> 1read:スレッドの値をSTDIN の次のビットで置き換えるか、EOFに達した場合は空のリストで置き換えます。
  • 2 -> 1連結:これはスレッドを同期する唯一の方法です。スレッドが矢印の片側にヒットすると、別のスレッドが反対側にヒットするまで中断されます。その時点で、それらは単一のスレッドに連結され、実行を継続します。
  • 2 -> 1label:これは、異なる実行パスを結合する唯一の方法です。これは、2つの入力が可能な単純な操作なしです。したがって、いずれかのルートを介して「ラベル」に入るスレッドは、単に同じ方向にリダイレクトされます。
  • 1 -> 2split:単一のスレッドを受け取り、異なる方向に2つのコピーを送信します。
  • 1 -> 1isZero?:スレッドの最初のビットを消費し、ビットが0であったか1であったかに応じて2つの方向のいずれかでスレッドを送信します。
  • 1 -> 1isEmpty?:リスト全体を消費し(つまり、空のリストに置き換えます)、リストが既に空であるかどうかに応じて、2つの方向のいずれかでスレッドを送信します。

それを念頭に置いて、一般的な戦略を考え出すことができます。連結を使用して、入力全体を表す文字列に新しいビットを繰り返し追加します。連結の出力を入力の1つにループバックすることでこれを簡単に行うことができます(そしてisEmpty?で a {0}をクリアすることで空のリストに初期化します)。問題は、このプロセスをどのように終了できるかです。

現在のビットを付加することに加えて、我々はまたします先頭に追加我々はEOFに達したかどうかを示す0または1。isZeroを介して文字列を送信する場合は、再びそのビットを取り除きますが、ストリームの終わりを区別します。その場合、スレッドをグリッドの端からそのままにします(これにより、Ziimはスレッドの内容をSTDOUTに出力し、プログラムを終了します)。 。

EOFに到達したかどうかは、isEmptyを使用して判断できますか?入力のコピー上。

これが私が約束した図です:

              +----------------------------+   {0} --> isEmpty --> label <--+
              |                            |                    n    |      |
              v                            |                         v      |
    {0} --> label --> read --> split --> split ------------------> concat   |
                                 |                                   |      |
                           n     v     y                             |      |
 inv --> label --> concat <-- isEmpty --> concat <-- label <-- {0}   |      |
  ^        ^          |                     |          ^             |      |
  |        |          v                     v          |             |      |
 {0}       +------- split ---> label <--- split -------+             |      |
                                 |                                   |      |
                                 +-------------> concat <------------+      |
                                                   |                        |
                                              y    v                        |
                         print and terminate <-- isZero --------------------+

読み始める場所に関する注意事項:

  • {0}左上隅には、入力ループを開始し、最初のトリガーです。
  • {0}右上の方はすぐに空のリストにクリアAN我々は徐々に入力でいっぱいだろう最初の文字列を表しています。
  • 他の2つ{0}は「プロデューサー」ループ(1つは反転、もう1つはループ)に送られ、文字列の先頭に追加する必要のある0sと1sを無制限に供給します。

29
あなたの脳が百万個の小さな組織の塊に爆発することなく、どうしてそのようなプログラムを書くことができますか?
アシュウィングプタ

40

六角形、6バイト

これは以前は3バイトでした(以下を参照)が、そのバージョンは言語の最新の更新以降機能しなくなりました。バージョンが使用したエラーを意図的に導入したことがないため、カウントしないことにしました。


エラーのないソリューション(つまり、固定インタープリターで動作するソリューション)は、はるかに難しいことがわかりました。私はそれを2x2グリッドに詰め込むのに苦労しましたが、今では1つの解決策を見つけましたが、7バイト全部必要です。

<)@,;.(

展開後、次の結果が得られます。

enter image description here

最初のメモリエッジは0であるため、<無条件に命令ポインタを北東の対角線に偏向し、そこでグレーパスにラップします。.何もしません。今,、バイトを読み込み、)それは、そのような(NULLバイトを含む)の有効バイトが正であることをインクリメントし、EOFは0です。

そのため、EOFでは、IPは赤いパスにラップし@、プログラムを終了します。しかし、まだバイトを読み取る場合、緑のパスへのIPラップは、代わりに(エッジを元の値にデクリメントし、;STDOUT に出力します。IPは無条件に灰色のパスに戻り、プロセスを繰り返します。


Truth Machineの回答用のブルートフォーススクリプトを作成し後、catプログラムにもエラーのない6バイトのソリューションを見つけるように設定しました。驚くべきことに、それは1つを見つけました-はい、すべての可能な6バイトのHexagonyプログラムで正確に1つのソリューション。真実のマシンからの50のソリューションの後、それは非常に驚くべきことでした。コードは次のとおりです。

~/;,@~

展開中:

enter image description here

~代わりに(単項否定)を使用するの()は興味深いです。a)ゼロでのノーオペレーション、b)ブランチのサイドを交換する、c)一部のコードでは、単一~の操作をそれ自体で取り消すために2回使用される可能性があるからです。そのため、ここで何が起こっているのでしょうか:

最初に通過する(紫色のパス)のは~、何もしません。/斜めの北西にIPを反映しています。灰色のパスは文字を読み取り、その文字コードにを乗算します-1。これにより、EOF(-1)が真の(正の)値になり、すべての有効な文字が偽の(非正の)値になります。EOFの場合、IPは赤いパスを取り、コードは終了します。有効な文字の場合、IPは緑のパスを取り、~否定を取り消し;て文字を出力します。繰り返す。


最後に、元のバージョンのHexagonyインタープリターで動作していた3バイトバージョンがあります。

,;&

ラビリンスの答えのように、入力ストリームが有限の場合、これはエラーで終了します。

コードを展開すると、次の16進グリッドに対応します。

enter image description here

ザ・は.ノーオペレーションません。紫色のパスで実行が開始されます。

,バイトを読み取り、バイトを;書き込みます。その後、実行はsalmon(ish?)パスで続行されます。&現在のメモリエッジをゼロにリセットする必要があります。これにより、2番目の行の最後のコーナーにヒットしたときにIPが紫色の行にジャンプして戻ります。一度,EOFそれが返されますヒット-1したときにエラーが発生しており、;それを印刷しようとしています。


Timwiの驚くべきHexagonyColorerで生成されたダイアグラム。


2
6バイトバージョンは非常に賢いです。ブルートフォーサーは信じられないほど素晴らしいことができます。
ETHproductions

ブルートフォーサーへのリンクはありますか?
MD XF

@MDXFさまざまなバージョンを保持していませんが、常にこのRubyスクリプトの一部の変更です。
マーティンエンダー

36

TeaScript、0バイト

TeaScriptはJavaScriptにコンパイルされた簡潔なゴルフ言語です


最近の更新では、入力は暗黙的に最初のプロパティとして追加されます。

オンラインで試す


または、1バイト

x

xTeaScriptの入力が含まれます。出力は暗黙的です


私はこれを投稿しようとしていた:)
Kritixi Lithos

5
ああ、私は「代わりに」は言語名だと
思った...-Quelklef

28

ブライアン&チャック、44バイト

#{<{,+?+}_+{-?>}<?
_}>?>+<<<{>?_}>>.<+<+{<{?

私はもともと、使用できないように見えるプログラミング言語を作成するためにこの言語を作成しました。しかし、ゴルフの単純な問題に対する非常に良いエクササイズであることがわかりました。

基本: 2行のそれぞれは、他のプログラムのソースコードで動作するBrainfuckのようなプログラムを定義します。最初のプログラムはBrianと呼ばれ、2番目のプログラムはChuckと呼ばれます。ブライアンだけが読むことができ、チャックだけが書くことができます。Brainfuckのループの代わりに、?制御を他のプログラムに渡します(命令ポインターとテープヘッドの役割も変わります)。Brainfuckに添加される{と、}その最初の非ゼロ電池用テープ(または左端)をスキャン。また、_nullバイトに置き換えられます。

まだこれが最適だとは思いませんが、このソリューションには非常に満足しています。私の最初の試みは84バイトで、Sp3000との数回のゴルフセッションの後(そして彼の試みからインスピレーションを得て)、一度に数バイトずつ44にゆっくりと下げることができました。特に素晴らしい+}+トリックは彼のアイデアでした(下記参照)。

説明

入力は、チャックのテープの最初のセルに読み込まれ、それから苦労してブライアンのテープの最後にコピーされ、そこで印刷されます。最後にコピーすることで、前の文字をゼロに設定する際のバイト数を節約できます。

これ#は単なるプレースホルダーです。切り替え制御では、切り替えたセルが実行されないためです。{<{テープヘッドがチャックの最初のセルにあることを確認します。,STDINからバイトを読み取るか-1、EOFにヒットした場合。したがって+、EOFの場合はゼロに、それ以外の場合は非ゼロにするためにそれをインクリメントします。

今のところ、まだEOFにいないと仮定しましょう。したがって、セルは正であり、?制御をチャックに切り替えます。}>(ブライアンの)テープヘッドを移動し、バックブライアンに制御を渡します。+_?

{-これで、チャックの最初のセルが減少します。まだゼロでない場合は、でコントロールをChuckに再度渡し?ます。今回}>は、最後の非ゼロセルの右側にある2つのセルのブライアンのテープヘッドを移動します。最初はここにあります:

#{<{,+?+}_+{-?>}<?__
                   ^

しかし、後で、いくつかのキャラクターがすでにそこにいます。たとえば、すでに読み取り、印刷しているabc場合、次のようになります。

#{<{,+?+}_+{-?>}<?11a11b11c__
                            ^

どこ1sが実際に1バイト(我々は、約後に何があるかわかります)です。

このセルは常にゼロになるため、今回? コントロールを変更しません>さらに別のセルを右に移動し、+そのセルをインクリメントします。これが、入力の最初の文字が最後に3つのセル?(および右に続く各3つのセル)になる理由です。

<<<そのリストの最後の文字(または?最初の文字の場合)に{>戻り、+ブライアンのテープに戻ってループを繰り返します。これにより、入力セルがブライアンのテープの終わりにゆっくりと転送されます。

入力セルが空?{-なると、after は制御を切り替えません。次に>}<、チャックのテープヘッドをに移動し、_チャックの後半が代わりに実行されるように制御を切り替えます。

}>>は、ブライアンのテープの最後を過ぎて書き込んだセルに移動します。これは、STDINから読み取ったバイトなので、で印刷し.ます。ためには}、テープ上にこの新しい文字を過ぎて実行するために、我々は2つのヌルバイトのギャップを埋める必要があるので、我々はそれらをインクリメント1して<+<+(最終テープ上の実際の文字の間に1バイトがあるなぜそれはです)。最後に{<{、ブライアンのテープの最初に戻り、最初?からすべてを開始します。

あなたが読んだ文字がヌルバイトだったらどうなるのかと思うかもしれません。その場合、新しく書き込まれたセル自体はゼロになりますが、それはブライアンのテープの終わりにあり、その終わりがどこであるかは気しないので、単純にそれを無視できます。つまり、入力がの場合、ab\0deブライアンのテープは実際には次のようになります。

#{<{,+?+}_+{-?>}<?11a11b1111d11e

最後に、EOFに到達すると?、ブライアンのテープでは最初はノーオペレーションになります。この時点で、プログラムを終了します。素朴な解決策は、プログラムが終了するように、チャックのテープの最後に移動して制御を切り替えることです>}>}<?。これは、Sp3000の本当に賢いアイデアが3バイトを節約する場所です。

+チャックの最初のセルをに変え1ます。つまり}、出発点があり_、チャックのテープの真ん中で見つけます。スキップするのではなく、1with に変更することでギャップを単純に埋め+ます。それでは、この変更されたチャックを使って、ブライアンの残りのコードがどうなるか見てみましょう...

{いつものようにChuckの最初のセル-に戻り、ヌルバイトに戻します。つまり、それは?ノーオペレーションです。しかし、現在>}<、通常はテープヘッドをチャックのテープの中央に移動し、それを過ぎてチャックのテープの最後まで移動し、?制御をチャックに渡してコードを終了します。物事がうまくいくといいですね... :)


25

Haskell、16バイト

main=interact id

interact入力を読み取り、引数として指定された関数に渡し、受け取った結果を出力します。id恒等関数です。つまり、入力を変更せずに返します。Haskellの怠lazなおかげでinteract、無限の入力でも機能します。


23

sh + binutils、3 2バイト

dd

まあ、それほど明白ではありません。@ Random832から

元の:

cat

痛々しいほど明らかに...:D


12
私は1つをもっと良くします:dd
Random832

私は猫をやろうとしていた... D:
ev3commander

1
はい、これはすばらしく、すべて...しかし、タイピングのための170担当者cat???
MD XF

1
@MDXF誰がセグメンテーション違反からどのくらいの担当者を知っているのか?;)
ケアード・コミンヘリングアーイング

23

機能、16バイト

╔═╗
╚╤╝

(BOMでUTF-16としてエンコード)

説明

ボックスは、STDINの内容を返します。ルーズエンドが出力します。


19

Motorola MC14500Bマシンコード、1.5バイト

16進表記:

18F

バイナリで書かれた:

0001 1000 1111

説明

1   Read from I/O pin
8   Output to I/O pin
F   Loop back to start

オペコードはそれぞれ4ビットです。


1
P(JK):-1なしスクリーンない、例えば、またはオンラインリンクそれを試してみてください
MD XF

2
+1。これをさらに最適化する唯一の方法は、入力ピンを出力ピンにはんだ付けして、ソケットからチップを取り出すことです:P
Wossname

16

モーニングトンクレセント、41バイト

Take Northern Line to Mornington Crescent

Mornington Crescentがnullバイトを処理できるかどうかはわかりませんが、プログラムの開始前にすべての入力が読み取られます。これが言語の性質です。


15

Brainfuck、5バイト

,[.,]

擬似コードと同等:

x = getchar()
while x != EOF:
    putchar(x)
    x = getchar()

これは無限ストリームを処理しますが、ヌルバイトをEOFとして扱います。BF nullバイトを正しく処理できるかどうかは実装ごとに異なりますが、これは最も一般的なアプローチを前提としています。


1
くそ!あなたは私を5分で倒した!
kirbyfan64sos

最初の文字がNULLの場合、これは正しく実行されません。だからそれは+[,.]正しいはずですか?
Shelvacu

6
@Shelこれは、EOFバイトとして0x00を使用しています。最初の文字がEOFの場合、期待どおりに動作せず、何も出力しません。
メゴ

2
「擬似コード」ああ、それは明らかに、ちょうど角括弧のない、セミセミコロンのないC:P
MD XF

14

ラビリンス、2バイト

,.

ストリームが有限の場合、これはエラーで終了しますが、エラーによって生成されるすべての出力はSTDERRに送られるため、標準出力ストリームは正しいです。

Brainfuckの場合,と同様に、バイトを読み取り(ラビリンスのメインスタックにプッシュ).、バイトを書き込みます(ラビリンスのメインスタックからポップします)。

このループ理由は、両方のことである,.、ソースコードで表される(非常に些細な)迷路の「行き止まり」であり、そのような命令ポインタは、単にその場で回るとバック他のコマンドに移動します。

EOFを,押すと、-1代わりにプッシュが有効になり、有効な文字コードではない.ためエラーがスローされ-1ます。これは実際には将来変更される可能性がありますが、これについてはまだ決めていません。


参考のために、次のように6バイトでエラーなしでこれを解決できます。

,)@
.(

ここでは、)読み取るバイトをインクリメントします。これにより0、EOFで正の値が得られます。値がの0場合、IPは直進し@てプログラムを終了します。値が正の場合、IPは代わりに右に曲がり(、スタックのトップをデクリメントして元の値に戻します。IPはすぐ隅にあり、右に曲がり続け、で印刷し.、で新しいバイトを読み取ってから、再び.フォークに)到達します。


13

C、40バイト

main(i){while(i=~getchar())putchar(~i);}

main(){while(255-putchar(getchar()));}は数バイト短くなっています。
アルキミスト

1
悲しいことに、それは0xFFバイトで途中で終了し、入力に含まれていない場合は入力に0xFFバイトを追加します。
デニス

次の36バイトはどうですか:main(){for(;; putchar(getchar()));};
ヨハンデュトワ

@ user2943932 EOFに達すると-1をgetchar返すため、コードは(有限)入力の後に0xFFバイトの無限ストリームを出力します。
デニス

12

> <>、7バイト

i:0(?;o

ここで試してみてください。説明:

i:0(?;o
i        Take a character from input, pushing -1 if the input is empty
 :0(     Check if the input is less than 0, pushing 1 if true, 0 if false
    ?;   Pop a value of the top of the stack, ending the program if the value is non-zero
      o  Otherwise, output then loop around to the left and repeat

あなたはそれをより多くの入力を与えるまでは続けるしたい場合は、交換してください;!


ああ、私は> <>回答を投稿したいと思っていました...:P(+1!)
El'endia Starman

1
io(2バイト)も同じですがsomething smells fishy...、実行の終了時にクラッシュし、STDERRに書き込みます。これは許可されています。
リン

@Maurisオンラインインタープリターは、エラーで終了するのではなく、nullバイトを出力するだけです。
DanTheMan

11

X86アセンブリ、70バイト

分解objdump

00000000 <.data>:
   0:   66 83 ec 01             sub    sp,0x1
   4:   66 b8 03 00             mov    ax,0x3
   8:   00 00                   add    BYTE PTR [eax],al
   a:   66 31 db                xor    bx,bx
   d:   66 67 8d 4c 24          lea    cx,[si+0x24]
  12:   ff 66 ba                jmp    DWORD PTR [esi-0x46]
  15:   01 00                   add    DWORD PTR [eax],eax
  17:   00 00                   add    BYTE PTR [eax],al
  19:   cd 80                   int    0x80
  1b:   66 48                   dec    ax
  1d:   78 1c                   js     0x3b
  1f:   66 b8 04 00             mov    ax,0x4
  23:   00 00                   add    BYTE PTR [eax],al
  25:   66 bb 01 00             mov    bx,0x1
  29:   00 00                   add    BYTE PTR [eax],al
  2b:   66 67 8d 4c 24          lea    cx,[si+0x24]
  30:   ff 66 ba                jmp    DWORD PTR [esi-0x46]
  33:   01 00                   add    DWORD PTR [eax],eax
  35:   00 00                   add    BYTE PTR [eax],al
  37:   cd 80                   int    0x80
  39:   eb c9                   jmp    0x4
  3b:   66 b8 01 00             mov    ax,0x1
  3f:   00 00                   add    BYTE PTR [eax],al
  41:   66 31 db                xor    bx,bx
  44:   cd 80                   int    0x80

起源:

sub esp, 1
t:
mov eax,3
xor ebx,ebx
lea ecx,[esp-1]
mov edx,1
int 0x80
dec eax
js e
mov eax,4
mov ebx,1
lea ecx,[esp-1]
mov edx,1
int 0x80
jmp t
e:
mov eax,1
xor ebx,ebx
int 0x80

1
したがって、objdump16ビットとしてコンパイルしているように見えますが、32ビットコードとして逆アセンブルしました。何を信じますか?を使用しているのでint 0x80、Linux向けであると思いますが、なぜ16ビットとしてコンパイルするのですか?
ルスラン

@Ruslan 16ビットでコンパイルされていることすら知らなかった
...-kirbyfan64sos

11

ユニバーサルラムダ、1バイト

!

Universal Lambdaプログラムは、ラムダ項をバイナリでエンコードし、8ビットのチャンクに切り刻み、不完全なチャンクに任意のビットを埋め込み、バイトストリームに変換します。

ビットは、次のようにラムダ項に変換されます。

  • 00 ラムダ抽象化を導入します。
  • 01 2つの後続の用語の適用を表します。
  • 111..10、ビットのn回の繰り返しで1n番目の親ラムダの変数を参照します。つまり、単項のDe Bruijnインデックスです。

この変換によって、0010恒等関数であるλa.a形態のいずれかの単一バイト・プログラム手段は、0010xxxxあるcatプログラム。


1
しかし、そうで!0x21ありません0x4_か?
-wchargin

一定。---------
リン

10

PowerShell、88 41 30バイト

$input;write-host(read-host)-n

編集- $inputパイプライン入力に自動変数を使用できることを忘れていました ... EDIT2-の存在をテストする必要はありません$input

ええ、そうです... PowerShellのSTDINは...奇妙です。すべてのタイプのSTDIN からの入力を受け入れる必要があるという前提で、これはこのカタログに対する1つの可能な答えであり、他にもあると確信しています。1

ただし、PowerShellでのパイプライン入力は、思ったとおりには機能しません。PowerShellでのパイピングは言語の機能であり、環境/シェルの機能ではないため(とにかく、PowerShellは言語だけではありません)、動作にいくつかの癖があります。

まず、このエントリに最も関連性のあるものとして、パイプは瞬時に(ほとんどの場合)評価されません。我々が持っている場合は、意味command1 | command2 | command3私たちの殻に、command2まで入力を取るか、または処理を開始しませんcommand1完了... しない限り、あなたはあなたのをカプセル化するcommand1ForEach-Object...です異なるよりForEachForEachのエイリアスですが、エイリアスでForEach-ObjectはなくForEachステートメントとして話しているので、それは別の問題です)

これは、yes | .\simple-cat-program.ps1yes実際には存在しませんが、どんなものでも)のようなものyesは、決して完了しないため機能しないことを意味します。それができればForEach-Object -InputObject(yes) | .\simple-cat-program.ps1、(理論的には)動作するはずです。

Microsoft "Hey、Scripting Guy!"でForEachおよびForEach-Objectを理解する ブログ。

したがって、これらの段落はすべて、なぜif($input){$input}存在するのかを説明しています。パイプライン入力が存在する場合は特別に自動的に作成される入力パラメーターを取得し、存在するかどうかをテストし、存在する場合は出力します。

次に、(read-host)本質的に別個のSTDINストリームを介してユーザーからの入力を取得write-hostし、それを元に戻します。-nフラグ(の略-NoNewLine)を使用。これは、任意の長さの入力をサポートしていないことに注意してください。read-host改行が入力された場合にのみ完了します(技術的にはユーザーが「Enter」を押すと機能します)。

ふう。

1ただし、他のオプションもあります。

たとえば、パイプライン入力のみに関心があり、完全なプログラムを必要としない場合、| $_入力されたものをすべて出力するようなことを行うことができます。(一般的に、PowerShellには計算後に「置き去りにされた」ものの暗黙的な出力があるため、これはやや冗長ですが、それは別です。)

インタラクティブなユーザー入力のみに関心がある場合は、justを使用できますwrite-host(read-host)-n

さらに、この関数には、コマンドライン入力を受け入れるという奇妙な機能が.\simple-cat-program.ps1 "test"あり$aます。たとえば、変数に値を入力(および出力)します。


組み込みのエイリアスを忘れないでください!
チャドバクスター

10

Cubix6 5バイト

nullバイトを処理するようになりました!

@_i?o

Cubixは、2次元のスタックベースのエソランです。Cubixは、ソースコードがキューブの外側にラップされているという点で、他の2D言語とは異なります。

オンラインでテストしてください!注:反復の間には50ミリ秒の遅延があります。

説明

インタプリタが最初に行うことは、コードが収まる最小のキューブを見つけ出すことです。この場合、エッジの長さは1です。その後、.6つの辺がすべて埋められるまで、コードには何も実行されません。空白は処理前に削除されるため、このコードは上記と同じです。

  @
_ i ? o
  .

これでコードが実行されました。IP(指示ポインター)は、左端の面から始まり、東を指します。

IPが最初に遭遇する文字はで_、これはIPが北または南に面している場合にIPを反転させるミラーです。現在は東を向いているため、これは何もしません。次はi、STDINからバイトを入力します。?上の項目が負の場合はIPを左に、正の場合は右にIPを切り替えます。ここには3つの可能なパスがあります。

  • 入力されたバイトが-1(EOF)の場合、IPは左に曲がってヒットします @、プログラムを終了します。
  • 入力されたバイトが0(ヌルバイト)の場合、IPは単純にそのまま続行し、でバイトを出力しますo
  • それ以外の場合、IPは右に曲がり、底面を横切ってミラーに当たり_ます。これは?、それを方向転換し、に送り返します。それは、それを再び正しく方向付けて、バイトを出力します。

このプログラムは最適だと思います。Cubixがヌルバイトを処理できるようになる前(EOFは-1ではなく0)、このプログラムはヌルバイト以外のすべてで機能しました。

.i!@o

5バイトのcatプログラムをすべて見つけるために、ブルートフォーサーを作成しました。終了するまでに約5分かかりますが、最新バージョンでは5つのプログラムが見つかりました。

@_i?o   (works as expected)
@i?o_   (works in exactly the same way as the above)
iW?@o   (works as expected)
?i^o@   (false positive; prints U+FFFF forever on empty input)
?iWo@   (works as expected)

一度に多数の投稿を編集しないでください。あなたはフロントページをあふれています。一度に3つでも問題ありませんが、それ以上の作業が必要な場合は、12時間ごとに小さなバッチで編集してください。
マーティンエンダー

@MartinEnder申し訳ありませんが、私はちょうどそれに気づいた。将来的にはそれらを削除します。
ETHproductions

9

Vitsy、2バイト

グーグー

zすべての入力スタックを取得し、アクティブなプログラムスタックにプッシュします。ZアクティブなスタックをすべてSTDOUTに出力します。

別の方法:

I \ il \ O
I \次の文字を入力スタックの長さだけ繰り返します。
  i入力からアイテムを取得します。
   l \現在アクティブなプログラムスタックの長さだけ次の文字を繰り返します。
     Oスタックの一番上のアイテムを文字として出力します。

2
^ _ ^とにかく+1してください!:)
El'endia Starman

残念投票、私のお気に入り!
アディソンクランプ

なぜダウン投票するのですか?これは完全に有効なエントリのようです
コナーオブライエン

1
それはあるすべての仕様によって有効。
アディソンクランプ

9

MarioLANG、11バイト

,<
."
>!
=#

これが最適かどうかは完全にはわかりませんが、私が見つけた最短です。

これは無限ストリームをサポートし、EOFに達するとエラーで終了します(少なくともRubyのリファレンス実装はそうします)。

マリオをダブルジャンプできる忍者に変えるこれの別のバージョンがあります。

,<
.^
>^
==

どちらの場合でも、マリオは左の列から落ち始め、そこで,バイトを読み取り、バイトを.書き込みます(,有効な文字を返さないため、EOFでエラーがスローされます)。>マリオが右に歩くことを保証します(=彼が歩くためのちょうど地面です)。それから彼は、左の列に戻るように指示する前に、ダブルジャンプ^またはエレベータ("および#ペア)を介し<て上に移動します。


8

rs、0バイト


真剣に。rsは、指定されたスクリプトが完全に空の場合、取得したものをすべて出力します。


7

GolfScript、3バイト

:n;

空のプログラムは標準入力をエコーし​​ます。この言語は無限ストリームを処理できない可能性があります。ただし、@ Dennisが述べたように、改行を追加します。これは、アレイと、呼び出しにスタック全体を包むことによってそうするputsように定義されprint n printn改行です。ただし、nSTDINに再定義し、スタックを空にすること:n;ができます。これはまさにそうです。


7

交通量の多い半破損車、9 + 3 = 12バイト

#<
o^<
 v

交通渋滞(HBCHT)の半分壊れた車はコマンドライン引数として入力を受け取るため、次のように実行します

py -3 hbcht cat.hbc -s "candy corn"

+3は-sフラグ用で、charsとして出力されることに注意してください。また、すべてのゼロが出力から削除されるため、HBCHTはNULを処理しないようです(たとえば97 0 98、2つのcharとして出力されますab)。

説明

HBCHTでは、車はから始まりo、目標は出口#です。^>v<同時にBFのようなテープを修正しながら、車の動きを指示します(に^>v<変換+>-<)。ただし、言語名が示すように、車は右にしか曲がることができません。左に曲がろうとしても、メモリ効果を含めて完全に無視されます。これは方向転換専用であることに注意してください–あなたの車は完全に前進/後退方向を運転できます。

HBCHTのその他の興味深い部分は、車の最初の方向がランダム化され、グリッドがトロイダルであることです。したがって、4つの初期方向すべてのテープを変更せずに、出口に到達するために車が必要です。

  • 上下は簡単で、出口に直接向かいます。

  • 左については、ラップして実行し<、でインクリメントし^ます。次で左に曲がることができない<ので、でラップしてデクリメントしv、前のインクリメントを無効にします。下に向かっているので<、ポインタを2回移動し、セル値を変更せずに、出口で右に曲がります。

  • 右については、左と同じことを行いますが、左に^曲がることができないため、最初のものをスキップします。


編集:HBCHTインタープリターは、コマンドラインフラグを介して単一のパスのみを実行できることがわかります。たとえば、

py -3 hbcht -d left cat.hbc

ただし、この特定の質問に対してフラグが高すぎる(少なくとも5バイト" -d u")だけでなく、すべてのパスがコードを実行するために出口に到達できる必要があるようです。


7

Minkolang、5バイト

od?.O

ここで試してみてください。

説明

o入力から文字を読み取り、ASCIIコードをスタックにプッシュします(0入力が空の場合)。d次に、スタックの最上部(読み込まれたばかりの文字)を複製します。?は条件付きトランポリンであり、スタックの最上部の次の命令はジャンプしません0。入力が空だった場合は、.ジャンプされず、プログラムは停止します。それ以外の場合は、Oスタックの最上部を文字として出力します。Minkolangのトロイダル性は、これが最初にループすることを意味します。


2
ほら!あなたは私の言語を破りました!受け入れられない!+1
アディソンクランプ

7

INTERCALL、133バイト

ワット

INTERCALL IS A ANTIGOLFING LANGUAGE
SO THIS HEADER IS HERE TO PREVENT GOLFING IN INTERCALL
THE PROGRAM STARTS HERE:
READ
PRINT
GOTO I

それは本当に、純粋に抗ゴルフの言語でgolfed誰かのように見えます... 133から116 = 17
エリックOutgolfer

@EʀɪᴋᴛʜᴇGᴏʟғᴇʀ猫のプログラムは非常に簡単ですので、これはすべてのプログラムの場合をis'nt ... codegolf.stackexchange.com/a/82748/53745
TuxCrafting

言語を作った人はローマ数字を使用するつもりでしたが、印刷する場合500(わからない場合)はそうでしょうPRINT D?(ヘッダーを除く)
エリックアウトゴルファー

@EʀɪᴋᴛʜᴇGᴏʟғᴇʀいいえ、INTERCALLはASCII文字のみを印刷し、スタックを使用できます。たとえば、ASCII値20で文字を印刷するには、コードはPUSH XX<newline>PRINTまたはPUSH XX AND PRINTです。ああ、私はインターの生みの親だ
TuxCrafting

7

V、0バイト

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

Vの「記憶」という考え方は、巨大な2D文字の配列にすぎません。プログラムを実行する前に、すべての入力がこの配列に読み込まれます(「バッファ」と呼ばれます)。次に、プログラムの最後に、バッファ内のすべてのテキストが印刷されます。

つまり、空のプログラム catプログラムです。


6

スノーマン1.0.2、15文字

(:vGsP10wRsp;bD

撮影雪だるまさんから直接examplesディレクトリ。行を読み取り、行を印刷し、行を読み取り、行を印刷します...

実装の詳細のため、STDINが空の場合、 vg、空の行の場合と同じものが返さ。したがって、STDINが閉じられると、無限ループで改行を繰り返し印刷します。これは将来のバージョンで修正される可能性があります。

コードの説明:

(        // set two variables (a and f) to active—this is all we need
:...;bD  // a "do-loop" which continues looping as long as its "return value"
         // is truthy
  vGsP   // read a line, print the line
  10wRsp // print a newline—"print" is called in nonconsuming mode; therefore,
         // that same newline will actually end up being the "return value" from
         // the do-loop, causing it to loop infinitely

5

FireType、7バイト

,
&
_
=

プッシュしばかりのいくつかの変更が必要です。ルールは言う:

通常のルールとは異なり、このチャレンジよりも新しい言語(または言語バージョン)を自由に使用できます。

だから私は明確です!


5

核分裂、4バイト

R?J!

言語独自のリポジトリでサンプルプログラムを破ったとき、それは素晴らしいことではありませんか?:)参考のために、それは7バイトのソリューションを持っています

R?J0;0!

説明

そのためR、右向きのアトムで制御フローを開始します。?STDINから文字を原子の質量に読み込みます。文字を読んでいる限り、エネルギーはゼロのままなので、Jumpはノーオペレーションで!文字を出力します。アトムは最初にループバックし(R現在はノーオペレーション)、プロセス全体を繰り返します。

EOFを押す?と、原子のエネルギーがに設定される1ため、Jumpはprintコマンドをスキップします。しかし、EOFが既に返された? 後にアトムがヒットすると、代わりにアトムが破壊され、プログラムが終了します。

(言語の作成者からのソリューションは、明示的な;プログラムを使用してプログラムを終了し0ます。それ以外の場合は、2つの-portalsでスキップされます。)


5

ストライプ、20バイト

e )
"
 r )
 s )
 "
"

これは、ほとんどすべての印刷可能なASCII文字列がShtripedの有効な識別子であることを簡単に示しています。

使い方:

e )   \ declares a variable named )
"     \ defines a function with 0 arguments named "
 r )  \ gets a line of string input, saving it to )
 s )  \ prints ) as a string
 "    \ recursively calls ", effectively looping forever
"     \ calls " from the main scope to get things started

EOFを検出する実際の方法はないため、これはPythonのanswerのように永久にループします。

ただし、空の行が指定されたときに簡単に停止させることができます(30バイト):

e )
"
 r )
 d ) \ tries to decrement ), if it was the empty string, aka 0, it can't, so 0 is returned all the way up
 i ) \ increment ) to put it back to normal after possibly decrementing
 s )
 "
"

Shtriped I / Oは、印刷可能なASCII、タブ、ラインフィード、キャリッジリターン、垂直タブ、およびフォームフィード(合計100文字)のみをサポートすることに注意してください。これは、内部的に、文字列が負ではない任意精度の整数として表され、すべての文字列をエンコードできるように文字の有限アルファベットが必要であるためです。

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