Programming Puzzles & Code Golf Stack Exchange is a question and answer site for programming puzzle enthusiasts and code golfers. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

Since Halloween is coming up I though I might start a fun little code golf challenge!

The challenge is quite simple. You have to write a program that outputs either trick or treat.
"The twist?" you may ask. Well let me explain:

You program has to do the following:

  • Be compilable / runnable in two different languages. Different versions of the same language don't count.
  • When you run the program in one language it should output trick and the other should output treat. The case is irrelevant and padding the string with whitespace characters is allowed (see examples).
  • This is , so the solution with the fewest bytes wins.

A few explanations:

Valid outputs (Just for the words not for running the code in the two languages. Also adding quotes to signalize the beginning or ending of the output. Do not include them in your solution!):

"trick"

"Treat"

"    TReAt"

"
     tRICk          "

Invalid outputs:

"tri ck"

"tr
eat"

"trck"

I'm interested to see what you can come up with! Happy Golfing!

I'd like to note that this is my first challenge so if you have suggestions on this question please leave them in the form of a comment.

share|improve this question
    
Sorry, it's a duplicate. – mbomb007 18 hours ago
2  
While I agree it's a duplicate, I'm not sure it was worth closing given its popularity. – Aaron 17 hours ago
8  
This meta answer states that near-duplicates can be tolerated if there's a good reason. I believe that the popularity this question receives from being close to Halloween is a good reason in itself, so I'll vote to reopen. I wouldn't mind closing it after Halloween (but I don't know if this would be a good thing either). – Aaron 16 hours ago
3  
@steenbergh I don't challenge the fact it is a dupe. I challenge closing it. What does closing it bring to the community? Even more, what does closing it right now, as opposed to after Halloween, bring to the community? I think keeping it open on the other hand (at least for a few days until nobody cares about pumpkins and bats anymore) draws interest to the community. Now that's just my opinion and I'm just a single vote ; if people give more value to the eradication of duplicates, so be it ! – Aaron 16 hours ago
    
@steenbergh and they are : they were both closed as duplicate, because they are, and they might both be reopened if enough people judge on a case by case basis that they are still valuable despite being duplicate. I notice that the question you mention has 4 reopen votes and currently stands a better chance to be reopened than this one. – Aaron 16 hours ago

52 Answers 52

Python / Windows Batch 25 bytes

print"trick"#||echo.treat

Everything after the # is interpreted as a comment by python, while the || is an OR in batch, saying that as the previous command failed, execute this one.

I also like the use of an OR as it almost reads "trick or treat" :)

share|improve this answer
7  
TBH I up-voted this just for the comment about the OR. – Jmons 21 hours ago

Whitespace / Starry, 135 bytes

Here's to a clear night sky on Halloween!


  + +    +      + + 
    +

* +   +*      +     *

   +    *           
     + +        

 +* +   



 +* + .  + .   +      +* +   +* . . .

Note that whitespace on empty lines may not be preserved if you copy from the above code

Whitespace outputs "TRICK". Try it Online!
Starry outputs "TREAT". Try it Online!

Explanation

Starry

Starry ignores all tabs and new lines so the code it reads is the following

         + + + + + +  * +   +*   +  *   +  *       + +   +* +   +* + .  + .   +      +* +   +* . . .

Bytewise, pushing values is very expensive compared to stack and arithmetic operations in Starry. The code starts by pushing and duplicating 4 and the performs a number of operations on it and with 2 and 1 pushed later on produces all of the required ASCII values.

Annotated Code

Stack (after op)    Code        Operation
4                            +  Push 4
4 4 4 4 4 4          + + + + +  Duplicate top of stack 5 times
4 4 4 4 16            *         Multiply top two items
4 4 4 4 16 16        +          Duplicate top of stack
4 4 4 16 4 16          +        Rotate top three items on stack right
4 4 4 16 20         *           Add top two items
4 4 20 4 16            +        Rotate...
4 4 20 64             *         Multiply...
4 64 4 20              +        Rotate...
4 64 80               *         Multiply...
4 64 80 2                  +    Push 2
4 64 80 2 2          +          Duplicate...
4 64 2 80 2            +        Rotate...
4 64 2 82           *           Add...
4 64 2 82 82         +          Duplicate...
4 64 82 2 82           +        Rotate...
4 64 82 84          *           Add...
4 64 82 84 84          +        Rotate...
4 64 82 84           .          Pop and print as character (T)
4 64 84 82            +         Swap top two items on stack
4 64 84              .          Pop and print... (R)
84 4 64                +        Rotate...
84 4 64 1                 +     Push 1
84 4 65             *           Add...
84 4 65 65           +          Duplicate...
84 65 4 65             +        Rotate...
84 65 69            *           Add...
84 65                .          Pop and print... (E)
84                   .          Pop and print... (A)
                     .          Pop and print... (T)

