真理機を実装する


148

真実マシンは、(クレジットに行くこの男、それを考え出すために)言語のI / Oおよび制御フローを示すために設計された非常に単純なプログラムです。真理値マシンの機能は次のとおりです。

  • STDINから数値(0または1)を取得します。

  • その数が0の場合、0を出力して終了します。

  • その数が1の場合、1を永久に出力します。

チャレンジ

上記のように、選択した言語で真理マシンを記述します。真理値マシンは、これらのルールに従う完全なプログラムでなければなりません。

  • STDINまたは許容可能な代替から入力を取得します
    • 言語がSTDINから入力を取得できない場合、ハードコードされた変数またはプログラム内の適切な同等物から入力を取得できます。
  • STDOUTまたは許容可能な代替に出力する必要があります
    • ご使用の言語が文字を出力できない場合、0または1バイトまたは単項I / Oは受け入れ可能です。
  • 入力がの場合、1継続的に1sを出力し、プログラムが強制終了またはメモリ不足になった場合にのみ停止する必要があります
  • 出力のみをしなければならないのいずれか0一方又は無改行やスペース、または無限に続く1それぞれとの1一つまたは無改行またはスペースのいずれかが続きます。抑制できない言語のインタープリターの一定の出力(挨拶、ANSIカラーコード、インデントなど)を除き、他の出力は生成できません。改行またはスペースの使用方法は一貫している必要があります。たとえば、1すべて1のsの後に改行が必要な後に改行を使用して出力することを選択した場合などです。

  • あなたの言語がその入力で終了できない可能性がある場合にのみ0、コードが何も出力されない無限ループに入ることが許容されます。

これはカタログであるため、このチャレンジの後に作成された言語は競合できます。提出物をテストできるようにインタープリターが必要であることに注意してください。以前に未実装の言語用にこのインタープリターを自分で作成することは許可されています(推奨されます)。それ以外は、すべての標準ルールに従わなければなりません。ほとんどの言語での提出物は、適切な既存のエンコーディング(通常はUTF-8)でバイト単位で記録されます。

カタログ

この投稿の下部にあるスタックスニペットは、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


マシンコードエントリのために、プロセッサが記述されたコードの実行を終了すると、プログラムが停止すると仮定できますか?
リルトシアスト

3
すべての無効な入力に対して何らかの動作が問題ないと仮定しますか?
ランチャー

3
@Cruncherはい、あなたが得ることを期待すべき唯一の入力は0と1です
spaghetto

4
カタログは作成されません。
アディソンクランプ

2
カタログは異なる言語と見なされBfbf異なる言語のように見えます。
Mooingダック

回答:


189

六角形、6バイト

これは驚くほどトリッキーで、最適だとは思いません...

<.@!$?

コードのパディングと展開後、これは次の16進グリッドを表します。

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

これは、対角線に沿って移動する、最近のエラーのないcatプログラムのような同様の制御フローを使用します。それを達成するために、紫色のパスが左下隅に回り込むように、命令ポインター(IP)を左にそらすことから始めます。

?入力を整数として読み取ります。!それを印刷します。.無操作です。これで、グリッドのコーナーがブランチとして機能します。

入力がの0場合、IPは赤いパスに沿って続行し@ます。これは単にでプログラムを終了します。

入力がの1場合、IPは緑のパスで続行します。繰り返しますが、これ.は単なる操作ではありません$が、Befungeのトランポリンと同等です。次の命令をスキップします。ラップした後、次の命令はになりますが?$実行により、実際には青いパスで続行され、の!別のコピーの印刷から始まり1ます。のみを含むこのループ!..$は、無期限に繰り返されます。

六角形の制御フローの研究...

上記のソリューションが最適だと思います。私はブルートフォーサーを作成しました。これは、少なくとも1つ?!@(必要です。チェック:%@ゼロ除算エラーで終了する代わりに)を含む、すべての6バイトのHexagonyプログラムをチェックしますが、それも助けにはなりませんでした)。このチェックは、a)0入力で生成して0終了し、b)少なくとも2つ1(およびそれ以外)を生成し、プログラムの最初の60ティック(5バイトソリューションでは200ティック)以内に終了しないすべてのプログラムを印刷します。。有効な解決策では、このような小さなグリッドで最初0または2番目を正しく印刷するのに200ティック以上かかる1とは思わないので、解決策を逃したとは思わない。

検索では5バイトの結果は得られませんでしたが、6バイトでは57の結果が得られます(@同じバイト数で問題なく解決できれば、エラーで終了する必要はありません)。それらの57のうち6つだけが誤検知で、実際には2つしか印刷されず1、それ以上印刷せずに無限ループに入りました。2つの!コマンドが含まれていたため、1つのソリューションが2回リストされました。有効なソリューションは正確に50個です。

1つまたは2つのキャラクターが実質的ではないソリューションの間には、ある程度の縮退があります。たとえば、とにかく効果的にノーオペレーションです。ソリューションは23セットのまったく異なるプログラムにグループ化できます(場合によっては、2セットの間に文字の違いが1つしかありませんが、制御フローが大幅に変更されるため、個別にカウントしました)。2つのグループは、非常に予期しない方法で複数の命令ポインターを使用します。ブランチとミラーを使用するこれらの方法のほとんどを思いつかなかったので、これらは六角形でどのような制御フローが可能かについて非常に興味深い研究を行い、将来のゴルフのためのいくつかの新しいトリックを間違いなく学びました。

