triplegolf - важна не только длина исходного кода!

15

Цель этой задачи - написать программу, в которой длина следующих трех будет одинаковой:

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

Победитель является самым коротким кодом, отвечающим всем трем критериям, и должен иметь длину не менее 1 символа.

Чтобы оживить ситуацию, если вывод содержит менее трех разных символов, он получает штраф в 5 баллов, добавленный к длине каждого (так что +10, если только один тип, +5 для двух).

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

В случае равного количества очков, тот, кто печатает наиболее интересный результат (вместо мусора), становится победителем.

ВСЗ
источник
1
Что такое «тип персонажа»?
Питер Тейлор
5
Кроме того, что если компилятор выдаст вывод без предупреждения (например, «Compiling Main»)? Кроме того, что если имя исходного файла появляется в предупреждающих сообщениях (например, «foo.c: 1: 1: ...»)?
Джои Адамс
3
Моим оружием выбора является VBA, который на самом деле не имеет компилятора и не выводит двоичный файл для запуска (как я полагаю, в случае с некоторыми другими языками). Есть ли соображения по этому поводу, или я просто дисквалифицирован по умолчанию?
Гаффи
2
Интересно, возможен ли тройной квин на каком-то языке?
Ry-
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__);?>
l0n3sh4rk
источник
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
Хлебница
источник
Насколько я понимаю, непечатаемые (белые пробелы?) Усечены, так что это не считается. Если это сработает, я могу улучшить свой ответ.
Гаффи
1
Управляющие символы обычно не считаются пробелами, за исключением, конечно, \ t, \ n, \ r, \ f и иногда \ v. Ни один из них не находится на лидирующей или тянущей позиции, поэтому я решил, что я в безопасности.
хлебница
1
Я думаю, что это вполне приемлемо. Они не пробельные, и в любом случае это не ACM быть , что строгие требования. Основная причина этого "правила пробелов" заключалась в том, что некоторые IDE могли сильно форматировать выходные данные компилятора.
vsz
1
@ Копия, Или main(i){i='\z';while(i-->74)putchar(i);}- но уменьшение размера программы на самом деле контрпродуктивно.
хлебница
1
Это мой любимый ответ, я знаю, что должен был запретить доступ к содержимому файла (так же, как это делают настоящие квинны)
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

Зш , 20 байт

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

Проблема, с которой мы здесь сталкиваемся, упоминается в комментарии выше: Zsh печатает имя программы в дополнение к номеру строки перед каждой ошибкой. Решение здесь использует односимвольное имя файла, чтобы злоупотребить этим. Я обернул его в вспомогательный скрипт, чтобы показать, что именно он печатает, и использовать wc -cв stderr, stdout и исходном файле.

Вывод: 569Xcatcatcatcatcatпосле новой строки.
Ошибки: s:[:2: ']' expectedпосле новой строки.


РЕДАКТИРОВАТЬ: альтернативное 20-байтовое решение без ограничения файла:

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

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

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

<<<$_$_$_

-xфлаг включает xtrace. Это снова требует односимвольного имени файла. Попробуйте онлайн!

Зш zsh -JNTwEDY , 12 байт

<<<$->&1 >&2

Кратчайший -flagответ без указания имени файла. Устанавливает больше флагов и $-печатает их все. Попробуйте онлайн!

GammaFunction
источник
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.

ETHproductions
источник
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 есть метод warn, но он просто выводит свои аргументы в $ stderr, делая его менее похожим на предупреждение.

Redouane Red
источник
1

Python, 57 байт

Другие переводчики могут отображать предупреждение по-разному. Это было проверено только для работы на TIO.

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

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

Выход

prtprtprtprtprtprtprtprtprtprtprtprtprtprtprtprtprtprtprt

Предупреждение

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

Обратите внимание, что начальные пробелы не учитываются при подсчете байтов. Если начальные пробелы не были проигнорированы, это можно сделать за 51 байт.

mbomb007
источник
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
vrugtehagel
источник
0

VBA, 39 байт

Не уверен, что это правильно, учитывая ограничение компилятора, но:

Ввод: (в ближайшем окне)

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

* Вывод включает в себя непечатные символы, которые плохо воспроизводятся в этом окне.

Gaffi
источник
VBA не дает никаких предупреждений компилятора, поэтому я не думаю, что это считается действительным
Тейлор Скотт