Whitespace

As the name may suggest, Whitespace only parses the three whitespace characters—space, tab, and newline. Unlike the Starry, the Whitespace simply pushes the ASCII values of T, R, I, C, and K and the prints them.

Annotated Code

<Space><Space><Space><Tab><Space><Tab><Space><Space><Tab><Space><LF> Push the ASCII value of R
<Space><Space><Space><Tab><Space><Tab><Space><Tab><Space><Space><LF> Push the ASCII value of T
<Tab><LF><Space><Space> Pop and print the T
<Tab><LF><Space><Space> Pop and print the R
<Space><Space><Space><Tab><Space><Space><Tab><Space><Space><Tab><LF> Push the ASCII value of I
<Tab><LF><Space><Space> Pop and print the I
<Space><Space><Space><Tab><Space><Space><Tab><Space><Tab><Tab><LF>   Push the ASCII value of K
<Space><Space><Space><Tab><Space><Space><Space><Space><Tab><Tab><LF> Push the ASCII value of C
<Tab><LF><Space><Space> Pop and print the C
<Tab><LF><Space><Space> Pop and print the K
<LF><LF><LF>            Terminate the program. The following line is not run.
<Space><Space><Space><Space><Space><Space><Space><Space><Space><Space><Space><Space><Space><Space><Space><Space><Space><Space><Space><Space><Space><Space><LF>

The interweaving of pushes and prints was chosen based solely on aesthetic reasons as it does not affect the byte count.

share|improve this answer
5  
so beautiful sky – lois6b yesterday
1  
this is by far the best answer, so creative. im shocked by the ingenuity. and the skill. bravo! – nephi12 2 hours ago

Python / Perl, 28 bytes

print([]and"trick"or"treat")

Explanation

Since [] is an ArrayRef in Perl, it's truthy, but it's an empty array in Python, therefore falsy.

share|improve this answer
1  
Similarly, print({}and"trick"or"treat") in Python / Lua. – user200783 3 hours ago
    
@user200783 That would have the same effect in Perl as well, since {} is a HashRef! – Dom Hastings 48 mins ago

PHP / JavaScript, 32 30 bytes

Displays trick in PHP and treat in JS.

NaN?die(trick):alert('treat');

The unknown NaN constant is implicitly converted to a string by PHP, making it truthy. It's falsy in JS.

Alternative method, 38 bytes

(1?0:1?0:1)?die(trick):alert('treat');

The ternary operator is right-associative in JS:

                1 ? 0 : 1 ? 0 : 1
 is parsed as:  1 ? 0 : (1 ? 0 : 1)
 which equals:  0

And left-associative in PHP:

                1 ? 0 : 1 ? 0 : 1
 is parsed as:  (1 ? 0 : 1) ? 0 : 1
 which equals:  1
share|improve this answer

evil / ZOMBIE, 109 bytes

Another spooky answer !

xf is a vampire summon task f say "trick" stumble say "jzuueeueeawuuwzaeeaeeaeawuuuuwzuueeueeaw" animate bind

The ZOMBIE code defines a vampire named xf whose only task f is activated at instanciation and will output trick once before being deactivated by stumble. The other say call is dead code (how appropriate !) for ZOMBIE, but contains most of the evil code.

For evil, the xf name is a call to jump to the next j, which precedes the zuueeueeawuuwzaeeaeeaeawuuuuwzuueeueeaw zombie moan that crafts and output treat. The code following is either executed (lowercase letters) or ignored but since there's no w no output should be produced.

share|improve this answer
1  
+1 for using two Halloween themed languages. – Kevin Cruijssen 18 hours ago
1  
@KevinCruijssen thanks, I enjoyed this occasion to get into some less-known esoteric languages :) – Aaron 18 hours ago
    
Well, from the four you've used I have seen Agony a few times before, and I vaguely remember to have seen ZOMBIE once. Never heard of HashHell or evil before, though. :) – Kevin Cruijssen 18 hours ago

/Brainf..k/, 143 + 3 = 146 bytes

This answer requires the -A flag to output in ASCII for Brain-Flak and luckily Brainfuck doesn't care about that flag so it doesn't affect the output in Brainfuck.

