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


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.