全体的な制御の流れは、ほぼ常に同じです:番号を読んで、それを印刷します。それはだた場合0への道を見つけること@をループ保持しない場合、!のエッジ値をmainting中1。4つの注目すべき例外があります。

  • 1つのソリューション(2のあるソリューション)は、グリッドを介して反復ごとに!2 1秒を印刷するため、大部分のプログラムの約2倍の速度で印刷されます。これにx2以下のマークを付けました。
  • いくつかのソリューション(含むものはo)置き換える1111(の文字コードo)ので、彼らは印刷3 1彼らが早くプログラムの過半数の3倍程度に印刷すること、反復ごと秒。これらをx3以下でマークしました。
  • 2つのソリューションは、各反復でエッジ値にa を追加1ます(つまり、1-> 11-> 111-> ...)。これらは非常に高速に印刷されますが、最終的にはメモリ不足になります。これらをOoM以下でマークしました。
  • 2つのソリューションは非常にタイトなループに入り、単に!5回ごとではなく1刻みごとに前後にバウンドします。これにより、わずかに高速になります。これらを><以下でマークしました。

ここに動物園全体があります:

#1                #5                #12                #19
?!/$.@            ?$!>$@            .?!/$@             |!|?$@  # ><
?!/$1@  # OoM     ?$!|$@            =?!/$@
?!/$=@                                                 #20
?!/$\@            #6                #13                $@.?<!
?!/$o@  # x3      ?/!<|@            .?/!$@             $@1?<!  # OoM
?!/$!@  # x2                        =?/!$@             $@=?<!
                  #7                                   $@o?<!  # x3
#2                ?\!<|@            #14
?!>$)@                              \!?__@             #21
?!>$1@            #8                                   _>_!?@
?!>$o@  # x3      ?<!>$@  # ><      #15
?!|$)@                              \_?!$@             #22
?!|$1@            #9                                   <!@.$?
?!|$o@  # x3      ?\$!@$            #16                <!@/$?
                                    \_?!_@             <!@=$?
#3                #10                                  <$@!$?
?!|)$@            ?~#!@)            #17                <.@!$?
?!|1$@            ?~#!@1            $$?\@!             </@!$?
?!|o$@  # x3                                           <=@!$?
                  #11               #18
#4                ?$)\@!            \$?\@!             #23
?_!<@>            ?$1\@!                               <<@]!?
                  ?$o\@!  # x3

以下は、少数の代表的なグループの簡単なウォークスルーです。特にグループ10と23はチェックアウトする価値があります。他のグループには、他にも面白い、時には複雑なパスがたくさんありますが、これで終わりになりました。本当に六角形を学びたい人にとっては、これらはミラーとのさらに多くの可能な使用法を示しているので、調査する価値があり$ます。

グループ1

これは元のソリューションよりも複雑ではありませんが、パスは異なる方向に進みます。また、右端のノーオペレーションは、構造を変更せずにこれを有効にする5つの異なるコマンドで置き換えることができるため、1つのセルで最大数のバリエーションが可能になります。

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

グループ2

これは水平方向にしか移動しないため、非常に興味深いものです。にラップした>後、IPはすぐに反転し、角にある枝を取ります。ダイアグラムが完全に見えないわけではありません1が、最初の行をもう一度走査する場合、今回は逆方向に走査します。これはまた?、再び0(EOF)を返すことを意味します。これは)、印刷を維持するために(増分)で修正されます1。これは、また、5つのバリエーションがあり)、また可能性があり1、またはo、及び>またあり得ます|

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

グループ3

これは前のものとほとんど同じに見えますが、地獄のように面倒です。|最下行または最上行をヒットしてからトラバースするまでは同じです。しかし、ループの場合は、$今をスキップ) 上にミラー。だから我々は、スキップ、今増分を打つ、右にターコイズパスをたどる@我々はラップアラウンドする前に| もう一度その後、上部の緑道に戻ります。

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

グループ4

これは特に気の利いたものだと思いました。

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

_右上隅のミラーは、最初は何も操作していません。そのため、で印刷して!を押します<0パスは今、水平ミラーに当たると終了します。しかし、この1経路は非常に興味深い軌道をたどります。下に曲がり、折り返し!、水平方向にリダイレクトされ、! 再び折り返します。その後、この菱形の形状で動き続け、反復ごとに2回(3目盛りごとに)印刷します。

グループ8

これは、非常にタイトな印刷ループを持つ2つのソリューションの1つです。

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

<ブランチとして機能します。2回ラップした後、を0押し@ます。1一方、最初にをスキップし?、次にに>送信します。$そのため、がスキップされ@ます。その後、IPは、前後間のバウンスターコイズ路にラップ><(その間のエッジの周りにラッピング)。

グループ10

他の命令ポインターを使用する2つのグループのうちの1つ。六角形には6があります。それぞれが時計回りのエッジに沿って異なるコーナーから始まりますが、一度にアクティブになるのはそのうちの1つだけです。

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

いつものように、で読みます?。今~単項否定である:それはターン1-1。次に、を押します#。これは、IPを切り替える1つの方法です。現在のエッジ値をモジュロ6で取り、対応するIPに切り替えます(IPは0時計回りに番号が付けられます)。入力がの場合、0IPは単純に同じままで、退屈にまっすぐに進み!@ます。ただし、入力がの場合、1現在の値は-1である5 (mod 6)。したがって、まったく同じセル(緑色のパス)で開始するIPに切り替えます。今#は何もしないで?、メモリエッジをに設定します0)増分するため、を!出力し1ます。今、~もう一度ヒットして#(プログラムを終了するIP 1に切り替えるのとは対照的に)それでも操作は行われません。この小さなプログラムですべてがうまく調和するのは驚くべきことです。

グループ22

ただ、これは私の元のソリューションが属するグループです。また、no-opは2つの異なる場所にある可能性があり、実際の(効果的なno-op)コマンドにはいくつかの選択肢があるため、最大のグループになります。

グループ23

これは、複数のIPを使用するもう1つのグループです。実際、これは3つの異なるIPを使用します。右上隅は少し混乱していますが、これについて説明します。

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

