triplegolf - не враховується лише довжина вихідного коду!


15

Мета цього завдання - написати програму, де довжина наступних трьох абсолютно однакова:

  • довжина вихідного коду
  • довжина виводу, який він друкує на стандартний вихід
  • довжина попереджень компілятора, які він генерує за допомогою (не зміненого) компілятора на ваш вибір

Переможець - найкоротший код, який повинен виконати всі три критерії, і повинен бути не менше 1 символу.

Щоб підкріпити речі, якщо на виході є менше трьох різних символів, він отримує 5-бальний штраф до довжини для кожного (так +10, якщо лише один тип, +5 для двох).

(Нові рядки вважаються як 1 або 2 символи, ваш вибір, але він повинен бути узгоджений за всіма трьома критеріями. Провідні та відсталі пробіли ігноруються у всіх рядках у всіх трьох критеріях)

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


1
Що таке "тип характеру"?
Пітер Тейлор

5
Крім того, що робити, якщо компілятор видає попередження без попередження (наприклад, "Компіляція головного")? Крім того, що робити, якщо ім'я вихідного файлу з’являється у попереджувальних повідомленнях (наприклад, "foo.c: 1: 1: ...")?
Джої Адамс

3
Моєю зброєю вибору є VBA, яка насправді не має компілятора і не видає бінарний файл для запуску (як я вважаю, це стосується деяких інших мов). Чи є в цьому міркування, чи я просто дискваліфікований за замовчуванням?
Гаффі

2
Цікаво, чи можлива потрійна квітка якоюсь мовою?
Ри-

2
Для інтерпретованих мов ми отримуємо вихід навіть при виникненні помилки; в такому випадку приймаються ці помилки чи приймаються лише попередження?
l0n3sh4rk

Відповіді:


14

Баш, 23 символи

Помилка:

bash: /: Is a directory

Джерело:

echo       $0-$01234;/;

Вихід:

/bin/bash-/bin/bash1234


Brainf * ck, 32 символи

Цей код виконується близько 3 секунд і зупиняється та відображає наступну помилку та вихід.

Помилка:

bff: out of memory (-2058691272)

Джерело:

+++++[......-]..+[>>>>>>>>>>>>-]

Вихід: (Hexdump)

0505 0505 0505 0404 0404 0404 0303 0303
0303 0202 0202 0202 0101 0101 0101 0000


C, 35 символів

Увага:

b.c:1:30: warning: division by zero

Джерело та вихід:

main(){system("cat "__FILE__)/0;;;}


PHP, 50 символів

Увага:

PHP Warning:  Division by zero in /tmp/3 on line 1

Джерело та вихід:

<?php echo (0/0).''.file_get_contents(__FILE__);?>

1
Приклад bash - це помилка, а не попередження.
Пітер Тейлор

Який компілятор ви використовуєте для рішення C?
хлібниця

@breadbox gcc версія 4.7.0 20120505 (попередня версія) (GCC)
l0n3sh4rk

8

C - 48 символів

main(i){while(++i<49)putchar(i);putchar('\z');}

Примітка: включає заключний (у стилі Unix) новий рядок.

Вихід з gcc a.cчитання:

a.c:1:41: warning: unknown escape sequence '\z'

Вихід з a.outбільшості не надрукованих символів, тому ось, як це виглядає після проходження через hexdump:

00000000: 0203 0405 0607 0809 0A0B 0C0D 0E0F 1011  ................
00000010: 1213 1415 1617 1819 1A1B 1C1D 1E1F 2021  .............. !
00000020: 2223 2425 2627 2829 2A2B 2C2D 2E2F 307A  "#$%&'()*+,-./0z

Я розумію, що недруковані (whitepace?) Усічені, тому це не рахується. Якщо це працює, я можу вдосконалити власну відповідь.
Гаффі

1
Контрольні символи зазвичай не вважаються пробілами, за винятком, звичайно, для \ t, \ n, \ r, \ f, а іноді і \ v. Жодне з них не перебуває на провідній чи задній позиції, тому я зрозумів, що в безпеці.
хлібниця

1
Я думаю, що це цілком прийнятно. Вони не пробільні, і в будь-якому випадку це не ACM бути , що суворі вимоги. Основна причина цього "правила пробілу" полягала в тому, що деякі ІДЕ можуть сильно форматувати висновки компілятора.
vsz

1
@copy, Або main(i){i='\z';while(i-->74)putchar(i);}- але зменшення розміру програми насправді контрпродуктивне.
хлібниця

