Этот код ошибки на * это * и * это *, действительно ли они написаны в них?


25

Вдохновленный я не тот язык, который вы ищете!

Вызов

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

This program errors out in <the current language> :P

а затем генерирует различные виды ошибок в каждом из двух языков.

правила

Некоторые правила взяты из оригинальной задачи.

  • В выводе должны точно следовать названия языков:
    • Имя, указанное в TIO , возможно, за исключением номера версии и / или имени реализации (например, если вы используете JavaScript (Node.js)один из ваших языков, вы можете использовать его JavaScriptдля названия языка, но не JSили Javascript.)
    • Полное имя на официальном сайте (или GitHub Repo), если ваш язык не доступен на TIO.
  • Ни одна из программ не должна принимать никаких данных от пользователя.
  • Вы можете использовать комментарии на любом языке.
  • Две разные версии одного и того же языка считаются разными языками.
    • Если это сделано, программа должна вывести основной номер версии, а если она запущена на двух разных второстепенных версиях, должна также сообщить младшую версию.
    • Вы не должны использовать встроенные функции версии (это включает переменные, которые уже были оценены во время выполнения).
  • Два разных флага командной строки на одном и том же языке также считаются разными языками в соответствии с этим мета-консенсусом , если флаги не включают фрагменты кода (например, -Dblahblah...в C).
    • Если это сделано, программа также должна вывести используемый флаг.
  • Две ошибки считаются разными, если только обе ошибки не генерируются одной и той же семантикой (например, «деление на ноль», «ошибка сегментации» или «индекс вне диапазона»).
    • Если среда выполнения языка не завершается после ошибки, но каким-то образом сообщает об ошибке пользователю, это допустимая ошибка.
    • Если язык не различает сообщения об ошибках, но имеет известный список причин, которые вызывают ошибку, вы должны указать причину, а не сообщение об ошибке.
      Примером может служить ><>только одно сообщение об ошибке something smells fishy..., но на вики-странице esolangs есть список причин ошибок.
  • Синтаксическая ошибка не допускается, если она не генерируется вызовом eval()или подобным.
  • Бросать что-то вручную (через throw(JS), raise(Python), die(Perl) или подобное) разрешено, но все они рассматриваются как один вид ошибки.
  • Ошибка недопустимой команды в 2D или golflangs также допускается (и рассматривается как один из видов ошибок).

Примеры

Python и Ruby

  • Python: This program errors out in Python :Pв стандартный вывод, затем неопределенный идентификатор
  • Ruby: This program errors out in Ruby :Pв стандартный вывод, затем индексировать за пределы

С89 и С99

  • C89: This program errors out in C 89 :Pв стандартный вывод, затем деление на ноль
  • C99: This program errors out in C 99 :Pв стандартный вывод, затем ошибка сегментации

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

Python 2.7.9 и Python 2.7.10

  • Python 2.7.9: This program errors out in Python 2.7.9 :Pв стандартный вывод, затем синтаксическая ошибка на eval
  • Python 2.7.10: This program errors out in Python 2.7.10 :Pв стандартный вывод, затем ключевая ошибка в dict

Perl и Perl -n

  • Perl: This program errors out in Perl :Pв стандартный вывод, затем неверный формат времени
  • Perl -n: This program errors out in Perl -n :Pв стандартный вывод, затем попробуйте открыть файл, который не существует

Выигрышное условие

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



Ошибка должна остановить программу?
Джо Кинг

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

Я думаю, что уже знаю ответ, но на всякий случай: может ли предложение This program errors out in ...содержать смешанные табуляции / пробелы вместо просто пробелов?
Кевин Круйссен

Связано (напечатать два разных текста на двух разных языках).
Кевин Круйссен

Ответы:


33

Python 2 / Python 3 , 60 байт

print("This program errors out in Python %d :P"%(3/2*2))*1;a
  • Python 2 получил NameError: name 'a' is not defined
  • Python 3 получил unsupported operand type(s) for *: 'NoneType' and 'int'

Python 2:

  • /целочисленное деление, 3/2 получил 1; int (3/2 * 2) равно 2.
  • print - это оператор, поэтому первый оператор, читаемый как print((...)*1), здесь *1означает повторение строки один раз.
  • Второй оператор ссылался на несуществующую переменную, которая вызвала ошибку.
  • Попробуйте онлайн!

Python 3:

  • '/' - деление с плавающей запятой, 3/2 получило 1,5; int (3/2 * 2) равно 3.
  • print - это функция, поэтому первое утверждение читается как (print(...))*1 .
  • функция printвозвращает None; Умножение не работает наNone x int , поэтому он сообщает «неподдерживаемый операнд».
  • Попробуйте онлайн!

15

С и С ++, 114 101 байт

-13 байт благодаря l4m2 !

#include<stdio.h>
main(){auto d=.5;printf("This program errors out in C%s :P",d?"++":"");2[&d]+=1/d;}

Ошибка сегментации в C ++, исключение с плавающей точкой в ​​C.

autoпо умолчанию intв C так (int).5становится0 , поэтому попытка деления на него в основном делится на ноль.

В C ++ 1/dесть 2, добавив его по адресуd и попытка изменить значение этого адреса приводит к возникновению ошибки.

Попробуйте это в C ++!
Попробуйте это в C!


1
Не уверен , если это поможет, но если вы можете отобразить C / C ++ для 2 и 0, можно использовать "++"+n, где nэто 0на C ++ и 2для C
Конор О'Брайен