だから、あなたが前に見た始まり:<北東をそらし、?入力を読む。これ]はIPを切り替えるもう1つの方法です。時計回りに次のIPに制御を渡します。そこで、制御を、ターコイズブルーのパス(見づらいことは知っていますが)に切り替えます。すぐに反映される<ので、南東の角に回り込んで北西に向かいます。またヒットする]ため、次の IPに切り替えます。これは、東の角から始まり、南西に向かう灰色の道です。入力を出力し、北東の角に折り返します。<パスを水平方向に偏向し、そこで のパスに反映され<ます。今右<ブランチとして機能します。入力がの0場合、IPは北東に移動し、にラップします@。入力がの1場合、IPはに移動し、!lef-thandに折り返され<、そこで反射されます...今、コーナーで!折り返され、右に偏向<され、左に反射され<、パスが開始されます以上...

かなり混乱しているが、美しい混乱。:)


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


55
おっと。おっと。
コナーオブライエン

6
^同意した。だから、クールな...
El'endiaスターマン

28
黙って私の賛成票を取りなさい!
メゴ

7
@ThomasOltmannこの答えは、言語の基本的な知識があることを前提としています。あなたが実際にそれについての詳細を学ぶことに興味があるなら、私は基本を行ってきたこの答えではこの答えでは、しかし、あなたがいないのであれば、私はあなたを責めないであろう。;)
マーティン・エンダー

5
うん...メモリモデルは、ビット(私が推測するが、1Dテープよりは良い)苦痛に見える
ジョン・ドヴォルザーク

144

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

16進数で:

58EC

説明:

5  OR the register with input from the data bus
8  Write the register to the data bus
E  Skip next instruction if register is zero
C  Jump

Motorola MC14500Bは1ビットのマイクロコントローラーです。1つの1ビットレジスタと1ビットのデータバスがあります。オペコードはそれぞれ4ビットであるため、16個しかありません。それらの半分は、レジスタとデータバス上のビットの間で論理演算を実行します。

ジャンプ命令はジャンプフラグを設定します。アドレスが指定されていない場合、プログラムカウンタを0に設定するのが一般的です。入力ビットがゼロの場合、プロセッサはジャンプしません。入力ビットが1の場合、プロセッサは最初に戻ります。私たちがしているので、OR入力とINGのは、入力信号はその後、レジスタはその後、永遠に1になりますが何であるかは重要ではありません。

従来どおり、レジスタは0に初期化されます。

オペコードのリストは、データシートまたはこちらにあります


7
このチャレンジでは、必ず2バイトが最小です。
コナーオブライエン

23
@CᴏɴᴏʀO'Bʀɪᴇɴエソランと4ビットプロセッサのリストを数時間探して、1または1.5が存在するかどうかを確認しましたが、見つかりませんでした。
リトシアスト

間違いなく仕事に最適なツール。
ヒューゴジンク

リンクが閉じられています
...-TheDoctor

@TheDoctor両方のリンクは私のために正常に動作
MEGO

85

アーノルドC、296バイト

IT'S SHOWTIME
    HEY CHRISTMAS TREE i    
    YOU SET US UP @NO PROBLEMO
    BECAUSE I'M GOING TO SAY PLEASE i
        STICK AROUND i
            TALK TO THE HAND i
        CHILL
    BULLSHIT
        TALK TO THE HAND i
    YOU HAVE NO RESPECT FOR LOGIC
YOU HAVE BEEN TERMINATED

それほど競争的ではありませんが、楽しみのためです。標準入力をサポートしていません、交換する@NO PROBLEMO@I LIEDゼロ値のため。@No Problemoは1です。

実行(ファイルはtruthmachine.arnoldcであると仮定):

wget http://lhartikk.github.io/ArnoldC.jar
java -jar ArnoldC.jar truthmachine.arnoldc
java truthmachine

46
綺麗な。私は10月10日を叫んだ
spaghetto

10
BECAUSE I'M GOING TO SAY PLEASE
エリックマルティネス

8
これはif(i){while(i) print(i);} else {print(i);}確かにそうするように見えますprint(i);while(i) print(i);
リルトシアスト

16
が、BULLSHITプログラムのエンターテイメントとしての価値に大きく貢献している、技術的には不要です。後にBULLSHIT移動することで、ブランチ全体を除外できます。TALK TO THE HAND iYOU HAVE NO RESPECT FOR LOGIC
ガボルシュ

4
:@GaborSchそれに一つだけの適切な応答がありますBULLSHIT);
coinheringaahing caird

65

Minecraft、18バイト(MCバージョン15w45a)

Minecraftのスケッチ

ご覧のように、コマンドを含む繰り返しコマンドブロックに向けられたレバーがありますsay 1。その上にトーチを反転する信号があり、コマンドを含むシングルランコマンドブロックに電力を送りsay 0ます。

スイッチが真実に向けられているときはいつでも、リピーターブロックはコードsay 1を使用して無限を出力します1。レバーがfalseにリダイレクトされると、単一のが出力されます0

これは[@]デフォルトでを出力することに注意してください。あなたがいる場合、本当にただまっすぐ1とゼロにしたい、これはコマンドブロック内のコードである34バイトになり、tellraw @a [1]そしてtellraw @a [0]Metaにあるように、これはMCに対して@CᴏɴᴏʀO'Bʀɪᴇɴの推奨バイトカウントを使用しています。


28
あなたはコードゴルフにビデオゲームを使用しました。+1
RK。

11
@RK。これは、実際には単純な課題に対するかなり標準的な方法です。MCをコードゴルフ言語として使用する他のユーザーが少なくとも2人いますis:answer Minecraft。検索バーを使用してください。c:
アディソンクランプ

1
@FlagAsSpamよくやった。また、MCの回答を検索するためのヒントをありがとう。
アシュウィングプタ

56

