Implement a Truth-Machine

A truth-machine (credits goes to this guy for coming up with it) is a very simple program designed to demonstrate the I/O and control flow of a language. Here's what a truth-machine does:

• Gets a number (either 0 or 1) from STDIN.

• If that number is 0, print out 0 and terminate.

• If that number is 1, print out 1 forever.

Challenge

Write a truth-machine as described above in your language of choice. The truth-machine must be a full program that follows these rules:

• take input from STDIN or an acceptable alternative
• If your language cannot take input from STDIN, it may take input from a hardcoded variable or suitable equivalent in the program
• must output to STDOUT or an acceptable alternative
• If your language is incapable of outputting the characters 0 or 1, byte or unary I/O is acceptable.
• when the input is 1, it must continually print 1s and only stop if the program is killed or runs out of memory
• the output must only be either a 0 followed by either one or no newline or space, or infinite 1s with each 1 followed by either one or no newline or space. No other output can be generated, except constant output of your language's interpreter that cannot be suppressed (such as a greeting, ANSI color codes or indentation). Your usage of newlines or spaces must be consistent: for example, if you choose to output 1 with a newline after it all 1s must have a newline after them.

• if and only if your language cannot possibly terminate on an input of 0 it is acceptable for the code to enter an infinite loop in which nothing is outputted.

Since this is a catalog, languages created after this challenge are allowed to compete. Note that there must be an interpreter so the submission can be tested. It is allowed (and even encouraged) to write this interpreter yourself for a previously unimplemented language. Other than that, all the standard rules of must be obeyed. Submissions in most languages will be scored in bytes in an appropriate preexisting encoding (usually UTF-8).

Catalog

The Stack Snippet at the bottom of this post generates the catalog from the answers a) as a list of shortest solution per language and b) as an overall leaderboard.

To make sure that your answer shows up, please start your answer with a headline, using the following Markdown template:

## Language Name, N bytes


where N is the size of your submission. If you improve your score, you can keep old scores in the headline, by striking them through. For instance:

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


If there you want to include multiple numbers in your header (e.g. because your score is the sum of two files or you want to list interpreter flag penalties separately), make sure that the actual score is the last number in the header:

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


You can also make the language name a link which will then show up in the snippet:

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


<style>body { text-align: left !important} #answer-list { padding: 10px; width: 290px; float: left; } #language-list { padding: 10px; width: 320px; float: left; } table thead { font-weight: bold; } table td { padding: 5px; }</style><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="language-list"> <h2>Shortest Solution 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> <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> <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><script>var QUESTION_ID = 62732; var ANSWER_FILTER = "!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe"; var COMMENT_FILTER = "!)Q2B_A2kjfAiU78X(md6BoYk"; var OVERRIDE_USER = 12012; var answers = [], answers_hash, answer_ids, answer_page = 1, more_answers = true, comment_page; function answersUrl(index) { return "https://api.stackexchange.com/2.2/questions/" + QUESTION_ID + "/answers?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + ANSWER_FILTER; } function commentUrl(index, answers) { return "https://api.stackexchange.com/2.2/answers/" + answers.join(';') + "/comments?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + COMMENT_FILTER; } function getAnswers() { jQuery.ajax({ url: answersUrl(answer_page++), method: "get", dataType: "jsonp", crossDomain: true, success: function (data) { answers.push.apply(answers, data.items); answers_hash = []; answer_ids = []; data.items.forEach(function(a) { a.comments = []; var id = +a.share_link.match(/\d+/); answer_ids.push(id); answers_hash[id] = a; }); if (!data.has_more) more_answers = false; comment_page = 1; getComments(); } }); } function getComments() { jQuery.ajax({ url: commentUrl(comment_page++, answer_ids), method: "get", dataType: "jsonp", crossDomain: true, success: function (data) { data.items.forEach(function(c) { if (c.owner.user_id === OVERRIDE_USER) answers_hash[c.post_id].comments.push(c); }); if (data.has_more) getComments(); else if (more_answers) getAnswers(); else process(); } }); } getAnswers(); var SCORE_REG = /<h\d>\s*([^\n,<]*(?:<(?:[^\n>]*>[^\n<]*<\/[^\n>]*>)[^\n,<]*)*),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/; var OVERRIDE_REG = /^Override\s*header:\s*/i; function getAuthorName(a) { return a.owner.display_name; } function process() { var valid = []; answers.forEach(function(a) { var body = a.body; a.comments.forEach(function(c) { if(OVERRIDE_REG.test(c.body)) body = '<h1>' + c.body.replace(OVERRIDE_REG, '') + '</h1>'; }); var match = body.match(SCORE_REG); if (match) valid.push({ user: getAuthorName(a), size: +match[2], language: match[1], link: a.share_link, }); else console.log(body); }); valid.sort(function (a, b) { var aB = a.size, bB = b.size; return aB - bB }); var languages = {}; var place = 1; var lastSize = null; var lastPlace = 1; valid.forEach(function (a) { if (a.size != lastSize) lastPlace = place; lastSize = a.size; ++place; var answer = jQuery("#answer-template").html(); answer = answer.replace("{{PLACE}}", lastPlace + ".") .replace("{{NAME}}", a.user) .replace("{{LANGUAGE}}", a.language) .replace("{{SIZE}}", a.size) .replace("{{LINK}}", a.link); answer = jQuery(answer); jQuery("#answers").append(answer); var lang = a.language; lang = jQuery('<a>'+lang+'</a>').text(); languages[lang] = languages[lang] || {lang: a.language, lang_raw: lang.toLowerCase(), user: a.user, size: a.size, link: a.link}; }); var langs = []; for (var lang in languages) if (languages.hasOwnProperty(lang)) langs.push(languages[lang]); langs.sort(function (a, b) { if (a.lang_raw > b.lang_raw) return 1; if (a.lang_raw < b.lang_raw) return -1; return 0; }); for (var i = 0; i < langs.length; ++i) { var language = jQuery("#language-template").html(); var lang = langs[i]; language = language.replace("{{LANGUAGE}}", lang.lang) .replace("{{NAME}}", lang.user) .replace("{{SIZE}}", lang.size) .replace("{{LINK}}", lang.link); language = jQuery(language); jQuery("#languages").append(language); } }</script>

