Sử dụng lại mã của bạn!


23

Trong thử thách này, chúng tôi cố gắng giải quyết hai vấn đề quan trọng cùng một lúc. Họ đang:

  1. Cho các số nguyên ab , cho biết a b -1 có phải là số nguyên tố không.
  2. Cho các số nguyên ab , trả về nCr (a, b).

Cụ thể, bạn phải viết hai chương trình, một chương trình thực hiện nhiệm vụ đầu tiên và một chương trình khác thực hiện. Vì chúng tôi muốn giải quyết cả hai vấn đề cùng một lúc, nên sử dụng cùng một đoạn mã trong cả hai chương trình.

Chấm điểm

Điểm của một câu trả lời là khoảng cách Levenshtein giữa hai chương trình. Điểm thấp hơn là tốt hơn. Trong trường hợp hòa, câu trả lời có mã kết hợp ngắn nhất của hai chương trình sẽ thắng. Bạn có thể sử dụng tập lệnh này để tính điểm của giải pháp của bạn.

Quy tắc

  1. Bạn phải viết hai chương trình trong cùng một ngôn ngữ để giải quyết các nhiệm vụ được mô tả ở trên. Bạn có thể sử dụng bất kỳ phương pháp I / O nào bạn muốn. Đối với nhiệm vụ 1, bạn có thể trả về giá trị trung thực / giả hoặc chọn hai giá trị có nghĩa là đúng và sai và trả lại chúng cho phù hợp. Ví dụ. bạn có thể chọn điều đó "prime"có nghĩa là đúng và "not prime"có nghĩa là sai.
  2. Các thuật toán bạn sử dụng phải hoạt động cho tất cả các đầu vào có thể, nhưng sẽ ổn nếu mã không thành công cho số lượng lớn do giới hạn của loại số được sử dụng. Bạn có thể cho rằng đầu vào là hợp lệ.
  3. Không có tập hợp con của chương trình phải giải quyết vấn đề, tức là. mã không được hoạt động nếu bất kỳ (các) ký tự nào bị xóa. Ví dụ: đoạn mã sau không hợp lệ, vì có thể loại bỏ khối khác không sử dụng mà không phá vỡ chương trình:

    if (1) { /* change to 0 to get the second program*/
        ...
    } else {
        ...
    }
    
  4. Sơ hở tiêu chuẩn không được phép.

Các trường hợp thử nghiệm

a b -1 là số nguyên tố?

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
Điều này có thể hữu ích để tính khoảng cách Levenshtein
Luis Mendo

3
Ý tưởng này rất hay, nhưng tôi nghĩ bạn vẫn sẽ nhận được giải pháp với Levenshtein khoảng cách 1 quản lý để ngăn chặn sửa đổi các phần không được sử dụng bằng cách này hay cách khác và sau đó có hiệu quả trong cấu trúc bạn muốn cấm.
Martin Ender

6
@LuisMendo Vấn đề là nhiều giải pháp đó rất chậm. Bạn có thể sử dụng tập lệnh Mathics này thay thế.
Martin Ender

3
Tôi nghĩ rằng một số liệu tốt hơn sẽ là khoảng cách Levenshtein chia cho tổng chiều dài của hai chương trình.
Greg Martin

1
@GregMartin Sẽ không có kết quả trong trò chơi bowling? Có thể làm cho các chương trình lớn hơn một cách giả tạo và vẫn cho rằng chúng không có bất kỳ mã không cần thiết nào.
fergusq

Câu trả lời:


7

MATLAB, khoảng cách 10

Nguyên thủy:

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

nCr:

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

4
Đó là tích hợp mà tôi đang tìm kiếm!
Kritixi Lithos

7

PHP, khoảng cách 29

a^b-1 in 0 cho đúng và bất kỳ giá trị nguyên> 0 cho sai

[,$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, khoảng cách 36

a^b-1 in 1 cho đúng không có gì sai

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

Ruby, Khoảng cách 1, Chiều dài kết hợp 194

Kiểm tra chính:

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

Hãy thử trực tuyến!

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}

Hãy thử trực tuyến!