2
d?"++":""9 символов, "++"+4*d8 символов Но получает C / C ++ задом наперед. Вздох.
Якк

1
int main(){auto d=.5;printf("This program errors out in C%s :P",d?"++":"");2[&d]+=1/d;}(105), хотя я не знаю, почему
l4m2

1
Также intможет быть опущено
l4m2

Предлагаю L"⬫"+!dвместоd?"++":""
floorcat

14

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

<!--
document.write`This program errors out in JavaScript + HTML :P`()
--><script>document.write`This program errors out in HTML + JavaScript :P`+X</script>

<!--
document.write`This program errors out in JavaScript + HTML :P`()
--><script>document.write`This program errors out in HTML + JavaScript :P`+X</script>

Не уверен, если это считать два языка, но это смешно.


Таким образом, первый является неопределенным идентификатором, второй - вызовом функции не-функционального типа. Технически я бы рассмотрел первый HTML и второй JavaScript, но это действительно хорошая идея.
Bubbler

Хорошее использование <!-- ... --> качестве однострочных маркеров комментариев (я знаю, что это в спецификации по причинам обратной совместимости)
Shieru Asakoto

12

Java 8 & C99, 172 байта

//\
interface a{static void main(String[]a){System.out.print("This program errors out in Java 8 :P");a[1]=""/*
main(n){{n=puts("This program errors out in C99 :P")/0/**/;}}

На основании моего ответа на вызовы «abc» и «cba» .

Попробуйте это в Java 8 - в результате ArrayIndexOutOfBoundsException: 1 .
Попробуйте в C - в результате возникнет исключение с плавающей точкой: деление на ноль не определено .

Объяснение:

//\
interface a{static void main(String[]a){System.out.print("This program errors out in Java 8 :P");a[1]=""/*
main(n){{n=puts("This program errors out in C99 :P")/0/**/;}}

Как вы можете видеть в выделенном Java-коде выше, первая строка представляет собой комментарий из-за //, а C-код - из-за комментария /* ... */, что приводит к:

interface a{static void main(String[]a){System.out.print("This program errors out in Java 8 :P");a[1]="";}}

Таким образом, он печатает в STDOUT, а затем пытается получить доступ ко второму аргументу программы (если он не задан), поэтому он создает исключение ArrayIndexOutOfBoundsException .


//\
interface a{static void main(String[]a){System.out.print("This program errors out in Java 8 :P");a[1]=""/*
main(n){{n=puts("This program errors out in C99 :P")/0/**/;}}

Не уверен, как правильно включить C-подсветку, потому что lang-cприводит к той же подсветке, что и Java. Но //\закомментирует следующую строку, которая является Java-кодом, в результате:

main(n){{n=puts("This program errors out in C99 :P")/0;}}

Таким образом, он выводится в STDOUT, а затем выдает ошибку деления на ноль.


Я думаю, что это будет работать с C89 и C99. Не держи меня за это.
SIGSTACKFAULT

//Был добавлен в C с C99.
Betseg

Благодаря вам обоим, я изменил это на C99.
Кевин Круйссен,

Почему a[1]вместо a[0]?
xehpuk

@xehpuk Нет особой причины. Неважно, какую цифру я использую, и я уже заполнил 1с самого начала. Может быть использован 0, 9и т.д. , а также. Если у меня есть что-то, чтобы отредактировать этот пост, я тоже поменяю его на 0.
Кевин Круйссен

11

Java 8 & Whitespace , 439 431 428 408 байт

                         






























 interface a{static void    main(String[]a){System.out.print("This program errors out"+
" in Java 8 :P");a[0]="";}}













Попробуйте это в Java 8 - в результате ArrayIndexOutOfBoundsException: 0 .
Попробуйте в пробеле - в результате пользовательская ошибка (не могу сделать Infix Plus) .

Объяснение:

Java 8:

interface a{static void main(String[]a){System.out.print("This program errors out"+
" in Java 8 :P");a[0]="";}}

Таким образом, он печатает в STDOUT, а затем пытается получить доступ к первому аргументу программы (если он не задан), поэтому он создает исключение ArrayIndexOutOfBoundsException .


Пробелы:

[S S T  T   T   T   T   T   N
_Push_-31_P][S S T  T   T   S T S T N
_Push_-53_:][S S T  T   S S T   T   T   T   N
_Push_-79_space][S S T  T   S T S N
_Push_-10_e][S S T  T   T   S S N
_Push_-12_c][S S T  T   T   T   S N
_Push_-14_a][S S S T    N
_Push_1_p][S S S T  S S N
_Push_4_s][S S T    T   S T S N
_Push_-10_e][S S S T    S T N
_Push_5_t][S S T    T   T   S N
_Push_-6_i][S S T   T   T   T   N
_Push_-7_h][S S T   T   T   S S S N
_Push_-24_W][S T    S S T   S T S N
_Copy_0-based_10th_(-79_space)][S S T   T   N
_Push_-1_n][S S T   T   T   S N
_Push_-6_i][S T S S T   S N
_Copy_0-based_2nd_(-79_space)][S S S T  S T N
_Push_5_t][S S S T  T   S N
_Push_6_u][S S S N
_Push_0_o][S T  S S T   T   N
_Copy_0-based_3rd_(-79_space)][S S S T  S S N
_Push_4_s][S S S T  T   N
_Push_3_r][S S S N
_Push_0_o][S S S T  T   N
_Push_3_r][S N
S _Duplicate_top_(3_r)][S S T   T   S T S N
_Push_-10_e][S T    S S T   T   S N
_Copy_0-based_6th_(-79_space)][S S T    T   S N
_Push_-2_m][S S T   T   T   T   S N
_Push_-14_a][S S S T    T   N
_Push_3_r][S S T    T   S S S N
_Push_-8_g][S S S S (_Note_the_additional_S_here)N
_Push_0_o][S S S T  T   N
_Push_3_r][S S S T  N
_Push_1_p][S T  S S T   T   T   N
_Copy_0-based_7th_(-79_space)][S S S T  S S N
_Push_4_s][S S T    T   T   S N
_Push_-6_i][S S T   T   T   T   N
_Push_-7_h][S S T   T   T   S T T   N
_Push_-27_T][N
S S N
_Create_Label_LOOP][S S S T T   S T T   T   T   N
_Push_111][T    S S S _Add][T   N
S S _Print_as_character][N
S N
N
_Jump_to_Label_LOOP]

