重用您的代码!


23

在这一挑战中,我们试图立即解决两个重要问题。他们是:

  1. 给定整数ab,确定b -1是否为质数。
  2. 给定整数ab,返回nCr(a,b)。

具体来说,您必须编写两个程序,一个程序执行第一个任务,另一个程序执行另一个任务。由于我们想一次解决两个问题,因此建议在两个程序中使用同一段代码。

计分

答案的分数是两个程序之间的Levenshtein距离。分数越低越好。如果出现平局,则以两个程序中组合代码最短的答案为准。您可以使用此脚本来计算解决方案的分数。

规则

  1. 您必须用相同的语言编写两个程序来解决上述任务。您可以使用所需的任何I / O方法。对于任务1,您可以返回真实/虚假值,或选择两个值分别表示是和否,然后相应地返回它们。例如。您可以选择“ "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

a b nCr(a,b)
1 1 1
5 2 10
4 3 4
10 7 120
12 5 792

1
可能是很方便的计算Levenshtein距离
路易斯Mendo

3
这个想法很好,但是我认为您仍然可以得到Levenshtein距离1的解决方案,该解决方案可以防止对一种未使用的零件进行某种或另一种修改,然后有效地形成您要禁止的结构。
Martin Ender

6
@LuisMendo问题在于,其中许多解决方案的运行速度都很慢。您可以改用此Mathics脚本。
Martin Ender

3
我认为更好的度量标准是Levenshtein距离除以两个程序的总长度。
格雷格·马丁

1
@GregMartin不会导致代码保龄球吗?可以人为地使程序变大,但仍然声称它们没有任何不必要的代码。
fergusq

Answers:


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 打印0表示true,任何整数值> 0表示false

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

在线尝试!

正如评论中所预言的那样,总是有一些不可思议的问题与问题的精神背道而驰。不过,找到一种解决方法很有趣!它是这样工作的:我们为问题提供了两种单独的解决方案。我们将两者都运行,然后将它们放入数组中,然后选择第0个元素或第一个元素,编辑距离为1。这通常是非法的,因为您可以删除所有内容,但所需的计算仍然有效。但是,每个代码段的编写都依赖于相同标准库的加载'mathn'

  • 首先使用其内置 prime?
  • 第二个依赖于mathn不断变化的分工是如何工作的-加载它,之前3/4的计算结果为0,而事后评估为分数(3/4)。由于的中间结果(a+1-i)/i并不总是整数,因此如果没有库,则总结果是错误的。

现在,我们只需要使加载库取决于未修改的其余代码。为此,我们使用其余主代码的字符长度生成名称mathn:组合计算的长度为55,即ASCII值“ n”的两倍,即长度为110。因此,将其连接到字符串'math'即可得到所需的库。

另外,引入库依赖关系还可以使代码在合理的时间内运行。特别是,对于nCr的幼稚方法不会产生分数中间结果。



4

堆叠距离13

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

在线尝试!第一个使用威尔逊定理计算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

4

Python 2距离15,长度172

任务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)

任务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)

在线尝试!


3

Mathematica,距离10

任务1: PrimeQ[#2^#-1]&

任务2: Binomial[#2,#]&

两种功能均按顺序接受输入b,a


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}

如果素数返回1,则返回1;如果不是素数,则返回0。

效率极低的素数检查,对每个小于它且大于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. 在线尝试!
Conor O'Brien

2

八度,距离17 16 15

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

在线尝试!

isprime(a^b-1)

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

在线尝试!

我不太熟练使用Octave,所以我不知道是否有内置函数可以计算nCr。


1

MATL,距离4,长度6

判断是否a^b-1是素数:

^qZq

在线尝试!

计算nCr(a,b)

Xn

在线尝试!

怎么运行的

判断是否a^b-1是素数:

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

计算nCr(a,b)

Xn     % nchoosek with implicit inputs. Implicit display


1

PHP,距离14

编写具有两个函数的程序,仅调用其中一个函数会导致距离为1,但这太la脚了。

原始测试,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

果冻,距离4,长度5

任务1

*’ÆP

任务2

c

在线尝试!

怎么运行的

任务1

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

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

任务2

c     nCr atom

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

函数(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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.