• Can we assume that the program halts when the processor finishes executing the written code, for a machine code entry? Nov 3 '15 at 16:58
• Assuming any behaviour is fine for all invalid inputs? Nov 3 '15 at 17:33
• @Cruncher Yes, the only inputs you should expect to get are 0 and 1. Nov 3 '15 at 17:38
• Catalog is borked. Nov 6 '15 at 15:18
• Catalog appears to consider Bf and bf to be different languages. Nov 10 '15 at 1:13

Ruby + -np, 16 12 bytes

p 1while~/1/


Try it online!

~/1/ matches the last line of input to the regular expression /1/

Edit: replaced ;p 0 with the -p flag making the answer -np complete, thanks to @ValueInk

• you don't have to count flags any longer; just note in the body which one you've used (as you already have done) Mar 5 '18 at 23:14
• @Giuseppe thanks, is this the consensus opinion now? Mar 5 '18 at 23:16
• Yeah, see here. Mar 5 '18 at 23:18
• @Giuseppe so should I call it Ruby + -n? Mar 5 '18 at 23:28
• Use the -p flag instead to implicit print the zero ;p Jun 5 '19 at 2:10

Enterprise, 128 bytes

/©©//NDANDA/final disruptive class fdcBit{final immutable void main(){var Money i=read();;;write(i);;;while(i==1){write(i);;;}}}


It's really annoying how the specification isn't very clear, so I had to guess a lot of things.

Pip, 7 bytes

IqW1P1i


Try it online!

explanation:

If(q) // q is input
While(1) {
print(1);
}
output 0  // i is initialized to 0, but this stops it from being confused for "10"


Cascade, 10 bytes

?1/
#?
&#|


Try it online!

My first submission with my new language Cascade! Cascade is a tree-like esolang, similar to Pyramid Scheme, but a bit terser and with wrapping boundaries. Ungolfed, this looks more like:

 @ |
? /
#|
&|
^
# |
1 |


