코드를 재사용하십시오!


23

이 도전에서 우리는 한 번에 두 가지 중요한 문제를 해결하려고 노력합니다. 그들은:

  1. 정수 ab가 주어지면 , b -1이 소수 인지 알려 주십시오.
  2. 정수 ab가 주어지면 nCr (a, b)를 반환 합니다.

특히, 첫 번째 작업을 수행하는 프로그램과 다른 프로그램을 수행하는 프로그램을 작성해야합니다. 두 문제를 한 번에 해결하려면 두 프로그램에서 동일한 코드를 사용하는 것이 좋습니다.

채점

답의 점수는 두 프로그램 사이의 Levenshtein 거리입니다. 낮은 점수가 좋습니다. 동점 인 경우 두 프로그램 중 가장 짧은 결합 코드를 가진 답이 이깁니다. 이 스크립트 를 사용 하여 솔루션의 점수를 계산할 수 있습니다.

규칙

  1. 위에서 설명한 작업을 해결하는 동일한 언어로 두 개의 프로그램을 작성해야합니다. 원하는 I / O 방법을 사용할 수 있습니다. 작업 1의 경우 참 / 거짓 값을 반환하거나 참과 거짓을 의미하는 두 값을 선택하고 그에 따라 반환 할 수 있습니다. 예 : 당신은 "prime"true를 "not prime"의미하고 false를 선택할 수 있습니다 .
  2. 사용하는 알고리즘은 가능한 모든 입력에 대해 작동해야하지만 사용 된 숫자 유형의 제한으로 인해 코드가 많은 경우 실패합니다. 입력이 유효하다고 가정 할 수 있습니다.
  3. 프로그램의 어떤 부분 집합도 문제를 해결해서는 안됩니다. 문자를 제거하면 코드가 작동하지 않아야합니다. 예를 들어, 다음 코드는 프로그램을 중단하지 않고 사용하지 않은 else-block을 제거 할 수 있기 때문에 유효하지 않습니다.

    if (1) { /* change to 0 to get the second program*/
        ...
    } else {
        ...
    }
    
  4. 표준 허점은 허용되지 않습니다.

테스트 사례

a b -1이 소수입니까?

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
이것은 Levenshtein 거리를 계산하는 것이 편리 할 수 ​​있습니다
Luis Mendo

3
아이디어는 훌륭하지만 Levenshtein distance 1의 솔루션을 사용하여 사용하지 않는 부품의 수정을 방지하고 효과적으로 금지하려는 구조를 만들 수 있다고 생각합니다.
Martin Ender

6
@LuisMendo 문제는 많은 솔루션이 실제로 느리다는 것입니다. 대신이 Mathics 스크립트를 사용할 수 있습니다.
Martin Ender

3
레 벤슈 테인 거리를 두 프로그램의 총 길이로 나눈 것이 더 좋은 척도라고 생각합니다.
Greg Martin

1
@GregMartin 그 결과 코드 볼링이 발생하지 않습니까? 인위적으로 프로그램을 더 크게 만들면서도 불필요한 코드가 없다고 주장 할 수 있습니다.
fergusq

답변:


7

MATLAB, 거리 10

우선 순위 :

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

nCr :

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

4
그것이 내가 찾던 내장입니다!
Kritixi Lithos

7

PHP, 거리 29

a^b-1 true로 0을 인쇄하고 false로 0보다 큰 정수 값을 인쇄합니다.

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

a^b-1 true로 1을 인쇄하고 false로 아무것도 표시하지 않습니다.

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

루비, 거리 1, 결합 된 길이 194

프라임 체크 :

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

온라인으로 사용해보십시오!

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}

온라인으로 사용해보십시오!

의견에서 예측 한 바와 같이, 일부 저크는 항상 문제의 정신에 반대해야합니다. 그래도 해결 방법을 찾는 것이 재미있었습니다! 작동 방식은 다음과 같습니다. 문제에 대한 두 가지 별도의 솔루션이 있습니다. 우리는 둘 다 실행하고 배열에 넣은 다음 편집 거리 1에 대해 0 번째 요소 또는 첫 번째 요소를 선택합니다. 원하는 계산 이외의 모든 것을 삭제할 수 있고 여전히 작동하기 때문에 일반적으로 불법입니다 . 그러나 각 코드 스 니펫은 동일한 표준 라이브러리의로드에 의존하도록 작성되었습니다 'mathn'.

  • 첫 번째는 내장을 사용합니다 prime?
  • 두 번째는 mathn나눗셈의 작동 방식 을 변경하는 것입니다.로드하기 전에로 3/4평가 0하고 그 후에는 분수로 평가합니다 (3/4). 의 중간 결과 (a+1-i)/i가 항상 정수가 아니기 때문에 라이브러리가 없으면 전체 결과가 잘못됩니다.

이제 수정되지 않은 나머지 코드에 라이브러리를 로딩해야합니다. 우리는 나머지 메인 코드의 문자 길이를 사용하여 mathn이라는 이름을 생성하여이 작업을 수행합니다. 결합 된 계산의 길이는 55로, 두 배는 110으로 두 배가되며 ASCII 값은 'n'입니다. 따라서 이것을 문자열 'math'에 연결하면 원하는 라이브러리가 제공됩니다.

또한 라이브러리 종속성을 도입하면 코드를 적절한 시간 내에 실행할 수 있습니다. 특히, nCr에 대한 순진한 접근법은 부분 중간 결과를 생성하지 않을 것이다.



4

쌓인 거리 13

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

온라인으로 사용해보십시오! 첫 번째는 Wilson의 정리를 사용하여 두 번째 우선 순위 인 nCr을 계산합니다.

(f g h) fork!N스택에서 args를 팝업 (호출 a0 ... aN)하고 적용 a0 ... aN f a0 ... aN h g합니다.

첫 번째 프로그램의 경우 :

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

그리고 두 번째로 :

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

매스 매 티카, 거리 10

작업 1 : PrimeQ[#2^#-1]&

작업 2 : Binomial[#2,#]&

두 기능 모두 순서대로 입력을 b,a받습니다.


3

자바 스크립트 ES7, 거리 14

거리를 7로 줄인 @Conor O'Brien에게 감사합니다.

우선 순위 :

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

소수가 아닌 경우 소수가 0을 리턴하면 1을 리턴합니다.

엄청나게 비효율적 인 프라임 체크, 숫자보다 작고 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}

y + 1부터 x까지 각 숫자에 1을 곱하고 1부터 xy까지 각 숫자로 나눕니다 (x! / y!) / (xy)!


f=x=>y=>{t=x+1;s=1;for(i=1;i<t;i++){if(y<i)s*=i/(i-y)}return s}편집 거리 를 제공 하도록 두 번째 프로그램 변경 14. 온라인으로 사용해보십시오!
코너 O'Brien




1

PHP, 거리 14

두 개의 기능을 가진 프로그램을 작성하고 그 중 하나만 호출하면 거리가 1이되지만 너무 절름발이입니다.

프라임 테스트, 100 바이트 :

[,$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 바이트 :

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

점수 자바 스크립트 1, 길이 : 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])}

함수 (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-- "; 반환 평가 (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

두 서브 루틴은 다른 하나의 길이를 사용하여 자체 상수를 계산하므로 문자를 제거 할 수 없습니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.