Цей код помилки на * this * і * that *, чи справді в них написано?


25

Натхненний я не мовою, яку ви шукаєте!

Виклик

Виберіть дві різні мови програмування та напишіть програму, яка друкує наступний рядок у stdout (або еквівалент):

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: This program errors out in Python :Pдля stdout, а потім невизначений ідентифікатор
  • Ruby: This program errors out in Ruby :Pдля stdout, потім індекс поза межами

C89 і C99

  • C89: This program errors out in C 89 :Pдо stdout, потім ділення на нуль
  • 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для stdout, потім синтаксична помилка на eval
  • Python 2.7.10: This program errors out in Python 2.7.10 :Pдля stdout, потім ключова помилка на dict

Perl і Perl -n

  • Perl: This program errors out in Perl :Pдля stdout, а потім недійсний формат часу
  • Perl -n: This program errors out in Perl -n :Pдля stdout, а потім спробуйте відкрити файл, який не існує

Умова виграшу

Це , тому виграє найкоротший код у байтах. Але вам завжди рекомендується розмістити відповідь, яка є цікавою або цікавою, навіть якщо вона не дуже коротка.



Чи потрібно помилка зупинити програму?
Джо Кінг

Я спочатку так вважав. Однак якщо є деякі мови, які можуть продовжуватись (можливо, із невизначеною поведінкою) після чогось на кшталт "поділ на нуль", з деяким механізмом визнати, що програма зіткнулася з цією помилкою, я з радістю дозволю це.
Бубон

Я думаю, я вже знаю відповідь, але про всяк випадок: чи може речення 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
  • Пітон 2 отримав NameError: name 'a' is not defined
  • Пітон 3 отримав unsupported operand type(s) for *: 'NoneType' and 'int'

Пітон 2:

  • /це ціле ділення, 3/2 отримало 1; int (3/2 * 2) дорівнює 2.
  • print - це твердження, тому перше твердження, прочитане як print((...)*1), тут *1означає повторення рядка один раз.
  • Другий оператор посилався на неіснуючу змінну, що спричинило помилку.
  • Спробуйте в Інтернеті!

Пітон 3:

  • '/' - це поділ числа з плаваючим числом, 3/2 отримав 1,5; int (3/2 * 2) дорівнює 3.
  • print - це функція, тому перше твердження читається як (print(...))*1.
  • функція printповертається None; Множення не працює None x int, тому він повідомляє про "непідтримуваний операнд".
  • Спробуйте в Інтернеті!

15

C і C ++, 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 char, "++"+4*d8 char. Але отримує 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?"++":""
roofcat

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, але дуже приємна ідея.
Бубон

Хороше використання <!-- ... -->як однорядкових маркерів коментарів (я знаю, що це є в специфікації з відсталої причини сумісності)
Shieru Асакото

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одночасно зміню .
Kevin Cruijssen

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 .
Спробуйте в Whitespace - це призводить до помилки користувача (не вдається зробити 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]додано лише як пояснення.

Спробуйте цю виділену версію.

Whitespace - мова на основі стека, яка ігнорує все, крім пробілів, вкладок та нових рядків. Ось та сама програма в псевдокоді:

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

Він помилиться, як тільки буде зроблено друк усіх значень, і стек порожній, коли він намагається зробити " Додати" ( TSSS), для чого потрібні два елементи на стеку.

Я створив константу за 111допомогою цієї програми Java , яку я також використовував для попередніх завдань, пов'язаних з ASCII, які я робив у Whitespace. Крім того, я використав кілька копій для пробілів для збереження байтів.

Одне важливе, що слід зазначити, - це трюк, який я використовував для розміщення програми Java у відповідь Whitespace. Дозвольте почати з пояснення того, як число висувається в 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 в цій програмі Whitespace для гольфу, мені потрібен був додатковий простір, тому перші два os поштовхуються SSSN, а третій - натисканням SSSSN, тому у нас є достатньо місця для речення програми Java.


10

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

Довелося додати 2 байти після розуміння синтаксичної помилки не було дозволено ....


Шестнадцятковий .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

original listing

Увага : Неможливо правильно ввести цю програму в редакторі BASIC. Навіть не намагайтеся редагувати цю програму в редакторі BASIC, вона вийде з ладу. Все-таки це запущена програма 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 виробляє a division by zero error in 1, працює як машинний код acan't continue error

screenshot


Пояснення:

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

Як бачимо, перший рядок у поданні BASIC - це коментар (rem ), що містить "сміття" та частину необхідного вихідного рядка. Це програма машинного коду та кілька байтів наповнювача. Ви бачите там деякі "випадкові" команди BASIC, оскільки програми CBM-BASIC містять команди "токенізовані" як однобайтові значення, а деякі з цих значень такі ж, як і опкоди, що використовуються в машинному коді. Машинний код повторно використовує рядок, присутній у другому рядку коду для його виведення.

Перші два байти рядка основної програми - вказівник на наступний рядок, тут $0850. Це ретельно вибирається, тому що 50 08це також інструкція гілки 6502 для переходу через наступні 8 байт, коли прапор переповнення не встановлений - це використовується для переходу десь посередині цього рядка "коментар", коли виконується як машинний код. Тут 50використовується опкод, тому другий рядок повинен починатися 0850з того, щоб трюк працював. Ось чому ви бачите послідовність у 5 20байтів (пробіли), які потрібно заповнити. Машинний код активно переходить на процедуру обробки помилок ПЗУ, щоб дати помилку "не можу продовжувати".