First, the ? checks if the printed (#) input (&) is positive. If not, it goes left and terminates since it finds no more instructions. If so, it goes right to the ^, which first executes the left (#1, print 1), then goes to the right, which wraps around back to the ^ for an infinite loop. In the golfed code we use another ? which does a similar thing except with the center and the right, since we know the return value of # is always positive.

MathGolf, 5 4 3 2 bytes

-1 for dropping block marker

q▲


Explanation

Implicit input
Starts a block
q  Output TOS without a newline.
▲ Execute the code block while the TOS is true. Executes at least once.
Implicit output


Try it online!

• I think you can drop the Ä since there's nothing before it now. Oct 13 '19 at 3:16

Gaia, 3 bytes

:p↺


Try it online!

Explanation

  ↺  While...
:    Duplicating the top of stack leaves a true value on top:
p   Print the top of the stack


Input is taken implicitly in Gaia. Every iteration leaves the stack empty, but if there is no input left when it attempts to grab some, it simply takes the most recently given input again.

Keg, 1287 4 bytes

{:|④


Try it online!

Explanation

# Implicit input
{:|  # While the duplicated item is nonzero:
④ # Output the item without popping
# After that, Output the item remaining on the stack and stop the program

• This can now be 8 bytes due to implicit input Aug 10 '19 at 9:30
• 4 bytes Try it online! Dec 15 '19 at 21:11

Python 3, 35 bytes

a=input()
while a:a=int(a);print(a)


This is the best I can do, don't know if it's the optimal solution though.

Explanation

In Python 3, input() stores the input as a string, so even if the user types 0, it will be stored as '0', which is truthy. This allows me to make a kind of do-while loop, which will always run at least once since '0' and '1' are both truthy. However, I then convert a to an integer ('0' becomes 0 and '1' becomes 1). Now, if the user typed 0, it will not run again since the while loop is now while 0 and 0 is falsy. However, if the user typed 1, it will run forever since the while loop is now while 1 and 1 is truthy.

• 34 bytes
– user85052
Dec 26 '19 at 15:17
• @a'_' oh nice, didn't know that was a thing in Python 3.8 Dec 27 '19 at 1:22

JavaScript, 39 32 Bytes

x=+prompt();do{alert(x)}while(x)


x=+prompt() gets input from user, and transforms it from a string to a number

do{alert(x)}while(x) is a post test loop, so it always alerts X, then executes again if x not = 0

Comp, 6 or 8 bytes

The first golfing language (sort of :) ) from 2020!

;{^&}&


That could be a mistake. An alternative program is:

;{^£}£


Explanation

;      Take an input from the console as an integer
{^£}  While that's nonzero, duplicate & print
£ If that's zero, directly print


Python3, 40Bytes

a=input()
while int(a):print(a)
print(a)

• If input is 0 it will be printed once.
• If input is 1 it will be printed forever.

RAKIAC machine language, 6 bytes (34 real for asm)

00000100
00000011
00110100
00100001
00000001
00000010


Representing the assembly:

in
s: out
jez v
jmp s
v: hlt
end


Tried out one of my things for fun (definitely not made for golf).

Turing Machine Code, 1929 19 bytes

0 0 * * h
0 * 1 r 0


Try it online!

Saved 10 bytes thanks to @Laikoni

• This is doable with just two rules: 0 0 * * h and 0 * 1 r 0. Feb 26 '20 at 12:54

Arn, 4 bytes

“l○|


Explained

Unpacked: &&[{1

Takes advantage of the fact that Arn's interpreter is written in Javascript. This means the && and || operator can be used as control flow.

  _     % Variable initialized to STDIN. Implied
&&      % Boolean AND
[     % Sequence
{   % Block; used to calculate future entries in a sequence
1 % Literal one
}   % End block. Implied
]     % End sequence. Implied

• One more answer and I'm going to learn Arn.
– null
Aug 21 '20 at 13:59
• ;) haha, like your esolang 1+ a lot too Aug 21 '20 at 14:00
• (Although, common mistake is I created 1+ - Parcly Taxel created it.)
– null
Aug 21 '20 at 14:01
• Oh wow, you use it so much I assumed it was yours haha. Apologies to the creator then. Aug 21 '20 at 14:03

Poetic, 137 bytes

TRUTHFUL MACHINE
A:I=true,O=false
B:get a number or get a value
C:if falsy,a zero
D:if truthy,a one
D.a:repeat it if value=I
E:suspend it


Try it online!

Python 3, 35 bytes

n=input()
while 1:print(n);0/int(n)

• Welcome to the site! Nice first answer. Dec 1 '20 at 13:31
• Also, golfing with suggested edits is usually not recommended, I'll leave a comment on xnor's answer for you. Dec 1 '20 at 13:33
• @RedwolfPrograms Thanks for the tip 😅 I'll pay more attention next time Dec 1 '20 at 13:40
• No problem, it happens a lot. Hopefully you'll get to 50 rep soon! Dec 1 '20 at 13:44

Python - 40 bytes

a=int(input())
while a:
print(a)
print(a)


This is simple but effective. A fun thing about this is that while we could put a condition that a==1 in, this is more fun because it reuses a, and a will be 1 causing the loop to run forever (works with any a != 0)

10IPL, 34 bytes

11001000 01001100 00100010 10100001 10100100 00100010 10100001 10100100 00100010 10100001 10100100 00100010 10100001 10100100 00100010 10100001 10100100 00100010 10100001 10100100 00100010 10100001 00100010 00011010 00101010 00101010 00101010 00101010 00101010 00000100 00000100 00000100 00110010 11110000


Try it online!

Program:

; input

inp rp0

; r1

xor r1, rp0

; rp0 OR r1

rtr r1
nor rp0, r1
nor rp0, rp0

rtr r1
nor rp0, r1
nor rp0, rp0

rtr r1
nor rp0, r1
nor rp0, rp0

rtr r1
nor rp0, r1
nor rp0, rp0

rtr r1
nor rp0, r1
nor rp0, rp0

rtr r1
nor rp0, r1
nor rp0, rp0

rtr r1
nor rp0, r1
rtr r1

; pointer

inr rp1
rtr rp1
rtr rp1
rtr rp1
rtr rp1
rtr rp1
zro r2
zro r2
zro r2

; print

prt r1

; jump

jmp


What is 10IPL?

10IPL, short for 10 Instruction Programming Language, is a simple compiled language I made for use in a computer I'm building in Minecraft. I made an online interpreter for it (with a few extra features), since I think it's a neat language.

How does this work?

This program consists of a few parts:

1. Take input
2. Set rp0 (the upper 8 bits of a pointer) to either 00000000 (if the input is truthy) or 11111111 (if the input is falsy)
3. Set rp1 (the lower 8 bits of the pointer) to point to the prt instruction after it
4. Print the inputted value
5. Jump to the pointer

This will jump into a few KiB of zeroed out RAM if the input is 00000000, then terminate. Otherwise, it keep going forever. Don't try it online.

Starry, 16 bytes

, +'. ' +. +'


Try it online!

Pretty simple, it reads the input onto the stack, if it's zero, it prints it, and if it's non-zero, prints it forever.

Plumber, 28 20 bytes

[]
=]]][=[]
][=[][


Try it Online!

I figured Plumber could use some love, so I thought I'd give it a try. It's a pretty fun language to work with! There's no online interpreter for it, so the TIO link is to Javascript, with the interpreter in the header, compliments of @RedwolfPrograms.

This simply takes in input, prints it, and if it is non-zero, it keeps printing it forever.

Piet, 12 codels

Codel size 16:

Instructions:

INN
DUP (start)
DUP
OUTN
PTR (back to start if 1; continue if 0)
POP


It has the following behavior for other values:

• if n % 4 == 1, print n forever
• else, print n once and terminate

if n % 4 == 2, there will be a stack underflow error, as the code path is as follows:

INN
DUP
DUP
OUTN
PTR
SWITCH (empties the stack)
PTR (error)
POP (error)


yuno, 4 bytes

ᴀ_¹¿


Try it online!

Or, using the flag to disable implicit output:

yunod, 3 bytes

ᴀ_¿


Try it online!

Explanation

The W flag caps output at 10,000 characters just so it doesn't freeze your browser window for too long.

ᴀ_¹¿    Main Link
¿    While
¹     The element is truthy
ᴀ_      Output it
<Implicitly output the value>

ᴀ_¿     Main Link
¿     While
ᴀ_      Output the element, then assess if it's truthy
<d flag disables implicit output>


Mascarpone, 18.125 bytes

['1.:!]v*['0.]v*1[:!]v*'1<,>!


Try It Online!

I'm surprised to see so few Mascarpone answers even on the big questions like this. It's a shame, it's such a beautiful language even if it is a bit of a tarpit.

Arduino, 133129 117 bytes

Thanks to @tail spark rabbit ear for shaving off 12 bytes!

#define S Serial
int x=0;void setup(){S.begin(300);}void loop(){S.available()&&S.print(x=S.read()-48);x&&S.print(1);}


Arduino is basically C++, but with this bit implied:

int main() {
setup();
while (true) {
loop();
}
return 0; // to make the compiler happy, I guess
}


The setup() and loop() functions must be implemented.
Explanation:

#define S Serial /* macro to make referencing the Serial monitor shorter */
int x = 0; // must either be global, or declared static inside loop()

void setup() {
S.begin(300);
// The argument to Serial.begin() is the baud rate
// 300 is the slowest supported option, but therefore takes the fewest bytes
}

void loop() {
S.available() &&
// Serial.available() returns truthy when there are unread bytes from the serial input
// Using && as a shortcut for an if statement (like minified JS)

S.print(
x = S.read() - 48
);
// Serial.read() dequeues the next byte from the input
// 48 is ASCII '0'
// Serial.print() converts 0 back to "0"; Serial.write() wouldn't

x &&
S.print(1);
}


As loop() is called indefinitely, it's impossible to terminate, so inputting "0" settles into a loop that prints nothing until something else is input.

Original:

int x=0;void setup(){Serial.begin(300);}void loop(){if(Serial.available()){x=Serial.read()-48;Serial.print(x);}if(x)Serial.print(1);}

• Welcome to Code Golf, and nice first answer! Would it be possible for you to provide either a link to the language, or a link to a testing environment, so that others can run your code? Aug 13 at 2:27
• @Dudecoinheringaahing Unfortunately no. In order to run Arduino code you have to deploy it to a physical Arduino board. Aug 13 at 2:30
• 117 bytes: does this work well? Aug 16 at 3:55

Lua For windows, 70 bytes

Use lua for windows for this

I=io.read() If I=="1" then while 1 do print"1" end elseif print"0" end


This program works because it takes a 0 or 1 from stdin then if it's a one it makes a while loop that prints one if it's a 0 it prints 0 then the program ends

• Does this rely on functionality specific to Windows? Why couldn't this be run with Lua on other systems? Nov 4 '15 at 3:16
• This could be shorter if you just called If io.read()=="1" instead of assigning it to an alias. Nov 4 '15 at 5:41

Ceylon, 91 88 bytes

Improved (explanation at the end):

shared void run()=>("0"<(process.readLine()else"")then{1}.cycled else{0}).each(print);

This was the original (91 bytes):

shared void run(){if("0"<(process.readLine()else"")){while(0<1){print(1);}}else{print(0);}}

Unfortunately the most part goes to reading the input and making sure it is defined.

shared void run() {
if("0"<(process.readLine() else "")) {
while(0<1) {
print(1);
}
} else {
print(0);
}
}


I merged this null check (in the else "" form) with the decision into one if, so when the input is ended without a line being read, it also prints 0. Also, any string sorting less than "0" lexicographically prints 0, and any string lexicographically > "0" will produce the 1-loop.

The 0<1 is used instead of true because it is shorter.

Here is a functional approach, unfortunately it can't compete (107 bytes after whitespace removal) due to the length of parseInteger:

shared void run() {
value i = parseInteger(process.readLine() else "") else 0;
(1:i).cycled.follow(i).each(print);
}


It cycles a range starting at 1 of length i (i.e. either {} or {1}), resulting in {} or {1,1,1,1,...}, prepends i (which results in {0} or {1,1,1,1,1,1,...}), and prints each element.

A different functional approach without variables and parsing is this one (88 bytes, shrinked version at the top):

shared void run() =>
("0" < (process.readLine() else "") then
{ 1 }.cycled else { 0 }).each(print);


This does the case distinction in an expression, using the then and else operators to produce either the {1,1,1,...} stream or the {0} singleton, and then calls print(...) on each element of that stream.

C#, 120 98 bytes

using c=System.Console;class o{static void Main(){if(c.Read()=='1')for(;;c.Write(1));c.Write(0);}}


Ungolfed:

using c=System.Console;
class o
{
static void Main()
{
if(c.Read()=='1')
for(;;c.Write(1));
c.Write(0);
}
}

• 2-byte gain: int a=c.Read();do c.Write(a-48);while(a>48); Dec 6 '15 at 16:10
• 95 bytes based on @LegionMammal978 answer using c=System.Console;class P{static void Main(){int a=c.Read()-48;do c.Write(a);while(a>0);}} Aug 29 '16 at 10:26

x86 (Linux / NASM syntax), 86 bytes

mov dx,1              ; 3rd argument to read(): length of buffer
mov ecx,esp           ; 2nd argument to read(): the buffer
; 1st argument to read(): the FD is already 0
mov ax,3              ; read system call number
int 128               ; invoke syscall, returns eax=1 == num of read bytes
l:mov ax,4            ; start of loop, eax=syscall number of write()
int 128               ; invoke syscall, returns eax=1 == num of written bytes
cmp byte[esp],49      ; compare buffer against '1'
jz l                  ; loop of it's the same
int 128               ; invoke syscall otherwise (syscall 1 == exit)


Compile with nasm -f elf h.asm && ld -o h h.o -m elf_i386 and ignore all warnings. :-)

Swift, 187 bytes

import Foundation
let i = Int("\(String(data: NSFileHandle.fileHandleWithStandardInput().availableData, encoding: NSUTF8StringEncoding)!.characters.first!)")!
print(i)
while i>0{print(i)}


Sadly this has to read from stdin if it can :( Would be so much smaller if I could just declare it inside...

• Can you not remove the spaces around =, after :, and after ,? Dec 14 '17 at 0:36

Scala, 46 bytes

if(readInt==0)print(0)else while(2>1)print(1)


Kinda uninteresting and obvious, but there we go

• ==0 can be replaced with <1
– V.G.
Nov 12 '15 at 17:18
• val k=readInt;do{print(k)}while(k>0)
– V.G.
Nov 12 '15 at 17:24