(((((()(()()()){})({}){}){}){})+++++++[<+++<(((()()()())((((({}){}){}){}){}()))[][][][]())>>-])<[<++++>-]<.--.---------.------.>++[<++++>-]<.>>

Try it Online!

Try it Online!

How this works

The only overlap between the syntax of Brain-Flak and Brainfuck are the characters <>[]. For brain-flak this mostly means the program has to ensure an even number of stack switches <>. And for Brainfuck this means we need to avoid infinite loops caused by use of the [] monad.

The Brain-Flak code is as follows:

(((((()(()()()){})({}){}){}){})[<<(((()()()())((((({}){}){}){}){}()))[][][][]())>>])<[<>]<>[<>]<>>

Aside from the [<<...>>] bit in the middle and the <[<>]<>[<>]<>> at the end this code is pretty par for the course as far as Brain-Flak programs go. The negative around the zero ([<...>]) is there to create a loop for Brainfuck. The inner <...> is used to move the Brainfuck to an empty cell before it encounters the [][][][] which would loop infinitely otherwise.

The Brainfuck code is as follows:

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

Aside from the aforementioned bits this is also a pretty standard program so I will spare you the details.

share|improve this answer
    
I like this one :D – Conor O'Brien yesterday
5  
There are a LOT more than two languages that match the regex /brainf..k/, so you should use the same header format as everyone else. – mbomb007 18 hours ago
4  
@mbomb007 the only other language I could find that fits this regex is brainfork. Conveniently when run in brainfork this prints "TRICK" so I will leave the regex for the time being. – Wheat Wizard 14 hours ago
    
For brain-flak this mostly means the program has to ensure an even number of stack switches Are you sure about that? It shouldn't matter since <> is a NOP in brainfuck – DJMcMayhem 10 hours ago
    
@DJMcMayhem it has to end on the same stack we put everything otherwise it won't print anything. – Wheat Wizard 10 hours ago

2sable / pl, 8 bytes

0000000: 74 72 65 61 74 93 d0 cb                          treat...

Both programs have been tested locally with the same 8 byte file, so this is a proper polyglot.

2sable: trick

This is the program in code page 1252.

treat“ÐË

Try it online!

pl: treat

This is the program in code page 437.

treatô╨╦

Try it online!

How it works

2sable: trick

t         Square root. Errors since there is no input. The exception is caught, the
          stack left unaltered, and the interpreter pretends nothing happened.
 r        Reverse stack.
          Reversed empty stack is still empty stack. ;(
  e       Compute nCr. Errors since there is no input.
   a      Alphanumeric test. Errors since there is no input.
    t     Square root. Errors since there is no input.
     “    Begin a lowercase string literal.
      Ð     Excluding ‘, ’, “, and ”, Ð is the 71st non-ASCII character in CP1252.
       Ë    Excluding ‘, ’, “, and ”, Ë is the 66th non-ASCII character in CP1252.
          (implicit) End string literal.
          Both characters together fetch the dictionary word at index
          71 * 100 + 66 = 7166, which is 'trick'.

pl: treat

treat     Bareword; push the string "treat" on the stack.
     ô    Unimplemented. Does nothing.
      ╨   Flatten the stack. This doesn't affect the output.
       ╦  Unimplemented. Does nothing.
share|improve this answer
    
But I've got to admit this answer is plain ridiculous! What's next? An answer that's shorter than the words themself? – BrainStone 12 hours ago
4  
This answer is extremely impressive. It's amazing that you managed to write a program shorter than the length of the two words. – DJMcMayhem 10 hours ago

Jolf + Chaîne, 12 bytes

Because Chaîne cannot accept a file to upload with an encoding, I assume UTF-8. (If I could assume ISO-8859-7, this would be 11 bytes, but that would be unfair.)

trick«treat

In Chaîne, « begins a comment, and the rest is printed verbatim. In Jolf, « begins a string. Thankfully, trick does nothing harmful (10; range(input, parseInt(input)) basically), and treat is printed.

Try Jolf here!

Try Chaîne here!

They both work on my browser (firefox, latest version), but the same cannot be said for other browsers.

share|improve this answer
1  
I suppose being the inventory of many obscure languages has it's benefits... – Conor O'Brien yesterday
1  
Nice to see that we are getting close to soloutions pretty much only consiting out of the words themself. I wonder if anyone can reuse the tr. – BrainStone yesterday
1  
@BrainStone I personally doubt that tr could be reused in any golf--it's a small piece of information that would take at least an operator to encode in golfing languages, then a language specific conditional. It would probably even out to either the same length, or longer. However, that's just my conjecture ;) – Conor O'Brien yesterday
    
