La tarea
En este desafío, su tarea es escribir un programa en un lenguaje de programación L que tome un entero positivo n , y genere la suma de los divisores apropiados de n ( secuencia A001065 en OEIS). Debería devolver la salida correcta para cualquier 1 ≤ n ≤ 10 000 . Aquí están las primeras 10 salidas:
0, 1, 1, 3, 1, 6, 1, 7, 4, 8
Además, su programa debe ser un políglota falso , lo que significa lo siguiente. Es un programa válido en otro lenguaje de programación L ' , y para cada entrada 1 ≤ n ≤ 10 (los casos de prueba anteriores), devuelve la suma de divisores propios de n , pero existen unos 11 ≤ n ≤ 10 000 para los cuales No devuelve el resultado correcto. Puede devolver algo incorrecto, repetirse para siempre, bloquearse, etc. Puede dar un resultado incorrecto para todos los n ≥ 11 , para algunos de ellos o solo uno.
Reglas y puntaje
Puede escribir un programa completo o una función, y puede tener diferentes medios de entrada y salida en los dos idiomas. El conteo de bytes más bajo gana. Aplican reglas estándar de código de golf . En este desafío, las diferentes versiones principales o implementaciones de un lenguaje se consideran distintas.
Tenga en cuenta que si usa lenguajes de programación con codificaciones que no sean ASCII (como lo hacen muchos en este sitio), se debe usar la misma secuencia de bytes para ambos idiomas. Esto significa que debe convertir entre páginas de códigos potencialmente diferentes o sufrir penalizaciones por caracteres Unicode de varios bytes.
Casos de prueba adicionales
20 -> 22
36 -> 55
180 -> 366
997 -> 1
2875 -> 869
10000 -> 14211
Python 2 y Python 3, 58 bytes
TIO para Python 2
TIO para Python 3
Funciona en python 2, pero por cada n> 10 generaría 0 en python 3.
Todo debido a diferentes enfoques en la comparación de cadenas con bytes:
'' == b''
'' != b''
fuente
JavaScript (Node.js) y PHP ,
7370 bytesEn ambos idiomas, esta es una función anónima. JavaScript da el resultado correcto, pero PHP da 0 para todos n> = 11 .
Pruébalo JS!
Pruébalo PHP!
Cómo funciona
Al principio, ambos idiomas hacen lo mismo: iterar de 1 a n-1, manteniendo una suma de todos los números i para los cuales n% i = 0 .
Lo que causa la diferencia en el comportamiento es la parte final:
En JavaScript,
"$n"
es solo un literal de cadena. La comparación>
con10
lo convierte en un número implícitamente, pero como no parece un número, se convierte en NaN. NaN da falso en comparación con un número de cualquier manera. Como resultado,$d
siempre se devuelve.Sin embargo, en PHP,
"$n"
es una cadena que contiene el valor de$n
. Cuando PHP convierte esto en un número, simplemente se convierte en el valor de$n
. Si es mayor que10
, entonces0
se devuelve en lugar de$d
.fuente
05AB1E / Jelly ,
98 bytesEl código de bytes (hexadecimal):
El uso de la página de códigos de Jelly devuelve resultados incorrectos para cualquier número excesivo (por ejemplo, una entrada de 12 retornos en
12
lugar de16
):Pruébalo en línea!
El uso de la página de códigos de 05AB1E devuelve resultados correctos:
Pruébalo en línea!
¿Cómo?
05AB1E analiza hasta e incluye el
71
(q
) que le indica que salga y luego detiene el análisis:Jelly analiza todo el programa por adelantado como tres enlaces debido al efecto de los bytes sin un significado asignado
ƭ
yq
actuando como delimitadores. El punto de entrada de un programa es su enlace final:fuente
ÆḌSD
Guarda un byte.ÆḌSṚ
.Python 3 / Python 2 ,
646058 bytesGracias a @officialaimm por 2 bytes de descuento
En Python 3 esto da los resultados correctos. En Python 2, la salida es incorrecta para entradas que exceden
10
. El código explota el redondeo de los banqueros, hecho por Python 3 pero no por Python 2.Pruébalo en línea! Python 3 (correcto), Python 2 (incorrecto para
n > 10
).fuente
[ ]
.Python 3 / Python 2 , 47 bytes
Una función sin nombre, falsa en Python 2.
Pruébelo en línea para Python 3 o Python 2
En Python 2
/
es división entera con argumentos enteros, mientras que en Python 3 es división.Cuando
n
excede 10 se10/n
evalúa a 0 en Python 2, pero a un pequeño número positivo en Python 3 (esto es cierto hasta el máximo requerido de 10,000 al menos).Como tal, se
10/n>0
evalúaTrue
para Python 3 yrange(10/n>0,n)
es equivalente arange(1,n)
mientras que en Python 2 se10/n>0
evalúaFalse
cuandon
excede 10, con lo cual serange(10/n>0,n)
convierte en equivalente arange(0,n)
hacern%d
que se intente realizar una aritmética de módulo cero, elevando aZeroDivisionError
.fuente
Jalea / 05AB1E , 12 bytes
Lo que ve Jelly:
Pruébalo en línea!
Explicación:
q
es admitido en la jalea, jalea de manera única "ve" lo que hay después de laq
.Lo que ve 05AB1E:
Pruébalo en línea!
Explicación:
Por supuesto, todo después de "dejar de fumar" en realidad no sucede.
fuente
ÆḌS
hubiera sido válido por sí solo ... ¡Respuesta extraordinaria!мλS
funcionaría en 05AB1E.