Буквы S(пробел), T(табуляция) и N(новая строка) добавляются только как подсветка.
[..._some_action]добавлено только для пояснения.

Попробуйте эту выделенную версию.

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

Push all unicode values of "P: ecapsetihW tuo srorre margorp sihT", minus 111
Start LOOP
  Push 111
  Add the top two stack values together
  Print as character
  Go to the next iteration of the LOOP

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

Я сгенерировал константу 111с помощью этой программы Java , которую я также использовал для предыдущих задач, связанных с ASCII, которые я делал в Whitespace. Кроме того, я использовал несколько копий для пробелов, чтобы сохранить байты.

Одна важная вещь, которую стоит отметить, - это трюк, который я использовал, чтобы поместить Java-программу в ответ Whitespace. Позвольте мне начать с объяснения того, как число вводится в пустое пространство:

Sв начале: включить управление стеками;
S: Нажмите то, что следует как число;
Sили T: положительный или отрицательный соответственно;
Некоторые Sи / или T, а затем N: число в двоичном виде, где T=1иS=0 .

Вот несколько примеров:

  • Нажатие на значение 1 будет SSSTN;
  • Нажав значение -1 будет SSTTN;
  • Нажав значение 111 будет SSSTTSTTTTN.
  • Нажатие значения 0 может быть SSSSN, SSTSN, SSSN, SSTN, SSSSSSSSSSSSNи т.д. (При использовании SSSN(или SSTN), мы не должны указывать бинарную часть, потому что это неявно 0 после того, как мы заявили знак.)

Так что SSSNдостаточно просто нажать значение 0( oв данном случае используется для буквы ). Но, чтобы поместить программу Java в этой программе golfed WHITESPACE, мне нужно дополнительное пространство, поэтому первые два os выталкиваются с SSSN, но третий один проталкиваются с SSSSN, поэтому у нас есть достаточно мест для предложения программы Java.


10

CBM BASIC и машинный код 6502 (C64), 142 144 байта

Пришлось добавить 2 байта после того, как синтаксическая ошибка не была допущена ....


Hexdump .prgфайла:

01 08 50 08 00 00 8F 5A 49 52 49 41 A9 17 8D 18 D0 A2 30 BD 30 08 20 D2 FF E8
E0 4B D0 F5 A2 30 BD 05 08 20 D2 FF E8 E0 44 D0 F5 A9 0D 20 D2 FF A2 1A 4C 37
A4 22 36 35 30 32 20 4D 41 43 48 49 4E 45 20 43 4F 44 45 20 3A D0 22 20 20 20
20 20 00 8D 08 01 00 97 35 33 32 37 32 2C 32 33 3A 99 22 D4 48 49 53 20 50 52
4F 47 52 41 4D 20 45 52 52 4F 52 53 20 4F 55 54 20 49 4E 20 C3 C2 CD 2D C2 C1
D3 C9 C3 20 3A D0 22 2C 58 AD 50 00 00 00

Представление CBM BASIC , как указано в редакторе C64:

0 remziriastepgosubinput#new0exp0 dim.clrsavekinput#stepnew0exp<white> dim.clrsavedinput#stepstep
 dim.newl7to"6502 machine code :P"
1 poke53272,23:print"This program errors out in CBM-BASIC :P",x/p

оригинальный список

Внимание : невозможно правильно ввести эту программу в бейсик редакторе. Даже не пытайтесь редактировать эту программу в редакторе BASIC, она вылетит. Тем не менее, это работоспособная ОСНОВНАЯ программа;)


Вид машинного кода 6502 :

         01 08                          ; load address

.C:0801  50 08       BVC $080B          ; jump to real start of mc

         ; line number (00 00), REM (8F) and "ziria"
.C:0803  00 00 8F 5A 49 52 49 41

.C:080b  A9 17       LDA #$17
.C:080d  8D 18 D0    STA $D018          ; set upper/lower font
.C:0810  A2 30       LDX #$30
.C:0812  BD 30 08    LDA $0830,X
.C:0815  20 D2 FF    JSR $FFD2          ; print "This program errors ..."
.C:0818  E8          INX
.C:0819  E0 4B       CPX #$4B
.C:081b  D0 F5       BNE $0812
.C:081d  A2 30       LDX #$30
.C:081f  BD 05 08    LDA $0805,X
.C:0822  20 D2 FF    JSR $FFD2          ; print "6502 machine code :P"
.C:0825  E8          INX
.C:0826  E0 44       CPX #$44
.C:0828  D0 F5       BNE $081F
.C:082a  A9 0D       LDA #$0D
.C:082c  20 D2 FF    JSR $FFD2          ; print a newline
.C:082f  A2 1A       LDX #$1A           ; error code for "can't continue"
.C:0831  4C 37 A4    JMP $A437          ; jump to error handling routine

