En este desafío tratamos de resolver dos problemas importantes a la vez. Son:
- Enteros dados una y b , saber si un b -1 es un número primo.
- Enteros dados una y b , el rendimiento de nCr (a, b).
Específicamente, debe escribir dos programas, uno que realiza la primera tarea y otro que realiza el otro. Como queremos resolver ambos problemas a la vez, se recomienda utilizar un mismo código en ambos programas.
Tanteo
El puntaje de una respuesta es la distancia de Levenshtein entre los dos programas. Puntaje más bajo es mejor. En caso de empate, gana la respuesta con el código combinado más corto de los dos programas. Puede usar este script para calcular la puntuación de su solución.
Reglas
- Debe escribir dos programas en el mismo idioma que resuelvan las tareas descritas anteriormente. Puede usar cualquier método de E / S que desee. Para la tarea 1, puede devolver un valor verdadero / falso o elegir dos valores para significar verdadero y falso y devolverlos en consecuencia. P.ej. puedes elegir que
"prime"
significa verdadero y"not prime"
falso. - Los algoritmos que use deben funcionar para todas las entradas posibles, pero está bien si el código falla para números grandes debido a limitaciones del tipo de número usado. Puede suponer que la entrada es válida.
Ningún subconjunto del programa debe resolver el problema, es decir. el código no debe funcionar si se eliminan los caracteres. Por ejemplo, el siguiente código no es válido, porque es posible eliminar el bloque else no utilizado sin romper el programa:
if (1) { /* change to 0 to get the second program*/ ... } else { ... }
Las lagunas estándar no están permitidas.
Casos de prueba
a b -1 es primo?
a b
1 1 false
2 3 true
5 2 false
2 5 true
4 3 false
2 7 true
nCr
a b nCr(a,b)
1 1 1
5 2 10
4 3 4
10 7 120
12 5 792
Respuestas:
MATLAB, distancia 10
Primalidad
nCr:
fuente
PHP, distancia 29
a^b-1
imprime 0 para verdadero y cualquier valor entero> 0 para falsonCr(a,b)
PHP, distancia 36
a^b-1
imprime 1 para verdadero nada para falsonCr(a,b)
fuente
Rubí, Distancia 1, Longitud combinada 194
Comprobación principal:
Pruébalo en línea!
nCr:
Pruébalo en línea!
Como se predijo en los comentarios, algunos idiotas siempre tienen que ir en contra del espíritu del problema. Sin embargo, fue divertido encontrar una manera de evitarlo. Así es como funciona: tenemos dos soluciones separadas para los problemas. Ejecutamos ambos, los colocamos en una matriz y luego elegimos el elemento 0 o el primero, para una distancia de edición de 1. Esto normalmente sería ilegal, ya que podría eliminar todo menos el cálculo que deseara y seguiría funcionando . Sin embargo, cada fragmento de código está escrito para confiar en la carga de la misma biblioteca estándar
'mathn'
:prime?
mathn
cambiar el funcionamiento de la división: antes de cargarla, se3/4
evalúa en0
, mientras que luego se evalúa en la fracción(3/4)
. Como el resultado intermedio de(a+1-i)/i
no siempre es un número entero, el resultado general es incorrecto sin la biblioteca.Ahora solo necesitamos hacer que la carga de la biblioteca sea contingente para que el resto del código no se modifique. Hacemos esto generando el nombre mathn usando la longitud de caracteres del resto del código principal: el cálculo combinado tiene una longitud 55, que duplicado a 110 es el valor ASCII de 'n'. Entonces, concatenando esto en la cadena 'matemáticas' se obtiene la biblioteca deseada.
Como beneficio adicional, la introducción de las dependencias de la biblioteca también hace que el código se ejecute en un período de tiempo razonable. En particular, el enfoque ingenuo de nCr no generaría resultados intermedios fraccionarios.
fuente
05AB1E , distancia 3
nCr
Pruébalo en línea!
isPrime (a ^ b-1)
Pruébalo en línea!
fuente
Apilado , distancia 13
Pruébalo en línea! El primero calcula nCr, la segunda primalidad, utilizando el teorema de Wilson.
(f g h) fork!
sacaN
args de la pila (llámalosa0 ... aN
) y aplicaa0 ... aN f a0 ... aN h g
.Para el primer programa:
Y para el segundo:
fuente
Pitón 2 , distancia 15 , longitud 172
Tarea 1
Tarea 2
Pruébalo en línea!
fuente
Mathematica, distancia 10
Tarea 1:
PrimeQ[#2^#-1]&
Tarea 2:
Binomial[#2,#]&
Ambas funciones toman las entradas en el orden
b,a
.fuente
Javascript ES7, distancia 14
Gracias @Conor O'Brien por reducir la distancia en 7
Primalidad
Devuelve 1 si prime devuelve 0 si no prime.
Verificación principal increíblemente ineficiente, verifica el módulo de número cada número más pequeño que él y mayor que 1 ...
nCr:
¡Multiplica 1 por cada número de y + 1 a x y divide por cada número de 1 a xy (x! / Y!) / (Xy)!
fuente
f=x=>y=>{t=x+1;s=1;for(i=1;i<t;i++){if(y<i)s*=i/(i-y)}return s}
distancia de edición 14. ¡ Pruébelo en línea!Octava, distancia
171615nCr
Pruébalo en línea!
isprime(a^b-1)
Pruébalo en línea!
No soy muy fluido en Octave, así que no sé si hay un incorporado para calcular nCr.
fuente
MATL , distancia 4, longitud 6
Indica si
a^b-1
es primo:Pruébalo en línea!
Calcular
nCr(a,b)
:Pruébalo en línea!
Cómo funciona
Indica si
a^b-1
es primo:Calcular
nCr(a,b)
:fuente
Pyth, distancia 4, longitud total 8
Primalidad de
a^b-1
Pruébalo en línea!
nCr (a, b)
Pruébalo en línea!
Ambos toman la entrada como tuplas / listas de enteros (por ejemplo
(1,2)
).fuente
PHP, distancia 14
Escribir un programa con dos funciones y solo llamar a una de ellas conduciría a una distancia de 1, pero sería demasiado aburrido.
Prueba principal, 100 bytes:
nCr, 98 bytes:
fuente
Gelatina , distancia 4, longitud 5
Tarea 1
Tarea 2
Pruébalo en línea!
Cómo funciona
Tarea 1
Tarea 2
fuente
JavaScript, Puntuación: 1, Longitud:
144142126117función (a, b) {s = "a = Math.pow (a, b) -s.length + 79; for (b = 2; a% b ++;); b> a1for (t = s.length-79 ; b;) t = t * a - / b - "; devuelve eval (s.split (1) [1])}Ambas subrutinas usan la longitud del otro para calcular su propia constante, por lo que no se puede eliminar ningún carácter.fuente