153
\$\begingroup\$

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>

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

392 Answers 392

0
\$\begingroup\$

Alice, 8 bytes

i.o.&#@#

Try it online!

Explanation

i     Read a byte X from STDIN (gives 48 for input 0, 49 for input 1).
.o    Duplicate X and print that byte back to STDOUT.
.     Duplicate X again.
&#    Skip X commands. Since the program contains 8 commands, if X = 48, 
      this doesn't really do anything. The IP will just loop through the 
      code six times while skipping all commands. But if X = 49, it skips
      one more command, so the next command is skipped.
@     Terminate the program (only gets executed for input 0).
#     Skip the i at the beginning of the next iteration.

This code loops indefinitely, unless the @ terminates it on the first iteration.

| improve this answer | |
\$\endgroup\$
0
\$\begingroup\$

REXX, 33 bytes

pull n
do while n
  say n
  end
say n
| improve this answer | |
\$\endgroup\$
0
\$\begingroup\$

Add++, 11 bytes

+?
O
W,+1,O

Try it online!

But how? I'll tell you!

+?       Add the input to the accumulator x. For this example, lets assume an input of 1
O        Output the input
W,       While input is true
  +1       Add 1 to the input
  ,O       Output and reset x
| improve this answer | |
\$\endgroup\$
0
\$\begingroup\$

Braingolf, 7 bytes

!?[!_+]

Try it online!

Explanation:

 ?          If last element in stack is > 0