Let's find out. But I have to agree. A byte count of 10 or less would be insane! – BrainStone yesterday

HTML / JavaScript, 53 bytes

treat<script>document.body.innerHTML='trick'</script>

treat is the document´s text content in HTML.
If JS is enabled, it will replace the HTML content with trick.

share|improve this answer
    
Interesting solution. I like it – BrainStone 18 hours ago

#hell / Agony, 43 bytes

So much ><> everywhere, what is this, an April Fools challenge? Here's an answer with appropriately themed languages.

--<.<.<.<.<.$
io.write("trick")--+<~}~@+{+<

#hell is a subset of LUA which fortunately accepts io.write output calls. We use LUA's -- comments so that it only executes this fragment.

Agony is a Brainfuck derivative, which has the particularity to have its code and working memory on the same tape. The first line only prints 5 characters (10 cells) from the end of the code segment, where I encoded treat as Agony commands. LUA's comment opening -- modifies the value of a cell which isn't used.

share|improve this answer
    
+1 for using two Halloween themed languages. – Kevin Cruijssen 18 hours ago
    
I have to say your Halloween themed ones are the best imho. Very creative! – BrainStone 11 hours ago
    
@BrainStone Thanks, I had fun making them ! – Aaron 10 hours ago

Linux ELF x86 / DOS .COM file, 73 bytes

00000000  7f 45 4c 46 01 00 00 00  1a 00 00 00 1a 00 43 05  |.ELF..........C.|
00000010  02 00 03 00 1a 00 43 05  1a 00 43 05 04 00 00 00  |......C...C.....|
00000020  eb 0c b4 09 ba 41 01 cd  21 c3 20 00 01 00 b2 05  |.....A..!. .....|
00000030  b9 3b 00 43 05 cd 80 2c  04 cd 80 74 72 69 63 6b  |.;.C...,...trick|
00000040  00 74 72 65 61 74 24 eb  d9                       |.treat$..|
00000049

NASM source:

ORG 0x05430000

BITS 32                                         ;
                                                ;   ELF HEADER    --   PROGRAM HEADER
; ELF HEADER                                    ; +-------------+
DB 0x7f,'E','L','F'                             ; | magic       |    +--------------------+
                                                ; |             |    |                    |
; PROGRAM HEADERS                               ; |             |    |                    |
DD 1                                            ; |*class 32b   | -- | type: PT_LOAD      |
                                                ; |*data none   |    |                    |
                                                ; |*version 0   |    |                    |
                                                ; |*ABI SysV    |    |                    |
DD 0x01a        ; offset = vaddr & (PAGE_SIZE-1); |*ABI vers    | -- | offset             |
                                                ; |             |    |                    |
entry:  DD 0x0543001a                           ; |*PADx7       | -- | vaddr = 0x0543001a |
DW 2                                            ; | ET_EXEC     | -- |*paddr LO           |
DW 3                                            ; | EM_386      | -- |*paddr HI           |
DD 0x0543001a                                   ; |*version     | -- | filesz             |
;       inc     ebx     ; STDOUT_FILENO         ; |             |    |                    |
;       mov     eax, 4  ; SYS_WRITE             ; |             |    |                    |
DD 0x0543001a                                   ; | entry point | -- | memsz              |
DD 4                                            ; | ph offset   | -- | flags: RX          |
                                                ; |             |    |                    |
        jmp     short skip                      ; |*sh offset   | -- |*align              |
BITS 16                                         ; |             |    |                    |
treat:  mov     ah, 9                           ; |             | -- |                    |
        mov     dx, trick + 0x100 + 6           ; |*flags ______|    |                    |
        int     0x21                            ; |______/      |    +--------------------+
        ret                                     ; |*ehsize      |
BITS 32                                         ; |             |
DW 32                                           ; | phentsize   |
DW 1                                            ; | phnum       |
skip:                                           ; |             |
        mov     dl, 5   ; strlen("trick")       ; |*shentsize   |
        mov     ecx, trick                      ; |*shnum       |
                                                ; |*shstrndx    |
                                                ; +-------------+
        int     0x80
        sub     al, 4   ; SYS_EXIT
        int     0x80


trick:  DB      "trick/treat$"

BITS 16
        jmp     short treat

This uses the fact that the ELF header starts with 7F 45, which, interpreted as x86 code, is a jump.

The relevant parts for the DOS .COM:

-u100 l2
07D2:0100 7F45          JG      0147
-u147 l2
07D2:0147 EBD9          JMP     0122
-u122 l8
07D2:0122 B409          MOV     AH,09
07D2:0124 BA4101        MOV     DX,0141
07D2:0127 CD21          INT     21
07D2:0129 C3            RET
-d141 l6
07D2:0140     74 72 65 61 74 24   -                           treat$
share|improve this answer
    
Bravo, sir. Bravo. – Draconis 9 hours ago
1  
+1 Simply impressive! – BrainStone 6 hours ago

C++ / Java 7, 165 155 128 123 bytes

//\
class a{public static void main(String[] s){System.out.print("treat"/*
#include<cstdio>
main(){{printf("trick"/*
*/);}}

//\ makes the next line also a comment in C but is a regular one line comment in Java, so you can make C ignore code meant for Java and by adding /* in the second line you can make a comment for Java that is parsed as code by C.

Edit: I improved it a little bit by reorganizing the lines and comments.

Edit2: I did some more reorganizing and shortened it even more.

Edit3: I added corrections suggested by BrainStone to remove 5 bytes, thanks :)

