Riutilizza il tuo codice!


23

In questa sfida cerchiamo di risolvere due problemi importanti contemporaneamente. Loro sono:

  1. Interi Dato un e b , dire se un b -1 è un numero primo.
  2. Interi Dato un e b , restituiscono nCr (a, b).

In particolare, è necessario scrivere due programmi, uno che esegue la prima attività e uno che esegue l'altra. Dato che vogliamo risolvere entrambi i problemi contemporaneamente, si consiglia di utilizzare lo stesso codice in entrambi i programmi.

punteggio

Il punteggio di una risposta è la distanza di Levenshtein tra i due programmi. Il punteggio più basso è migliore. In caso di pareggio, vince la risposta con il codice combinato più breve dei due programmi. È possibile utilizzare questo script per calcolare il punteggio della soluzione.

Regole

  1. È necessario scrivere due programmi nella stessa lingua che risolvono le attività sopra descritte. È possibile utilizzare qualsiasi metodo I / O desiderato. Per l'attività 1, è possibile restituire un valore di verità / falsità o scegliere due valori per indicare vero e falso e restituirli di conseguenza. Per esempio. puoi scegliere che "prime"significa vero e "not prime"significa falso.
  2. Gli algoritmi utilizzati devono funzionare per tutti i possibili input, ma è OK se il codice non riesce per numeri grandi a causa delle limitazioni del tipo di numero utilizzato. Si può presumere che l'input sia valido.
  3. Nessun sottoinsieme del programma deve risolvere il problema, ad es. il codice non deve funzionare se vengono rimossi dei caratteri. Ad esempio, il seguente codice non è valido, poiché è possibile rimuovere il blocco else inutilizzato senza interrompere il programma:

    if (1) { /* change to 0 to get the second program*/
        ...
    } else {
        ...
    }
    
  4. Non sono ammesse scappatoie standard.

Casi test

a b -1 è 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
Questo può essere utile per calcolare la distanza di Levenshtein
Luis Mendo,

3
L'idea è buona, ma penso che otterrai comunque soluzioni con Levenshtein distance 1 che riescono a prevenire le modifiche alle parti inutilizzate in un modo o nell'altro e quindi alla struttura che vuoi proibire.
Martin Ender,

6
@LuisMendo Il problema è che molte di queste soluzioni sono molto lente. Puoi invece usare questo script di matematica.
Martin Ender,

3
Penso che una metrica migliore sarebbe stata la distanza di Levenshtein divisa per la lunghezza totale dei due programmi.
Greg Martin,

1
@GregMartin Non si tradurrebbe in bowling di codice? È possibile ampliare artificialmente i programmi e dichiarare che non hanno codici inutili.
Fergusq,

Risposte:


7

MATLAB, distanza 10

Primality:

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

nCr:

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

4
È quello che stavo cercando!
Kritixi Lithos,

7

PHP, distanza 29

a^b-1 stampa 0 per vero e qualsiasi valore intero> 0 per 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, distanza 36

a^b-1 stampa 1 per vero niente per 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

Rubino, Distanza 1, Lunghezza combinata 194

Primo controllo:

->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}

Provalo online!

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}

Provalo online!

Come previsto nei commenti, alcuni idioti devono sempre andare contro lo spirito del problema. È stato divertente trovare un modo per aggirarlo, però! Ecco come funziona: abbiamo due soluzioni separate per i problemi. Eseguiamo entrambi, li inseriamo in un array e quindi scegliamo il 0 ° elemento o il 1 ° per una distanza di modifica di 1. Questo sarebbe normalmente illegale, dal momento che potresti semplicemente cancellare tutto tranne il calcolo desiderato e funzionerebbe comunque . Tuttavia, ogni frammento di codice viene scritto in modo da fare affidamento sul caricamento della stessa libreria standard 'mathn':

  • Il primo usa il suo builtin prime?
  • Il secondo si basa sul mathncambiamento del funzionamento della divisione: prima di caricarlo, 3/4valuta 0, mentre successivamente valuta la frazione (3/4). Poiché il risultato intermedio di (a+1-i)/inon è sempre un numero intero, il risultato complessivo è errato senza la libreria.

Ora non ci resta che rendere il caricamento della libreria subordinato alla modifica del resto del codice. Lo facciamo generando il nome mathn usando la lunghezza dei caratteri del resto del codice principale: il calcolo combinato ha lunghezza 55, che raddoppia a 110 è il valore ASCII di 'n'. Quindi concatenandolo sulla stringa 'matematica' si ottiene la libreria desiderata.

Come bonus, l'introduzione delle dipendenze della libreria rende anche l'esecuzione del codice in un ragionevole lasso di tempo. In particolare, l'approccio ingenuo a nCr non genererebbe risultati intermedi frazionari.



4

Impilato , distanza 13

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

Provalo online! Il primo calcola nCr, la seconda primalità, usando il teorema di Wilson.

(f g h) fork!pops Nargs dallo stack (chiamali a0 ... aN) e si applica a0 ... aN f a0 ... aN h g.

Per il primo programma:

[([@.!]$/{%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)!
                 *              *

E per il secondo:

[^#-:([]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

Python 2 , distanza 15 , lunghezza 172

Compito 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)

Compito 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)

Provalo online!


3

Mathematica, distanza 10

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

Compito 2: Binomial[#2,#]&

Entrambe le funzioni accettano gli ingressi nell'ordine b,a.


3

Javascript ES7, distanza 14

Grazie @Conor O'Brien per aver ridotto la distanza di 7

Primality:

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

Restituisce 1 se primo restituisce 0 se non primo.

Controllo primo incredibilmente inefficiente, controlla il numero modulo ogni numero più piccolo di esso e maggiore di 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}

Moltiplica 1 per ogni numero da y + 1 a x e divide per ogni numero da 1 a xy (x! / Y!) / (Xy)!


Cambiare il secondo programma per f=x=>y=>{t=x+1;s=1;for(i=1;i<t;i++){if(y<i)s*=i/(i-y)}return s}dare la distanza di modifica 14. Provalo online!
Conor O'Brien,

2

Ottava, distanza 17 16 15

nCr

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

Provalo online!

isprime(a^b-1)

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

Provalo online!

Non sono molto fluente in Octave, quindi non so se esiste un built-in per calcolare nCr.


1

MATL , distanza 4, lunghezza 6

Dì se a^b-1è primo:

^qZq

Provalo online!

Calcolare nCr(a,b):

Xn

Provalo online!

Come funziona

Dì se a^b-1è primo:

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

Calcolare nCr(a,b):

Xn     % nchoosek with implicit inputs. Implicit display


1

PHP, distanza 14

Scrivere un programma con due funzioni e chiamarne solo una porterebbe a una distanza di 1, ma sarebbe troppo zoppo.

Test Prime, 100 byte:

[,$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 byte:

[,$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 , distanza 4, lunghezza 5

Compito 1

*’ÆP

Compito 2

c

Provalo online!

Come funziona

Compito 1

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

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

Compito 2

c     nCr atom

0

JavaScript, Punteggio: 1, Lunghezza: 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])}

funzione (a, b) {s = "a = Math.pow (a, b) -s.length + 79, per (b = 2; a% b ++,); b> a1for (t = s.length-79 ; b;) t = t * a - / b - "; return 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

Entrambe le subroutine usano la lunghezza dell'altro per calcolare la propria costante, quindi nessun carattere può essere rimosso

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.