1
Це моя улюблена відповідь, я знаю, що я повинен був заборонити доступ до вмісту файлу (так, як це роблять справжні quines)
vsz

5

JavaScript, 63 66

!function x(){console.log(x+'...');eval(Array(33).join('$'))}()

Вихід:

function x(){console.log(x+'...');eval(Array(33).join('$'))}...

У Chrome помилка:

ReferenceError: $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ is not defined

3

Visual Basic .NET, 185

Джи, vbcдосить багатослівний з його попередженнями про компіляцію. У всякому разі, код такий:

Public Module Main
    Public Sub Main()
        Console.WriteLine(New String("a"c,185))
    End Sub

    Public Function A()
        'This is actually just padding.
        'Hi
    End Function
End Module

(Зверніть увагу, що вони повинні бути вкладками, а не пробілами.)

Вихід такий:

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

І попередження компілятора таке:

warning BC42105: Function 'A' doesn't return a value on all code paths. A null reference exception could occur at run time when the result is used.

    End Function
    ~~~~~~~~~~~~

(Цього разу це фактично чотири пробіли, а не вкладки.)


3

Zsh , 20 байт

<<<   $-$_$_$_$_$_
[

Про проблему, з якою ми стикаємося тут, згадується у коментарі вище: Zsh друкує назву програми на додаток до номера рядка перед кожною помилкою. Тут рішення використовує односимвольне ім'я файлу для зловживання цим. Я загорнув його в помічник сценарію, щоб показати, що саме друкує, і використавwc -c у stderr, stdout та вихідний файл.

Вихідні дані: 569Xcatcatcatcatcatсупроводжуються
помилками нового рядка : s:[:2: ']' expectedслідом за новим рядком


EDIT: Альтернативне 20-байтне рішення без обмеження файлу:

<<<$-$-$-$-$_>&1 >&2

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

ЗШ , zsh -x, 10 байт

<<<$_$_$_

-xпрапор дозволяє xtrace. Для цього знову потрібно односимвольне ім'я файлу. Спробуйте в Інтернеті!

Zsh zsh -JNTwEDY , 12 байт

<<<$->&1 >&2

Найкоротша -flagвідповідь без вимоги до імені файлу. Встановлює більше прапорів і $-друкує їх усі. Спробуйте в Інтернеті!


2

JavaScript (Firefox 54), 34 байти

alert((f=function(x)1234)(56)+f+f)

Виходи:

1234function(x)1234function(x)1234

І воно надсилає це попередження на консоль браузера:

expression closures are deprecated

Схоже , що це в моїй копії Firefox Developer Edition (54.0a2). Він може працювати і в інших версіях Firefox.


2

Рубі, 48 символів

IO=1;puts ?a*48;# let's make it 48 bytes long :)

Виходи

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

Попереджає

r.rb:1: warning: already initialized constant IO

(файл - r.rb, я видалив шлях, якщо ви запустите його з irb, ви отримаєте (irb): 1: попередження ...)

Існує метод попередження в Ruby, але він просто виводить свої аргументи до $ stderr, роблячи це менш схожим на попередження.


1

Пітон, 57 байт

Інші перекладачі можуть по-різному відображати попередження. Це було протестовано лише для роботи над TIO.

from warnings import*
print("prt"*19)
warn("Warning...!")

Спробуйте в Інтернеті

Вихідні дані

prtprtprtprtprtprtprtprtprtprtprtprtprtprtprtprtprtprtprt

Увага

.code.tio:3: UserWarning: Warning...!
  warn("Warning...!")

Зауважте, що провідні пробіли не зараховуються до числа байтів. Якщо провідні пробіли не були проігноровані, це можна зробити в 51 байті.


1

Javascript (ES6), 32 30 байт

Screen(console.log(Function));

відбитки

ƒ Function() { [native code] }

в Chrome, а потім кидає

TypeError: Illegal constructor

Моє оригінальне 32-байтне рішення:

(x=y=>console.log(x+!0+10)||z)()

по-перше, відбитки

y=>console.log(x+!0+10)||ztrue10

І викидає помилку

ReferenceError: z is not defined

0

VBA, 39 байт

Не впевнений, чи відповідає це, враховуючи обмеження компілятора, але:

Введення: (у безпосередньому вікні)

For i=1 To 39:a=a & Chr(i):Next:Print a

* Вихід включає символи, що не надруковуються у цьому вікні.


VBA не дає жодних попереджень компілятора, тому я не думаю, що це вважається дійсним
Тейлор Скотт,

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