.C:0834  22 ; '"'

         ; "6502 machine code :P"
.C:0835  36 35 30 32 20 4D 41 43 48 49 4E 45 20 43 4F 44 45 20 3A D0

         ; '"', some spaces, and next BASIC line
.C:0849  22 20 20 20 20 20 00 8D 08 01 00 97 35 33 32 37 32 2C 32 33 3A 99 22

         ; "This program errors out in CBM-BASIC :P"
.C:0860  D4 48 49 53 20 50 52 4F 47 52 41 4D 20 45 52 52 4F 52 53 20 4F 55 54
.C:0877  20 49 4E 20 C3 C2 CD 2D C2 C1 D3 C9 C3 20 3A D0

.C:0887  22 2C 58 AD 50 00 00 00

Демо-версия в сети , введитеrunдля запуска как BASIC,sys 2049чтобы запустить как машинный код,listчтобы показать, что он интерпретируется как BASIC-код.

Запуск как BASIC производит division by zero error in 1, запуск как машинный кодcan't continue error

Скриншот


Объяснение:

Первые два байта .prgфайла - это адрес загрузки с прямым порядком байтов, здесь он $0801(десятичный 2049), который является начальным адресом для программ BASIC на C64. runзапускает эту программу в интерпретаторе BASIC, в то время sys 2049как это команда для запуска программы машинного кода по адресу2049 .

Как видите, первая строка в представлении BASIC - это комментарий ( rem), содержащий «мусор» и часть необходимой выходной строки. Это программа машинного кода и несколько байтов заполнителя. Вы видите некоторые «случайные» команды BASIC, потому что программы CBM-BASIC содержат команды, «tokenized» в виде однобайтовых значений, и некоторые из этих значений совпадают с кодами операций, используемыми в машинном коде. Машинный код повторно использует строку, представленную во второй строке кода, для его вывода.

Первые два байта строки базовой программы - это указатель на следующую строку $0850. Это тщательно выбрано, потому что 50 08это также инструкция 6502 ветвления, перепрыгивающая через следующие 8 байтов, когда флаг переполнения не установлен - это используется для перехода где-то посередине этой строки «комментария» при выполнении в виде машинного кода. Здесь 50используется код операции, поэтому вторая строка должна начинаться, 0850чтобы трюк работал. Вот почему вы видите последовательность из 5 20байтов (пробелов) для заполнения. Машинный код активно переходит к процедуре обработки ошибок ПЗУ, чтобы выдать ошибку «невозможно продолжить».

Базовый код довольно прост; в качестве второго аргумента для «печати» две неинициализированные переменные (имеющие значение 0в CBM BASIC) делятся, вызывая ошибку «деление на ноль».


2
Вы, сэр, настоящий программист. Как ты это придумал? Программирование Atari?
Орион

@ Орион спасибо :) По сути, я начал со второй строки, введенной как обычный бейсик, удалил ее, используя монитор машинного кода, встроенный в тиски (эмулятор), собрал машинный код непосредственно в оперативную память и вручную исправил указатели строк Основная программа ...
Феликс Пальмен

9

> <> и Foo , 42 байта

#o<"This code errors in "p"Foo"'><>'" :P"/

Попробуйте это в> <>!

Попробуйте это в Foo!

Foo печатает все ", что хорошо документировано, и в конце пытается делить на ноль. Это игнорирует '><>'.

><>помещает «Foo» в стек, но сразу же выдает его, используя p. После того, как он печатает все в стек, #o<он выходит, когда стек пуст с единственным сообщением об ошибке, которое он знает,something smells fishy...


Важна причина ошибки, а не сообщение об ошибке. На странице esolang ><>есть список причин ошибок, поэтому я считаю, что вы должны указать одну из них, а не something smells fishy....
Bubbler

2
@Bubbler Ошибка вызвана выталкиванием из пустого стека.
Esolanging Fruit

3
Использование pдля поп-музыки Fooочень умно!
Esolanging Fruit

6

C и Python, 126 116 байт

-10 байт благодаря @Bubbler!

#1/*
-print("This program errors out in Python :P")
'''*/
main(c){c=puts("This program errors out in C :P")/0;}//'''

В Python print () - None, поэтому пытаться получить отрицательный результат не имеет смысла, поэтому Python выдает ошибку.

В C printf () возвращает int, поэтому деление его на ноль дает исключение с плавающей запятой.

Попробуйте это в C!
Попробуйте это на Python!


1
Вы можете использовать -print(...)для поднятия a TypeErrorв Python, и тогда вы можете сделать ошибку с плавающей точкой (деление на ноль) в C. В сочетании с некоторыми избыточными символами новой строки, здесь 116 байтов ( Python , C ).
Bubbler

5

Attache + Wolfram Language (Mathematica) , 82 байта

s:="Attache"
s=" Mathematica "
Throw[Print["This program errors out in",s,":P"]-0]

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

Это основывается на значении оператора =на двух языках. В Attache он сравнивается на равенство, но в Mathematica он выполняет присваивание переменных. :=выполняет присваивание переменных на обоих языках.

