コードを再利用してください!


23

この課題では、2つの重要な問題を一度に解決しようとします。彼らです:

  1. 整数aおよびbを指定すると、a b -1が素数であるかどうかがわかります。
  2. 整数aおよびbを指定すると、nCr(a、b)を返します。

具体的には、2つのプログラムを作成する必要があります。1つは最初のタスクを実行し、もう1つは他のタスクを実行します。両方の問題を一度に解決したいので、両方のプログラムで同じコードを使用することをお勧めします。

得点

回答のスコアは、2つのプログラム間のレーベンシュタイン距離です。スコアが低いほど優れています。同点の場合、2つのプログラムの最短の組み合わせコードでの答えが勝ちです。このスクリプトを使用し、ソリューションのスコアを計算できます。

ルール

  1. 上記のタスクを解決する2つのプログラムを同じ言語で作成する必要があります。任意のI / Oメソッドを使用できます。タスク1では、真偽値を返すか、2つの値を選択してtrueとfalseを意味し、それに応じて返すことができます。例えば。あなたはそれが"prime"真を"not prime"意味し、偽を意味することを選ぶことができます。
  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
これは、レーベンシュタイン距離を計算するのに便利かもしれません
ルイスメンドー

3
アイデアは素晴らしいですが、未使用のパーツが何らかの方法で変更されることを防ぎ、禁止したい構造を効果的にもたらす、レーベンシュタイン距離1のソリューションが得られると思います。
マーティンエンダー

6
@LuisMendo問題は、これらのソリューションの多くが本当に遅いことです。代わりに、このMathicsスクリプトを使用できます。
マーティンエンダー

3
より良い測定基準は、レーベンシュタイン距離を2つのプログラムの合計の長さで割ったものだと思います。
グレッグマーティン

1
@GregMartinそれはコードボウリングになりませんか?プログラムを人為的に大きくし、それでもプログラムに不要なコードがないと主張することは可能です。
fergusq

回答:



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 falseの場合はtrue、noの場合は1を出力します

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

オンラインでお試しください!

コメントで予測されているように、一部のジャークは常に問題の精神に反する必要があります。しかし、それを回避する方法を見つけるのは楽しかったです!仕組みは次のとおりです。問題の解決策は2つあります。両方を実行し、それらを配列に入れてから、編集距離が1になるように0番目の要素または1番目の要素を選択します。これは通常、違法になります。 。ただし、各コードスニペットは、同じ標準ライブラリの読み込みに依存するように記述されています'mathn'

  • 最初の組み込み prime?
  • 2番目は、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!=]

オンラインでお試しください!最初は、ウィルソンの定理を使用して、2番目の素数であるnCrを計算します。

(f g h) fork!Nスタックから引数をポップし(呼び出します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)!
                 *              *

そして2つ目:

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

Javascript ES7、距離14

@Conor O'Brien、距離を7減らしてくれてありがとう

素数:

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

primeが素数でない場合に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)!


2番目のプログラムを変更してf=x=>y=>{t=x+1;s=1;for(i=1;i<t;i++){if(y<i)s*=i/(i-y)}return s}編集距離を14にします。オンラインで試してください!
コナーオブライエン




1

PHP、距離14

2つの関数を使用してプログラムを作成し、そのうちの1つだけを呼び出すと、距離は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

JavaScriptの、スコア: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])}

function(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

両方のサブルーチンは、他のサブルーチンの長さを使用して独自の定数を計算するため、charは削除できません

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.