Bash + GNU utils、13

grep 0||yes 1

バッシュ、35

read n;for((;n;));{ echo 1;};echo 0

3
はい、bashソリューションが可能かどうか疑問に思っていました...
スパゲッティ

2
いいね!これはかなり巧妙だ
spaghetto

38

ルビー、20

print while/1/||gets

次のように、コマンドラインから実行して警告を回避します

ruby -e "print while/1/||gets" <<< 0
ruby -e "print while/1/||gets" <<< 1

説明:

少ないゴルフ、これは

while /1/ || gets
  print
end

Regexpが条件で使用される場合、変数$_が設定されパターンに一致しない限り、偽と評価されます。ループを初めて通過するとき$_は空であるため、に進みgets、の値を$_STDINから読み取った行に設定します。print引数なしで出力し$_ます。ここで条件を再度評価します。1を読み込むと、短絡して1を再度印刷するだけで、以降も同様に続きます。それ以外の場合はに進みますがgets、入力の2行目がないgetsため、nilを返し、ループは終了します。


18
些細な作業で、「通常の」言語でさえ驚くようなソリューションが可能になるのはいいことです。:)
マーティンエンダー

この||gets部分はすばらしく、すべてですがgets;print while/1/、1バイトだけを実行して保存することはできませんか?
ダニエル

いいえ、0をまったく出力しません。
-histocrat

37

マイクロスクリプト、3バイト

i{p

私が知っている最も短いもの。

説明:

i  Takes numeric input and puts it in register 1
{  while register 1 is truthy
  p  Print the contents of register 1

マイクロスクリプトには、終了時にレジスタ1が暗黙的に印刷されます。これが、入力0が1回印刷される理由です。


@quartataあなたにマッチしました:D
コナー・オブライエン

@CᴏɴᴏʀO'Bʀɪᴇɴ:O
spaghetto

2
あなたが最初の質問、または回答...書いた場合、私は真剣に思ったんだけど
ジョンドヴォルザークを

1
質問。質問を書いている最中に出てきたのは最短だったので、これを投稿したかっただけです。それはカタログなので、本当の勝者はいません。
spaghetto

36

チューリング機械コード、32バイト

ここにあるルールテーブルの構文を使用します。

0 0 0 * halt
0 1 1 r 1
1 _ 1 r 1

私は本当にこれが好きです。1
spaghetto

誰かがすでにこれを投稿していることを知っていました!
YoYoYonnY

25

JavaScript、28バイト

多くの場合、forループはwhileループよりも短いです。

alert(x)を返しますundefined。これは偽であるため、ビット単位のor演算子は|にキャストし0ます。したがって、もしxある"0"、警告一度、そうでない場合はループを続けます。この回答のalertようなSTDOUTの使用。

for(x=prompt();alert(x)|x;);

撃て、あなたは私を打ち負かした。まさにこれを投稿しようとしていた!:) GG
ドミノ

うわー、それは私のものよりも少し賢いです:) +1を持っています!
ETHproductions

末尾のセミコロンは必要ありません。
コナーオブライエン

@CᴏɴᴏʀO'Bʀɪᴇɴどのブラウザを使用しましたか?FirefoxとChromeでテストしましたが、SyntaxErrorそれがありません。
-intrepidcoder

@intrepidcoderああ、申し訳ありませんが、私の悪い。私の考えは、「末尾のセミコロンは役に立たない」モードでした。^^ "
コナーオブライエン

24

Python 2、29バイト

a=input()
while 1:print a;1/a

これ0、デフォルト許可されている除算エラーで終了します


STDERR出力は問題ありません。> <>回答も同様に使用します。
spaghetto

これは素晴らしいです^ _ ^
ABcDexter

印刷しながら仕事をしますか?申し訳ありませんが、私はpythonを知りません。
ローハンジュンジュンワラ

1
@RohanJhunjhunwala 0の場合、何も印刷されませんが、一度だけ印刷する必要があります。
xnor

1
@xnorああ、私の悪い。
ローハンジュンジュンワラ

20

Brainfuck、41 36 31 30バイト

入力後すぐに1回印刷し、Ethanとuser46915の助けを借りて短縮しました。

,.+++[->>+<-----<]>>---<-[>.<]

以前のバージョン:入力から48を引きます。ゼロでない場合は、48に1を追加してASCIIを1永久に印刷し、そうでない場合は印刷します0

-[>+<-----]>--->,<[->->+<<]>[>+<]>.<[>.<]

ここで実行しましたが、出力がバッファリングされているため、プログラムはで終了しないため、出力は表示されません1

編集:0入力時に印刷するのを忘れていました0。修正されました。>.<最後の顔が好きです。


1
@ThomasKwa私は推測していませんが、モジュロ2 専用のアルゴリズム見当たらないのでわかりません。divmodアルゴリズムは少し長いです。
mbomb007

2
:あなたは少し良く一緒にコードの断片をマージし、直接ご入力レジスタを使用して、代わりに別の「48」を登録させることによって、もう少しそれを短縮することができます,.[>+>+<<-]-[>-<-----]>+++[>.<]
イーサン・

mod 2で解決策を試みました。間違いなく48を引くことが正しい方法です。 ,.[->+>+<<]>>[->[>-<[-]]>+[<+>-]<<]>[<<.>>]
cardboard_box

1
@Rayこれがデフォルトであり、一般的に想定されています。別の実装を使用していたとしたら、そう言っていただろう。
mbomb007

1
減算とコピーを組み合わせることで、もう1バイトを取得できます,.+++[->>+<-----<]>>---<-[>.<]
。– user46915

19

Piet、27 18 16コーデル

