Задание
В этой задаче ваша задача - написать программу на языке программирования L, которая принимает положительное целое число n и выводит сумму соответствующих делителей n ( последовательность A001065 в OEIS). Должно быть возвращено правильное значение для любого 1 ≤ n ≤ 10 000 . Вот первые 10 выходов:
0, 1, 1, 3, 1, 6, 1, 7, 4, 8
Кроме того, ваша программа должна быть фальшивым полиглотом , что означает следующее. Это допустимая программа на другом языке программирования L ' , и для каждого входа 1 ≤ n ≤ 10 (тестовые примеры выше) она возвращает сумму собственных делителей n , но существует несколько 11 ≤ n ≤ 10 000, для которых это не возвращает правильный результат. Он может возвращать что-то неправильное, цикл навсегда, сбой и т. Д. Он может дать неправильный результат для всех n ≥ 11 , для некоторых из них или только для одного.
Правила и оценки
Вы можете написать полную программу или функцию, и у вас могут быть разные средства ввода и вывода на двух языках. Побеждает самое низкое число байтов. Применяются стандартные правила игры в гольф . В этой задаче разные основные версии или реализации языка считаются разными.
Обратите внимание, что если вы используете языки программирования с кодировками не-ASCII (как это делают многие на этом сайте), для обоих языков должна использоваться одинаковая последовательность байтов . Это означает, что вы должны либо конвертировать между потенциально разными кодовыми страницами, либо подвергаться штрафам за многобайтовые символы Юникода.
Дополнительные тестовые случаи
20 -> 22
36 -> 55
180 -> 366
997 -> 1
2875 -> 869
10000 -> 14211
Python 2 и Python 3, 58 байт
TIO для Python 2
TIO для Python 3
Он работает в Python 2, но для каждого n> 10 он будет выводить 0 в Python 3.
Все из-за разных подходов при сравнении строк с байтами:
'' == b''
'' != b''
источник
JavaScript (Node.js) и PHP ,
7370 байтНа обоих языках это анонимная функция. JavaScript дает правильный результат, но PHP дает 0 для всех n> = 11 .
Попробуйте это JS!
Попробуйте это PHP!
Как это работает
Поначалу оба языка делают одно и то же: выполняют итерацию от 1 до n-1, сохраняя промежуточную сумму всех чисел i, для которых n% i = 0 .
Что вызывает разницу в поведении, так это заключительная часть:
В JavaScript
"$n"
это просто строковый литерал. Сравнение>
с10
неявным образом приводит его к числу, но, поскольку оно не похоже на число, оно становится NaN. NaN дает ложь при сравнении с числом любым способом. В результате$d
всегда возвращается.Однако в PHP
"$n"
есть строка, содержащая значение$n
. Когда PHP преобразует это в число, оно просто становится значением$n
. Если оно больше чем10
, то0
возвращается вместо$d
.источник
05AB1E / Желе ,
98 байтовБайт-код (шестнадцатеричный):
Используя кодовую страницу Jellÿ по возвращает неправильные результаты для любого избыточного количества (например , ввод 12 возвратов ,
12
а не16
):Попробуйте онлайн!
Использование кодовой страницы 05AB1E возвращает правильные результаты:
Попробуйте онлайн!
Как?
05AB1E анализирует до (включая )
71
(q
), который выдает команду, а затем прекращает синтаксический анализ:Jelly анализирует всю программу заранее как три ссылки из-за влияния байтов без назначенного значения
ƭ
иq
действует как разделители. Точка входа в программу - это ее окончательная ссылка:источник
ÆḌSD
сохраняет байт.ÆḌSṚ
.Python 3 / Python 2 ,
646058 байтСпасибо @officialaimm за 2 байта
В Python 3 это дает правильные результаты. В Python 2 вывод неправильный для превышения входных данных
10
. Код использует банковское округление, которое выполняется Python 3, но не Python 2.Попробуйте онлайн! Python 3 (правильно), Python 2 (неправильно
n > 10
).источник
[ ]
.Python 3 / Python 2 , 47 байт
Безымянная функция, подделка в Python 2.
Попробуйте онлайн для Python 3 или Python 2
В Python 2
/
это целочисленное деление с целочисленными аргументами, тогда как в Python 3 это деление.Если значение
n
превышает 10, то10/n
значение равно 0 в Python 2, но в небольшом положительном числе в Python 3 (это, безусловно, верно до максимально требуемого максимума в 10 000 ).Как таковой,
10/n>0
оцениваетсяTrue
для Python 3 иrange(10/n>0,n)
эквивалентен, вrange(1,n)
то время как в Python 210/n>0
оценивается,False
когдаn
превышает 10, после чегоrange(10/n>0,n)
становится эквивалентнымrange(0,n)
побуждениюn%d
к попытке выполнить арифметику по модулю ноль, поднимая aZeroDivisionError
.источник
Желе / 05AB1E , 12 байт
Что Желе видит:
Попробуйте онлайн!
Объяснение:
q
в Jelly не поддерживается, поэтому Jelly только «видит», что послеq
.Что видит 05AB1E:
Попробуйте онлайн!
Объяснение:
Конечно, после «выхода» все на самом деле не происходит.
источник
ÆḌS
бы, чтобы он действовал сам по себе ... Необычный ответ!мλS
будет работать в 05AB1E.