Теперь в Attache Printвозвращает напечатанный массив строк, и вычитание невозможно со строками и целыми числами (а именно, 0). Итак, ошибка типа выбрасывается. В Mathematica Printвозвращается Null, и Mathematica прекрасно вычитает 0из этого. Но, мы вручную забросить , что нуль с Throw, что дает nocatchошибку.


примечание: это не работает для текущих версий атташе из-за ошибки. Я постараюсь исправить это в ближайшее время
Конор О'Брайен

5

Python (2) и QB64 , 82 байта

1#DEFSTR S
s="QB64"
'';s="Python"
print"This program errors out in "+s+" :P"
CLS-1

Чтобы проверить версию Python, вы можете попробовать его онлайн! Чтобы протестировать версию QB64, вам нужно скачать QB64.

Что видит Python

1#DEFSTR S
s="QB64"
'';s="Python"
print"This program errors out in "+s+" :P"
CLS-1

Первая строка - это просто голое выражение 1(без операции), за которым следует комментарий.

Вторая строка устанавливает sстроку "QB64", но третья строка немедленно меняет ее на "Python". Четвертая строка печатает сообщение соответственно.

Пятая строка - еще одно голое выражение, но оно вызывается NameErrorиз-за неопределенного имени CLS.

Что видит QB64

1#DEFSTR S
s="QB64"
'';s="Python"
print"This program errors out in "+s+" :P"
CLS-1

Первая строка, пронумерованная 1# , определяет каждую переменную, имя которой начинается с S(без учета регистра) как строковую переменную. Это означает, что нам не нужно использовать s$, что было бы синтаксической ошибкой в ​​Python.

Вторая строка устанавливает s строку "QB64". 'начинает комментарий в QB64, поэтому третья строка ничего не делает. Четвертая строка печатает сообщение соответственно.

Пятая строка пытается CLS(очистить экран) с аргументом -1. Но так как CLSпринимает только аргументы 0, 1или 2, это приводит к ошибке Illegal function call. Ошибка создает диалоговое окно, спрашивающее пользователя, хотят ли они продолжить выполнение или прервать выполнение. Технически это означает, что ошибка не является фатальной (в этом случае вы можете выбрать «продолжить выполнение», и программа просто завершится без дальнейших проблем); но OP явно разрешил языки, которые могут продолжаться после ошибки, поэтому поведение QB64 должно быть в порядке.


3

Perl 5 и JavaScript (Node.js) , 96 байт

eval("printf=console.log");printf("This program errors out in %s :P",("Perl","JavaScript"));$//0

Это использует тот факт, что (...)это список в Perl, который printfбудет использовать самый левый элемент, и тот факт, что это оператор запятой в JavaScript, который будет возвращать самый правый аргумент.

Вызывает ошибку деления на ноль в Perl и ReferenceError, потому что $не определено в JavaScript.

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

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


3

Октава и MATLAB, 67 байт

v=ver;disp(['This program errors out in ' v(1).Name ' :P']);v(--pi)

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

Примечания: Код предполагает, что MATLAB установлен без наборов инструментов (или что имена любого установленного набора инструментов не начинаются с букв от A до M).

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

Код получает данные о версии для интерпретатора и наборов инструментов ver. Запуск v(1).Nameизвлекает имя первого продукта, он вернет либо, Octaveлибо, MATLABесли примечание выше верно.

Затем программа отобразит требуемую строку, дополненную OctaveилиMATLAB как требуется.

Наконец мы делаем v(--pi) .

В октаве -- есть оператор предварительного декремента. Как таковой, он пытается предварительно уменьшить, который терпит неудачу как переменнаяpi не существует ( piна самом деле это функция, а не переменная).

This program errors out in Octave :P
error: in x-- or --x, x must be defined first

В MATLAB оператор предварительного декремента не существует. Как таковое утверждение интерпретируется как v(-(-pi))равное справедливости v(pi). Однако piне является целым числом, поэтому не может использоваться для индексации в vмассиве, что приводит к ошибке.

This program errors out in MATLAB :P
Subscript indices must either be real positive integers or logicals.

3

C ++ 14 (gcc) / C ++ 17 (gcc) , 107 105 байт

#include<cstdio>
int*p,c=*"??/0"/20;int
main(){*p=printf("This program errors out in C++ 1%d :P",4+c)/c;}

Попробуйте онлайн! (C ++ 14)

Попробуйте онлайн! (C ++ 17)


Предполагается, что <cstdio>объявляетprintf в глобальном пространстве имен (в дополнение кstd ) и что базовый набор символов выполнения использует значения ASCII, которые являются истинными при использовании g ++ в Linux.

Основная проблема здесь в том, что C ++ 17 исключил триграфы из языка.

В C ++ 14 "??/0"содержит триграф и эквивалентен "\0". Так *"??/0"что ноль, и cустанавливается на ноль. Число 4 передается в качестве аргумента printf, затем деление на cвызывает неопределенное поведение. В Linux это происходит до того, как это *pвходит в картину, и программа получает SIGFPE.

В C ++ 17 "??/0"это строка длиной 4, как представляется. So *"??/0"is '?'or 63 и cустановлен в 3. Число 7 передается в качестве аргумента printf, и на этот раз деление на cявляется действительным. Поскольку он pявляется членом пространства имен, он инициализируется нулями в начале программы и имеет нулевое значение указателя, *pкак и неопределенное поведение. В Linux, поскольку программа пытается изменить память по нулевому адресу, программа получает SIGSEGV.


mainВозвращаемый тип может быть опущен, поэтому -3 байта.
Макс Ехлаков

2

