Кошелек или жизнь полиглот


161

С приближением Хэллоуина я подумала, что могу принять участие в небольшом соревновании по коду!

Задача довольно проста. Вы должны написать программу, которая выводит либо trickили treat.
"Твист?" Вы можете спросить. Хорошо, позвольте мне объяснить:

Ваша программа должна делать следующее:

  • Быть компилируемым / запускаемым на двух разных языках. Разные версии одного и того же языка не учитываются.
  • Когда вы запускаете программу на одном языке, она должна выводить, trickа другая должна выводить treat. Случай не имеет значения, и допускается заполнение строки пробельными символами (см. Примеры).
  • Это , поэтому выигрывает решение с наименьшим количеством байтов.

Несколько объяснений:

Допустимые выходные данные (только для слов, не предназначенных для запуска кода на двух языках. Также добавьте кавычки, чтобы обозначить начало или конец вывода. Не включайте их в свое решение!):

"trick"

"Treat"

"    TReAt"

"
     tRICk          "

Неверные выходы :

"tri ck"

"tr
eat"

"trck"

Мне интересно посмотреть, что вы можете придумать! Счастливого гольфа!

Хочу отметить, что это мой первый вызов, поэтому, если у вас есть предложения по этому вопросу, пожалуйста, оставьте их в форме комментария.

Leaderboards

Вот фрагмент стека, который генерирует как регулярную таблицу лидеров, так и обзор победителей по языкам.

Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:

# Language Name, N bytes

где Nразмер вашего представления. Если вы улучшите свой счет, вы можете сохранить старые результаты в заголовке, вычеркнув их. Например:

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

Если вы хотите включить в заголовок несколько чисел (например, потому что ваш результат равен сумме двух файлов или вы хотите перечислить штрафы за флаг интерпретатора отдельно), убедитесь, что фактический результат является последним числом в заголовке:

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

Вы также можете сделать название языка ссылкой, которая затем будет отображаться во фрагменте списка лидеров:

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


21
В этом мета-ответе говорится, что при наличии достаточных причин можно допускать почти повторные копии. Я считаю, что популярность этого вопроса в связи с приближением к Хэллоуину сама по себе является хорошей причиной, поэтому я проголосую, чтобы открыть его снова. Я не возражал бы закрыть это после Хэллоуина (но я не знаю, будет ли это хорошо также).
Аарон

2
@ mbomb007. Это дубликат чего ?
TRiG

3
определенно не дубликат. Единственное, что то же самое в этом другом, это то, что это также вызов полиглота с указанным выводом.
Брайан Минтон

3
... 3 страницы ... Я действительно думаю, что это получает большую активность, основываясь на текущей стоимости сезонного варианта.
wizzwizz4

2
Какой замечательный вопрос! Мне нравится, как некоторые ответы освещают и используют то, как простые фрагменты кода означают разные вещи на разных языках - например, правдивость / ложность и ассоциативность троичного оператора.
Дон Хэтч

Ответы:


146

2sable / pl , 8 байт

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

Обе программы были протестированы локально с одним и тем же 8-байтовым файлом, так что это правильный полиглот.

2sable: трюк

Это программа в кодовой странице 1252 .

treat“ÐË

Попробуйте онлайн!

пл: лечить

Это программа в кодовой странице 437 .

treatô╨╦

Попробуйте онлайн!

Как это устроено

2sable: трюк

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'.

пл: лечить

treat     Bareword; push the string "treat" on the stack.
     ô    Unimplemented. Does nothing.
      ╨   Flatten the stack. This doesn't affect the output.
       ╦  Unimplemented. Does nothing.

15
Но я должен признать, что этот ответ просто смешной! Что дальше? Ответ, который короче, чем сами слова?
BrainStone

45
Этот ответ чрезвычайно впечатляет. Удивительно, что вам удалось написать программу короче, чем длина двух слов.
DJMcMayhem

1
А? Это две программы
FireCubez

1
@FireCubez Это тот же код, байт на байт. Однако визуальное представление зависит от кодовой страницы.
Деннис

201

Пакет Python / Windows, 25 байт

print"trick"#||echo.treat

Все после # интерпретируется Python как комментарий, а || является ИЛИ в пакете, говоря, что, поскольку предыдущая команда не удалась, выполните эту.

Мне также нравится использование ИЛИ, так как оно почти гласит: «Кошелек или жизнь» :)


33
TBH Я проголосовал за это только за комментарий об ИЛИ.
Jmons

7
TBH Я никогда не ожидал, что мой первый пост здесь получит 65 голосов :)
nephi12

11
TBH позволяет не просто говорить о голосовании. Это не Quora
S Andrew