BASIC-код досить простий; як другий аргумент для "друку" 0поділяються дві неініціалізовані змінні (мають значення у CBM BASIC), що викликає помилку "поділ на нуль".


2
Ви, пане, справжній програміст. Як ви придумали це? Програмування Atari?
Оріон

@Orion спасибі :) В основному, я почав з другого рядка, введеного як звичайний BASIC, перемістив його з шляху, використовуючи монітор машинного коду, вбудований у порок (емулятор), зібрав машинний код безпосередньо на таран і вручну відремонтував лінійні покажчики основна програма ...
Фелікс Палмен

9

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

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

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

Спробуйте це у Foo!

Foo друкує все в ", як це добре зафіксовано, і намагається ділити на нуль наприкінці. Він ігнорує '><>'.

><>штовхає "Foo" до стеку, але тут же вискакує за допомогою p. Після того, як він надрукує все до стека, #o<він виходить, коли стек порожній, з єдиним відомим повідомленням про помилку,something smells fishy...


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

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(...)для підняття TypeErrorв Python, і тоді ви можете зробити помилку з плаваючою точкою (поділ на нуль) в C. У поєднанні з деякими зайвими новими рядками, ось 116 байт ( Python , C ).
Бубон

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помилку.


Примітка: це не працює для поточних версій атташе через помилку. Я спробую скоріше це виправити
Conor O'Brien

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. Помилка створює діалогове вікно, яке запитує користувача, чи хоче він продовжувати виконання або скасовувати. Технічно це означає, що помилка не є фатальною (у цьому випадку ви можете вибрати «продовжити виконання», і програма просто закінчується без додаткових проблем); але ОП явно дозволив мови, які можуть продовжуватися після помилки, тому поведінка 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 встановлений без наборів інструментів (або що назви встановленої скриньки інструментів не починаються з літер від А до М).

Як це працює:

Код отримує дані про версії інтерпретатора та інструментальних скриньок за допомогою ver. Запуск v(1).Nameвитягує назву першого продукту, це поверне OctaveабоMATLAB припустимо, що примітка вище відповідає дійсності.

Після цього програма відобразить необхідний рядок у комплекті з OctaveабоMATLAB як потрібно.

Нарешті ми робимо v(--pi) .

В Octave --є оператором до декременту. Як такий, він намагається попередньо зменшити декремент, який не вдається, оскільки змінна 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 рядка. Так *"??/0"є '?'або 63, і cвстановлюється 3. Число 7 передається як аргумент printf, і на цей раз ділення на " cдійсне". Оскільки pє членом простору імен, він починає нульову ініціалізацію на початку програми і має нульове значення вказівника, тому *pне визначене поведінка. У Linux, оскільки програма намагається змінити пам'ять за нульовою адресою, програма отримує a 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) / Стакс , 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))

Спробуйте в Інтернеті! (Стакс) або Запустити та налагодити! (Стакс)

Послідовно в 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 припиняється кожного разу, коли вона намагається вискочити або зазирнути з порожнього стека. Це робить трохи складніше, і ми повинні підготувати стопку, яка не порожня. 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”“¢ḅñ⁵ẹḞŀẊịñṙȧṄɱ»;ȮṠṛƓ

Спробуйте в Jelly!

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

Обидві мови застосувати зворотний İдо 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.

Помилка М - 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 та a 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 Забув редагувати це, вибачте.
Esolanging Fruit

7
Я думаю, що в інтерпретаторі Foo є помилка. Очевидно, це повинно Only Jon Skeet can divide by zero. помилитися

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: .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, але це оператор довжини в Луа. Додаткові реквізити до 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]/**/;}}

Зловживання різними режимами управління між 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 вважає (порожній масив) хибним значенням, тоді як воно є truthy в 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 і кожної системи, до якої я маю доступ.

У перл програма обробляє всю програму C у вигляді рядка, використовує регулярний вираз , /T.*n /щоб відповідати , This program errors out inа потім друкує , що і perl :P. dieвикликає збій програми з помилкою Died at script_name line 2.

Якщо ви не любите це як помилку, 1/0має однакову довжину і збої з Illegal division by zeroпомилкою. Мені просто подобається dieбільше;)

Спробуйте в Інтернеті! (C)

Спробуйте в Інтернеті! (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");}}}

Спробуйте в Інтернеті! (Java)

Спробуйте в Інтернеті! (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();}

Неперевірений на Mac; По суті, Джон Кук вказував (у своєму блозі ), що POSIX не визначає гамму; Linux використовує журнал функції гамма (log (gamma (1)) поверне 0, що спровокує виняток з плаваючою комою); OSX використовує "справжню" гамма-функцію (яку офіційно називають tgamma per POSIX); це повертає 1, який потім потрапить у заяву про переривання; Я намагався змусити його викинути іншу помилку з плаваючою комою (наприклад, sqrt (-1), але я забуваю, як зробити цю помилку кидка проти просто повернути нуль)


0

Perl, Bash (78 байт)

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

Вихід у Perl:

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

Вихід на Bash:

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

(Зауважте, що Bash дійсно відображає line 4помилку, незважаючи на те, що рядок 3 не закінчується каналом рядка ...)



0

C (gcc) і Haskell , 135 байт

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

Спробуйте в Інтернеті (С)! Спробуйте в Інтернеті (Haskell)!

Результат досягається переплетенням коментарів, версія C по суті така:

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

(Провал досягається написанням перед початком рядка).

З іншого боку, версія Haskell зводиться до наступного:

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

(Невдача досягається шляхом виведення хвоста в порожній список)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.