Perl 5 и Perl 6 , 55 байт

say('This program errors out in Perl ',5-~-1,' :P').a/0

Попробуйте Perl 5 онлайн! (Незаконное деление на ноль)

Попробуйте Perl 6 онлайн! (Нет такого метода)

Префикс ~- это строковое форматирование в Perl 6 и, по сути, запрет на использование в приведенной выше программе. В Perl 5 это не поразрядно, преобразовывая -1 в 0.

. это синтаксис вызова метода в Perl 6 и конкатенация в Perl 5.


2

C (gcc) / Stax , 109 байт

AA=~1;
	char* s;main(){*(int*)(printf("%s C :P",s))=0;}char* s=
"This program errors out in";;;/*dp`UGYC\`Q*/

Попробуйте онлайн! (C (GCC))

Попробуйте онлайн! (Stax) или запустить и отладить его! (Stax)

Segfault в C. Неправильная операция в Stax. Мне нравится, что все, что не является комментарием, на самом деле используется в Stax.

С

Вот как С это видит. Первая строка не работает. Во второй строке печатается сообщение с, printfа затем с ошибками из-за =0.

AA=~1;
	char* s;main(){*(int*)(printf("%s C :P\n",s))=0;}char* s=
"This program errors out in";;;/*dp`UGYC\`Q*/

Stax

Программа Stax завершает работу всякий раз, когда она пытается выскочить или посмотреть из пустого стека. Это немного усложняет задачу, и мы должны подготовить не пустой стек. AA=~1;делает это, оставаясь действительным утверждением в C.

AA=~1;
AA=       10=10, returns a 1
   ~      Put it on the input stack
    1     Pushes a 1 to main stack (*)
     ;    Peek from the input stack (**)

Что действительно полезно, так это то ~, что он подготавливает непустой стек ввода, чтобы его ;можно было выполнить без выхода из программы. Тем не менее, два1 s в основном стеке также используются позже.

Вторая строка начинается с вкладки и начинается с комментария в Stax.

"...";;;/*dp`UGYC\`Q*/
"..."                     "This program errors out in"
     ;;;                  Peek the stack three times so that we have enough operands for the next two operations
        /                 Divide, this consumes one element of the main stack
         *                Multiply, this consumes another element
          d               Discard the result, now the TOS is the string
           p              Pop and print without newline
            `UGYC\`       Compressed string literal for " Stax :P"
                   Q      Print and keep the string as TOS
                    *     Duplicate string specific times
                          Since the element under the top of stack is `1` that was prepared in (**), this does nothing
                     /    Invalid operation error

Недопустимая операция пытается выполнить /операцию для строки в качестве TOS (2-й операнд) и числа 1из (*) в качестве 1-го операнда, что недопустимо.

Если два операнда поменялись местами, это будет действительная операция в Stax.


2

Желе и М , 39 байт

İ=`ị“¢³ƥ“Ȥ¹»;“ :P”“¢ḅñ⁵ẹḞŀẊịñṙȧṄɱ»;ȮṠṛƓ

Попробуйте это в желе!

Попробуйте в М!

Оба языка применить обратный İк 0что приводит infк Желе иzoo для М. я не знаю , почемуzoo представляет бесконечность в М. Ask Деннис.