!           Prevent if from consuming checked element
  [         Begin while loop (at the end of each iteration of a while loop, the first
            Item in the stack will be decremented by 1, the loop will exit if it reaches 0
   !_       Print the last item on the stack without removing it
     +      Attempt to add together the last 2 items in the stack
            As there is only one item, add it to itself
       ]    End while loop, each time the code reaches this point it will decrement the
            first item in the stack by 1, and will only exit the loop if the item == 0
            Implicit Endif, Implicit output of the last item in the stack
| improve this answer | |
\$\endgroup\$
0
\$\begingroup\$

Decimal, 32 bytes

81D301110D412D590D5111D91D30191D

Pretty simple. Explanation:

81D   ; builtin to read INT to stack
301   ; print
110D  ; push INT 0
412D  ; compare for equality, pop values used, push result
5     ; if truthy
90D   ;  exit
5     ; endif
111D  ; push INT 1
91D   ; declare jump 1
301   ; print
91D   ; exit

Try it online!

| improve this answer | |
\$\endgroup\$
0
\$\begingroup\$

Noether, 5 bytes

0(IP)

This works very simply:

0 - Push 0 to stack
( - Pop value of stack and loop until top of stack equals popped value
I - Push user input to stack
P - Print top of stack
) - End loop

Unless you want your browser to freeze, I would advise against testing this online at https://beta-decay.github.io/noether

| improve this answer | |
\$\endgroup\$
0
\$\begingroup\$

ArcPlus, 22 bytes [non-competing]

(: n (,))(@ (p n) (p n

Verbose version:

(set n (input))
(while (print n) (print n))
| improve this answer | |
\$\endgroup\$
0
\$\begingroup\$

Lean Mean Bean Machine, 18 bytes

 O
 i
 ?
 _
u $
  ~

Explanation:

 O    - Spawns a marble at program start
 i    - Fetch input and assign to marble's value
 ?    - If marble's value is truthy, spin right, else spin left
 _    - Move in direction of spin
u $   - u terminates marble and prints value, $ prints value
  ~   - Trampoline, move marble to top of field on same column

Yep, Mayube's at it again making another language that'll probably be abandoned in a week. This one's not at all golfy though, and inspired by this challenge

| improve this answer | |
\$\endgroup\$
  • \$\begingroup\$ 2D languages generally aren't golfy. However, they're interesting to program in. \$\endgroup\$ – Draco18s no longer trusts SE Jul 17 '17 at 20:47
0
\$\begingroup\$

Cubically, 29 28 bytes

$!7{%0&}U3D1R3L1F3B1U1D3(%1)

Try it online! (May not work for a little while after posting due to TIO's version) Explanation:

$                             read integer as input
 !7{...}                      if falsy
    %0                         print 0th face
      &                        exit
        U3D1R3L1F3B1U1D3      quickest way to get 1 onto a face
                        (..)  forever
                         %1    print the first face
| improve this answer | |
\$\endgroup\$
  • \$\begingroup\$ L1D1L3 gets 1 onto face 0. \$\endgroup\$ – TehPers Aug 5 '17 at 11:04
0
\$\begingroup\$

Python 2, 50 bytes

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

Try it online!

| improve this answer | |
\$\endgroup\$
  • 1
    \$\begingroup\$ You don't need to cast datatypes. 33 bytes \$\endgroup\$ – Simon Sep 5 '17 at 7:57
0
\$\begingroup\$

Assembly (as, x64, Linux), 128 bytes

.data
i:.byte 0
.text
mov $3,%eax
mov $0,%ebx
mov $i,%ecx
mov $1,%edx
int $128
l:mov $4,%eax
mov $1,%ebx
int $128
cmp $49,i
je l

Try it online!

Explanation

.data
i:.byte 0       ;Declare variable i with type byte

.text
mov $3,%eax
mov $0,%ebx
mov $i,%ecx
mov $1,%edx
int $128        ;Make system call read(eax=3) from stdin(ebx=0) with an address(ecx) and length in bytes(edx)

l:mov $4,%eax   ;Declare section/label l
mov $1,%ebx
int $128        ;make system call write(eax=4) to stdout(ebx=1). There is no need to reassign ecx or edx
cmp $49,i       ;compare the value at the address i to 49(ascii value of "1")
je l            ;jump to label l if equal
| improve this answer | |
\$\endgroup\$
0
\$\begingroup\$

INTERCAL, 141 bytes

PLEASE WRITE IN .1
DO (1020) NEXT
DO (1) NEXT
DO COME FROM (3)
(3)DO READ OUT #1
(2)PLEASE RESUME .1
(1)DO (2) NEXT
DO READ OUT #0
DO GIVE UP

Try it online!

| improve this answer | |
\$\endgroup\$
0
\$\begingroup\$

4, 28 bytes

3.61448701501132011483250194

Try it online!

Explanation:

3.            Start Program
6 14 48       Set the value of memory cell 14 to 48 (the ASCII code of '0')
7 01          Read in one byte to memory cell 01
5 01          Print byte from memory cell 01
1 32 01 14    Set the value of memory cell 32 to cell 01 - cell 14
8 32          Start loop: if cell 32=0, skip to the end
5 01          Print byte from memory cell 01
9             End loop
4             End program
| improve this answer | |
\$\endgroup\$
0
\$\begingroup\$

CMD, 30 bytes

:a
echo %1
if %1==1 (goto a)

Pretty straight-forward

| improve this answer | |
\$\endgroup\$
0
\$\begingroup\$

JavaScript, 62 34 33 31 bytes

Golfed:

i=prompt();do{alert(i)}while(i)

Ungolfed:

input=prompt();
do {
    alert(i);
} while(i);

-1 byte thanks to JimmyJazzx's answer
-2 bytes and bug fix thanks to kamoroso94's comment

| improve this answer | |
\$\endgroup\$
  • 1
    \$\begingroup\$ You can golf this even more to something like this: i=prompt();for(;i==1;)alert(i);alert(i) (39 bytes). Also to read from the user use prompt() not alert()`. \$\endgroup\$ – insertusernamehere Nov 10 '15 at 19:26
  • \$\begingroup\$ @insertusernamehere thanks for catching that typo! Just fixed it. \$\endgroup\$ – Solomon Ucko Nov 11 '15 at 1:50
  • \$\begingroup\$ @Martin Büttner♦ Thanks for the formatting fixes! \$\endgroup\$ – Solomon Ucko Nov 11 '15 at 1:53
  • \$\begingroup\$ This does the opposite of what it's supposed to. You need to loop on 1, not 0. Get rid of <1 and save two bytes to fix your bug. \$\endgroup\$ – kamoroso94 Oct 10 '17 at 4:54
  • 2
    \$\begingroup\$ Finally got 50 rep, for(i=prompt();alert(i)|i;); (28 bytes) \$\endgroup\$ – Ephellon Dantzler Oct 10 '17 at 21:13
0
\$\begingroup\$

Java (OpenJDK 8), 103 bytes

interface J{static void main(String[]a){int n=Integer.decode(a[0]);do System.out.print(n);while(n>0);}}

Try it online!

ungolfed (although Java doesn't need it that much):

interface J{
    static void main(String[]a){
        int n=Integer.decode(a[0]);
        do System.out.print(n);
        while(n>0);
    }
}

Using Interface, as since Java 8 interfaces can have function bodies. Because they are always public we are saving some chars. The question states

take input from STDIN or an acceptable alternative

and for me the run arguments are an acceptable alternative.

Note that Integer.decode() throws a NumberFormatException, but input will always only be 0 or 1.

| improve this answer | |
\$\endgroup\$
  • \$\begingroup\$ @cairdcoinheringaahing But the question states "The truth-machine must be a full program that follows these rules:", so a function isn't sufficent, right? There already is a 48 byte Java answer which is only a function. I saw one Java answer which is a full program, but it had 120 bytes. \$\endgroup\$ – Luca H Nov 16 '17 at 6:39
  • \$\begingroup\$ @cairdcoinheringaahing but thanks for the welcome! But I'm not familiar with any golfing language and most of my knowledge lies in Java, which also is not that much... So I don't think you'll see that much of me ;) \$\endgroup\$ – Luca H Nov 16 '17 at 6:41
  • \$\begingroup\$ @cairdcoinheringaahing I know that already, I watched quite some challenges :P But of course, a 3 byte Jelly or something else solution is more liked than a 100 byte Java solution :P But lets see if I'll manage something nice some day ;) \$\endgroup\$ – Luca H Nov 16 '17 at 8:18
0
\$\begingroup\$

Java, 126 bytes

public static void main(String[]a){int n=new Scanner(System.in).nextInt();while(n==1)System.out.print(n);System.out.print(n);}

Ungolfed (+ comments with explanation)

public static void main(String[]a){
    int n=new Scanner(System.in).nextInt();//Create the scanner and get the next integer input
    while(n==1)System.out.print(n);//if n == 1, print 1
    //else exit. If there is nothing that happens the java program automatically exits
    System.out.print(n);//But first print out 0
}

The reason behind using a scanner is me not being able to get the desired behaviour using System.in.read(). Typing 1 exited the program as if it was something else being typed. System.in.read() returns an int as 0-255 representing the byte it received, meaning 1 != 1 with that method.

| improve this answer | |
\$\endgroup\$
0
\$\begingroup\$

JavaScript (ES5), 40 bytes

function(x){x?while(1)alert(1):alert(0)}
| improve this answer | |
\$\endgroup\$
0
\$\begingroup\$

Bitwise, 52 46 38 bytes

Oh, that's right, I made the interpreter not care about the return value for I/O. It was definitely not for code golf.

IN 1 &1
OUT 1 &1
XOR 1 &48 2
JMP &-3 2

Try it online!

Translated to C (labels added instead of literal jumps for clarity):

IN 1 &1        mem[1] = getchar();
LABEL &1       label_1:
OUT 1 &1         putchar(mem[1]);
XOR 1 &48 2      mem[2] = (mem[1] ^ 48);   // ^ is equivalent to !=
JMP @1 2       if (mem[2]) goto label_1;
| improve this answer | |
\$\endgroup\$
0
\$\begingroup\$

Swift, 55 bytes, 54 bytes, 53 bytes

if readLine()=="1"{while 1>0{print(1)}}else{print(0)}

I tried to use ternary for a while but couldn't get it compiling. Maybe someone else will or it is just impossible. I'm open for tips or advice :)

| improve this answer | |
\$\endgroup\$
  • \$\begingroup\$ instead of while(true) can you do while(1) or while(1>0)? \$\endgroup\$ – Cyoce Sep 5 '17 at 8:03
  • \$\begingroup\$ @Cyoce error: 'Int' is not convertible to 'Bool' \$\endgroup\$ – idrougge Nov 22 '17 at 11:52
  • \$\begingroup\$ @Simon You can shave off one byte by removing the parentheses after while. They serve no purpose in Swift. \$\endgroup\$ – idrougge Nov 22 '17 at 11:54
  • \$\begingroup\$ One byte shorter using ternary: readLine()=="1" ? {while 1>0{print(1)}} : {print(0)} \$\endgroup\$ – idrougge Nov 22 '17 at 12:06
  • \$\begingroup\$ @idrougge 'Expression resolves to an unused function' \$\endgroup\$ – Simon Nov 22 '17 at 12:24
0
\$\begingroup\$

Whispers, 34 bytes

> Input
>> Output 1
>> DoWhile 1 2

Try it online!

| improve this answer | |
\$\endgroup\$
0
\$\begingroup\$

Pyt, 5 bytes

`Đƥłŕ

Explanation:

`  ł     (Do ... while top of stack is true)
 Đ       Duplicate top of stack
  ƥ      Print top of stack
    ŕ    Pop top of stack and discard

Try it online!

| improve this answer | |
\$\endgroup\$
0
\$\begingroup\$

;#+, 28 bytes

;;;;;;;;~*~-(;~;;;;;;~)~p(p)

Try it online!

;;;;;;;;~*~-(;~;;;;;;~)~p(p)
;;;;;;;;                      set acc0 = 8
        ~*~                   set acc1 = input
           -(;        )       while(acc0--)
              ~;;;;;;~            acc1 -= 6
                              this leaves us with a `0` or `1` values for character input
                       ~p     print acc1
                         ( )  while(acc1)
                          p       print acc1
| improve this answer | |
\$\endgroup\$
0
\$\begingroup\$

FALSE, 12 11 bytes

^'0-[$.$]$#
| improve this answer | |
\$\endgroup\$
0
\$\begingroup\$

Draw, 21 bytes

start 0 1 start start

This is the version of the program where 1 is input. To change the input to 0, replace the 1 with a 0. The program where the 1 is there will produce an infinite line of marked squares towards y=+∞ starting at x=0, y=1; if the 1 was replaced, there will be only one marked square, at x=0, y=0.

| improve this answer | |
\$\endgroup\$
0
\$\begingroup\$

Aheui, 33 bytes

방챵뱍벅나명희멍터벅벅

You can test it with jsaheui, or rpaheui.

How does it works?

// When input is 0
방챵뱍벅나명희멍터벅벅
ⓐⓑ    ⓖⓕⓔⓓⓒ

// When input is 1
방챵뱍벅나명희멍터벅벅
ⓐⓑⓓⓒⓔⓕ
   ⓖ
| improve this answer | |
\$\endgroup\$
0
\$\begingroup\$

Kotlin Script, 41 bytes

readLine().let{while(it=="1")print("1")}

Pretty Printed:

readLine()
    .let{
        while(it=="1")
            print("1")
    }
| improve this answer | |
\$\endgroup\$
0
\$\begingroup\$

Perl 6, 28 bytes

{.say;.say while $_}(+slurp)
| improve this answer | |
\$\endgroup\$
0
\$\begingroup\$

Yabasic, 36 bytes

Another answer that takes input as integer, n and outputs to the console.

Input""n
If n Then Do?1Loop Else?0Fi

Try it online!

| improve this answer | |
\$\endgroup\$
0
\$\begingroup\$

QUARK, 11 bytes

This is 6.75 bytes in QUARK's encoding, but that's not finished yet (no encoder), so I'll score this in UTF8 until then.

i‶{p}⟲

As QUARK became capable of doing a truth machine (implementation wise) less than a minute ago (from when I started writing this answer), it obviously needs an explanation, so here you go:

i Get input from the user (as a number)
 ‶ Pin the input to the stack (Pinning is QUARK's way of avoiding a million and one dupes, by simply making the value undeletable until you run the pin command on it again.)
  { Begin a block
   p Print a value off the stack. Because the input is pinned, it's not consumed.
    } End the block, and push it to the stack (when the program reaches this point)
     ⟲ Execute the block. If the top of the stack is not after the first execute 0, execute the block until it is. As the input is pinned, it will always be either 0 or 1. So the block either executes once, or infinitely.
| improve this answer | |
\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.