Reutiliza tu código!


23

En este desafío tratamos de resolver dos problemas importantes a la vez. Son:

  1. Enteros dados una y b , saber si un b -1 es un número primo.
  2. 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

  1. 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.
  2. 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.
  3. 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 {
        ...
    }
    
  4. 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

1
Esto puede ser útil para calcular la distancia de Levenshtein
Luis Mendo

3
La idea es buena, pero creo que aún obtendrá soluciones con la distancia 1 de Levenshtein que logran evitar modificaciones a las partes no utilizadas de una manera u otra y luego resultan en la estructura que desea prohibir.
Martin Ender

66
@LuisMendo El problema es que muchas de esas soluciones son realmente lentas. Puedes usar este script de Matemáticas en su lugar.
Martin Ender

3
Creo que una mejor métrica habría sido la distancia de Levenshtein dividida por la duración total de los dos programas.
Greg Martin

1
@ GregMartin ¿No resultaría eso en boliche de código? Es posible ampliar artificialmente los programas y aún así afirmar que no tienen ningún código innecesario.
fergusq

Respuestas:


7

MATLAB, distancia 10

Primalidad

function x=f(a,b);x=isprime(a^b-1);

nCr:

function x=f(a,b);x=nchoosek(a,b);

44
¡Esa es la función que estaba buscando!
Kritixi Lithos

7

PHP, distancia 29

a^b-1 imprime 0 para verdadero y cualquier valor entero> 0 para falso

[,$a,$b]=$argv;for($c=-$i=1;$i<=$d=$a**$b-1;$d%++$i?:$c++);echo$c;

nCr(a,b)

[,$a,$b]=$argv;for($c=$i=1;$i<=$a;$c*=$i**(1-($i<=$a-$b)-($i<=$b)),$i++);echo$c;

PHP, distancia 36

a^b-1 imprime 1 para verdadero nada para falso

[,$a,$b]=$argv;for($c=-1,$i=1;$i<=$d=-1+$a**$b;)$d%++$i?:$c++;echo$c<1;

nCr(a,b)

[,$a,$b]=$argv;for($c=$d=$i=1;$i<=$a;$c*=$i++)$d*=$i**(($i<=$a-$b)+($i<=$b));echo$c/$d;

7

Rubí, Distancia 1, Longitud combinada 194

Comprobación principal:

->a,b{s='[(a**b-1).prime?,(1..b).inject(1){|m,i|(a+1-i)/i*m}][0]';require'math'<<s.size*2;eval s}

Pruébalo en línea!

nCr:

->a,b{s='[(a**b-1).prime?,(1..b).inject(1){|m,i|(a+1-i)/i*m}][1]';require'math'<<s.size*2;eval s}

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':

  • El primero usa su incorporado prime?
  • El segundo se basa en mathncambiar el funcionamiento de la división: antes de cargarla, se 3/4evalúa en 0, mientras que luego se evalúa en la fracción (3/4). Como el resultado intermedio de (a+1-i)/ino 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.



4

Apilado , distancia 13

[([@.!]$/{%y!x y-!*})fork!]
[^#-:([]1/$%{!n 1-!})fork!=]

Pruébalo en línea! El primero calcula nCr, la segunda primalidad, utilizando el teorema de Wilson.

(f g h) fork!saca Nargs de la pila (llámalos a0 ... aN) y aplica a0 ... aN f a0 ... aN h g.

Para el primer programa:

[([@.!]$/{%y!x y-!*})fork!]
[(                  )fork!]  apply the fork of:
  [@.!]                      equiv. { x y : x ! } => `x!`
       $/                    divided by
         {%        }         two-arg function
           y!                y!
             x y-                 (x - y)!
                 *              *

Y para el segundo:

[^#-:([]1/$%{!n 1-!})fork!=]  
[^                         ]  exponentiate  (a^b)
  #-                          decrement     (a^b-1)
    :                         duplicate     (a^b-1 a^b-1)
     (              )fork!    apply the fork to:
      []1/                    1-arg identity function
          $%                  modulus by
            {!     }          1-arg with `n`:
              n 1-             (n-1)
                  !                 !
                          =   check for equality

4

Pitón 2 , distancia 15 , longitud 172

Tarea 1

D=lambda k:max(k-1,1)
P=lambda n,k=0:n<k or P(n-1,k)*n/k
lambda a,b:P(a**b-2)**2%D(a**b)

Tarea 2

D=lambda k:max(k-1,1)
P=lambda n,k=1:n<k or P(n-1,D(k))*n/k
lambda a,b:P(a,b)/P(a-b)

Pruébalo en línea!


3

Mathematica, distancia 10

Tarea 1: PrimeQ[#2^#-1]&

Tarea 2: Binomial[#2,#]&

Ambas funciones toman las entradas en el orden b,a.


3

Javascript ES7, distancia 14

Gracias @Conor O'Brien por reducir la distancia en 7

Primalidad

f=x=>y=>{t=x**y-1;s=1;for(i=2;i<t;i++){if(!t%i)s=i-i}return s}

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:

f=x=>y=>{t=x+1;s=1;for(i=1;i<t;i++){if(y<i)s*=i/(i-y)}return s}

¡Multiplica 1 por cada número de y + 1 a x y divide por cada número de 1 a xy (x! / Y!) / (Xy)!


Cambiando el segundo programa a 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!
Conor O'Brien el

2

Octava, distancia 17 16 15

nCr

a=input("");b=input("");f=@(x)factorial(x);printf("%d",f(a)/f(b)/f(a-b))

Pruébalo en línea!

isprime(a^b-1)

a=input("");b=input("");f=@(x)isprime(x);printf("%d",f(a^b-f(8-6)))

Pruébalo en línea!

No soy muy fluido en Octave, así que no sé si hay un incorporado para calcular nCr.


1

MATL , distancia 4, longitud 6

Indica si a^b-1es primo:

^qZq

Pruébalo en línea!

Calcular nCr(a,b):

Xn

Pruébalo en línea!

Cómo funciona

Indica si a^b-1es primo:

^      % Power with implicit inputs
q      % Subtract 1
Zq     % Is prime? Implicit display

Calcular nCr(a,b):

Xn     % nchoosek with implicit inputs. Implicit display


1

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:

[,$a,$b]=$argv;function f($n){for($i=$n;--$i>0&&$n%$i;);return$i==1;}echo f($a**$b*-1)*(1|f($a-$b));

nCr, 98 bytes:

[,$a,$b]=$argv;function f($n){for($i=$n;--$i>0&&$n*=$i;);return$n*=1;}echo f($a)/(f($b)*f($a-$b));

0

Gelatina , distancia 4, longitud 5

Tarea 1

*’ÆP

Tarea 2

c

Pruébalo en línea!

Cómo funciona

Tarea 1

*’ÆP  Main link. Argument: a, b

*     Yield a**b.
 ’    Decrement; yield a**b-1.
  ÆP  Test the result for primality.

Tarea 2

c     nCr atom

0

JavaScript, Puntuación: 1, Longitud: 144 142 126 117

function(a,b){s="a=Math.pow(a,b)-t;for(b=2;a%b++;);b>a1for(;b;)t=t*a--/b--";t=s.length-56;return eval(s.split(1)[0])}

funció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])}

function A(a,b){a=Math.pow(a,b)-(B+0).length+63;for(b=2;a%b++;);return b>a;}
function B(a,b){for(t=(A+0).length-76;b;)t=t*a--/b--;return t;}
F=A

Ambas subrutinas usan la longitud del otro para calcular su propia constante, por lo que no se puede eliminar ningún carácter.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.