share|improve this answer
1  
You can safe 1 byte by changing C to C++ and replacing #include<stdio.h> with #include<cstdio>. Not much but a byte is a byte. And additionally removing int infront of main will safe 4 bytes. int is implied by C and C++ – BrainStone 11 hours ago
    
Thanks, I modified the code according to your suggestions :) – I_LIKE_BREAD7 5 hours ago

><> / Fishing, 38 bytes

_"kcirt"ooooo;
[+vCCCCCCCC
   `treat`N

For the sake of making a ><> / Fishing polyglot.

It's my first piece of Fishing code after having played for a long time with ><>.
My first impression : as in nature, the fisherman has less physical capabilities than its pray but makes up for it with its tool !

Here the code is extremely simple : ><> will only execute the first line, where _ is a vertical mirror and has no effect since the fish starts swimming horizontally. It just pushes trick on the stack then print it before stopping.
For Fishing, the _ instructs to go down. The fisherman will follow the deck that is the second line while catching the characters of the third line. These will push treat on the tape then print it, stopping as it reaches the end of the deck.

If erroring out is allowed, you could go down to 35 bytes with the following code which will throw an error when run as ><> once the trick is printed off the stack :

_"kcirt">o<
[+vCCCCCCCC
   `treat`N

You should also check my themed languages answers, #hell / Agony and evil / ZOMBIE !

share|improve this answer
    
Aw, I wanted to make a fish/fishing polyglot :) You beat me to it. Nice one! – Emigna 22 hours ago
    
+1 for "as in nature, the fisherman has less physical capabilities than its pray but makes up for it with its tool !" – Kevin Cruijssen 22 hours ago

QBasic / Javascript, 51 bytes

PRINT ("Trick")
'';function PRINT(){alert("Treat")}

In QBasic, it prints the first line and doesn't execute the second line because it's believed to be a comment (thank you '). In JS, it calls the function PRINT, which is defined on the second line.

share|improve this answer
1  
A very clever approach! – BrainStone 23 hours ago
    
@BrainStone Then you'll really enjoy this one: codegolf.stackexchange.com/a/57645/44874 – steenbergh 23 hours ago

MATL / CJam, 17 bytes

'TRICK'%];"TREAT"

In MATL this outputs TRICK. In CJam it outputs TREAT.

Explanation

MATL

'TRICK'         Push this string
%];"TR"         Comment: ignored
                Implicit display

CJam

'T              Push character 'T'
R               Push variable R, predefined to empty string
I               Push variable I, predefined to 18
C               Push variable C, predefined to 12
K               Push variable K, predefined to 20
'%              Push character '%'
]               Concatenate stack into an array
;               Discard
"TREAT"         Push this string
                Implicit display
share|improve this answer
    
You're missing 3 characters there! (EAT) – Destructible Watermelon yesterday
    
@DestructibleWatermelon Thanks! Edited – Luis Mendo yesterday

Ruby / Perl, 21 bytes

print"trick"%1||treat

Perl

Calculates "trick" % 1 which is 0 % 1 so the || sends treat to print instead, since Perl accepts barewords.

Ruby

Formats the string "trick" with the argument 1, which results in "trick" which is truthy, so the || isn't processed.