(Codelは、画像が表示のために引き伸ばされるときの混乱を避けるために使用されるピクセルの派手な名前です。pietスクリプトは画像として保存されるため、バイトの代わりにcodelsをカウントしました。実際には、この小さなgifファイルは最適なパレットデータを備えた62バイトです。これをcodelの量ではなく、エントリのサイズとして使用する必要があるかどうか教えてください。)

元の画像: 小さなバージョン

拡大: 拡大版

pietでは、2つの色の違いによって実行されるコマンドが決まるため、同じ色を2回表示しても同じアクションを実行するわけではありません。実行は左上のコーデルで始まります。次に、水平方向に移動し、次を実行します。

  1. 数字を読んでスタックに置く
  2. スタックの一番上を複製する
  3. スタックのトップをポップして出力します
  4. スタックの上部をポップし、その回数だけ時計回りに回転します。

入力が1の場合、カーソルはライムコーデル内に移動し、スタックに1がプッシュされます。その後、実行は左に進み続けます。カーソルが色から白へ、および白から色へ移動しても、何も起こりません。黒も壁と見なされるため、カーソルは最終的に最上行のライムコーデルに戻り、ステップ2から全体を繰り返します。

ただし、入力が0だった場合、カーソルが下に移動することはなく、右の青のJになります(意図的にしゃがみ、価値がありました)。このJ字型ブロックの底面は、黒いコーデルまたは画像の端に隣接しています)。カーソルがトラップされるため、実行は終了します。

予期しない値:
ユーザーが別の数値を書き込むと、その数値は引き続き印刷され、カーソルは値に基づいて多かれ少なかれ回転します。

  • 4または0の倍数:実行は水平方向に継続して終了します。
  • 3の倍数:上に行くことは不可能なので、カーソルはすぐに時計回りに回転し、水平方向に続き、終了します。
  • 4の倍数ではなく2の倍数。カーソルが回転し、左に移動し始めます。幸いなことに、これはすべて、プログラムフローに影響を与えずにスタックを空にする一連の操作を実行するだけです。スタックが空であるために操作を実行できない場合、単に無視されます。カーソルが左上隅に達すると、カーソルは他に行く場所がなくなり、再び右に移動して、プログラムを効果的に再起動します。
  • その他の値:カーソルは1と同じように下に移動し、1を永久に印刷します。入力が5の場合、出力は5111111111111...

整数以外の値は、プログラムを終了します。実行は正常に続行されますが、スタックに何もないため、すべての操作は無視されます。ある意味で、プログラムはクラッシュすることはありません-それは正常に停止するか、永久にループします。


PietDevフレンドリーバージョン

PietDev(非常に基本的なオンラインPiet IDE)は白いコーデルで問題を抱えているようですので、適切な白いコーデルの自動回転に頼るのではなく、手動で回転させる新しいバージョンを作成しました。そして、新しい色を使用する必要さえありませんでした!それでテストしたい場合は、PietDevはカスタムプログラムサイズをサポートしていないため、コードの周囲に黒い境界線を描画してください。

小さなバージョン

拡大版


古いバージョン

最初のバージョンは、スタックに1をプッシュバックせず、代わりに以前の複製命令にループバックしました。また、装飾的な役に立たないコーデルもありました。

実際にはパイエットコードである小さなパターン

拡大版

その後、スタックの1を押して空白行を削除するというアイデアがありました。装飾的なコーデルのおかげで、私はそれをどう思ったかおかしいです。

小さなバージョン

ラージバージョン

それから、もう必要のない余分な重複があることに気付き、画像のパレットデータに保存する色の数を減らしました。また、私は知らないので、単一の装飾コーデルも取り除きました。


7
コーデル以外のスコアでPietの回答が得られるのを見たことはありませんが、最適なバイト数を含めることも興味深いと思います:)
undergroundmonorail

1
20種類のコーデル値があります。つまり、3つのコーデルを13ビットにパックし、次に8つのトリプレットを13バイトにパックして、1バイトあたり2.6コーデルのストレージ密度を実現できるはずです。しかし、誰かが最初にその言語を定義する必要があります。DPPi =密集したパイトという名前をお勧めします。
ジョンドヴォルザーク

1
@JanDvorak改行用に特別な値を追加するために21個の値をカウントしました。最初の改行があると、パーサーは他の値がどこにあるべきかを推測できます。しかし、コーデルをトリプレットに結合することはできませんでした。これは、コーデルごとに5ビットを無駄にするよりもはるかに理にかなっています。賢い。
ドミノ

1
最初の数バイトとしてディメンションを追加するだけです。追加のシンボルは必要ありません。
ジョンドヴォルザーク

1
それを試してみたい@everyone:PietDevは1を1つだけ出力して終了するため、PietDevでこのソリューションを試さないでください。しかし、ソリューションはnpietで適切に機能します。
ML

19

Pyth、 4 3 2

Wp

ありなしで!末尾のスペース(isaac :)に感謝)。以前はwhileループをコンパイルするためにスペースが必要でしたが、その後Pythは更新されました。通常、それを使用すると失格になりますが、これはカタログであるため有効です。

説明:

Wp        : implicit Q = eval(input)
W         : while
 p        : print and return the value of Q, to be evaluated as the while condition
          : Functions without enough arguments automatically use Q now
          : do nothing in the body of the while loop

5
Pythに暗黙的passに追加するこの回答に感銘を受けました。スペースは不要になりました。pyth.herokuapp.com/?code=WpQ&input=0&debug=0
isaacg

52
クロス4はまだ4のように見えます。
コナーオブライエン

1
。え、私はちょうどLOL、すべてのすべての時間を:(支配pyth seingのように退屈そうだ。
のAshwinグプタ

1
@AshwinGupta 私の言語は技術的にそれを打ち負かしたので、完全に支配しているわけではありません:)
チョイス

@Cyoceええ!よくやった!私は何かがピスを打ち負かすことができると安心します笑。
アシュウィングプタ

16

