Вдохновленный этим вопросом о SO , ваша задача состоит в том, чтобы создать программу, которая действительна (по крайней мере) в двух основных версиях выбранного вами языка и дает различный вывод.
правила
- Можно использовать любой язык, имеющий более одной основной версии.
- Для целей этой задачи я бы предложил «основную версию», где изменяется первое число в номере версии.
- PHP 4 и PHP 5 отличаются, PHP 5.3 и PHP 5.4 - нет.
- Однако, поскольку я не знаю схемы управления версиями для всех языков, если вы сможете достаточно хорошо аргументировать свою позицию, я уверен, что сообщество определит, насколько вы были справедливы в определении «основной версии» самостоятельно.
- Для целей этой задачи я бы предложил «основную версию», где изменяется первое число в номере версии.
- Код должен быть скомпилирован и запущен с одинаковыми флагами и каждый раз вводиться
- За исключением изменения версии языка, если это уместно
- Ошибки не считаются выходными данными, а ответы, которые приводят к ошибкам, дисквалифицируются (вместо того, чтобы вывод ошибок просто игнорировался)
- Программа не должна предпринимать никаких действий, кроме той, которая требуется для ее запуска.
- Для каждой данной версии выходные данные всегда должны быть одинаковыми
- Предполагается, что это изменение должно быть следствием изменения спецификации языка, а не спецификации виртуальной машины или метаданных среды.
счет
- код-гольф типа выигрыша по длине, поэтому
+1
для каждого символа / байта -1
для каждого символа разница в длине вывода.- например, выходные данные версии 1
abcde
(5 символов), выходные данные версии 2123abc
(6 символов) =-1
- например, выходные данные версии 1
Другие правила
- Применяются стандартные исключения - никаких внешних программ, веб-запросов и т. Д.
- Ваша программа должна завершиться (в течение 2 секунд)
- Самый низкий балл побеждает.
«Лучше» забил
Сохраняйте свои оригинальные ответы, в интересах справедливости я отмечу победителя на основе оригинальных правил.
Так как мой первоначальный результат в корне нарушен, почему бы не пересчитать / повторить попытку с помощью следующей системы оценок:
- код-гольф типа выигрыша по длине, поэтому
+1
для каждого символа / байта +1
для каждого символа разница в длине выводаabcde
и123456
->+1
-1
для каждого уникального различия символов в выводе (ограничено длиной кратчайшего вывода)abcde
и123456
->-5
12345
и123456
->-1
12345
и123455
->0
- Очки, близкие к нулевой победе
- В случае второго тай-брейка выигрывает простой код-гольф .
code-challenge
Джеймс Вебстер
источник
источник
zzzz
иaaaa
это мне даст-4
? Это то, что мне кажется.Ответы:
Пересмотренный ответ для «лучшей» системы оценки
C89 / C99, оценка: 0
Моя программа длиной 52 символа и использует тот же механизм, что и в моем исходном ответе, для достижения другого результата. Это работает, потому что C89 не рассматривает
//
как комментарий:Результаты:
Старый ответ:
C89 / C99, Оценка: -Бесконечность?
Я не совсем уверен, что эта программа не нарушает правила, но не берите в голову. Эта программа использует тот факт, что в C89
//
это не правильный комментарий, но/* ... */
есть.Используя трюк с комментарием, выполняется другая функция. В C89 функция просто печатает
"trolololol..."
до тех пор, пока стек не переполнится (поэтому он может завершиться в течение 2 секунд).C99
C89
источник
Scores closest to zero win
так что это на самом деле очень далеко от нуля.Python - на 10 баллов меньше, чем следующий лучший ответ
В Python 2 это напечатает весь список целых чисел от 0 до 99.
В Python 3
range
есть генератор и поэтому он будет печатать только «диапазон (0,100)».Поскольку я никогда не сталкивался с ограничением размера чисел в Python, я могу заменить эти 100 на гораздо большее число (например, 2 ** 1000) и в результате получить практически бесконечную разницу в выходных данных.
Отредактировано, чтобы отразить тот факт, что, хотя я могу получить бесконечно низкий балл для любой практической цели, я не могу достичь фактической бесконечности с программой, которая заканчивается менее чем за 2 секунды
Для обновленной системы оценки тай-брейков я бы отправил:
Выход:
Python 2:
[0, 1, 2, 3]
Python 3:
range(0, 4)
Первый отпечаток содержит 5 уникальных символов (
[123]
), второй - 8 уникальных символов (range(4)
), разница в длине вывода равна 1, код состоит из 15 символов, самый короткий вывод - 11 символов ... эти правила довольно запутанные, но Я думаю, что это подводит меня к окончательному счету 15 + 1-минута (11,5 + 8) = 5.источник
Питон - 0 очков
Понятия не имею, как это работает: P Просто наткнулся на него, пробуя случайный код.
На Python 3 это
<class 'int'>
и на Python 2, это<type 'int'>
(с помощью интерактивной консоли)«Лучше» Оценка: 3 (длина) + 1 (разность символов) - 4 (уникальные символы)
Старый Питон 1 - 7 очков
Большое спасибо @grc за эту версию и помогу мне вычесть четыре очка!
В Python 2 это утверждение интерпретируется как то,
print ()
что печатает пустой кортеж()
.В Python 3
print
функция является функцией и ничего не печатается.«Лучший» счет: 7 (длина) + 2 (разность символов) - 2 (уникальные символы)
Старый Python 2 - 13 очков:
«Лучший» счет: 12 (длина) + 2 (разность символов о / п) - 1 (уникальные символы о / п)
Я знаю, что это не победит, но все же дал ответ, так как это моя первая попытка Python :)
источник
print()
.dict.itertools()
: PC #
Я также изменил общие алгоритмы вывода типов методов между C # 2, 3 и 4. Например:
В C # 2 вывод типа метода говорит, что T не может быть одновременно
int
иint?
, и так, и так производит2
. В C # 3 вывод типа метода говорит «лучший компромисс междуint
иint?
естьint?
» и поэтому выбираетM<int?>
и производит 1.источник
Ruby, 4 символа + 0 различий в длинах символов - 3 уникальных разницы в символах = 1 балл
На Ruby 1.9 он будет печататься
"d"
. На 1.8 он печатает100
.Пояснение:
?d
это"d"
в 1.9 , и100
(ASCII - код для г) в 1.8.p x
эквивалентноputs x.inspect
.*
это и повторение строк и умножение.«Оптимизированная» версия для старой оценки:
Ruby, 8 символов - разница в 999999989 символов = оценка -999999981
Отпечатки
33000000000.0
для 1.8 и"!!!!!!
...!!!"
для 1.9. (?!
Это33
в 1,8 и"!"
в 1,9, и*
является как струна повторение и умножение.)На самом деле, с умножением вы можете пойти так далеко, как захотите, все зависит от скорости вашего компьютера.
источник
Bash - -∞ (до практических пределов)
Фактически, сколько у вас памяти. Например, около 10 ГБ:
Bash 2: не поддерживает диапазоны в расширении фигурных скобок, поэтому печатает
{0..999999999}
.Баш 3:
Любой язык - -∞ (до практических ограничений)
Вы получите это практически на любом языке, даже если это окажется немного сложнее. Как только вы можете сделать два разных значения, вы можете написать код, который будет производить произвольно разные выходные данные. Лучший метод оценки будет игнорировать различия в выходных данных.
источник
…
«любом языке» версия обозначает любые приемы, которые вы используете, чтобы ваша программа зависела от изменения языковой спецификации. Это определение версии, делаете ли выif $version >= 3
илиif isinstance(range(0),list)
.C #
Следующий код даст другой вывод для C # 5.0 и предыдущих версий C #
Выход: C # 5.0
Выход: C # 4.0
Причина объяснена в блоге Эрика Липперта
Закрытие по переменной цикла считается вредным
источник
Python, -14 очков (разница длин символов от 3 до 17 = -14)
Выходы Python 2:
0
Выходы Python 3:
0.6666666666666666
Лучшая версия для скоринга, 5 баллов (разница в длине 3 + 2 символа = 5)
Выходы Python 2:
1
Выходы Python 3:
1.5
источник
C #
Я добавил ковариацию и контравариантность в C # 4, поэтому программы вида:
Будет производить
false
в C # 2 и 3 иtrue
в C # 4.Однако можно утверждать, что это не считается, поскольку библиотека, содержащая определение,
IEnumerable<T>
также должна была измениться.источник
C ++ 98/11 - «Лучший» результат (115 символов - 115 уникальных символов, разница в результатах = 0 баллов)
Немного отредактированная версия, чтобы соответствовать новым правилам оценки
Golfed:
Безголовая версия:
Новое решение не сильно отличается от старого. В новом решении выходные данные как в C ++ 11, так и в C ++ 98 имеют одинаковую длину 116 символов, но их объединяет только один символ новой строки, добавляемый функцией put.
Для C ++ 98
u8
inu8"\x7E"[0]
все равно будет заменен, но теперь с"\x0B"
. Таким образом, полученное значение после предварительной обработки будет"\x0B""\x7E"[0]
. Две строки будут объединены,"\x0B\x7E"
и оператор нижнего индекса получит доступ к первому элементу, в этом случае символ со значением 11 в кодировке символов. Дополнительноi
будет добавлено значение, которое изначально равно 114. Таким образом, символ со значением 125 будет записан в результирующий массив. По мереi
приближения к нулю все значения от 125 до 11 будут записаны в массив иputs
будут печатать все символы со значениями от 11 до 125 плюс завершающая новая строка.В C ++ 11
u8"\x7E"[0]
будет интерпретироваться как строка UTF-8, состоящая из одного символа с шестнадцатеричным значением 7E. Оператор нижнего индекса теперь будет обращаться к этому символу, иi
к нему добавляется значение, что приводит к десятичному значению 241 во время первой итерации. Покаi
идет ноль, все значения до 126 будут записаны в массив иputs
будут печатать символы со значениями от 126 до 241 плюс завершающая новая строка.В зависимости от используемого набора символов это приведет к различным результатам, так как большинство наборов символов имеют только первые 128 общих символов.
Для ISO-8859-2 вывод будет следующим:
C ++ 98:
C ++ 11:
C ++ (106 символов - 107 разница в выводе = оценка -1) (СТАРЫЕ ПРАВИЛА)
Golfed:
Безголовая версия:
Составлено с
g++ -std=c++98 main.cpp
иg++ -std=c++11 main.cpp
.На самом деле вы можете заменить
108
любое положительное число в целочисленном диапазоне, чтобы получить отрицательные оценки. Пока это больше, чем 108;)В C ++ 98
#define u8 "f"
заставит препроцессор заменитьu8""[0]
на"f"""[0]
. Это приведет к тому"f"[0]
, что в конечном итоге станет один символ'f'
, который записывается в массив.puts(c)
выведет результирующий массив, состоящий из i-1'f'
.В C ++ 11
u8""[0]
пустая строка будет интерпретироваться как строка UTF-8, поэтому конкатенация строк не выполняется. Поскольку это C-строка, оператор нижнего индекса получит доступ к завершающему нулевому байту и запишет его в массив.В конце
puts(c)
выведите итоговый массив, который состоит только из нулевых байтов. Но так какputs
перестает читать ввод, как только он встречает нулевой байт, он будет печатать только новую строку и ничего больше.источник
?
(по крайней мере, в моей системе (Mac))CSS2 против CSS3 48 очков
Отображается как
ABCDEFGHIJKLMNOPQRSTUVWXYZ
(маленькие заглавные буквы) в браузерах CSS3Отображается как
abcdefghijklmnopqrstuvwxyz
в не-CSS3 браузерах74 символа - разница 26 уникальных символов = 48
источник
Perl, 24 символа - (9 * (10 ^ 9)) - разница в 1 символ = оценка - ((9 * (10 ^ 9)) - 1) +24
Печатает 9e9 раз
a
для всех версий ниже 5, печатаетa
для всех версий выше 5. Вы можете сделать счет бесконечно низким, просто добавив большеa
s во второй вывод.источник
Befunge, 36 - 378 = -342; 164 - 2576 = -2412
В Befunge 93 это вывело бы 3 пробела, а затем
<v
следуют 76 пробелов,<v
затем 76 пробелов<v
, затем 76 пробелов, затем<v
77 пробелов, затемv
78 пробелов. Длина:3 + 2 + 76 + 2 + 76 + 2 + 76 + 2 + 77 + 1 + 78 = 395
Это легко расширяется путем добавления дополнительных строк, аналогичных первым 5 строкам.В Befunge 98 это будет выводиться
<v <v <v <v v
.Разница в длине:
395 - 17 = 378
. Таким образом, оценка была бы (по старым правилам):-342
Примечание: я мог бы получить еще большую разницу, если бы использовал
.
вместо,
; разница была бы-684
Изменение правила:
Это немного сложнее.
Befunge 93 выход:
Выход Befunge 98:
Длины:
2576
. Ни один из символов между строками не совпадает, поэтому, если я правильно понял задачу, мой результат будет164 - 2576 = -2412
(да, я должен был стремиться0
, но это было веселее). Если мне нужно сделать так, чтобы каждый символ в каждой строке был уникальным и отличался друг от друга, я могу сделать это, пожалуйста, сообщите мне.источник
Powershell, «лучший» результат, -163 (разница 15–178 символов = -163)
Powershell V2
Powershell V3
источник
PHP, оценка: 0 (в лучшем случае)
Вау, это будет весело, чтобы объяснить.
Согласно этому веб-сайту , эта
srand()
функция, похоже, не работает с PHP 5.1.5 до PHP 5.3.14 . Поэтому мы собираемся рассмотреть PHP 4.4.9 и одну случайную версию PHP 5, которая попадает в указанный выше интервал версий.Выход PHP 4.4.9:
1505335290
Я не думаю, что это нарушает правила; Поскольку это похоже на ошибку, вывод должен быть таким же, но это не так. Другая наша версия PHP просто пропустит
srand()
функцию и выведет случайное число.источник
Ява (около -2.000.000.000)
Версии Java иногда называют 1.x, но я думаю, что это все еще в рамках правил.
Самый простой способ - проверить, существует ли класс, представленный в конкретной версии.
(Зависит немного от вашего терминала, можно ли вывести 2 миллиарда символов за две секунды. Для нового скоринга замените
Integer.MAX_VALUE
счетчик байтов программы, чтобы получить идеальный нулевой счет.)Этот код зависит от используемой версии VM / JDK (это считается?)
Он печатает
z
s для Java 6 и более раннихa
версий JDK и s для последних версий.источник
JavaScript (ES3 против ES5) - 9 очков
длина
10
+ разница в длине0
- разница на выходе1
Выходы
1
для современных браузеров, которые поддерживают Array.prototype.map. Выводы0
в старых браузерах. Я проверил это с IE8.Со старыми правилами: 0 баллов
длина
26
- разница в длине26
Выводы
00000000000000000000000000
в современных браузерах. И пустая строка на старом.источник
Python - 0
Python 2 печатает лебеду, а Python 3 ничего не печатает.
РЕДАКТИРОВАТЬ: Обновлено, исправлено.
источник
APL (5 - (1988894-1) = -1988888)
В APL старого стиля (например, Dyalog, если
⎕ML=0
*)↑
означает mix , который на одномерном векторе ничего не делает. В APL2-стиле APL, такие как GNU APL (или Dyalog if⎕ML=3
),↑
означает first , который берет первый элемент вектора.Таким образом, следующие
5
байты (АПЗ кодировки делают посадку в бай),выводит
1988894
байты (список чисел от 1 до 3e5, разделенных пробелами) на диалектах APL старого стиля,и
1
байт (только первое число в указанном списке, который имеет1
длину и, следовательно, имеет длину1
) в диалектах APL в стиле APL2.Заметки:
⎕ML
означает уровень миграции . В Dyalog APL, чем выше значение⎕ML
, тем больше функций в стиле APL2. По умолчанию оно0
. (И это глобальная переменная! Весело!)3e5
было самым высоким 3-символьным значением, которое Dyalog APL примет⍳
.4e5
дал мнеLIMIT ERROR
. Это ограничение, вероятно, зависит от переводчика. (У GNU APL не было проблем с более высокими значениями.)источник
Bash 7 (длина программы 14 байтов + разница в длине вывода - 7 различий в уникальных символах в выходе)
Относится к ответу @Gilles, но имеет другую функцию расширения и разные версии. Оценка по отредактированному вопросу:
Выход для bash 3.x:
Выход для bash 4.x:
источник
PHP: -134217684 (43 - 134217727)
Использование:
В PHP5 + это ничего не печатает, так как ip2long с недопустимым аргументом превращается в false, что приводит к нулю. В PHP4 он
ip2long("")
возвращает -1, и мы дополняем пустую строку 128 МБ ОГa
.Маска установлена так, чтобы она возвращалась задолго до 2 секунд на моей машине. Если вы не можете сделать это за 2 секунды, купите лучшее оборудование!
С новыми правилами: 0 (40 - 40. Вы не можете приблизиться к нулю.)
Выходы:
источник
C89 / C99 комментарий, 45 символов, 0 очков
выход с89
QRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}
- 45 знаковвыход C99
MLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"!
- 45 знаковисточник
printf
кputchar
; Самое страшное, что для r5 я неправильно понял правила и случайно соединил новые и старые оценки. Вывод для [r5, r6] является ошибкой. r3 в другом ответе C содержит точно такую же ошибку. Если вы посмотрите на временные метки, то увидите, что здесь был опубликован r5 , когда другой ответ обновился. Не то, чтобы это имело значение, так как это кодовый гольф , и эта запись удовлетворяет вызову в меньшем количестве символов, точка.С ++ 98 / C ++ 11
Для стандартного компилятора C ++ 98 это выводит 199711 раз букву «x», в то время как для стандартного компилятора C ++ 11 это 201103 умножение на букву «x». Следовательно, разница в длине вывода составляет 1392 символа. Это означает, что на самом деле игра в исходные коды не имеет смысла, так как гораздо больший эффект можно получить, просто заменив
"x"
более длинную строку или умножив ее__cplusplus
на некоторое число.источник
SmileBASIC 3 / SmileBASIC 2, оценка: -5 (оригинальная оценка)
В современных версиях SB он печатается,
1000000000
как и ожидалось, но в версии 2 и более ранних он печатается10
из-за ошибки.источник
TI-Basic 83 Plus против 84 Plus, оценка 5-1 = 4
Выходы
2
на TI-83 Plus, где одна и та же программа анализируется как нечто похожееlength("?►DMS
на то, чтоsetTime(
команда еще не была введена. Таким образом, строка содержит два 1-байтовых токена, ее длина равна 2.Выходы
1
на TI-84 Plus, потому что строка, содержащая один 2-байтовый токен, имеет длину 1.источник
Перейти 1.9-> 1.10. Оценка = 1 - 1 = 0
С 1.10 отмечает :
1,8:
256
1,9:
1024
1,10:
10340
источник