3
@Sndrew, как совершенно новый участник этого сообщества, я не ожидал, что сделаю пост, который будет так скоро получен, и я рад, что смог внести свой вклад. Я не пытаюсь похвастаться, пожалуйста, не поймите меня неправильно. Я просто очень рад, что меня так хорошо приняли, как я новичок. спасибо за комментарий :)
nephi12

2
Консенсус сообщества @YotamSalmon гласит, что STDERR по умолчанию игнорируется; рассматривается только STDOUT. Попробуйте команду еще раз с 2>nul.
Конор О'Брайен,

154

Пробел / Звездный, 135 байт

Вот ясное ночное небо на Хэллоуин!

  + + + + + 
    +

* + + * + *

   + *           
     + +        

 + * +   



 + * +. + + + * + + *. , ,

Обратите внимание, что пробелы в пустых строках могут не сохраниться, если вы копируете из приведенного выше кода

Пробел выводит «ТРИК». Попробуйте онлайн!
Звездные выходы "TREAT". Попробуйте онлайн!

объяснение

звездный

Starry игнорирует все вкладки и новые строки, поэтому код, который он читает, выглядит следующим образом

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

Таким образом, отправка значений является очень дорогой по сравнению со стеком и арифметическими операциями в Starry. Код начинается с нажатия и дублирования 4, и он выполняет над ним ряд операций, а затем, нажимая 2 и 1, производит все необходимые значения ASCII.

Аннотированный код

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)

Пробелы

Как следует из названия, пробельные символы анализируются только тремя пробельными символами - пробел, табуляция и символ новой строки. В отличие от Starry, то Пробелы просто выталкивает значения ASCII из T, R, I, Cи Kи печатает их.

Аннотированный код

<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>

Переплетение толчков и отпечатков было выбрано исключительно на основе эстетических соображений, поскольку оно не влияет на количество байтов.


12
такое красивое небо
lois6b

9
это, безусловно, лучший ответ, настолько креативный. я в шоке от изобретательности. и навык. Браво!
nephi12

137

Linux ELF x86 / DOS .COM файл, 73 байта

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 источник:

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

При этом используется тот факт, что заголовок ELF начинается с 7F 45, что интерпретируется как код x86 и является переходом.

Соответствующие части для 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$

4
Браво, сэр. Браво.
Драконис

9
Мое сердце екнуло.
Джон Китс

muppetlabs.com/~breadbox/software/tiny/teensy.html - это хорошая статья для всех, кто интересуется уловкой наложения заголовков здесь.
Спарр

4
Это один из лучших ответов, которые я когда-либо видел на этом сайте. Codegolf слишком часто превращается в эзотерические языки, специально предназначенные для игры в гольф, а не умные ответы. Это прекрасно.
Knetic

Это отличные вещи.
Gooseman

104

зло / зомби , 109 байт

Еще один жуткий ответ!

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

ZOMBIEКод определяет vampireимени xfкоторого только задача fактивируется при создании экземпляра и выход будет trickодин раз перед тем , как деактивируется stumble. Другой sayвызов - это мертвый код (как уместно!) ДляZOMBIE , Но содержит большую часть evilкода.

Для evil, то xfимя вызова , чтобы перейти к следующему j, который предшествует zuueeueeawuuwzaeeaeeaeawuuuuwzuueeueeawзомби стонать , что поделки и выход treat. Следующий код либо выполняется (строчные буквы), либо игнорируется, но, поскольку нет wвыходных данных, выводить не нужно.


1
@KevinCruijssen спасибо, мне очень повезло, что я попал на некоторые менее известные эзотерические языки :)
Аарон

Ну, из четырех использованных мной я уже несколько раз видел Агонию, и я смутно помню, что однажды видел Зомби. Никогда раньше не слышал о HashHell или зле. :)
Кевин Круйссен

Хэллоуин это впечатляет! Я никогда даже не слышал об этих двух языках
ejfrancis

95

Python / Perl, 28 байт

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

объяснение

Так []как ArrayRef в Perl, это правда, но это пустой массив в Python, поэтому ложно.


7
Точно так же print({}and"trick"or"treat")в Python / Lua.
user200783

1
@ user200783 Это будет иметь тот же эффект и в Perl, поскольку {}это HashRef!
Дом Гастингс

2
Также почти идентичен для Python / Ruby, но требует дополнительного пробела:print ([]and"trick"or"treat")
Value Ink

2
Любить это! Это отличный комментарий к тому, что неявное преобразование в bool делает читабельностью.
Дон Хэтч

Это может быть полиглот в Lua, Perl и Python print({}and"trick"or"treat")!
ckjbgames

48

PHP / JavaScript, 32 30 байт