チップ、6バイト

e*faAs

チップは、集積回路のような動作をする2D言語です。一度に1バイトの入力を受け取り、ビットを個々の入力要素に分割します。出力は、出力要素の値をまとめてバイトに戻します。

これを分解しましょう:

*はソース信号であり、隣接するすべての要素に真の値を送信します。 eそして、f出力の第5及び第6ビットに対応します。したがって、ASCII文字「0」であるe*fbinaryを生成し00110000ます。

これAは、入力aの最初のビットであり、出力の最初のビットなので、aAそのビットを入力から出力にコピーします。したがって、と組み合わせた場合e*f、ASCII「0」の入力は「0」を生成し、「1」は「1」を生成します。(そこの間には相互作用はありませんfし、aどちらも任意の信号を生成しないため、。)

s真の信号によって活性化されたときに最後には、全部が同じ入力で再び実行されることを意味し、次のバイトに進むからの入力を防ぐことができます。

「0」の最初のバイトはゼロであるため、この要素はアクティブにならず、プログラムは「0」を出力し、入力を使い果たして終了します。ただし、「1」はこの要素をアクティブにします。つまり、「1」は出力されますが、入力では消費されず、サイクルを無期限に繰り返すことができます。

ASCIIではなく、値0x0および0x1が出力に使用される場合、そのe*f部分を削除して、3バイトのみにすることができます

aAs

ゼロではなく閉じるには標準入力を期待するよりも、自分自身を終了させなければならないならば、我々はとの最初のバイトを反転以下、取得~、およびへの結果渡すtプログラム(終了し、10バイト):

aA~te*f
 s

tさらには信号を生成しないので、間の相互作用がないtとはe。)


2
素敵な答え!これはカタログの課題であるため、これを非競合としてマークする必要はありません。そのため、その部分を削除しました。PPCGへようこそ!
メゴ

4
私はチップをTIOに追加する自由を取りました。オンラインでお試しください!
デニス

@デニス、あなたへの質問:TIOにそのソースを更新するにはどうすればいいですか?先週、Chipインタプリタのバグを修正しましたが、変更がTIOに反映されていません。これは私に誰かに頼む必要があるものですか?
Phlarx

私はチップを引っ張りました。何か更新が必要な場合は、talk.tryitonline.netにメッセージを残してください。
デニス


13

LOLCODE、119バイト

GIMMEH n
n R SUM OF n AN 0
BOTH SAEM n AN 0, O RLY?
YA RLY
 VISIBLE 0
NO WAI
 IM IN UR l
  VISIBLE 1
 IM OUTTA UR l
OIC

ゴルフをしていない:

HAI

BTW, Read n as a string from STDIN and convert to an integer
GIMMEH n
n R SUM OF n AN 0

BTW, Test n for equality with 0
BOTH SAEM n AN 0, O RLY?
YA RLY
    BTW, Write 0 to STDOUT and exit
    VISIBLE 0
NO WAI
    BTW, Loop forever, printing 1
    IM IN YR l
        VISIBLE 1
    IM OUTTA YR l
OIC

KTHXBYE

1.どのインタープリターを使用していますか?2. MAEK n A NUMBRキャストできますか?3. 条件のDIFFRINT代わりに使用しBOTH SAEM、条件を切り替えることができますか?
リルトシアスト

