Ваша задача - написать полиглот, который работает на разных версиях вашего языка. При запуске он всегда выводит языковую версию.
правила
- Ваша программа должна работать как минимум в двух версиях вашего языка.
- Вывод вашей программы должен быть только номером версии. Никаких посторонних данных.
- Ваша программа может использовать любой метод для определения номера версии. Однако выходные данные должны соответствовать правилу 2; однако вы определяете номер версии, вывод должен быть только номер.
- Ваша программа должна выводить только основную версию языка. Например, в FooBar 12.3.456789-beta вашей программе нужно будет только вывести 12.
- Если ваш язык помещает слова или символы до или после номера версии, вам не нужно выводить их, а только номер. Например, в C89 ваша программа должна только печатать
89
, а в C ++ 0x ваша программа должна только печатать0
. - Если вы решите напечатать полное имя или вспомогательные номера версий, например, C89, а не C99, он должен печатать только имя.
C89 build 32
действует, покаerror in C89 build 32: foo bar
нет. - Ваша программа не может использовать встроенные, макро или пользовательские флаги компилятора для определения языковой версии.
счет
Ваша оценка будет равна длине кода, деленной на количество версий, в которых он работает. Победа с наименьшим количеством очков, удачи!
(number of languages)^3 / (byte count)
.Ответы:
Серьезно и актуально , 3 байта, оценка 1,5
Попробуйте онлайн: на самом деле , серьезно
Объяснение:
u
иD
наличие функциональности в строках было добавлено только в Actually (который является Серьезно v2).источник
v1
ветви. До того, как серьезно осуждается, фактически проживал вv2
филиале. Кроме того, серьезно используются1.x
номера версий в выпусках , а на самом деле используются2.x
(как там, так и на PyPI ).Python 3.0 и Python 2, оценка 6
(12 байт, 2 версии)
Попробуйте онлайн:
Python 2
Python 3
Полагается на тот факт, что Python 3+ по умолчанию использует деление с плавающей запятой, в отличие от Python 2, который использует деление по полу.
источник
Your program should work in at least two versions of your language.
Работает как минимум в двух версиях 2.7 и 3.0. Я выбралto print the full name or minor version numbers
.from __future__ import division
, проблема решена :)Java, 189 байт, 10 версий, оценка = 18,9
Поддерживаемые версии:
1.0
,1.1
,1.2
,1.3
,1.4
,1.5
,1.6
,1.7
,1.8
и9
(Для предыдущих оценок, проверьте историю !)
Запустите его на Java 8
Запустите его на Java 9 или новее
Ungolfed
Обратите внимание, что часть кода
return v<9?"1."+v:v;
(ранееreturn(v<9?"1.":"")+v;
) необходимо проверять на соответствие любой версии между Java 1.0 и Java 1.3. У меня нет установки Java 1.3 или более ранней версии для тестирования этого синтаксиса.Введение
У версий Java есть особая история. Все версии исторически были в
1.x
том числе1.0
. Но ... начиная с Java 9 и JEP223 , схема версий изменилась с использования1.x
наx
. Это версия как внутренне известная. Итак, у нас есть следующая таблица (вместе с Javadoc и Wikipedia ):Эта запись вызова соответствует столбцу версии в таблице выше, которая содержится в системном свойстве
"java.version"
.объяснение
Цель состоит в том, чтобы проверить, с какой версии класс начинает существовать, потому что Java не поддерживает код, но никогда не удаляет его. Код был специально написан на Java 1.0, чтобы быть совместимым со всеми версиями, опять же, потому что JDK (в основном) совместим с исходным кодом .
Реализация пытается найти кратчайшие имена классов, представленные в каждой версии. Однако, чтобы получить байты, нужно попытаться выбрать общий подпакет. До сих пор я обнаружил, что наиболее эффективный пакет состоит в том,
java.util
что он содержит несколько действительно коротко названных классов, распределенных по всем версиям Java.Теперь, чтобы найти фактический номер версии, имена классов отсортированы по версии. Затем я пытаюсь последовательно создавать каждый класс и увеличивать индекс массива. Если класс существует, мы переходим к следующему, в противном случае мы позволяем исключению быть пойманным
try
-блоком. Когда это сделано, выдается еще одно исключение, потому что больше нет классов, существование которых мы должны проверить.В любом случае поток покинет
try
-блок с исключением. Это исключение не перехвачено, а просто поставить на удержание благодаряfinally
-блоку, который , в свою очередь , переопределяет исключение на удержании на самом деле возвращает значение , которое"1."+v
гдеv
находится индекс , используемый ранее. Также бывает, что мы сделали этот индекс соответствующим младшему номеру версии Java.Важной частью игры в гольф было нахождение кратчайшего нового имени класса в пакете
java.util
(или любом детском пакете) для каждой версии. Вот таблица, которую я использовал для расчета этой стоимости.кредиты
хорошемумышлению "из коробки"!finally
трюк.return(i<9?"1.":"")+i;
сreturn i<9?"1."+i:i;
(это должно быть подтверждено против 1,0 или максимум 1,3 , поскольку каких - либо изменений синтаксиса произошло до 1.4)Со встроенными
Если встроенные были разрешены:
54 байта для 13 версий (от 1,0 до 12), поэтому оценка будет 4,1538.
источник
return"...
без пробела во всех версиях tbh.)String v(){return "1."+(e("time.Year")+e("nio.file.Path")+e("io.Console")+e("util.UUID")+e("text.Bidi")+e("util.Timer")+e("sql.Ref")+e("lang.Void"));}int e(String c){try{Class.forName("java."+c);return 1;}catch(Exception e){return 0;}}
String v(){int i=0;try{for(String[]s={"lang.Void","sql.Ref","util.Timer","net.URI","util.UUID","net.IDN","nio.file.Path","time.Year","lang.Module"};;i++)Class.forName("java."+s[i]);}catch(Exception e){}return"1."+i;}
finally{return"1."+i;}
.Python , 606 байт / 15 версий = оценка 40,4
-67 байт (смеется) благодаря NoOneIsHere.
Версии: 0.9.1, 2 (.0), 2.2, 2.2.2, 2.5.0, 2,5.1, 3 (.0), 3.1, 3.1.3, 3.2.1, 3.3, 3.4, 3.5 aa и 3.6 ,
Все заслуги в удивительном ответе Sp3000 . Конечный перевод строки необходим.
Ух, это было весело для гольфа. Это должно работать (да, я установил каждую из этих версий), но я мог случайно что-то испортить. Если кто-нибудь найдет ошибку, пожалуйста, дайте мне знать.
источник
print'0.9.1'
неверного синтаксиса.print
вызове ... Спасибо, что сообщили мне знать!except
s наexcept:
).x=<string inside eval>
вместо того, чтобы просто проверить код вручную?1/0
, но потом я понял. Спасибо!С ++ 14.11.17, оценка = 147/3 = 49
Для того, чтобы различать C ++ 11 и C ++ 14/17, он использует изменение по умолчанию
const
ностиconstexpr
функций членов в C ++ 14 (с кредитом к примеру на https://stackoverflow.com/questions/23980929/ что-изменения-введенные-в-c14-могут-потенциально-сломать-программу-написано-в-c1 ). Чтобы различать C ++ 14 и C ++ 17, он использует тот факт, что C ++ 17 отключил триграфы.Ungolfed:
(Протестировано с использованием Debian gcc 7.1.0
-std=c++{11,14,17}
.)источник
include
и<
, например, в операторах включения#include<iostream>
.__cplusplus
макрос) - тогда, чтобы отличить C ++ 17 от C ++ 14, я бы склонялся к использованию изменений в диапазоне для семантики. Возможно, создайте минимальные классы итераторов / стражей по аналогии с темboost::integer_iterator
, чтобы преобразование часового в итератор имело «удивительное» поведение.return 0;
неявно для,main
так что вы можете сохранить 9 байтов там. Также в соответствии сwc -c
вашим решением используется 251 байт, а не 252 (ваш редактор, возможно, вставил новую строку в конце).return *
=>return*
EcmaScript 3/5/2015/2016/2017 в браузере, 59 байт / 5 версий = 11,8 балла
Сэкономьте 1 байт благодаря GOTO 0
источник
-!
вместо того,+!!
где это имеет смысл (и соответственно изменить числовые константы).JavaScript (ES5 & ES6), 14 байтов / 2 версии = 7
0o
-стильные восьмеричные константы являются новыми в ES6; ES5 приводит строку, кNaN
которой не влияет результат побитового XOR.источник
JavaScript (ES 2, 3 и 5 -
89),59/6 = 9,83375/7 = 10,714Можно также представить решение с большим количеством версий, даже если оно имеет оценку несколько выше, чем у решения с 2 версиями.
Попробуйте онлайн
Проверяет наличие различных методов в прототипах Array, RegExp и String, отменяет их, давая логическое значение, и вычитает логическое значение от начального значения 9. Умножение
![].map
учитывает тот факт, что ES4 был оставлен.dotAll
Собственности (и связанный с нимиs
флаг) для регулярных выражений были введены в ES2018 (v9).padEnd
String был представлен в ES2017 (v8).includes
Array был представлен в ES2016 (v7).keys
Array был представлен в ES2015 (v6).map
Array был введен в ES5.1 (v5).pop
Array был введен в ES3 (v3).источник
PHP 5/7, оценка 5,5
3V4L это онлайн!
PHP 5.3.9 / 5.3.11, оценка 10
3V4L это онлайн!
Онлайн-версия длиннее, потому что в старых версиях PHP в песочнице не включены короткие теги.
источник
Befunge:
1511 байт / 2 версии = 5.5@ Pietu1998 сбрил 4 байта
Попробуйте онлайн:
Befunge 93
Befunge 98
Использует эксклюзивный оператор точки с запятой Befunge 98 («перейти к следующей точке с запятой») для различения версий. Оба напечатают «9». Befunge 93 проигнорирует точки с запятой, вычтет 5 из «8» (значение осталось в верхней части стека), выведет получившуюся «3» и завершится. Befunge 98, с другой стороны, пропустит, напечатает «8» и завершит работу.
источник
"89",;5-;,@
для 11 байтов;
частью.Pyth 4/5 - 6 байт / 2 версии = 3
В Pyth 5 четное количество пробелов в начале строки игнорируется для использования в отступе, в то время как в Pyth 4 он действует как один пробел и предотвращает печать
5
. В Pyth 4 точки с запятой просто заканчивают операторы, что позволяет4
печатать, а в Pyth 5 пробел и точка с запятой делают оставшуюся часть строки комментарием.источник
Python 3 и Python 2.0, 18 байт, оценка 18/2 = 9
Банковское округление в Python 3, стандартное округление в Python 2.
Попробуйте онлайн - Python 3!
Попробуйте онлайн - Python 2!
источник
Кубически, 4 байта, оценка 4 / ∞
Работает в каждой версии вашей системы имеет достаточно памяти для запуска. Не конкурирует, потому что это хромает. Действительно для этого мета-поста .
По сути, B3 вращается на один ряд от левой грани в верхнюю границу. F3 будет работать так же хорошо, как F3 или B3. Так как один ряд в Cubically 3x3x3 представляет собой три кублета на один кубет, это помещает три
1
в верхнюю грань, что дает ему сумму%0
граней, равную 3., печатает эту верхнюю грань, печатая 3 для Cubically 3 x3x3.В кубическом 4x4x4 строки - 4x1 кубы. Ставит 4 1 в верхнюю грань, получая сумму 4.
источник
16/32/64-битный машинный код x86: 11 байт, оценка = 3,66
Эта функция возвращает текущий режим (размер операнда по умолчанию) как целое число в AL. Звони из Си с подписью
uint8_t modedetect(void);
Машинный код NASM + список исходных кодов (показывающий, как это работает в 16-битном режиме, поскольку
BITS 16
говорит NASM собирать мнемонику источника для 16-битного режима.)Обоснование :
В машинном коде x86 официально нет номеров версий, но я думаю, что это удовлетворяет цели вопроса, так как приходится создавать конкретные числа, а не выбирать то, что наиболее удобно (это занимает всего 7 байтов, см. ниже).
Исходный процессор x86, Intel 8086, поддерживал только 16-битный машинный код. 80386 представил 32-битный машинный код (можно использовать в 32-битном защищенном режиме, а затем в режиме Compat под 64-битной ОС). AMD представила 64-битный машинный код, который можно использовать в длинном режиме. Это версии машинного языка x86 в том же смысле, что Python2 и Python3 - это разные языковые версии. Они в основном совместимы, но с преднамеренными изменениями. Вы можете запускать 32- или 64-разрядные исполняемые файлы непосредственно под ядром 64-разрядной ОС, так же, как и программы Python2 и Python3.
Как это устроено:
Начните с
al=64
. Сдвиньте его вправо на 1 (32-разрядный режим) или 2 (16-разрядный режим).16/32 против 64-битных: 1-байты
inc
/dec
кодировки являются префиксами REX в 64-битных ( http://wiki.osdev.org/X86-64_Instruction_Encoding#REX_prefix ). REX.W совсем не влияет на некоторые инструкции (например, ajmp
илиjcc
), но в этом случае, чтобы получить 16/32/64, я хотел бы включить или dec,ecx
а неeax
. Это также устанавливаетREX.B
, который изменяет регистр назначения. Но, к счастью, мы можем сделать это, но настройку так, чтобы 64-битная версия не меняласьal
.Инструкции, которые выполняются только в 16-битном режиме, могут включать в себя
ret
, но я не нашел это необходимым или полезным. (И сделает невозможным встроенный фрагмент кода, если вы захотите это сделать). Это также может бытьjmp
внутри функции.16-битные и 32/64: немедленные 16-битные, а не 32-битные. Изменение режимов может изменить длину инструкции, поэтому 32/64 битные режимы декодируют следующие два байта как часть немедленной, а не отдельной инструкции. Я упростил задачу, используя 2-байтовую инструкцию здесь, вместо того, чтобы не синхронизировать декодирование, чтобы 16-битный режим декодировал с границ команд, отличных от 32/64.
Связанный: Префикс размера операнда изменяет длину непосредственного (если это не 8-разрядный немедленный знак), так же как разница между 16-битным и 32/64-битным режимами. Это затрудняет параллельное декодирование длины команды; Процессоры Intel имеют киоски декодирования LCP .
Большинство соглашений о вызовах (включая psABI x86-32 и x86-64 System V) позволяют узким возвращаемым значениям иметь мусор в старших битах регистра. Они также допускают удары CX / ECX / RCX (и R8 для 64-битных). IDK, если это было распространено в 16-битных соглашениях о вызовах, но это кодовый гольф, так что я всегда могу просто сказать, что это пользовательское соглашение о вызовах.
32-разрядная разборка :
64-разрядная разборка ( попробуйте онлайн! ):
Связанный: мой машинный код полигона x86-32 / x86-64 Q & A на SO.
Другое различие между 16-битным и 32/64 заключается в том, что режимы адресации кодируются по-разному. eg
lea eax, [rax+2]
(8D 40 02
) декодирует какlea ax, [bx+si+0x2]
в 16-битном режиме. Это, очевидно , трудно использовать для кода-гольфа, особенно с тех порe/rbx
иe/rsi
является вызовом сохранившегося во многих соглашениях о вызовах.Я также рассмотрел использование 10-байт
mov r64, imm64
, который является REX +mov r32,imm32
. Но так как у меня уже было 11-байтовое решение, это было бы в лучшем случае равным (10 байт + 1 дляret
).Тестовый код для 32 и 64-битного режима. (На самом деле я не выполнял его в 16-битном режиме, но разборка говорит вам, как он будет декодироваться. У меня не настроен 16-битный эмулятор.)
Эта программа Linux завершает работу с exit-status =
modedetect()
, поэтому запустите ее как./a.out; echo $?
. Соберите и свяжите его в статический бинарный файл, например7 байт (оценка = 2,33), если я могу нумеровать версии 1, 2, 3
Официальных номеров версий для разных режимов x86 нет. Мне просто нравится писать ответы на вопросы. Я думаю, что это нарушило бы намерение вопроса, если бы я просто назвал режимы 1,2,3 или 0,1,2, потому что дело в том, чтобы заставить вас генерировать неудобное число. Но если это было разрешено:
Который декодирует в 32-битном режиме как
и 64-битный как
источник
python2
сpython3
интерпретаторами в одной и той же программе Python. Новые процессоры x86 всегда включают режим, совместимый со старыми процессорами (это их единственное оправдание для использования такого сложного, трудно декодируемого формата машинного кода!), Но 32-битный защищенный режим 386 и длинный режим x86-64 действительно новые версии машинного кода x86. В длинном режиме даже удалены некоторые коды операций, что делает их недействительными.Brachylog / Brachylog v1 , 5/2 = 2,5
Попробуйте онлайн! (Brachylog)
Попробуйте онлайн! (Brachylog v1)
Пояснение к брахилогу:
Объяснение для Brachylog v1:
источник
2,1
в Brachylog v2 строится не список[2,1]
(2;1
будет), а номер21
(который не меняет способ, которым вы хотели, чтобы ваш ответ работал).2;1
не работал бы в Brachylog v1 как;
средство логического ИЛИ там.C89 / C99, 25 байтов, 2 версии, оценка = 12,5
//
комментарии стиля не распознаются в C89.Гольф версия:
Попробуйте онлайн: C89 , C99
источник
int v()
наmain()
, он короче и фактически скомпилируется как полная программа!Perl 5 и Perl 6,
23 байта19 байтов, оценка 9,5grep
Первая операция Perl 5 всегда рассматривается как регулярное выражение, а не в Perl 6.источник
Bash, все 4 версии,
727132 байта ⇒ оценка = 8Этот фрагмент кода использует различные интерпретации
$'...'
строк в каждой версии Bash.Выводит основной номер версии - и все.
Док нашел здесь .
Ungolfed:
Этот ответ наполовину предположение; Я тестировал только в bash 4 и 3, но он должен работать и на других версиях.
Дайте мне знать, если это произойдет / нет, я постараюсь с другими версиями, как только они будут доступны.
-1 символ благодаря Йенсу.
-29 байт благодаря Digital Trauma (вся
expr
идея)!источник
;;
в последней альтернативе. Используйте,;
чтобы сбрить байт.$'\xN
Похоже, что функция интерпретации была добавлена в 2.01.1 ... Мне придется обновить свой ответ. Работа над этимs="$'\ua\xa\n'";case ${#s} in 3)echo 4;;5)echo 3;;7)echo 2;;9)echo 1;esac
s=$'\ua\xa\n';expr 5 - ${#s} / 2
. Это работает на v3 и v4. У меня нет работающих старых версий, чтобы попробовать прямо сейчас.R, версии 2 и 3, оценка: 10,5 балла
Эта команда возвращается
2
для R 2.xx и3
для R 3.xx Функцияcite
была добавлена в R версии 3.0.0. Следовательно, командаexists("cite")
возвращаетсяFALSE
для R 2.xx иTRUE
для R 3.xxR, все версии (1, 2 и 3), оценка: 12⅓ баллов
Функция
eapply
была введена в R 2.0.0.источник
R.version$major
, 15 символов. Я не с тех пор, когда это существует.Python , 196 байт / 16 версий = оценка 12,25
Версии: 1.5, 1.6, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 3.0, 3.1, 3.2, 3.3, 3.4, 3.5 и 3.6.
К сожалению, мне пришлось опустить 2.7, потому что в это (насколько я могу судить), которые не в 2.6, но в 3.0.
Мы перебираем несколько модулей, представленных в разных версиях Python, и при первой ошибке завершаем работу и возвращаем версию. Пробелы между основными версиями заполняются путем многократного импорта
os
. Тест для Python 1.5 полагается наstring.split
отсутствие до 1.6.Благодарим Оливье Грегуара за ответ на идею тестирования новых классов / модулей в цикле.
Теперь я наконец-то протестировал все соответствующие версии python ... которые требовали редактирования исходного кода 1.5, чтобы заставить его скомпилировать ...
источник
Пакетный файл Windows , 35 байт / 2 версии = оценка 17,5
Печать
DOS
на MS-DOS (Дух) иNT
на Windows NT. (Дух)Теперь для некоторого объяснения.
Со времен MS-DOS в Windows был пакетный сценарий, и с тех пор он практически не изменился. Однако, когда появилась Windows NT , Microsoft изменила интерпретатор по умолчанию для пакетных скриптов с
COMMAND.COM
наcmd.exe
(теперь также разрешает расширение.cmd
в качестве альтернативы оригиналу.bat
).При этом они также реализовали несколько изменений , таких как
/i
флаг игнорирования строкового регистра в условных выражениях. То есть, покаZ==z
ложно,/i Z==z
верно.Мы эксплуатируем, что DOS не имеет нечувствительности к регистру, и сравниваем прописные
Z
и строчные буквыz
. Используя/i
флаг, мы получаемZ==z
(ложное) условие для DOS иz==z
(истинное) для NT.Теперь я понимаю, что в задании указывается номер версии. Но, насколько я знаю, нет «номера версии» для пакетного скриптинга, так что это самое близкое, что я мог получить.
Протестировано на Windows 10, DOSBox и vDos:
Windows 10:
(запустить,
cmd /k
чтобы предотвратить закрытие окнаexit
)DOSBox:
пКС:
источник
7
короче, чем WindowsNT
.7
самом деле это не языковая версия, она была одинаковой на всех Windows с 3.1. Так что я не думаю, что было бы очень справедливо называть это,7
когда, возможно, даже должно быть3.1
Wolfram Language / Mathematica 10/11, 37 байт / 2 версии = 18,5
Рассмотрим
(Length@DateRange[{1},{1}][[1]]+27)/3
, при 37 байтах и работе с 2 версиями, я получаю оценку 18,5.а также
Я уверен, что есть более эффективный способ, но расхождение между выходными данными DateRange в последнее время немного затронуло меня, поэтому я решил использовать это.
Как следствие, кто-то, возможно, мог бы воспользоваться
Length@DateRange[{1}, {1}][[1]]
оценками1
в Mathematica версии 1-8, но у меня не было времени, чтобы включить это.источник
$Version
:Your program may not use a builtin, macro, or custom compiler flags to determine the language version.
$Version
чтобы продемонстрировать, что он выводит правильный результат в правильной версии,$Version
не является частью моего ответа ...$VersionNumber
, но вместо этого вы называете это$Version
. На мой взгляд, хотя ядро вашей программы - этоLength@DateRange
то, что не сработает, если вы не$Version
предоставите полную информацию о версии, которую вы затем обрабатываете, что, следовательно, нарушает правила.{1} Tr[1^#&@@%~DateRange~%]/3+9
(31 байт) или даже7+Length@Now
(12 байт)Ruby 1.x и 2.x, 20 байт, оценка 10
На основе
to_h
метода, который был введен вArray
классе в Ruby 2.источник
p [].to_h&&2rescue 1
немного короче.Erlang, 180 байт, 11 версий, оценка 16,36
С отступом и переносом строки:
Протестировано на одном дополнительном выпуске каждой основной версии начиная с 10:
Идея состоит в том, что в каждом основном выпуске добавляется по крайней мере один новый допустимый аргумент для функции
erlang:system_info
, поэтому давайте попробуем те из списка, подсчитаем, сколько из них вышло из строя, и вычтем количество отказов из 20, что является текущей версией.источник
Юлия 0,4, 0,5, 46 байт, оценка 22
Юлия изменила имя типа конкретного и абстрактного типов String во многих версиях.
Этот код, в частности, использует преимущества:
Юлия 0,4 :
ASCIIString
,AbstractString
,String
.Юлия 0.5 :
String
,ASCIIString
,AbstractString
, (хотя это не имеет значения здесь)Смотрите также мое новое, более эффективное решение, основанное на разных принципах.
источник
Джапт (1 и 2),
86/2 =43Тест v1 | Тест v2
объяснение
До версии v2 Japt использовал настраиваемый синтаксис RegEx, поэтому мы можем воспользоваться этим.
Число 1 в виде строки.
Замените (
r
) ниже на2
.Japt 2 видит это как RegEx
/\S/g
, который соответствует1
. Japt 1 игнорирует\
escape-символ и просто видитS
, который является константой Japt для пробела и, очевидно, не совпадает с1
.источник
Befunge, оценка = 3,5
7 байтов, 2 версии
Попробуйте онлайн в Befunge-93
Попробуйте онлайн в Befunge-98
"]"
является строковым литералом в обеих версиях, помещая 93 (значение ASCII[
) в стек.'b
это символьный литерал в Befunge-98, нажимающий 98 (значение ASCIIb
), но это недопустимые инструкции в Befunge-93, поэтому они просто игнорируются. Таким образом, мы заканчиваем с 93 на вершине стека в Befunge-93 и 98 в Befunge-98..@
записывает значение в верхней части стека и затем выходит.источник
]".@.b'
или]g.@.b'
тоже работаRuby 1.x (<1.9) и 2.x,
108 байт, оценка = 4Попробуй:
Это работает, используя различные способы поведения
?x
между Ruby 1.x и 2.x. В Ruby 1.x?A
(например) возвращает65
(значение ASCII символаA
), но в Ruby 2.0 он возвращает односимвольную строку"A"
.Код выше эквивалентен этому:
В Ruby 1.x (<1.9) значением
val
является50
(значение ASCII символа2
) Fixnum.Fixnum#%
является оператором по модулю, поэтому50 % 7
возвращает1
.В Ruby 2.x
val
есть строка"2"
.String#%
является инфиксной версиейsprintf
, поэтому"2" % 7
эквивалентноsprintf("2", 7)
, где"2"
это строка формата. Поскольку строка формата не содержит никаких последовательностей формата (например%d
), последующие аргументы отбрасываются и"2"
возвращаются.Наконец,
$>
это псевдоним для$stdout
, поэтому$> << ...
печатает результат.источник
?A==66?1:2
прежде чем я наткнулся на ваш ответPython 2 и Python 3 ,
3634 байта, оценка1817В Python 2 хэш отрицательной бесконечности равен -271828, но в Python 3 это -314159. Редактировать: 2 байта, 1 балл, благодаря @ArBo.
источник
hash
впервые была установлена работа с бесконечными числами с плавающей точкой, соответствующий разработчик использовал pi * 1e5 и e * -1e5 в качестве хеш-значений. В какой-то момент в Python 3 значение has для отрицательной бесконечности изменилось и стало отрицанием значения хеш-функции для бесконечности.Питон 3 , Питон 2 , оценка 17,5
(35 байт, 2 версии)
Python 2 , 35 байт
Попробуйте онлайн!
Python 3 , 35 байт
Попробуйте онлайн!
Сохранено 5 байт благодаря ETHproductions
Не хороший код гольф-ответа, но масштабное изменение!
источник
try:exec("print 2")\nexcept:print(3)