Важным отличием является то, что бесконечность желе равна самой себе, а бесконечность М - нет. Таким образом, монада "равно себе" =`дает 1в желе и 0в м. Отсюда:

İ=`ị“¢³ƥ“Ȥ¹»;“ :P”“¢ḅñ⁵ẹḞŀẊịñṙȧṄɱ»;ȮṠṛƓ
İ=`                                      0 in M, 1 in Jelly
    “¢³ƥ“Ȥ¹»                             Pair of compressed strings: [' M',' Jelly']
   ị                                     Index into this list with 0 or 1
            ;“ :P”                       Concatenate with the string ' :P'
                  “¢ḅñ⁵ẹḞŀẊịñṙȧṄɱ»       Compressed string: 'This program errors in'
                                  ;      Prepend this to ' Jelly/M :P'
                                   Ȯ     Print the string and return it
                                    Ṡ    Sign. M errors with a string as input and terminates
                                         Jelly returns a list of Nones
                                     ṛ   Right argument. This prevents the list of Nones from being printed
                                      Ɠ  Read a single line from input. Since input is not allowed, this produces an EOFError

Ошибка желе EOFError: EOF when reading a line .

Ошибка M является TypeError: '>' not supported between instances of 'str' and 'int'.


1
Как ты вообще начинаешь делать это в двух эсолангах?
Волшебная Урна Осьминога

2

Foo / CJam , 51 50 байт

"This program errors out in ""Foo"/'C'J'a'm" :P"Li

Это завершается с ошибкой деления на ноль в Foo, и NumberFormatException в CJam.

Для CJam:

  • Строковый литерал (между кавычками) помещается в стек. Элементы из стека автоматически печатаются без разделителя, когда программа завершается.
  • /пытается разбить строку This program errors out in на подстроку Foo. Поскольку строка не содержит подстроки, это приводит к массиву синглтона, содержащему исходную строку, которая отображается точно так же.
  • 'xсимвольный литерал для x, который печатается так же, как и односимвольная строка. Таким образом, мы можем передать данные для CJam, которые игнорируются Foo (я не выяснил, как заставить цикл не выполняться в Foo).
  • Liпытается привести пустую строку к целому числу, что не удается. Все из стека печатается.

Для Foo:

  • Строковый литерал (между кавычками) печатает сам.
  • /пытается разделить текущую ячейку на верхний элемент стека (который является неявным 0). По какой-то причине ошибки деления на 0 не являются фатальными в Foo, поэтому это просто печатает сообщение
    Only Chuck Norris can divide by zero.
    в STDERR и продолжает идти.
  • Нераспознанные символы ( 'C'J'a'mи Li) игнорируются.

2
Разве не последние 50 байтов?
Bubbler

@Bubbler Забыл отредактировать это, извините.
Esolanging Fruit

7
Я думаю, что есть ошибка в интерпретаторе Foo. Очевидно, это должно быть ошибка с Only Jon Skeet can divide by zero. meta.stackexchange.com/a/9138

2

Питон и Луа , 111 110 102 98 95 85 байт

x="This program errors out in ",#[[
print(x[0]+"Python :P")
a#]]z=#print(x.."Lua :P")

Ошибки: Python 3:

Traceback (most recent call last):
  File ".code.tio", line 3, in <module>
    a#]]z=#print(x.."Lua :P")
NameError: name 'a' is not defined

Lua:

lua: .code.tio:3: attempt to get length of a nil value
stack traceback:
    .code.tio:3: in main chunk
    [C]: in ?

Ясно отчетливо

Злоупотребляет множественными различиями:

  • <var>=<a>,<b>,... создает кортеж в Python, но в Lua создает список аргументов, из которого берется только первый член.
  • #начинает комментарий в Python, но является оператором длины в Lua. Дополнительные реквизиты для Python, позволяющие кортежам заканчиваться запятой.
  • [[...]]многострочный синтаксис Lua, означающий, что он даже не видит функцию печати Python; это необходимо из-за использования Lua ..для конкатенации строк, а не+ .
  • Ошибки Python после просмотра aнеопределенной переменной; Луа после z=#print(x.."Lua :P"). Использование только #print(x.."Lua :P")для Lua не работает, так как это вызывает ошибку еще до того, как код будет выполнен.

Редактирование:

  • Не нужно использовать "".joinв Python, -1 байт
  • Создайте xстроку на обоих языках и поместите Pythonв строковый литерал в функции печати, -8 байт
  • Использование #[[]]короче #""и --[[]], -4 байта
  • Не нужно использовать #1в качестве ключа таблицы, -3 байта
  • Джо Кинг сделал это , -9 байт
  • Принимая длину возвращаемого значения print(x.."Lua :P")работ, по-видимому; -1 байт


2

Java и C # 242 235

/**\u002f/*/using System;/**/class G{public static void/**\u002fmain/*/Main/**/(String[]a){String s="This program errors out in ";/**\u002fSystem.out.print(s+"Java :P");/*/Console.Write(s+"C# :P")/**/;s=/**\u002f(1/0)+""/*/a[-1]/**/;}}

Злоупотребление различной обработкой escape между java и C # (экранирование unicode анализируется перед синтаксическим анализом кода в java, а не в c #) как своего рода препроцессор, вот и работа \u0027 магии, остальные - это некоторые "комментарии-переключатели"

Редактировать: Гольф от 8 байтов благодаря указателю @KevinCruijssen

Редактировать: правило сумасшедшего исправлено


Вы можете играть в гольф 6 байт путем изменения как Stringв var(Java 10 поддерживает это). (Или 5, изменив String s="...";к String s="...",x;и удалить Stringперед x=в Java 9 или ранее).
Кевин Круйссен

1
повторное использование S-строки работает, также для java99 и раньше. @KevinCruijssen
masterX244,

2

AutoHotKey / C #, 155 133 128 122 байтов

Подсветка синтаксиса объясняет это лучше, чем я мог:

C # RuntimeBinderException: «Невозможно вызвать тип без делегата»

;dynamic
i="This program errors out in " ;Console.Write(i+"c# :P");i();/*
i:=SubStr(i,2,27)
send %i%AutoHotkey :P
Throw */

Ошибка AutoHotkey : возникла исключительная ситуация.

;dynamic
i="This program errors out in " ;Console.Write(i+"c# :P");i();/*
i:=SubStr(i,2,27)
send %i%AutoHotkey :P
Throw */

Редактирование:

  1. удалил вар
  2. -5 байт благодаря молоку

2
Вот немного короче исключение бросить в C #: i+=i[-1]. System.IndexOutOfRangeException: 'Индекс находился за пределами массива.'
молоко

2
Немного короче, чтобы использовать dynamicвместо varи выбросить Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: «Невозможно вызвать тип без делегата» с i().
молоко

2

PHP 7+ / JavaScript, 90 89 байт

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

Разделение языка выполняется с помощью свойства, отсутствующего в JavaScript: PHP считает [](пустой массив) ложным значением, в то время как оно истинно в JavaScript (потому что это объект, а объекты всегда верны, даже new Boolean(false))

$X='This program errors out in %s :P';([]?console.log($X,'JavaScript'):printf($X,PHP))();


Исполнение:

Остановлюсь на следующий фрагмент кода: ([]?console.log($X,'JavaScript'):printf($X,PHP))();.

Атрибуция строк работает одинаково на обоих языках.

Этот код использует «троичный оператор» ( Javascript , PHP ), который в большинстве языков работает в основном одинаково.

Javascript

Javascript будет запускать console.log($X,'JavaScript')часть, которая возвращается undefined.

Позже, когда вы попытаетесь выполнить (...)(), вы получите Uncaught TypeError: (intermediate value)(intermediate value)(intermediate value) is not a function(в Google Chrome).

PHP

PHP выполнит printf($X,PHP)кусок.

В PHP printfфункция возвращает длину вывода .

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

Затем PHP попытается запустить функцию, имя которой является результатом выражения []? ... :printf($X,PHP)(которое является числом33 ).
Но у этой интересной функциональности есть предостережение: принимаются только строки (да!).

Это вызывает Fatal error: Function name must be a string, потому что 33является int.


Спасибо Шиеру Асакото за то, что он спас мне 1 байт!


1
[]короче '0'и также оценивается по-разному в JS и PHP, так что, может быть, здесь -1 байт?
Шиеру Асакото,

У меня есть много вопросов , с этим вопросом, где []нужно использовать вместо '0', '\0', '\0'=="0"и использовал это []до того, как хорошо. Но спасибо, что заметили этот вопрос.
Исмаэль Мигель

1

Perl 5 и C, 95 байт

//;$_='
main(){puts(puts("This program errors out in C :P"));}//';/T.*n /;print$&,"perl :P";die

//; это в основном NOP в Perl, и комментарий на C.

Таким образом, программа C эффективно:

main(){puts(puts("This program errors out in C :P"));}

Который печатает требуемую строку, затем пытается запустить puts(32). Это технически неопределенное поведение в C, но оно вызывает ошибку сегментации в TIO и в каждой системе, к которой у меня есть доступ.

Perl-программа обрабатывает всю C-программу как строку, использует регулярное выражение /T.*n /для сопоставления, This program errors out inа затем печатает это и perl :P. dieвызывает сбой программы с ошибкой Died at script_name line 2.

Если вам не нравится это как ошибка, 1/0имеет ту же длину и вылетает с Illegal division by zeroошибкой. мне просто нравитсяdie больше ;)

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

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


1

VBScript, JScript, 72 байта

x="VB"
'';x='J'
WScript.echo("This program errors out in "+x+"Script")
y

VBScript выведет «Ошибка времени выполнения Microsoft VBScript: Несоответствие типов:« y »»
JScript выведет «Ошибка времени выполнения Microsoft JScript:« y »не определено»



1

Java (JDK) / JavaScript (Node.js), 154 байта

class P{P(){var s="This program errors out in ";try{System.out.printf("%sJava :P",s);}finally{if(1!='1'){var a=0/0;}throw new Error(s+"JavaScript :P");}}}

Попробуйте онлайн! (Джава)

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

Вывод на Java:

This program errors out in Java :P
Exception in thread "main" java.lang.ArithmeticException: / by zero
    at P.(Main.java:1)

Вывод в JavaScript (в stderr):

Error: This program errors out in JavaScript :P
    at P (/home/runner/.code.tio:1:185)

Это позволяет использовать слабую типизацию JavaScript ( 1=='1') для определения языка, а также те же ключевые слова в Java и JavaScript ( var, class) и аналогичные конструкторы ошибок ( new Error()) для создания полиглота.


1

PowerShell v6 и PowerShell v2, 73 байта

"This errors out in PowerShell v$($PSVersionTable.PSVersion) :P"
1-shl1/0

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

Это приведет к ошибке синтаксического анализа на v2, потому что -shlбыл введен в v3. Тогда v3 + сможет корректно сместить значение, прежде чем пытаться разделить его на 0, что приводит к ошибке деления на ноль. Обе версии имеют хэш-таблицу $ PSVersionTable, которая содержит PSVersionполе


0

C (gcc) в Linux / C (gcc) в Mac (160)

#include <sys/utsname.h>
main(){struct utsname n;float g;uname(&n);printf("This program errors out in C(gcc) on %s :P\n",n.sysname);g=1/(int)gamma(1);abort();}

Untested on Mac; basically, John Cook pointed out (in his blog) that POSIX doesn't define gamma; Linux uses the log of the gamma function (log(gamma(1)) will return 0 which will trigger a floating point exception); OSX uses the "true" gamma function, (which is officially called tgamma per POSIX); this returns 1 which will then hit the abort statement; I tried to get it to throw a different floating point error (e.g. sqrt(-1) but I'm forgetting how to make that throw an error vs just return zero)


0

Perl, Bash (78 bytes)

printf "This program errors out in ";eval 'echo Bash :P'||print"Perl :P
";
a()

Output in Perl:

This program errors out in Perl :P
Undefined subroutine &main::a called at /tmp/perlbash line 3.

Output in Bash:

This program errors out in Bash :P
/tmp/perlbash: line 4: syntax error: unexpected end of file

(Note that Bash is indeed displaying the line 4 error, despite the fact that line 3 does not end with a line feed...)



0

C (gcc) and Haskell, 135 bytes

char/*x=0-- */*
s="This program errors out in ";
int main(){--s;*s=printf("%sC :P",s+1);}//-}=0;main=mapM print[s++"Haskell :P",tail""]

Try it online (С)! Try it online (Haskell)!

The result is achieved by interweaving the comments, the C version being essentially this:

char * s = "This program errors out in ";
int main ()
{
   --s;
   *s = printf ("%sC :P", s + 1);
}

(Failure is achieved by writing before the beginning of the string).

Haskell version, on the other hand, reduces to the following:

char /* x = 0 -- a useless operator (/*) taking two arguments
s = "This program errors out in ";
int main () = 0 -- a useless function int taking two arguments
main = mapM print [s ++ "Haskell :P", tail ""]

(Failure is achieved by taking tail of an empty list)

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