@ThomasKwa repl.itのLOLCOFFEEを使用していました。(現時点ではダウンしているように見えるので、バックアップが
アレックスA.

O RLY?ブール値にキャストしませんか?
リーキー修道女

@LeakyNunいいえ...?O RLY?は後置記号のようなものifです。
アレックスA.

12

C、37バイト

Cでそれを行う方法に関する別の見解。

main(c){for(gets(&c);putchar(c)&1;);}

cデフォルトint値は1のがgets(&c)から文字列を取得しstdin、ここでの値を追い払ってくれる、chackishly以来、cではありませんchar*。to putchar(c)の値を出力cstdout、を返しますc。以来'0'48で、'1'ASCIIで49です、我々は(最後のビットを使用することができ&1、それがであるかを決定するために)。の場合'0'、ループが中断します。そうでなければ、それは永遠に続きます。

Linuxでコンパイルし(に関する警告を表示gets)、実行しgcc-4.8ます。


2
おそらく、これはリトルエンディアンアーキテクチャでのみ機能します。
ニール

@Neil私はそう思います。
cbojar

@Neil Endiannessは、マルチバイト値のバイト順序にのみ影響します。
LegionMammal978

1
@ LegionMammal978のcデフォルトはでありint、これはマルチバイト値であり、ビッグエンディアンアーキテクチャでgetsは、間違ったバイトを設定します。
ニール

11

ラビリンス、7バイト

 ?+
@!:

Labyrinthは2Dスタックベースの言語であり、制御フローは各命令の後にチェックされるスタックの最上位要素の符号に依存します。実行は、上の行の最初の有効な命令から右に移動し始めます?

関連する指示は次のとおりです。

?      Input integer
+      Add top two elements (Labyrinth's stack has infinite 0s on the bottom)
:      Duplicate top element
!      Output as number
@      Terminate program

入力が0の場合、IPは入力を読み取り?、スタックの上位2つ(0 + 0 = 0)を追加し、0を複製:して出力します。!ここで、プログラム内の唯一のジャンクションに遭遇し、スタックの先頭を確認して確認する必要がありますどこへ行く。上部は0なので、前方に移動してで終了し@ます。

一方、入力が1の場合、のジャンクションに到達する前に、前と同じ命令を実行します(ただし、1を出力します)!。スタックの一番上がポジティブになり、右に曲がり?ます。EOF迷宮は0をプッシュし、私たちが行う上0 + 1 = 1+、複製:、および出力!。もう一度、スタックの一番上に1があり、ループが続きます。

ボーナスとして、同様に動作する@MartinBüttnerの7バイトソリューションがあります。

?+!@
1!

ほとんどの言語とは異なり、1実際にnスタックからポップしてプッシュすることに注意してくださいn*10 + 1。ただし、その時点でスタックの最上部は空なので、単に1を押すのと違いはありません。


10

> <>、7バイト

i2%:n:,

これは、> <>がEOFで-1をプッシュするという事実(1 mod 2)を使用します。また、終了には0による除算を使用します(STDERR出力は無視されるというコンセンサスがあるため、明らかに大丈夫です)。

参考のために、エラーなしで正常に終了するのは余分なバイトです:

i2%:n?!;

10

APL、6バイト

→⎕←⍣⍲⎕

説明:

     ⎕ Read the input, then
 ⎕←    write it out
   ⍣   repeatedly
    ⍲  until NAND of it with itself becomes true.
→      Branch to zero to avoid printing the result again.

1
2番目と最後の文字は異なって見えるはずですか?彼らは私のためではないからです。
ジョンドヴォルザーク

@JanDvorakいや、彼らは同じです。
アレックスA.

1
OK、今私は:-D私には同じに見えるモバイルと二本の矢が、すべてのものの上にそれを探しています
ジョンドヴォルザーク

10

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

,}<-{-?<SOH>_{+?
_>+{?<.p

ここで<SOH>は、対応する制御文字(0x01)に置き換える必要があります。

説明

基本的な考え方は、入力の文字コード(48または49)pをChuckの最後から減算する?ことです@

,入力文字をChuckの最初のセル(でマーク_)に読み込みます。0他のいくつかの変更を行いながら、この値をループ内でデクリメントします。

}<移動pし、-それをデクリメント。次に{、入力セルに戻り-、同様にデクリメントします。これがまだゼロでない限り、?チャックに制御を与えます。次に、>ブライアンのテープヘッドを1セル右に移動し(初期化されます1)、それを+インクリメントします。次に、でループをリセットします{?

チャック上の最初のセルが当たる時までに0<SOH>細胞は、我々はSTDINから読んだ文字にインクリメントされていますpでしょう?入力用1または@入力用0

今、?任意のより多くの制御を切り替えていません。0又は1(で表されるヌルバイトであるように、それは、何もしません後_)。{Chuckの最初のセルに戻り、+増分してセルが正になるようにし?ます。これにより、手がChuckを制御できるようになります。

この時間>+は、ブライアンの最初のテープの終了後にセルを増分します。そのセルはゴミですが、使用することはありません。今{だけに、ブライアンのテープの前にすべての方法をスキャンしません_。したがって?、現在のセルがゼロであるため、何もしません。次に、<.1つを左(入力文字のコピー)に移動して印刷します。

最後に、?またはに遭遇し@ます。入力が0あり、このセルが@空の場合、プログラムは終了します。しかし、入力が1あり、このセルがチャックのループをリセット?するブライアンに引き継がれ{+?、現在は1永遠にs を印刷しています(ブライアンのテープの最後のセルの整数がメモリに収まらないまで)もっと、私は...)。

ボーナス

Sp3000と私はこれに数日間ゴルフをしていました。約40バイトから始めて、まったく異なる2つのソリューションに到達しましたが、解決策は26バイトでした。私の説明を書き始めたときだけ、上記の21バイトの解決策が思い浮かびました。B&Cでアイディアを投げかけ、お互いにゴルフのコツを教えてくれたSpに感謝します。:)

これは彼の26バイトのソリューションです。

>,----{?{>1?0
#I<?_}<.<<<?

そして、これは私のものです:

,{>-<-?_0+?_1{<?
_®{?_{>.?

®値174のバイトはどこにありますか(たとえば、ファイルをISO 8859-1として保存するだけです)。

コアに鉱山は、その中に、21バイトの溶液と同様に機能®なる}入力用1~入力用(NO-OP)0が、実行はそれほどエレガントです。

彼の解決策は、ソースコードがASCIIのみであり、入力を処理するためのループを必要としないという点で非常に適切です。代わりに、----ターン1-0,(チャック用ノー・オペレーション)。これ-により、?Brianのテープの最初のテープがに変更さ>れ、1-caseに異なる制御フローが作成されます。


10

ビット単位のサイクリックタグ、3ビットまたは1バイト未満

Bitwise Cyclic Tagは、最も単純なチューリング完全言語の1つです。プログラムデータの 2つのビット文字列で動作しますプログラムのビットは周期的に読み取られ、次のように解釈されます。

  • 0:最初のデータビットを削除します(出力がある実装では出力します)。
  • 1x:最初のデータビットがの場合、データの最後に(またはを表す)を1追加します。(最初のデータビットがの場合、何もしません。)x010

プログラムは、データ文字列が空になるまで実行されます。

真実の機械

110

データ文字列が次のように設定されている場合0

  • 11最初のデータビットがそうでないので何も追加しません1
  • 0/出力を削除します0
  • データ文字列は空になり、プログラムは停止します。

データ文字列が次のように設定されている場合1

  • 11を追加し1ます。
  • 0/出力を削除します1
  • データ文字列は1つに戻り1、プログラムは元の場所に戻るため、永久にループします。

9

GNU sed、10

:;/1/{p;b}

説明

  • : 名前のないラベルを定義する
  • /1/入力が正規表現1に一致する場合、
  • p パターンスペースを印刷します(すなわち1)
  • b そして、名前のないラベルに(永久に)ジャンプして戻ります
  • 入力が1(つまり0)でない場合、パターンスペースは変更されずに出力され、プログラムは終了します。

フラグ:;p;/1/bnフラグを使用して1文字を削り、合計9バイトにします。sed -fとにかくスクリプトファイルを実行するために使用されるため、追加のフラグを追加するのに2バイトは必要ありません。
seshoumara

9

真剣に4 3バイト

取り消し線4は4 :(

,W■

,STDINから値を読み取ります。Wスタックの一番上の値がbodyである間、実行されるループを開始しますポップせずに一番上のスタック要素を出力します。ループはEOFで暗黙的に閉じられます。

の入力で0は、ループは決して実行されず(0falseyであるため)、プログラムはEOFで終了し、スタック上のすべての値を自動的にポップして出力します。入力に1(またはではない任意の値0""または[])、ループが無限に実行されます。

実際、先頭は,2つのバイトまでスコアをもたらし、(暗黙的な入力のおかげで)必要とされません。


8

火、34バイト

1::=12
2::=~1
0::=~0
@::=:::
::=
@

説明:

1::=12 部分文字列「1」のインスタンスは「12」になることがあります

2::=~1 部分文字列「2」のインスタンスを削除して、「1」を出力できます

0::=~0 部分文字列「0」のインスタンスは削除でき、「0」が出力されます

@::=::: 部分文字列「@」のインスタンスは、入力からの文字列で置き換えることができます

::= 置換ルールの終了リスト

@ 初期文字列は「@」です


8

アーノルドC、134バイト

IT'S SHOWTIME
HEY CHRISTMAS TREE i
YOU SET US UP 0         //or 1
STICK AROUND i
TALK TO THE HAND 1
CHILL
TALK TO THE HAND 0
YOU HAVE BEEN TERMINATED

これは、他のArnoldCの回答ほど面白いものではありませんが、ゴルフです。たとえば、インデントは不要です。また、マクロ@NO PROBLEMOとは不要@I LIEDです。

このバージョンの言語でテストしましたが、入力はできません。


8

Cubix、5 6バイト

Cubixは、@ ETHproductionsの新しい2次元言語で、キューブの面にコマンドがラップされます。オンライン通訳 保存のため@ETHproductionsに感謝します。

!I\@O

これは最終的にキューブに展開されます

  !
I \ @ O
  .

これはIコマンドから始まります。整数をスタックに入力します。
\、no opの上に命令ポインタをリダイレクトします。
O、スタックの最上部の数値を出力します。
!@スタックのトップがtrueの場合、次のコマンド()をスキップします。これは\、1の場合にリダイレクトをジャンプし
\、命令ポインターを@出口プログラムにリダイレクトします。

これは、O ? !コマンドによってスタックがポップされないという事実を利用しています。


いいね 私の言語を使用している他の人に会えて本当にうれしいです:) 5つの命令(およびノー​​オペレーション)のみを使用する別の6バイトのソリューションがあるので、おそらくそれを投稿します。
-ETHproductions

@ETHproductionsは必ずそれを投稿します。あなたはここで有望な言語を持っていると思う:)
MickyT

を削除する?だけでバイトを保存できます!!I\@O
ETHproductions

@ETHproductionsとてもいいです
MickyT

1
私が書いたブルートフォーサを:、ちょうど5 5バイトのソリューションを思い付く:この(1,2分、ブラウザがフリーズ警告)のために@IOw!@I?Ov@!IOw!IOW@!I\@O
ETHproductions

7

Foo、6バイト

&1($i)

FooにはSTDIN入力がないため、入力は2番目の文字としてハードコードされます。Fooが今、すごいことに同意しませんか?:)

説明

&1          Set current cell to 1
  (  )      Do-while loop (or, at least according to the interpreter)
   $i       Print current cell as int

2
私はいつもフーが好きでした。
spaghetto

7

Perl、18 + 1 = 19 13 + 1 = 14バイト

print while$_

次のように実行します:

echo -n NUM | perl -p truth.pl

5バイトのゴルフをしてくれたThisSuitIsBlackNot(Perlゴルフの方が私よりもずっと上手です)に感謝します。


2
ステートメント修飾子はあなたの友達です!また、入力の末尾に改行がないことを確認した場合、+0:(echo -n 0 | perl -pe'print while$_'13バイト+の場合は1 -p)をドロップできます。perl -M5.010 -pe'say while$_'さらに短くなりますが、その結果、0対1の間で一貫性のない改行が発生します。
ThisSuitIsBlackNot

わーい!印刷中に$ _を試しましたが、なぜ機能しないのかわかりませんでした。入力に末尾の改行を使用できないことに気づきませんでした。
spaghetto

はい、文字列0は偽ですが、0改行は真です。をご覧くださいperldoc perlsyn
ThisSuitIsBlackNot

2
say-E余分なバイトとしてカウントされる場合でも、より短くなります。
デニス

2
@Dennis ...で固定することができる私はちょうど実現-lperl -lpE 'say while$_'(11バイト+ 2 -lp)。
ThisSuitIsBlackNot

7

> <>、6バイト

::n?!;

スタックに入力をプッシュして開始します

:        copy top element on stack
 :       copy top element on stack again
  n      pop and outputs top element
   ?     condition trampoline - pops top element, if it is zero skips next instruction
    !    trampoline skips next instruction
     ;   finish execution

1
ここPPCGでは、説明が大好きです。1
spaghetto

3
48('0')と49('1')で動作するはずのとき、これはリテラルの0と1の入力でのみ動作するはずです。私は間違っていますか?
地下

@quartataもしそれが私なら、入力を取得するより伝統的な方法から使用する回答に公平であるために、48または49をスタックに配置する必要があると思います。それはあなたの挑戦であり、とにかく大したことではないので¯\ _(ツ)_ /¯–
地下

2
これには別の問題があります。スタックが事前に設定されている場合、-vフラグに3バイトを追加する必要があります。
エレンディアスターマン

1
@Aaron:それが価値があるので、私もそれが2バイトだと思ったので-v、修正されました。だから、あなただけではありません。:)
エルエンディアスターマン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.