share|improve this answer

05AB1E/Actually, 10 bytes

"trick"’®Â

Explanation

05AB1E

"trick"     # push the string "trick"
       ’®Â  # push the string "treat"
            # implicitly print top of stack (treat)

Try it online

Actually

"trick"     # push the string "trick"
       ’®Â  # not recognized commands (ignored)
            # implicit print (trick)

Try it online

share|improve this answer
    
You know, I can clearly read the trick, but how is ’®Â treat?.. – Kevin Cruijssen 23 hours ago
    
Now people have known this feature. Next time we'll get questions such as "hQq3k or bvM;p polyglot"... – jimmy23013 22 hours ago
1  
@KevinCruijssen: ’®Â is translated as "take the word with index 3757 from the dictionary", which is "treat". – Emigna 22 hours ago
    
@Emigna Ok... So all ~1.1M English words are accessible in 05AB1E? – Kevin Cruijssen 22 hours ago
1  
@KevinCruijssen: No, there are 10k in total (each representable as 2 characters). You can find the whole list here. – Emigna 22 hours ago

C / Ruby, 64 62 51 bytes

#define tap main()
tap{puts('\0'?"treat":"trick");}

The tap method takes a block and executes it once. It's a short identifier that we can create a #define macro for in C. It also allows us to put a brace-enclosed block in the shared code, even though Ruby doesn't allow {}s in most contexts.

What C sees (after the pre-processor):

main(){puts('\0'?"treat":"trick");}

The '/0' character literal is just the 0 byte, which is falsy, so C will print "trick."

What Ruby sees:

tap{puts('\0'?"treat":"trick");}

