Kodunu tekrar kullan!


23

Bu mücadelede iki önemli sorunu bir kerede çözmeye çalışıyoruz. Onlar:

  1. Verilen tamsayılar bir ve b bir eğer, söyle b -1 bir asal sayıdır.
  2. A ve b tam sayılarına bakıldığında , nCr (a, b) değerini döndürün .

Özellikle, biri ilk işi diğeri diğeri yapan iki program yazmalısınız. Her iki sorunu da aynı anda çözmek istediğimiz için, her iki programda da aynı kod parçasını kullanmaya teşvik edilir.

puanlama

Bir cevabın puanı, iki program arasındaki Levenshtein mesafesidir. Düşük puan daha iyidir. Beraberlik durumunda, iki programın en kısa kombine koduna sahip cevap kazanır. Çözümünüzün puanını hesaplamak için bu betiği kullanabilirsiniz .

kurallar

  1. Yukarıda açıklanan görevleri çözen aynı dilde iki program yazmalısınız. İstediğiniz herhangi bir G / Ç yöntemini kullanabilirsiniz. Görev 1 için, bir hakikat / yanlışlık değeri veya doğru ve yanlış anlamında iki değeri seçip uygun şekilde geri getirebilirsiniz. Örneğin. Bunun "prime"doğru ve "not prime"yanlış anlamına geldiğini seçebilirsiniz .
  2. Kullandığınız algoritmalar, tüm olası girişler için çalışmalıdır, ancak kullanılan sayı türünün sınırlamaları nedeniyle büyük sayılar için başarısız olursa sorun olur. Girişin geçerli olduğunu varsayabilirsiniz.
  3. Örneğin, programın hiçbir alt grubu sorunu çözmemelidir. Herhangi bir karakter (ler) kaldırılırsa, kod çalışmamalıdır. Örneğin, aşağıdaki kod geçerli değildir, çünkü kullanılmayan else-block’u programı bozmadan kaldırmak mümkündür:

    if (1) { /* change to 0 to get the second program*/
        ...
    } else {
        ...
    }
    
  4. Standart boşluklara izin verilmez.

Test durumları

a b -1 asaldır?

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
Bu Levenshtein mesafesini hesaplamak için kullanışlı olabilir
Luis Mendo

3
Fikir güzel, ama hala kullanılmayan kısımlarda değişiklik yapılmasını önleyen ve daha sonra etkin bir şekilde yasaklamak istediğiniz yapıyla sonuçlanan Levenshtein mesafe 1 ile çözümler alacağınızı düşünüyorum.
Martin Ender

6
@LuisMendo Sorun, bu çözümlerin çoğunun gerçekten yavaş olması. Bunun yerine bu Matematik komut dosyasını kullanabilirsiniz.
Martin Ender

3
Bence daha iyi bir ölçüm, iki programın toplam uzunluğuna bölünen Levenshtein mesafesi olurdu.
Greg Martin,

1
@GregMartin Bu kod bovlingi ile sonuçlanmaz mı? Programları yapay olarak büyütmek ve gereksiz kodları olmadığını iddia etmek mümkündür.
fergusq

Yanıtlar:


7

MATLAB, mesafe 10

Asal Sayı:

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

nCr:

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

4
Aradığım dahili bu!
Kritixi Lithos,

7

PHP, mesafe 29

a^b-1 true için 0, false için> 0 olan herhangi bir tam sayı değeri yazdırır

[,$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, mesafe 36

a^b-1 yanlış için doğru hiçbir şey için 1 yazdırır

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

Yakut, Mesafe 1, Birleşik Uzunluk 194

Ana kontrol:

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

Çevrimiçi deneyin!

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}

Çevrimiçi deneyin!

Yorumlarda da belirtildiği gibi, bazı pislikler her zaman sorunun özüne karşı çıkmak zorundadır. Yine de etrafta dolaşmanın bir yolunu bulmak eğlenceliydi! İşte nasıl çalışıyor: Sorunlara iki ayrı çözümümüz var. Her ikisini de çalıştırırız, onları bir diziye koyarız ve sonra ya 1'inci öğeyi veya 1'i seçeriz, 1'lik bir düzenleme mesafesi için. Bu normalde kaçak olur, çünkü istediğiniz her şeyi silebilirsiniz, ancak hala çalışır. . Ancak, her kod pasajı, aynı standart kitaplığın yüklenmesine bağlı olarak yazılmıştır 'mathn':

  • İlk onun yerleşik kullanır prime?
  • İkincisi, mathnbölmenin çalışma şeklini değiştirmeye dayanır - yüklemeden önce, 3/4değerlendirir 0, daha sonra kesir için değerlendirir (3/4). Ara sonucu (a+1-i)/iher zaman tam sayı olmadığından, genel sonuç kitaplık olmadan yanlıştır.