Theo dự đoán trong các bình luận, một số kẻ ngốc luôn phải đi ngược lại tinh thần của vấn đề. Thật là vui khi tìm cách để làm việc xung quanh nó, mặc dù! Đây là cách nó hoạt động: Chúng tôi có hai giải pháp riêng biệt cho các vấn đề. Chúng tôi chạy cả hai, đặt chúng vào một mảng và sau đó chọn phần tử thứ 0 hoặc phần 1, cho khoảng cách chỉnh sửa là 1. Điều này thường là bất hợp pháp, vì bạn chỉ có thể xóa mọi thứ trừ phép tính bạn muốn và nó vẫn hoạt động . Tuy nhiên, mỗi đoạn mã được viết để dựa vào việc tải cùng một thư viện tiêu chuẩn , 'mathn':

  • Cái đầu tiên sử dụng nội dung của nó prime?
  • Thứ hai phụ thuộc vào mathnviệc thay đổi cách thức phân chia hoạt động - trước khi tải nó, 3/4đánh giá 0, trong khi sau đó nó đánh giá phân số (3/4). Vì kết quả trung gian (a+1-i)/ikhông phải luôn luôn là một số nguyên, nên kết quả tổng thể là sai nếu không có thư viện.

Bây giờ chúng ta chỉ cần làm cho việc tải thư viện phụ thuộc vào phần còn lại của mã không được sửa đổi. Chúng tôi thực hiện điều này bằng cách tạo tên mathn bằng cách sử dụng độ dài ký tự của phần còn lại của mã chính: phép tính kết hợp có độ dài 55, nhân đôi thành 110 là giá trị ASCII của 'n'. Vì vậy, kết hợp điều này vào chuỗi 'toán học' mang lại cho thư viện mong muốn.

Như một phần thưởng, giới thiệu các phụ thuộc thư viện cũng làm cho mã chạy trong một khoảng thời gian hợp lý. Cụ thể, cách tiếp cận ngây thơ đối với nCr sẽ không tạo ra kết quả trung gian phân đoạn.



4

Xếp chồng lên nhau , khoảng cách 13

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

Hãy thử trực tuyến! Đầu tiên tính toán nCr, tính nguyên thủy thứ hai, sử dụng định lý Wilson.

(f g h) fork!pops Nargs từ ngăn xếp (gọi chúng a0 ... aN) và áp dụng a0 ... aN f a0 ... aN h g.

Đối với chương trình đầu tiên:

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

Và lần thứ hai:

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


3

Toán học, khoảng cách 10

Nhiệm vụ 1: PrimeQ[#2^#-1]&

Nhiệm vụ 2: Binomial[#2,#]&

Cả hai chức năng có các đầu vào theo thứ tự b,a.


3

Javascript ES7, khoảng cách 14

Cảm ơn @Conor O'Brien vì đã giảm khoảng cách 7

Nguyên thủy:

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

Trả về 1 nếu số nguyên tố trả về 0 nếu không phải là số nguyên tố.

Kiểm tra nguyên tố cực kỳ kém hiệu quả, kiểm tra số modulo mỗi số nhỏ hơn số đó và lớn hơn 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}

Bội số 1 theo từng số từ y + 1 đến x và chia cho mỗi số từ 1 đến xy (x! / Y!) / (Xy)!


Thay đổi chương trình thứ hai để f=x=>y=>{t=x+1;s=1;for(i=1;i<t;i++){if(y<i)s*=i/(i-y)}return s}cung cấp khoảng cách chỉnh sửa 14. Hãy thử trực tuyến!
Conor O'Brien

2

Octave, khoảng cách 17 16 15

nCr

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

Hãy thử trực tuyến!

isprime(a^b-1)

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

Hãy thử trực tuyến!

Tôi không rành về Octave, vì vậy tôi không biết có tích hợp để tính nCr không.


1

MATL , khoảng cách 4, chiều dài 6

Cho biết nếu a^b-1là số nguyên tố:

^qZq

Hãy thử trực tuyến!

Tính toán nCr(a,b):

Xn

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

Cho biết nếu a^b-1là số nguyên tố:

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

Tính toán nCr(a,b):

Xn     % nchoosek with implicit inputs. Implicit display


1

PHP, khoảng cách 14

Viết một chương trình có hai chức năng và chỉ gọi một trong số chúng sẽ dẫn đến khoảng cách là 1, nhưng nó lại quá khập khiễng.

Kiểm tra chính, 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

Thạch , khoảng cách 4, chiều dài 5

Nhiệm vụ 1

*’ÆP

Nhiệm vụ 2

c

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

Nhiệm vụ 1

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

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

Nhiệm vụ 2

c     nCr atom

0

JavaScript, Điểm: 1, Độ dài: 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])}

hàm (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 - "; 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

Cả hai chương trình con đều sử dụng độ dài của người kia để tính hằng số của chính nó, vì vậy không thể loại bỏ char nào

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.