The only falsy values in Ruby are false and nil. Even an empty string is truthy, and '\0' is truthy as well. Thus, Ruby will print "treat" (it will also print a warning about using a string literal in a condition, but that goes to stderr so it's ok).

2 bytes saved thanks to daniero.

share|improve this answer
1  
Nice. You can use puts instead of printf to save two bytes – daniero 14 hours ago
    
Thanks! I'm so used to just always using printf in C, I've forgotten that it also has a puts function. – m-chrzan 12 hours ago
    
Two ideas: Can't you use something shorter for tap? And why didn't you get rid of the spaces? p ? "trick":"treat" => p?"trick":"treat" – BrainStone 12 hours ago
    
tap actually serves two purposes. It's a short identifier for #define to latch onto, but it also allows me to put the braces directly in the Ruby code. {} blocks in Ruby don't work like they do in C and similar languages, but tap does take a block, and executes it once. – m-chrzan 12 hours ago
    
Method names in Ruby can end with a question mark, so a space is needed after p. ?<character> is a character literal, so a space is needed after the ?. – m-chrzan 11 hours ago

ShapeScript / Foo, 13 bytes

'trick'"treat

Try it online! trick | treat

How it works

ShapeScript is parsed character by character. When EOF is hit without encountering a closing quote, nothing is ever pushed on the stack. 'trick' does push the string inside the quotes, which is printed to STDOUT implicitly.

Foo doesn't have any commands assigned to the characters is 'trick', so that part is silently ignored. It does, however, print anything between double quotes immediately to STDOUT, even if the closing quote is missing.

share|improve this answer

Jelly / pl, 12 bytes

0000000: 74 72 65 61 74 0a 7f fe 00 ba 49 fb                 treat.....I.

This is the program displayed using Jelly's code page.

treatµ
“¡ṾI»

Try it online!

This is the program displayed using code page 437.

treat
⌂■␀║I√

Try it online!

Both programs have been tested locally with the same 12 byte file, so this is a proper polyglot.

How it works

In Jelly, every line defines a link (function); the last line defines the main link, which is executed automatically when the program is run. Unless the code before the last 7f byte (the linefeed in Jelly's code page) contain a parser error (which would abort execution immediately), they are simply ignored. The last line, “¡ṾI» simply indexes into Jelly's dictionary to fetch the word trick, which is printed implicitly at the end of the program.

I don't know much about pl, but it appears that the interpreter only fetches one line of code and ignores everything that comes after it. As in Perl, barewords are treated as strings, so treat prints exactly that.

share|improve this answer

SQL / Javascript, 54 bytes

select('trick')
--a;function select(){alert("treat")}

Same approach as with my QB/JS answer: First line has the SQL statement, the second line has a 'comment' for SQL and a NOP for JS. Then, we define SQL's select statement as a valid JS function.

share|improve this answer
1  
That is a very smart way of combining these two languages. Have a +1! – ETHproductions 14 hours ago

PHP/Perl, 28 bytes

print defined&x?trick:treat;

defined&x
gives something truthy in PHP (no idea why, but it does).
In Perl it checks if function x is defined - which is not.
--> trick in PHP, treat in Perl.

share|improve this answer
    
@jmathews Have you tried putting a backspace control character into your windows version? What about CLS? – Titus 19 hours ago

Labyrinth/><>, 32 30 bytes

Saved 2 bytes thanks to Martin Ender

v84.82."73.67.75.@
\"TAERT"
>o

Explanation

Labyrinth (TRICK)

The numbers represent ascii values of the letters in "TRICK"
. prints the ascii codes as bytes and @ exists the labyrinth.

Try it online

><> (TREAT)

Moves down and right and pushes the letters of "TAERT" to the stack.
Then loops to the beginning of the line, moves down and right.
Prints everything on the stack with o.

v
\"TAERT"
>o

Try it online

share|improve this answer

sed / Hexagony 32 bytes

/$/ctrick 
#;/;\t.t.ae..|..;..;@

sed

Try it Online!

The first line prints trick if there is an empty string at the end of input. (sed doesn't do anything if there isn't input, but a blank line on stdin is allowed in this case)

Example run:

$ echo | sed -f TrickOrTreat.sed
trick

Hexagony

Try it Online!

The first / redirects the instruction pointer up and the the left, so it wraps the the bottom left, skipping the text used for sed. It reuses the r from the sed code and runs a few others to no effect. The expanded hex looks like this:

   / $ / c 
  t r i c k 
 # ; / ; \ t 
. t . a e . . 
 | . . ; . . 
  ; @ . . . 
   . . . . 
share|improve this answer
    
I've seen Hexagony posts that have pictures of the execution path, is there an easy to generate those? – Riley 12 hours ago
    
Here it is github.com/Timwi/HexagonyColorer – 1000000000 6 hours ago

PowerShell / Foo, 14 bytes

'trick'#"treat

The 'trick' in PowerShell creates a string and leaves it on the pipeline. The # begins a comment, so the program completes and the implicit Write-Output prints trick.

In Foo, (Try it Online!), the 'trick' is ignored, the # causes the program to sleep for 0 seconds (since there's nothing at the array's pointer), then "treat starts a string. Since EOF is reached, there's an implicit " to close the string, and that's printed to stdout.

share|improve this answer
    
Also works in J / Foo. – Conor O'Brien yesterday
    
@ConorO'Brien Is the explanation the same? I've never used J and I'm not familiar with it. – TimmyD yesterday
    
No, this doesn't work in J. # is the copy function, and it only takes non-negative complex left arguments, not strings. The comment symbol is NB. – Adám 22 hours ago
    
@Adám right you are. Forgot the # – Conor O'Brien 20 hours ago

Batch/sh, 30 bytes

:;echo Treat;exit
@echo Trick

Explanation. Batch sees the first line as a label, which it ignores, and executes the second line, which prints Trick. The @ suppresses Batch's default echoing of the command to stdout. (Labels are never echoed.) Meanwhile sh sees the following:

:
echo Treat
exit
@echo Trick

The first line does nothing (it's an alias of true), the second line prints Treat, and the third line exits the script, so the @echo Trick is never reached.

share|improve this answer

Python / Pyth, 24 22 bytes

Thanks to @Loovjo and @Pietu1998 for some help

#"treat"
print"trick";

In Pyth, this outputs treat. In Python, this outputs trick.

How it works

Python

#"treat"       Comment
print"trick";  Print the string literal "trick"

Pyth

#"treat"     
#              Loop until error statement
 "treat"       Implicitly print the string literal "treat"
print"trick";  Throws an error since n has no right operand, breaking out of the loop
               The last ";" is a valid EOF
share|improve this answer
2  
Couldn't you replace the .q with something that gives an error (e.g. K)? Edit: you can remove the .q all together as Pyth will try to run the second line and fail – Loovjo yesterday
1  
To add to @Loovjo's comment, n fails as it has no second operand. – Pietu1998 yesterday

Haskell / Standard ML, 56 bytes

fun putStr x=print"treat";val main=();main=putStr"trick"

Haskell view

The semicolons allow multiple declarations in one line and act like linebreaks, so we get

fun putStr x=print"treat"
val main=()
main=putStr"trick"

A Haskell program is executed by calling the main function, so in the last row putStr"trick" is executed which just prints trick.
The first two rows are interpreted as function declarations following the pattern <functionName> <argumentName1> ... <argumentNameN> = <functionBody>. So in the first row a function named fun is declared which takes two arguments named putStr and x and the function body print"treat". This is a valid Haskell function with type fun :: t -> t1 -> IO (), meaning it takes an argument of an arbitrary type t and a second one of some type t1 an then returns an IO-action. The types don't matter as the arguments aren't used in the function body and the IO-action type results from print"treat", which prints "treat" to StdOut (notice the ", that's why putStr instead of print is used in main). However as it's only a function declaration, nothing is actually printed as fun is not called in main.
The same happens in the second line val main=();, a function val is declared which takes an arbitrary argument named main and return unit, the empty tuple (). It's type is val :: t -> () (Both the value and the type of unit are denoted with ()).

Try it on Ideone.


Standard ML view

Standard ML is a primarily functional language with a syntax related to, but not the same as Haskell. In particular, function declarations must be prefixed with the keyword fun if they take any arguments, and the keyword val if they don't. Also it's possible to have an expression at top level (meaning not inside any declaration) which is then executed when the program is run. (In Haskell writing 1+2 outside a declaration throws a naked expression at top level-error). Finally the symbol for testing equality is = instead of == in Haskell. (There many more differences, but those are the ones that matter for this program.)
So SML sees two declarations

fun putStr x=print"treat";
val main=();

followed by an expression

main=putStr"trick"

which is then evaluated. To determine whether main equals putStr"trick", both sides have to be evaluated and both must have the same type as SML (as well as Haskell) is statically typed. Let us first have a look at the right side: putStr is no library function in SML, but we declared a function named putStr in the line fun putStr x=print"treat"; - it takes an argument x (this is the string "trick" in our case) and forgets about it again, as it does not occur in the function body. Then the body print"treat" is executed which prints treat (without enclosing ", so SML's print is different from Haskell's print). print has the type string -> unit, so putStr has the type a -> unit and therefore putStr"trick" has just type unit.
So in order to be well-typed, main must have type unit too. The value for unit is in SML the same as in Haskell (), so we declare val main=(); and everything is well-typed.

Try it on codingground.
Note: The output in the console is

val putStr = fn : 'a -> unit                                   
val main = () : unit                                                    
treatval it = true : bool

because in SML\NJ the value and type of every statement is displayed after each declaration. So first the types of putStr and main are shown, then the expressions gets evaluated causing treat to be printed, then the value of the expression (true as both sides of = are ()) is bound to the implicit result variable it which is then also displayed.

share|improve this answer

FOG / Jolf, 16 14 bytes

"trick"X"treat

Jolf prints the "treat at the end (doesn't need the matched quote), X does nothing in this case (it's JS eval on the input, which there is none), and the "trick" just makes a string that isn't used.

In FOG, the "trick" pushes trick to the stack, and the X prints it. The unmatched quote on the end of "treat exits with an error.

Old Code:

a"trick""treat"X

Simple. In Jolf, a means print the string after it and disables auto-output. (not really the last part, but yes in this situation)

The other 2 commands are ignored pretty much. (X uses JS eval on the input (I think), and "treat" also gets a string ready to use in a function. No function is used though, so these don't do anything.)

In FOG, X prints the most recent item on the stack. a adds the top 2 elements on the stack (0 and 0, gives 0), and "trick""treat" pushes trick and then treat, and the X prints the top one.

share|improve this answer
    
What is FOG? I have not heard of that language. – ETHproductions yesterday
1  
@ETHproductions FOG, or Fuzzy Octo Guacamole, is his language. – Conor O'Brien yesterday
    
Actually, X is eval'd input. Subtle difference. – Conor O'Brien yesterday
    
@ConorO'Brien eh, close enough. Will edit with links also. – Easterly Irk yesterday
    
@Timmy I can't count. – Easterly Irk yesterday

CJam / Stuck, 19 17 Bytes

Stuck makes a comeback!

"trick"e#"treat"p

CJam will print trick, and Stuck will print treat! Here's an explanation in both languages.

CJam:

"trick"            e# pushes the strings "trick" to the stack
       e#"treat"p  e# the e# comments everything else out, stack implicitly prints

Stuck: note that Stuck does not have comments so you can't run the below

"trick"e#"treat"    | pushes the values "trick", e^2, "treat" to the stack
                p   | prints the top stack value


Old Versions:

19 Bytes: "tr""ick""eat";e#yy

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

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