Quine / Ошибка Quine Polyglot

14

Ваша задача проста: написать программу, которая может быть запущена на двух языках. Это должен быть обычный quine (печатает свой собственный исходный код) на языке 1, и должен быть quine ошибок (генерирующий сообщение об ошибке, идентичное его собственному исходному коду) на языке 2.

Это , поэтому выигрывает самое короткое действительное представление (в байтах).

Правила:

Esolanging Fruit
источник
Связанные и связанные .
Esolanging Fruit
Разрешены ли два разных диалекта бейсика?
MD XF
@MDXF Если они ведут себя точно так же, за исключением того, что вместо них выводится STDERR, то нет. Иначе да.
Esolanging Fruit
Так что мой ответ действителен, тогда.
MD XF
@MDXF Это действительно.
Esolanging Fruit

Ответы:

2

Befunge-93 (FBBI) / C (tcc) , 93 + 62 = 155 байт

^"
>#001p#"<>:#,_@#1-8*3:-1*57+55-1*79*57:-1:*77**278\-1:*57$p:1: error: declaration expected

Попробуйте онлайн !: Befunge-93 , C

Спасибо randomdude999 за то, что для работы с именем файла требуются соответствующие кавычки.

Должен быть сохранен под именем файла ^"\n>#001p#"<>:#,_@#1-8*3:-1*57+55-1*79*57:-1:*77**278\-1:*57$p, где \nнаходится новая строка. Из-за этого TIO для C работает не совсем так, как предполагалось. Проверено на работу на Lubuntu.

Объяснение (С):

Программа не может скомпилироваться, и tcc с удовольствием выдает имя файла как часть сообщения об ошибке. Есть несколько ошибок компиляции, которые вы можете получить, основываясь на начале кода. ^в начале дает нам declaration expected, который является коротким и не содержит никаких проблемных символов, таких как ". С другой стороны, разработчики gcc и clang очень пессимистичны и решили выводить сразу несколько ошибок, что не очень хорошо, поэтому мы не используем их компиляторы.

Пояснение (Befunge-93):

Befunge удобен для quines тем, что его код также можно использовать в качестве символьных данных благодаря "команде, которая переключает строковый режим. Вначале мы выполняем некоторые бесполезные операции со стеком, а затем выдаем p(команда put), которая помещает символ NUL в (0, 1). Затем мы отражаем указатель инструкции слева и начинаем читать все как строку. Это должно быть сделано слева, из-за природы LIFO стека. После оборачивания и достижения "символа снова, строка заканчивается. Обратите внимание, что символ NUL заменил$символ, создавая разделитель в середине строки. Затем мы помещаем 3 числа в стек и перепрыгиваем через NUL (потому что он, к сожалению, вешает интерпретатор при запуске в качестве инструкции). Статическая часть сообщения об ошибке должна быть выполнена здесь. Большинство ее символов - no-ops, но pкоманда использует три аргумента (следовательно, поэтому мы выдвинули 3 числа, в противном случае часть строки была бы здесь съедена), а символы :& 1помещают в стек всего 4 значения, которым мы противодействуем с инструкциями a pи $(pop и discard). Затем выполняется некоторая арифметика, чтобы подтолкнуть ASCII-коды, ^"\n>#001p#"и, наконец, цикл выводит все значения в стеке в виде символов, пока не найдет символ NUL и не завершится.

минус семь
источник
Вам нужно найти ОС, которая поддерживает такое имя файла, и перечислить его. Я знаю, что Windows не поддерживает это.
mbomb007
@ mbomb007 Предположительно, Linux обычно принимает любой печатный символ в имени файла, кроме /. Я не могу проверить это прямо сейчас.
минус семь
1
Какую версию tcc вы использовали? Я использую 0.9.27-3 прямо из репозитория Arch, и я получаю ошибку <define>:1: error: missing terminating " character.
randomdude999
1
Хорошо, я нашел точную версию tcc, используемую в TIO, и получил такое же сообщение об ошибке, но только если кавычки имени файла совпадают. Наличие бесподобных кавычек кажется совершенно необходимым для этого ответа. Вот кое-что, что может вам помочь: Linux также позволяет переводить строки в имена файлов. Это вывод tcc при добавлении новой строки и кавычки в конце имени файла: (длинная ссылка в gist) . Это означает, что вам нужно найти способ напечатать новую строку и прочее во второй строке.
randomdude999
@ randomdude999 Спасибо. Я обновил решение, чтобы учесть это. Довольно интересно, что непревзойденная цитата вызывает такую ​​проблему ...
минус семь
0

Applesoft BASIC / Commodore LCD BASIC , 13 байтов

?SYNTAX ERROR

В эмуляторе Apple] [нажмите RESETклавишу, чтобы войти в основной режим.
В ЖК-эмуляторе Commodore нажмите, RightArrowEnterчтобы войти в приложение BASIC.
В обоих случаях не вводите ?SYNTAX ERRORвсе заглавные буквы, потому что они автоматически пишутся с заглавной буквы.

MD XF
источник
2
неконкурентный статус зарезервирован для заявок на языках, которые были сделаны после конкурса. Если он недействителен по правилам, удалите его. Сначала жду подтверждения OP, потому что я думаю, что это должно быть действительным (при условии, что это работает).
HyperNeutrino
@HyperNeutrino Спасибо, отредактировано.
MD XF
1
Тогда придется заподозрить и этого. Этот вопрос более жестокий, чем кажется ...
Орджан Йохансен
1
@ ØrjanJohansen Ну, я не уверен в этом. Технически, на ЖК-дисплее Commore не было стандартного потока байтов ошибок, так что это действительно ошибка?
MD XF
1
@ ØrjanJohansen это ? Я предполагаю, что это может означать, что невозможно сказать, является ли это действительным или нет. Мы могли бы ждать подтверждения от ОП?
MD XF