Отображается trickв PHP и treatв JS.

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

Неизвестный NaN константа неявно преобразуется в строку PHP, что делает ее правдивой. Это ложно в JS.

Альтернативный метод, 38 байт

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

Тернарный оператор является правоассоциативным в JS:

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

И левый-ассоциативный в PHP:

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

1
Ты прав, мой плохой
Гарет Паркер

alert () - это JavaScript в HTML, но не JavaScript из консоли.
Питер Ферри

1
Альтернативный метод: '\ 0' == "\ 0"? Die (trick): alert ('Treat'); `.
Исмаэль Мигель

3
Отладка цепочечных троичных операторов в PHP должна быть очень увлекательной.
Роберт Фрейзер

3
@ Роберт Отладка чего-либо в PHP - это очень весело.
Сампатрисрис

39

HTML / HTML + JavaScript, 53 байта

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

treatтекстовое содержимое документа в HTML.
Если JS включен, он заменит содержимое HTML на trick.


3
Интересное решение. Мне это нравится
BrainStone

1
Вы должны использовать document.write()вместо этого. -8 байт
darrylyeo

@darrylyeo document.writeне заменит вывод HTML, а добавит к нему.
Тит

1
Проверено в Chrome. Полностью работает. Включение и выключение JavaScript изменяет содержимое при обновлении.
Tatarize

@Tatarize: протестировано в Firefox 49, Opera 41, Safari 5.0, Chrome 54, Edge 38 для Windows, Firefox 5.3 и Safari 5.0 на iOS, Firefox 49 и Dolphin 11.5 на Android. Только Firefox на Windows заменяет; все остальные добавляются.
Тит

33

C / Java 7, 165 155 128 123 122 120 103 байта

//\
class a{public static void main(String[] s){System.out.print("treat"/*
main(){{puts("trick"/**/);}}

// \ делает следующую строку также комментарием в C, но является обычным однострочным комментарием в Java, поэтому вы можете заставить C игнорировать код, предназначенный для Java, и добавив / * во второй строке, вы можете сделать комментарий для Java, который проанализировано как код C.

Изменить: я немного улучшил его, реорганизовав строки и комментарии.

Edit2: я сделал еще несколько реорганизации и сократил его еще больше.

Edit3: я добавил исправления, предложенные BrainStone для удаления 5 байтов, спасибо :)

Edit4: одна новая строка оказалась ненужной, поэтому я удалил ее.

Edit5: я изменил printf на пут.

Edit6: я добавил исправление, предложенное Ray Hamel.


1
Вы можете сохранить 1 байт, изменив C на C ++ и заменив #include<stdio.h>на #include<cstdio>. Не много, но байт - это байт. И дополнительно удаление int infront mainбудет безопасным 4 байта. intподразумевается C и C ++
BrainStone

Спасибо, я изменил код в соответствии с вашими предложениями :)
I_LIKE_BREAD7

1
Приятно! Мне было трудно придумать что-то для Java, и я сам закончил с Java 7 + Whitespace . Кстати, вы можете играть в гольф еще один байт, удалив пробел в String[]s.
Кевин Круйссен

29

Джольф + Чейн, 12 байт

Поскольку Chaîne не может принять файл для загрузки с кодировкой, я предполагаю UTF-8. (Если бы я мог принять ISO-8859-7, это было бы 11 байтов, но это было бы несправедливо.)

trick«treat

В Chaîne «начинается комментарий, а остальное печатается дословно. У Джольфа «начинается строка. К счастью, trickне делает ничего вредного (в 10; range(input, parseInt(input))основном) и treatпечатается.

Попробуй Джольфа здесь!

Попробуйте Chaîne здесь!

Они оба работают в моем браузере (Firefox, последняя версия), но этого нельзя сказать о других браузерах.


2
Я полагаю, что инвентаризация многих малоизвестных языков имеет свои преимущества ...
Конор О'Брайен

1
Приятно видеть, что мы приближаемся к решениям в значительной степени только из самих слов. Интересно, может ли кто-нибудь повторно использовать tr.
BrainStone

1
@BrainStone Я лично сомневаюсь, что это trможно было бы повторно использовать в любом гольфе - это небольшая часть информации, которая потребует, по крайней мере , оператора для кодирования на языках игры в гольф, а затем - для конкретного языка. Вероятно, он будет либо одинаковой длины, либо дольше. Впрочем, это только моя гипотеза;)
Конор О'Брайен

Давайте разберемся. Но я должен согласиться. Количество байтов 10 или меньше было бы безумным!
BrainStone


27

#hell / Agony , 43 байта

Так много ><>везде, что это, первоапрельская проблема? Вот ответ с соответствующими тематическими языками.

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

#hellэто подмножество LUAкоторых, к счастью, принимает io.writeвыходные вызовы. Мы используем LUA«S-- комментарии так , что он выполняет только этот фрагмент.

Agonyявляется Brainfuckпроизводной, которая имеет свой код и рабочую память на одной ленте. Первая строка печатает только 5 символов (10 ячеек) от конца сегмента кода, где я закодирован treatкак Agonyкоманды. LUAОткрытие комментария --изменяет значение ячейки, которая не используется.


Я должен сказать, что ваши тематические Хэллоуин - лучшие imho. Очень креативно!
BrainStone

@BrainStone Спасибо, мне было весело делать их!
Аарон

27

Cubix / Hexagony , 31 байт

t;./e;_a]"kcirt">o?@;=v=./r;\;/

Обмани это! Лечи это онлайн!

Хэллоуин тематический ? Обратите внимание на ужасающие факты об этих языках и коде:

  1. Если и даже если вы ничего не делаете (просто ставите no-ops), вы никогда не сможете выйти из цикла, который определенно работает вечно ...
  2. И застрял в середине трехмерного и двумерного языка программирования (О, агония ...)
  3. Внутри измерений вы постепенно потеряете то, где вы находитесь ... где вы были ...
  4. И есть =v=улыбка на вас, которая действует в коде без правил

Давайте углубимся в тайну скрытого 31-байтового протокола связи измерений и террора ...

трюк

Когда код сам разворачивается или разворачивается ... То есть cubifiedмакет выглядит так:

      t ; .
      / e ;
      _ a ]
" k c i r t " > o ? @ ;
= v = . / r ; \ ; / . .
. . . . . . . . . . . .
      . . .
      . . .
      . . .

И основная часть это эта часть посередине:

" k c i r t " > o ? @ .
. . . . . . . \ ; / . .

Он помещается k,c,i,r,tв стек и oвыводит его ;в цикле, ограниченном отражателями и? который направляет вас в зависимости от значения в верхней части стека ...

обращаться

Внезапно код трансформируется из куба в шестиугольник. (Представь это)

   t ; . /
  e ; _ a ] 
 " k c i r t 
" > o ? @ ; = 
 v = . / r ;
  \ ; / . .
   . . . .

И основной частью является эта часть:

   t ; . /
  e ; _ a ] 
 . . . . . . 
. . . . @ ; = 
 . . . / r ;
  . . . . .
   . . . .

Он запускает, t;который печатает tи ударяется о зеркало и поворачивает его направление на NW, начиная с угла SE, и ударяется о другое зеркало. Это работает r;и обтекает e;_aи ]доводит ее до Instruction Pointer 1 , который начинается в угле NE указует SE и удары , /которые отражают горизонтально ;тогда t.

Затем он обтекает =, ;и @заканчивается беспорядок.

Итак ... Что _там происходит?

Почему это внутриt e a (первые 3 буквы в коде)?

Здесь приходит конец истории -

это ничего не делает .

Похоже ли это конец истории ужасов?


Мило очень мило! Сложно создать полиглот из двух 2D языков. Мне нравится ужасная история, которая сопровождает это;)
ETHproductions

Не уверен, что этот ответ или ответ ELF / .COM более впечатляющий. Отличная работа!
вал

24

SQL / Javascript, 54 байта

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

Тот же подход, что и в моем ответе на QB / JS : первая строка содержит оператор SQL, вторая строка содержит комментарий для SQL и NOP для JS. Затем мы определяем оператор SQL selectкак допустимую функцию JS.


3
Это очень умный способ объединения этих двух языков. Есть +1!
ETHproductions

22

/Brainf..k/, 143 + 3 = 146 байт

Этот ответ требует, чтобы -Aфлаг выводился в ASCII для Brain-Flak, и, к счастью, Brainfuck не заботится об этом флаге, поэтому он не влияет на вывод в Brainfuck.

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

Попробуйте онлайн!

Попробуйте онлайн!

Как это работает

Единственное совпадение синтаксиса Brain-Flak и Brainfuck - это символы <>[]. Для мозгового штурма это в основном означает, что программа должна обеспечить четное количество стековых ключей <>. А для Brainfuck это означает, что мы должны избегать бесконечных циклов, вызванных использованием []монады.

Код Brain-Flak выглядит следующим образом:

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

Помимо [<<...>>]бита в середине и <[<>]<>[<>]<>>в конце, этот код вполне подходит для всего курса Brain-Flak. Минус вокруг нуля ( [<...>]) предназначен для создания цикла для Brainfuck. Внутренний <...>используется для перемещения Brainfuck в пустую ячейку, прежде чем он встретит[][][][] что в противном случае могло бы бесконечно повторяться.

Код Brainfuck выглядит следующим образом:

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

Помимо вышеупомянутых битов, это также довольно стандартная программа, поэтому я избавлю вас от деталей.


Мне нравится этот: D
Конор О'Брайен

9
Есть еще МНОГО более двух языков , которые соответствуют регулярному выражению /brainf..k/, так что вы должны использовать один и тот же формат заголовка , как и все остальные.
mbomb007

13
@ mbomb007 Единственный другой язык, который я мог найти, который подходит этому регулярному выражению, - это мозговая вилка . Удобно, когда запускается в мозговом форке, это печатает «ТРИК», поэтому я оставлю регулярное выражение на некоторое время.
Sriotchilism О'Зайк

For brain-flak this mostly means the program has to ensure an even number of stack switchesВы уверены, что? Это не должно иметь значения, так <>как это NOP в
игре

@DJMcMayhem это должно заканчиваться в том же стеке, мы помещаем все, иначе это ничего не напечатает.
Sriotchilism О'Зайк

21

> <> / Рыбалка , 38 байт

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

Ради изготовления а ><>/ Fishingполиглота.

Это мой первый кусок Fishingкода после долгой игры с ><>.
Мое первое впечатление: как и в природе, рыбак обладает меньшими физическими возможностями, чем его молитва, но восполняет это своим инструментом!

Здесь код очень прост: он ><>будет выполнять только первую строку, где _находится вертикальное зеркало и не имеет никакого эффекта, поскольку рыба начинает плавать горизонтально. Он просто кладет trickв стек, а затем распечатывает перед остановкой.
Для Fishing, что _инструктирует идти вниз. Рыбак будет следовать за колодой, которая является второй строкой, ловя символы третьей линии. Это подтолкнетtreat ленту, а затем распечатывать ее, останавливаясь, когда она достигнет конца деки.

Если допускается ошибка, вы можете уменьшить размер до 35 байт с помощью следующего кода, который выдаст ошибку при запуске, как ><>только она trickбудет распечатана из стека:

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

Вы также должны проверить мои ответы на тематические языки, #hell / Agony and evil / ZOMBIE !


Оу, я хотел сделать полиглот рыбы / рыбалки :) Вы меня опередили. Хороший!
Эминья

+1 за « как в природе, у рыбака меньше физических способностей, чем у его молитвы, но он восполняет это с помощью своего инструмента! »
Кевин Круйссен

20

05AB1E / На самом деле 10 байтов

"trick"’®Â

объяснение

05AB1E

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

Попробуйте онлайн

Фактически

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

Попробуйте онлайн


Вы знаете, я могу четко прочитать trick, но как ’®Âлечить? ..
Кевин Круйссен

1
Теперь люди знают эту функцию. В следующий раз мы получим такие вопросы, как " hQq3k или bvM; p polyglot " ...
jimmy23013

3
@KevinCruijssen: «® переводится как« взять слово с индексом 3757 из словаря », что означает« лечить ».
Эминья

@Emigna Хорошо ... Значит, все ~ 1.1M английские слова доступны в 05AB1E?
Кевин Круйссен

1
@KevinCruijssen: Нет, всего 10 КБ (каждый представлен 2 символами). Вы можете найти весь список здесь .
Эминья

16

Haskell / Standard ML , 56 байт

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

Представление Haskell

Точки с запятой допускают несколько объявлений в одной строке и действуют как переносы строк, поэтому мы получаем

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

Программа на Haskell выполняется путем вызова mainфункции, поэтому выполняется последняя строка, putStr"trick"которая просто печатает trick.
Первые две строки интерпретируются как объявления функций, следующие за шаблоном <functionName> <argumentName1> ... <argumentNameN> = <functionBody>. Таким образом, в первой строке funобъявляется названная функция, которая принимает два аргумента с именем putStrи xи тело функции print"treat". Это допустимая функция Haskell с типом fun :: t -> t1 -> IO (), то есть она принимает аргумент произвольного типа, tа второй - некоторого типа, t1а затем возвращает IO-действие. Типы tи t1не имеют значения, так как аргументы не используются в теле функции. В результате получается тип IO-действия print"treat", который печатает "treat"в StdOut (обратите внимание ", вот почемуputStrвместоprint (используется в main). Однако, поскольку это только объявление функции, на самом деле ничего не печатается, как funне вызывается main.
То же самое происходит во второй строке val main=();, valобъявляется функция, которая принимает произвольный аргумент с именемmain и возвращает единицу , пустой кортеж (). Это тип val :: t -> ()( обозначается как значение, так и тип единицы измерения() ).

Попробуйте это на Ideone.


Стандартный вид ML

Стандартный ML - это в первую очередь функциональный язык с синтаксисом, связанным с, но не таким, как у Haskell. В частности, объявления функций имеют префикс с ключевым словом, funесли они принимают какие-либо аргументы, и ключевым словом, valесли они этого не делают. Также возможно иметь выражение на верхнем уровне (т.е. не внутри какого-либо объявления), которое выполняется при запуске программы. (При написании на Haskell 1+2вне объявления naked expression at top levelвыдается -error). Наконец, символ для проверки равенства =вместо ==Хаскелла. (Есть еще много различий, но это единственные, которые имеют значение для этой программы.)
Таким образом, SML видит две декларации

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

с последующим выражением

main=putStr"trick"

который затем оценивается. Чтобы определить, mainравны ли они putStr"trick", обе стороны должны быть оценены, и обе должны иметь одинаковый тип, так как SML (как и Haskell) статически типизирован. Давайте сначала посмотрим на правую сторону: putStrэто не библиотечная функция в SML, но мы объявили функцию с именем putStrв строке fun putStr x=print"treat";- она ​​принимает аргумент x( "trick"в нашем случае это строка ) и сразу же забывает его снова, так как не встречается в теле функции. Затем выполняется тело, print"treat"которое печатает treat(без включения "SML printотличается от Haskell print).
printимеет тип string -> unit, поэтому putStrимеет тип a -> unitи, следовательно, putStr"trick"имеет только типunit . Чтобы быть хорошо напечатанным,mainдолжен иметь тип unitтоже. Стоимость за единицу в SML такое же, как в Haskell (), поэтому мы объявляем, val main=();и все хорошо напечатано.

Попробуйте это на площадке кодирования.
Примечание: вывод в консоли

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

потому что в SML \ NJ значение и тип каждого оператора отображаются после каждого объявления. Таким образом , первые типы putStrи mainпоказаны, то выражения получают оценку в результате чего treatбудет напечатано, то значение выражения ( trueтак как оба сторон =являются ()) связанно с неявным переменным результатом , itкоторый затем также отображается.


1
Я всегда думал, что это fun ... ... =был синтаксический сахар для val rec ... = fn ... =>. Но опять же прошли десятилетия с тех пор, как я использовал ML.
Нил

@Neil Вы правы, funэто синтаксический сахар для анонимной функции, связанной с val( recнеобходим, только если функция является рекурсивной), и поэтому формулировка «должен быть с префиксом» выбрана неправильно, я отредактирую ответ. В целом использование funявляется наилучшей практикой, особенно в кодовом гольфе, поскольку оно намного короче.
Лайкони

15

Рубин / С, 64 62 51 48 байтов

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

Что видит Руби:

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

tapМетод принимает блок и выполняет его один раз. Это короткий идентификатор, который мы можем создать#define макрос в C. Он также позволяет нам помещать заключенный в фигурные скобки блок в общий код, хотя Ruby не допускает {}s в большинстве контекстов.

Единственные ложные значения в Ruby - это falseи nil. В частности, 0 является правдой. Таким образом, Ruby напечатает «трюк».

Что видит C (после препроцессора):

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

0 - ложь в C, поэтому C будет печатать «лечить».

2 байта сохранены благодаря Daniero.


1
Приятно. Вы можете использовать putsвместо того, printfчтобы сохранить два байта
Даниеро

Спасибо! Я так привык всегда использовать printfв C, я забыл, что он также имеет putsфункцию.
m-chrzan

Две идеи: вы не можете использовать что-то более короткое для tap? И почему ты не избавился от мест? p ? "trick":"treat"=>p?"trick":"treat"
BrainStone

tapна самом деле служит двум целям. Это короткий идентификатор для #defineпривязки, но он также позволяет мне помещать фигурные скобки непосредственно в код Ruby. {}блоки в Ruby , не работают , как они это делают в C и подобных языков, но tap делает принимать блок, и выполняет его один раз.
m-chrzan

Имена методов в Ruby могут заканчиваться знаком вопроса, поэтому после них необходим пробел p. ?<character>является литералом символа, поэтому после ?.
m-chrzan

15

QBasic / JavaScript, 51 44 байта

'';PRINT=a=>{alert("Treat")}
PRINT("Trick")

В QBasic он печатает вторую строку и не выполняет первую строку, потому что он считается комментарием (спасибо '). В JS он вызывает функцию PRINT, которая определяется в первой строке сразу после JS NOP '';.


1
Очень умный подход!
BrainStone

14

ShapeScript / Foo , 13 байт

'trick'"treat

Попробуйте онлайн! трюк | обращаться

Как это устроено

ShapeScript анализируется символ за символом. Когда EOF получает удар, не встречая закрывающей кавычки, в стек ничего не помещается. 'trick'действительно вставляет строку в кавычки, которая неявно печатается в STDOUT.

Foo не имеет команд, назначенных символам is 'trick', поэтому эта часть игнорируется. Однако он выводит что-либо между двойными кавычками непосредственно в STDOUT, даже если заключительная кавычка отсутствует.


14

Ruby / Perl, 21 байт

print"trick"%1||treat

Perl

Рассчитываю , "trick" % 1который 0 % 1таким образом ||посылает treatк printвместо этого, так как Perl принимает barewords.

Рубин

Форматирует строку "trick"с аргументом 1, что приводит к "trick"достоверности, поэтому ||не обрабатывается.


14

MATL / CJam , 17 байтов

'TRICK'%];"TREAT"

В MATL это выводы TRICK . В CJam это выводит TREAT .

объяснение

MATL

'TRICK'         Push this string
%];"TREAT"      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

Вам не хватает 3 символов там! (ЕСТЬ)
Разрушаемый Лимон

@DestructibleWatermelon Спасибо! Отредактировано
Luis Mendo

Теперь вам не хватает трех в объяснении MATL!
Разрушаемый лимон

@DestructibleWatermelon Aww. Еще раз спасибо :-D
Луис Мендо

12

Желе / пл , 12 байт

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

Эта программа отображается с использованием кодовой страницы Jelly .

treatµ
“¡ṾI»

Попробуйте онлайн!

Эта программа отображается с использованием кодовой страницы 437 .

treat
⌂■␀║I√

Попробуйте онлайн!

Обе программы были протестированы локально с одним и тем же 12-байтовым файлом, так что это правильный полиглот.

Как это устроено

В Jelly каждая строка определяет ссылку (функцию); последняя строка определяет основную ссылку , которая выполняется автоматически при запуске программы. Если код перед последним 7fбайтом (перевод строки в кодовой странице Jelly) не содержит ошибку синтаксического анализатора (которая немедленно прервет выполнение), они просто игнорируются. Последняя строка “¡ṾI»просто индексирует в словарь Jelly для извлечения трюка со словом , который неявно печатается в конце программы.

Я не очень разбираюсь в pl, но похоже, что интерпретатор выбирает только одну строку кода и игнорирует все, что идет после него. Как и в Perl, голые слова обрабатываются как строки, поэтому treatпечатает именно это.


12

Objective-C / C, 50 байтов

puts(){printf("trick");}main(){printf("treat\n");}

Objective-C получил конфеты и лакомства , а C - нет, и печатает трюк .

Как это устроено

Я не знаю много о Objective-C , но он делает то, что мы разумно ожидаем в этой ситуации. Повторное определение putsне влияет на выход , так как мы никогда не вызвать функцию, и mainпечатает лечения и перевода строки в STDOUT.

Можно ожидать, что C будет делать то же самое, но по крайней мере gcc 4.8, gcc 5.3 и clang 3.7 этого не делают.

Поскольку нам не нужен реальный printf (который принимает строку формата и дополнительные аргументы), а строка, которая должна быть напечатана, заканчивается переводом строки, вместо этого мы можем использовать put . put немного быстрее, чем printf (который должен анализировать свои аргументы перед печатью), поэтому, если мы не переопределим также функцию printf , компилятор оптимизирует и заменяет вызов printf вызовом put . Мало ли компилятор знает, что вызов putsс аргументом вместо этого "treat"выведет трюк !

Исключением является включение stdio.h , поскольку определение put требуется использовать тот же тип, что и в заголовочном файле ( puts(const char*)).

Наконец, следует отметить, что вызов printf в put передает строку без завершающего перевода строки. В противном случае компилятор также «оптимизирует» этот вызов, что приведет к ошибке сегментации.


10

Пакет / ш, 30 байт

:;echo Treat;exit
@echo Trick

Объяснение. Пакет видит первую строку как метку, которую игнорирует, и выполняет вторую строку, которая печатает Trick. @ Подавляет повторное отображение пакета по умолчанию команды на стандартный вывод. (Метки никогда не отображаются.) Тем временем sh видит следующее:

:
echo Treat
exit
@echo Trick

Первая строка ничего не делает (это псевдоним true), вторая строка печатает Treat, а третья строка выходит из сценария, поэтому трюк @echo никогда не достигается.


10

sed / Hexagony 32 байта

/$/ctrick
#$@$a</;r;e;/t;....\t;

СЕПГ

Попробуйте онлайн!

Первая строка печатается, trickесли в конце ввода есть пустая строка. (sed ничего не делает, если нет ввода, но в этом случае допускается пустая строка на stdin)

Пример выполнения:

$ echo | sed -f TrickOrTreat.sed
trick

Hexagony

Попробуйте онлайн!

Первый /перенаправляет указатель инструкций вверх и влево, поэтому он оборачивает нижний левый, пропуская текст, используемый для sed. Он повторно использует r из кода sed и запускает несколько других безрезультатно. Расширенный гекс выглядит так:

   / $ / c 
  t r i c k
 # $ @ $ a <
/ ; r ; e ; /
 t ; . . . . 
  \ t ; . .
   . . . .

Выход:

treat

Я видел посты Hexagony, в которых есть картинки с путями исполнения, их легко создать?
Райли


1
Ваш код Hexagony печатает ведущий нулевой байт. Не уверен, считается ли это пробелом для целей этой задачи.
Мартин Эндер

@MartinEnder Похоже, это разрешено. Спасибо за указание на это, я всегда по каким-то причинам скучаю по ним ...
Riley

Мне удалось это исправить, сохранив при этом несколько байтов (за счет печати верхнего регистра. A букв, хотя вы могли бы сделать это менее уродливым, изменив все буквы на заглавные): hexagony.tryitonline.net/…
Martin Ender

10

C # / Java

Это, вероятно, не подходит, так как не работает само по себе, но проблема напомнила мне причуду в том, как C # и Java по-разному обрабатывают сравнение строк, с чем можно повеселиться при запутывании кода.

Следующая функция действительна в C # и Java, но вернет другое значение ...

public static String TrickOrTreat(){
    String m = "Oct";
    String d = "31";
    return m + d == "Oct31" ? "Trick" : "Treat";
}

Интересная причуда.
BrainStone

10

Brain-Flak / Brain-Flueue, 265 253 219 165 139 115 113 101 байт

Включает +1 для -A

Спасибо Wheat Wizard за то, что мы со мной играем пару байт на код друг друга.

((((()()()))([]((({}{}))({}([((({}()())))]([](({}{}){}){}{})))[]))[])[()()])({}()()){}({})({}[][]){}

Brain-Flak: попробуйте онлайн!
Brain-Flueue: попробуйте онлайн!

Объяснение:
В первом разделе перечислены значения, которые видит Brain-Flak.
Когда он переключается на Brain-Flueue, я начинаю перечислять значения так, как Brain-Flueue их видит.

# Brain-Flak
(
 (((()()()))             # Push 3 twice
  ([]                    # Use the height to evaluate to 2
   (
    (({}{}))             # Use both 3s to push 6 twice
    ({}                  # Use one of those 6s to evaluate to 6
     ([((({}()())))]     # Use the other 6 to push 8 three times and evaluate to -8
      ([](({}{}){}){}{}) # Use all three 8s to push 75
     )                   # The -8 makes this push 67
    )                    # The 6 makes this push 73
   [])                   # Use the height and the 6 to push 82
  )                      # Use the 2 to push 84

# Brain-flueue
 [])     # Use the height and 3 to push 84
[()()])  # Push 82
({}()()) # 67 is at the front of the queue, so use that to push 69
{}       # Pop one from the queue
({})     # 65 is next on the queue so move to the end
({}[][]) # 74 is next, so use that and the height to push 84
{}       # Pop that last value from TRICK


9

PowerShell / Foo, 14 байт

'trick'#"treat

'trick'В PowerShell создает строку и оставляет его на трубопроводе. #Начинает комментарий, поэтому программа завершается , и неявные Write-Outputотпечатки trick.

В Foo, (Попробуйте онлайн!) , 'trick'Игнорируется, #программа останавливается на 0несколько секунд (так как в указателе массива ничего нет), затем "treatзапускает строку. Поскольку EOF достигнут, есть неявное "закрытие строки, и это выводится на стандартный вывод.


Также работает в J / Foo.
Конор О'Брайен,

@ ConorO'Brien Это то же самое объяснение? Я никогда не использовал J, и я не знаком с этим.
AdmBorkBork

Нет, это не работает в J. #это функция копирования, и она принимает только неотрицательные сложные левые аргументы, а не строки. Символ комментарияNB.
Адам

@ Adám ты прав. Забыл#
Конор О'Брайен

9

PHP / Perl, 28 байт

print defined&x?trick:treat;

defined&x
дает что-то правдивое в PHP (не знаю почему, но это так).
В Perl он проверяет, определена ли функция x, а что нет.
-> trickв PHP, treatв Perl.


@jmathews Пытались ли вы поместить управляющий символ Backspace в вашу версию Windows? Как насчет CLS?
Тит

`является истинным значением определенного & x или d & x, спросите меня, что вы получили
Йорг Хюльсерманн
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.