Şimdi sadece kodun geri kalanında değiştirilmemiş olan kütüphane üzerine yükleme yapmamız gerekiyor. Bunu ana kodun geri kalanının karakter uzunluğunu kullanarak mathn ismini kullanarak yaparız: birleşik hesaplamanın uzunluğu 55, ikiye katlanan 110, 'n' ASCII değeridir. Böylece 'math' dizgisine birleştirmek istenen kütüphaneyi verir.

Bonus olarak, kütüphane bağımlılıklarının tanıtılması da kodu makul bir süre içerisinde çalıştırmasını sağlar. Özellikle nCr'ye naif yaklaşım, kesirli ara sonuçlara neden olmaz.



4

Yığılmış , mesafe 13

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

Çevrimiçi deneyin! İlki, Wilson teoremini kullanarak nCr'yi, ikinci primaliteyi hesaplar.

(f g h) fork!pops Nyığından args (onları arayın a0 ... aN) ve uygular a0 ... aN f a0 ... aN h g.

İlk program için:

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

Ve ikinci olarak:

[^#-:([]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 , mesafe 15 , uzunluk 172

Görev 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)

Görev 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)

Çevrimiçi deneyin!


3

Mathematica, mesafe 10

Görev 1: PrimeQ[#2^#-1]&

Görev 2: Binomial[#2,#]&

Her iki fonksiyon da girişleri sırayla alır b,a.


3

Javascript ES7, mesafe 14

Mesafeyi 7 azalttığı için @Conor O'Brien'a teşekkürler

Asal Sayı:

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

Asal değil, asal olursa 0 döndürür.

İnanılmaz derecede etkin olmayan prime kontrolü, her sayıdan daha küçük ve 1'den büyük olan modülo sayısını kontrol eder.

nCr:

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

1 ile x arasındaki sayıların her sayısını 1 ile çarpar ve her sayı ile 1'den xy'ye (x! / Y!) / (Xy)!


İkinci programı değiştirerek f=x=>y=>{t=x+1;s=1;for(i=1;i<t;i++){if(y<i)s*=i/(i-y)}return s}düzenleme mesafesi kazandırın. 14. Çevrimiçi deneyin!
Conor O'Brien,

2

Oktav, mesafe 17 16 15

nCr

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

Çevrimiçi deneyin!

isprime(a^b-1)

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

Çevrimiçi deneyin!

Octave'da çok akıcı değilim, bu yüzden nCr'yi hesaplayacak bir yerleşik var mı bilmiyorum.


1

MATL , mesafe 4, uzunluk 6

a^b-1Asal olup olmadığını söyle :

^qZq

Çevrimiçi deneyin!

Hesapla nCr(a,b):

Xn

Çevrimiçi deneyin!

Nasıl çalışır

a^b-1Asal olup olmadığını söyle :

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

Hesapla nCr(a,b):

Xn     % nchoosek with implicit inputs. Implicit display


1

PHP, mesafe 14

İki işlevli bir program yazmak ve bunlardan yalnızca birini çağırmak 1 mesafeye yol açacaktır, ancak çok topal olurdu.

Asal Test, 100 bayt:

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

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

Jöle , mesafe 4, uzunluk 5

Görev 1

*’ÆP

Görev 2

c

Çevrimiçi deneyin!

Nasıl çalışır

Görev 1

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

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

Görev 2

c     nCr atom

0

JavaScript, Puan: 1, Uzunluk: 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])}

fonksiyonu (a, b) {s = "a = Math.pow (a, b) -s.length + 79 b> a1for (t = s.length-79 (a% b ++, b = 2) için ; 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

Her iki alt yordam kendi sabitini hesaplamak için diğerinin uzunluğunu kullanır, böylece hiçbir karakter kaldırılamaz

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.