С приближением Хэллоуина я подумала, что могу принять участие в небольшом соревновании по коду!
Задача довольно проста. Вы должны написать программу, которая выводит либо 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
Ответы:
2sable / pl , 8 байт
Обе программы были протестированы локально с одним и тем же 8-байтовым файлом, так что это правильный полиглот.
2sable: трюк
Это программа в кодовой странице 1252 .
Попробуйте онлайн!
пл: лечить
Это программа в кодовой странице 437 .
Попробуйте онлайн!
Как это устроено
2sable: трюк
пл: лечить
источник
Пакет Python / Windows, 25 байт
Все после # интерпретируется Python как комментарий, а || является ИЛИ в пакете, говоря, что, поскольку предыдущая команда не удалась, выполните эту.
Мне также нравится использование ИЛИ, так как оно почти гласит: «Кошелек или жизнь» :)
источник
2>nul
.Пробел / Звездный, 135 байт
Вот ясное ночное небо на Хэллоуин!
Обратите внимание, что пробелы в пустых строках могут не сохраниться, если вы копируете из приведенного выше кода
Пробел выводит «ТРИК». Попробуйте онлайн!
Звездные выходы "TREAT". Попробуйте онлайн!
объяснение
звездный
Starry игнорирует все вкладки и новые строки, поэтому код, который он читает, выглядит следующим образом
Таким образом, отправка значений является очень дорогой по сравнению со стеком и арифметическими операциями в Starry. Код начинается с нажатия и дублирования 4, и он выполняет над ним ряд операций, а затем, нажимая 2 и 1, производит все необходимые значения ASCII.
Аннотированный код
Пробелы
Как следует из названия, пробельные символы анализируются только тремя пробельными символами - пробел, табуляция и символ новой строки. В отличие от Starry, то Пробелы просто выталкивает значения ASCII из
T
,R
,I
,C
иK
и печатает их.Аннотированный код
Переплетение толчков и отпечатков было выбрано исключительно на основе эстетических соображений, поскольку оно не влияет на количество байтов.
источник
Linux ELF x86 / DOS .COM файл, 73 байта
NASM источник:
При этом используется тот факт, что заголовок ELF начинается с 7F 45, что интерпретируется как код x86 и является переходом.
Соответствующие части для DOS .COM:
источник
зло / зомби , 109 байт
Еще один жуткий ответ!
ZOMBIE
Код определяетvampire
имениxf
которого только задачаf
активируется при создании экземпляра и выход будетtrick
один раз перед тем , как деактивируетсяstumble
. Другойsay
вызов - это мертвый код (как уместно!) ДляZOMBIE
, Но содержит большую частьevil
кода.Для
evil
, тоxf
имя вызова , чтобы перейти к следующемуj
, который предшествуетzuueeueeawuuwzaeeaeeaeawuuuuwzuueeueeaw
зомби стонать , что поделки и выходtreat
. Следующий код либо выполняется (строчные буквы), либо игнорируется, но, поскольку нетw
выходных данных, выводить не нужно.источник
Python / Perl, 28 байт
объяснение
Так
[]
как ArrayRef в Perl, это правда, но это пустой массив в Python, поэтому ложно.источник
print({}and"trick"or"treat")
в Python / Lua.{}
это HashRef!print ([]and"trick"or"treat")
print({}and"trick"or"treat")
!PHP / JavaScript,
3230 байтОтображается
trick
в PHP иtreat
в JS.Неизвестный
NaN
константа неявно преобразуется в строку PHP, что делает ее правдивой. Это ложно в JS.Альтернативный метод, 38 байт
Тернарный оператор является правоассоциативным в JS:
И левый-ассоциативный в PHP:
источник
HTML / HTML + JavaScript, 53 байта
treat
текстовое содержимое документа в HTML.Если JS включен, он заменит содержимое HTML на
trick
.источник
document.write()
вместо этого. -8 байтdocument.write
не заменит вывод HTML, а добавит к нему.C / Java 7,
165155128123122120103 байта// \ делает следующую строку также комментарием в C, но является обычным однострочным комментарием в Java, поэтому вы можете заставить C игнорировать код, предназначенный для Java, и добавив / * во второй строке, вы можете сделать комментарий для Java, который проанализировано как код C.
Изменить: я немного улучшил его, реорганизовав строки и комментарии.
Edit2: я сделал еще несколько реорганизации и сократил его еще больше.
Edit3: я добавил исправления, предложенные BrainStone для удаления 5 байтов, спасибо :)
Edit4: одна новая строка оказалась ненужной, поэтому я удалил ее.
Edit5: я изменил printf на пут.
Edit6: я добавил исправление, предложенное Ray Hamel.
источник
#include<stdio.h>
на#include<cstdio>
. Не много, но байт - это байт. И дополнительно удалениеint
infrontmain
будет безопасным 4 байта.int
подразумевается C и C ++String[]s
.Джольф + Чейн, 12 байт
Поскольку Chaîne не может принять файл для загрузки с кодировкой, я предполагаю UTF-8. (Если бы я мог принять ISO-8859-7, это было бы 11 байтов, но это было бы несправедливо.)
В Chaîne
«
начинается комментарий, а остальное печатается дословно. У Джольфа«
начинается строка. К счастью,trick
не делает ничего вредного (в10; range(input, parseInt(input))
основном) иtreat
печатается.Попробуй Джольфа здесь!
Попробуйте Chaîne здесь!
Они оба работают в моем браузере (Firefox, последняя версия), но этого нельзя сказать о других браузерах.
источник
tr
.tr
можно было бы повторно использовать в любом гольфе - это небольшая часть информации, которая потребует, по крайней мере , оператора для кодирования на языках игры в гольф, а затем - для конкретного языка. Вероятно, он будет либо одинаковой длины, либо дольше. Впрочем, это только моя гипотеза;)#hell / Agony , 43 байта
Так много
><>
везде, что это, первоапрельская проблема? Вот ответ с соответствующими тематическими языками.#hell
это подмножествоLUA
которых, к счастью, принимаетio.write
выходные вызовы. Мы используемLUA
«S--
комментарии так , что он выполняет только этот фрагмент.Agony
являетсяBrainfuck
производной, которая имеет свой код и рабочую память на одной ленте. Первая строка печатает только 5 символов (10 ячеек) от конца сегмента кода, где я закодированtreat
какAgony
команды.LUA
Открытие комментария--
изменяет значение ячейки, которая не используется.источник
Cubix / Hexagony , 31 байт
Обмани это! Лечи это онлайн!
Хэллоуин тематический ? Обратите внимание на ужасающие факты об этих языках и коде:
=v=
улыбка на вас, которая действует в коде без правилДавайте углубимся в тайну скрытого 31-байтового протокола связи измерений и террора ...
трюк
Когда код сам разворачивается или разворачивается ... То есть
cubified
макет выглядит так:И основная часть это эта часть посередине:
Он помещается
k,c,i,r,t
в стек иo
выводит его;
в цикле, ограниченном отражателями и?
который направляет вас в зависимости от значения в верхней части стека ...обращаться
Внезапно код трансформируется из куба в шестиугольник. (Представь это)
И основной частью является эта часть:
Он запускает,
t;
который печатаетt
и ударяется о зеркало и поворачивает его направление на NW, начиная с угла SE, и ударяется о другое зеркало. Это работаетr;
и обтекаетe;_a
и]
доводит ее до Instruction Pointer 1 , который начинается в угле NE указует SE и удары ,/
которые отражают горизонтально;
тогдаt
.Затем он обтекает
=
,;
и@
заканчивается беспорядок.Итак ... Что
_
там происходит?Почему это внутри
t
e
a
(первые 3 буквы в коде)?Здесь приходит конец истории -
это ничего не делает .
Похоже ли это конец истории ужасов?источник
SQL / Javascript, 54 байта
Тот же подход, что и в моем ответе на QB / JS : первая строка содержит оператор SQL, вторая строка содержит комментарий для SQL и NOP для JS. Затем мы определяем оператор SQL
select
как допустимую функцию JS.источник
/Brainf..k/, 143 + 3 = 146 байт
Этот ответ требует, чтобы
-A
флаг выводился в ASCII для Brain-Flak, и, к счастью, Brainfuck не заботится об этом флаге, поэтому он не влияет на вывод в Brainfuck.Попробуйте онлайн!
Попробуйте онлайн!
Как это работает
Единственное совпадение синтаксиса Brain-Flak и Brainfuck - это символы
<>[]
. Для мозгового штурма это в основном означает, что программа должна обеспечить четное количество стековых ключей<>
. А для Brainfuck это означает, что мы должны избегать бесконечных циклов, вызванных использованием[]
монады.Код Brain-Flak выглядит следующим образом:
Помимо
[<<...>>]
бита в середине и<[<>]<>[<>]<>>
в конце, этот код вполне подходит для всего курса Brain-Flak. Минус вокруг нуля ([<...>]
) предназначен для создания цикла для Brainfuck. Внутренний<...>
используется для перемещения Brainfuck в пустую ячейку, прежде чем он встретит[][][][]
что в противном случае могло бы бесконечно повторяться.Код Brainfuck выглядит следующим образом:
Помимо вышеупомянутых битов, это также довольно стандартная программа, поэтому я избавлю вас от деталей.
источник
/brainf..k/
, так что вы должны использовать один и тот же формат заголовка , как и все остальные.For brain-flak this mostly means the program has to ensure an even number of stack switches
Вы уверены, что? Это не должно иметь значения, так<>
как это NOP в> <> / Рыбалка , 38 байт
Ради изготовления а
><>
/Fishing
полиглота.Это мой первый кусок
Fishing
кода после долгой игры с><>
.Мое первое впечатление: как и в природе, рыбак обладает меньшими физическими возможностями, чем его молитва, но восполняет это своим инструментом!
Здесь код очень прост: он
><>
будет выполнять только первую строку, где_
находится вертикальное зеркало и не имеет никакого эффекта, поскольку рыба начинает плавать горизонтально. Он просто кладетtrick
в стек, а затем распечатывает перед остановкой.Для
Fishing
, что_
инструктирует идти вниз. Рыбак будет следовать за колодой, которая является второй строкой, ловя символы третьей линии. Это подтолкнетtreat
ленту, а затем распечатывать ее, останавливаясь, когда она достигнет конца деки.Если допускается ошибка, вы можете уменьшить размер до 35 байт с помощью следующего кода, который выдаст ошибку при запуске, как
><>
только онаtrick
будет распечатана из стека:Вы также должны проверить мои ответы на тематические языки, #hell / Agony and evil / ZOMBIE !
источник
05AB1E / На самом деле 10 байтов
объяснение
05AB1E
Попробуйте онлайн
Фактически
Попробуйте онлайн
источник
trick
, но как’®Â
лечить? ..Haskell / Standard ML , 56 байт
Представление Haskell
Точки с запятой допускают несколько объявлений в одной строке и действуют как переносы строк, поэтому мы получаем
Программа на 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
если они этого не делают. Также возможно иметь выражение на верхнем уровне (т.е. не внутри какого-либо объявления), которое выполняется при запуске программы. (При написании на Haskell1+2
вне объявленияnaked expression at top level
выдается -error). Наконец, символ для проверки равенства=
вместо==
Хаскелла. (Есть еще много различий, но это единственные, которые имеют значение для этой программы.)Таким образом, SML видит две декларации
с последующим выражением
который затем оценивается. Чтобы определить,
main
равны ли ониputStr"trick"
, обе стороны должны быть оценены, и обе должны иметь одинаковый тип, так как SML (как и Haskell) статически типизирован. Давайте сначала посмотрим на правую сторону:putStr
это не библиотечная функция в SML, но мы объявили функцию с именемputStr
в строкеfun putStr x=print"treat";
- она принимает аргументx
("trick"
в нашем случае это строка ) и сразу же забывает его снова, так как не встречается в теле функции. Затем выполняется тело,print"treat"
которое печатаетtreat
(без включения"
SMLprint
отличается от Haskellprint
).print
имеет типstring -> unit
, поэтомуputStr
имеет типa -> unit
и, следовательно,putStr"trick"
имеет только типunit
. Чтобы быть хорошо напечатанным,main
должен иметь типunit
тоже. Стоимость за единицу в SML такое же, как в Haskell()
, поэтому мы объявляем,val main=();
и все хорошо напечатано.Попробуйте это на площадке кодирования.
Примечание: вывод в консоли
потому что в SML \ NJ значение и тип каждого оператора отображаются после каждого объявления. Таким образом , первые типы
putStr
иmain
показаны, то выражения получают оценку в результате чегоtreat
будет напечатано, то значение выражения (true
так как оба сторон=
являются()
) связанно с неявным переменным результатом ,it
который затем также отображается.источник
fun ... ... =
был синтаксический сахар дляval rec ... = fn ... =>
. Но опять же прошли десятилетия с тех пор, как я использовал ML.fun
это синтаксический сахар для анонимной функции, связанной сval
(rec
необходим, только если функция является рекурсивной), и поэтому формулировка «должен быть с префиксом» выбрана неправильно, я отредактирую ответ. В целом использованиеfun
является наилучшей практикой, особенно в кодовом гольфе, поскольку оно намного короче.Рубин / С,
64625148 байтовЧто видит Руби:
tap
Метод принимает блок и выполняет его один раз. Это короткий идентификатор, который мы можем создать#define
макрос в C. Он также позволяет нам помещать заключенный в фигурные скобки блок в общий код, хотя Ruby не допускает{}
s в большинстве контекстов.Единственные ложные значения в Ruby - это
false
иnil
. В частности, 0 является правдой. Таким образом, Ruby напечатает «трюк».Что видит C (после препроцессора):
0 - ложь в C, поэтому C будет печатать «лечить».
2 байта сохранены благодаря Daniero.
источник
puts
вместо того,printf
чтобы сохранить два байтаprintf
в C, я забыл, что он также имеетputs
функцию.tap
? И почему ты не избавился от мест?p ? "trick":"treat"
=>p?"trick":"treat"
tap
на самом деле служит двум целям. Это короткий идентификатор для#define
привязки, но он также позволяет мне помещать фигурные скобки непосредственно в код Ruby.{}
блоки в Ruby , не работают , как они это делают в C и подобных языков, ноtap
делает принимать блок, и выполняет его один раз.p
.?<character>
является литералом символа, поэтому после?
.QBasic / JavaScript,
5144 байтаВ QBasic он печатает вторую строку и не выполняет первую строку, потому что он считается комментарием (спасибо '). В JS он вызывает функцию PRINT, которая определяется в первой строке сразу после JS NOP
'';
.источник
ShapeScript / Foo , 13 байт
Попробуйте онлайн! трюк | обращаться
Как это устроено
ShapeScript анализируется символ за символом. Когда EOF получает удар, не встречая закрывающей кавычки, в стек ничего не помещается.
'trick'
действительно вставляет строку в кавычки, которая неявно печатается в STDOUT.Foo не имеет команд, назначенных символам is
'trick'
, поэтому эта часть игнорируется. Однако он выводит что-либо между двойными кавычками непосредственно в STDOUT, даже если заключительная кавычка отсутствует.источник
Ruby / Perl, 21 байт
Perl
Рассчитываю ,
"trick" % 1
который0 % 1
таким образом||
посылаетtreat
кprint
вместо этого, так как Perl принимает barewords.Рубин
Форматирует строку
"trick"
с аргументом1
, что приводит к"trick"
достоверности, поэтому||
не обрабатывается.источник
MATL / CJam , 17 байтов
В MATL это выводы
TRICK
. В CJam это выводитTREAT
.объяснение
MATL
CJam
источник
Желе / пл , 12 байт
Эта программа отображается с использованием кодовой страницы Jelly .
Попробуйте онлайн!
Эта программа отображается с использованием кодовой страницы 437 .
Попробуйте онлайн!
Обе программы были протестированы локально с одним и тем же 12-байтовым файлом, так что это правильный полиглот.
Как это устроено
В Jelly каждая строка определяет ссылку (функцию); последняя строка определяет основную ссылку , которая выполняется автоматически при запуске программы. Если код перед последним
7f
байтом (перевод строки в кодовой странице Jelly) не содержит ошибку синтаксического анализатора (которая немедленно прервет выполнение), они просто игнорируются. Последняя строка“¡ṾI»
просто индексирует в словарь Jelly для извлечения трюка со словом , который неявно печатается в конце программы.Я не очень разбираюсь в pl, но похоже, что интерпретатор выбирает только одну строку кода и игнорирует все, что идет после него. Как и в Perl, голые слова обрабатываются как строки, поэтому
treat
печатает именно это.источник
Objective-C / C, 50 байтов
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 передает строку без завершающего перевода строки. В противном случае компилятор также «оптимизирует» этот вызов, что приведет к ошибке сегментации.
источник
Пакет / ш, 30 байт
Объяснение. Пакет видит первую строку как метку, которую игнорирует, и выполняет вторую строку, которая печатает Trick. @ Подавляет повторное отображение пакета по умолчанию команды на стандартный вывод. (Метки никогда не отображаются.) Тем временем sh видит следующее:
Первая строка ничего не делает (это псевдоним
true
), вторая строка печатает Treat, а третья строка выходит из сценария, поэтому трюк @echo никогда не достигается.источник
sed / Hexagony 32 байта
СЕПГ
Попробуйте онлайн!
Первая строка печатается,
trick
если в конце ввода есть пустая строка. (sed ничего не делает, если нет ввода, но в этом случае допускается пустая строка на stdin)Пример выполнения:
Hexagony
Попробуйте онлайн!
Первый
/
перенаправляет указатель инструкций вверх и влево, поэтому он оборачивает нижний левый, пропуская текст, используемый для sed. Он повторно использует r из кода sed и запускает несколько других безрезультатно. Расширенный гекс выглядит так:Выход:
источник
A
букв, хотя вы могли бы сделать это менее уродливым, изменив все буквы на заглавные): hexagony.tryitonline.net/…C # / Java
Это, вероятно, не подходит, так как не работает само по себе, но проблема напомнила мне причуду в том, как C # и Java по-разному обрабатывают сравнение строк, с чем можно повеселиться при запутывании кода.
Следующая функция действительна в C # и Java, но вернет другое значение ...
источник
Brain-Flak / Brain-Flueue,
265 253 219 165 139 115 113101 байтВключает +1 для
-A
Спасибо Wheat Wizard за то, что мы со мной играем пару байт на код друг друга.
Brain-Flak: попробуйте онлайн!
Brain-Flueue: попробуйте онлайн!
Объяснение:
В первом разделе перечислены значения, которые видит Brain-Flak.
Когда он переключается на Brain-Flueue, я начинаю перечислять значения так, как Brain-Flueue их видит.
источник
PowerShell / Foo, 14 байт
'trick'
В PowerShell создает строку и оставляет его на трубопроводе.#
Начинает комментарий, поэтому программа завершается , и неявныеWrite-Output
отпечаткиtrick
.В Foo, (Попробуйте онлайн!) ,
'trick'
Игнорируется,#
программа останавливается на0
несколько секунд (так как в указателе массива ничего нет), затем"treat
запускает строку. Поскольку EOF достигнут, есть неявное"
закрытие строки, и это выводится на стандартный вывод.источник
#
это функция копирования, и она принимает только неотрицательные сложные левые аргументы, а не строки. Символ комментарияNB.
#
PHP / Perl, 28 байт
defined&x
дает что-то правдивое в PHP (не знаю почему, но это так).
В Perl он проверяет, определена ли функция
x
, а что нет.->
trick
в PHP,treat
в Perl.источник
CLS
?`
является истинным значением определенного & x или d & x, спросите меня, что вы получили