配对高尔夫双素数和Collat​​z序列


12

这是受到恢复变异的源代码问题启发的一种新挑战。

您应该用相同的语言编写两个程序或函数。第一个应解决任务1,第二个应解决任务2。

您的分数将是较长程序与两个程序源代码之间的Levenshtein距离的总和。分数越低越好,因此您应尝试使两个解决方案相似,同时保持程序长度短。

任务1

您将得到一个正整数N,你应该输出在Collat​​z序列N用空格或换行分隔。允许使用尾随分隔符。

Collat​​z序列的第一个元素是N。其余元素基于其后继:一个一世-1个

一个一世={一个一世-1个2 如果 一个一世-1个 甚至3一个一世-1个+1个 如果 一个一世-1个 很奇怪

一旦序列到达,就1不会生成新元素。

输入=>输出示例:

6 => 6 3 10 5 16 8 4 2 1
8 => 8 4 2 1
1 => 1

任务2

一对双素数是一对正整数,它们的差为2,它们都是素数。

您将得到一个正整数,N并且应该输出最小的一对双素数,其中两个素数均大于N。第一个数字应为较小的一个,并且两个素数应以空格或换行符分隔。允许使用尾随分隔符。

输入=>输出示例:

6 => 11 13
42 => 59 61
1 => 3 5

用于计算分数的代码段

(修改了“ 恢复变异的源代码问题”中的内容。)

编辑

在答案的标题中,使用以下格式

[Language], [longer length] + [distance] = [final score]

例如

Python 2, 60 + 32 = 92

Answers:



4

CJam,24 + 17 = 41 42

Collat​​z程序

ri2*{:N2%N3*)N2/?__p(}g;

双素数程序

ri_2+]{:)_{mp}/&_+((}gS*

两者都从STDIN接收输入并将打印空间/换行符分隔的数字输入到STDOUT

在这里在线尝试


3

CJam,25 + 16 = 41

Collat​​z程序:

l~2*{_2%{3*)}{2/}?_p_(}g;

双素数程序:

l~_2+]{:)_{mp}/&!_&}gS*

在这里测试。

我现在只是打高尔夫。我看看是否可以以某种方式降低分数。


2

Pyth,20 + 14 = 40 34

Collat​​z:

QWtQ=Q@,/Q2h*3QQQ

素数对:

~Q1WttP*Q+Q2~Q1;Q+Q2

两者都是从STDIN输入并在换行符上输出数字的程序。现在只是使用相同的循环原语来寻找两个答案。这可能会有所改善。

编辑:添加了更好的条件检查,从@isaacg被盗。似乎使用滤波器比使用质数对的while循环还短。

在这里在线尝试。


输出3 5为素数对上的输入3。它应该输出5 7
isaacg'2

@isaacg修复它,费用为3 :(
FryAmTheEggman

2

05AB1E,14 + 13 10 9 = 27 24 23

-4分得益于纯ASCII码

Collat​​z序列(14个字节):

[DÉi3*>ë2÷}Ð,#

在线尝试!

双素数(14个字节):

[DÅND>>Dp#}s,,

在线尝试!


高尔夫双素数(11字节):

[ÅNDÌp#]DÌ»

在线尝试!


Collat​​z链接不正确
分仅使用ASCII

谢谢,解决它!
Wisław

素数,-3分。可能值得在答案中保留高尔夫球版作为注释,以防万一有另外一种更好的高尔夫球(对子到底是做什么的,顺便说一句?就像我为什么要做,,,为什么只Ð,在那里工作)
仅ASCII

多-1(编辑:没关系,第一个数字应该更小。现在得分24
仅ASCII的


1

Java 8、118 + 84 = 202

Collat​​z:

n->{for(System.out.println(n);n>1;System.out.println(n=n%2<1?n/2:3*n+1));}

双素数:

n->{t:for(int p,z;;n++){for(z=n;z<n+3;z=z+2)for(p=2;p<z;p++)if(z%p<1)continue t;System.out.print(n+" "+(n+2));break;}}

提到Java 8 ..
Optimizer

1

Mathematica,53 + 29 = 82

Collat​​z序列:

Print/@(NestWhileList[If[OddQ@#,3#+1,#/2]&,#,#>1&]);&

双素数程序:

Print/@(NestWhile[NextPrime,#,!PrimeQ[#+2]&]+{0,2});&

1

> <>,116 + 86 = 202

Collat​​z程序(46):

0i:0(?v$a*$'0'-+!
?v6,>:>~:nao:1=?;3*:2%
 >1+^

双素数计划(116):

0i:0(?v$a*$'0'-+!
v&2+1~<:-2
<v!?%&+1:&:v?=&:&:
 >&~0$2&2+v>&~143.
:&:1+&%?!v>:&:&=?v
0v?*r$0~&< .561~&<.1
:<;noan-2

哎哟。两种程序都以相同的atoi功能开始,但此后双素数下降。同一段代码重复两次以进行素数检查-以某种方式重用该段代码可能会稍短一些,但是其设置不会节省很多字节。

将双数素数的后半部分放入Collat​​z程序的未使用位置,可能会做得更好,但是我不确定是否允许这样做。


3
“打它,打它NAO!” -Noanold Golfzenegger。就是说,这个问题似乎并不是说添加垃圾以减少Levenshtein的距离是禁忌,所以我会发疯了;)
FryAmTheEggman

0

C ++距离= 114更长的长度= 155得分= 269

任务1

void c(int N){while(N>1){cout<<N<<' ';N=(N%2==0)?N/2:N*3+1;}cout<<N;}

任务2

int p(int x){int z=0;for(int i=2;i<x;i++){if(x%i==0){z=1;break;}}return z;}
void c(int N){N=(N%2==0)?N+1:N+2;int M=N+2;while(p(N)+p(M)>0){N=M;M+=2;}cout<<N<<' '<<M;}

任务2有所改善

int p(int N){int z=0;for(int i=2;i<N;i++){if(N%i==0){z=1;break;}}return z;}
void c(int N){N=(N%2==0)?N+1:N+2;while(p(N)+p(N+2)>0){N+=2;}cout<<N<<' '<<N+2;}

我认为您甚至没有尝试降低分数。例如,您具有不同的函数名称,不同的参数名称,不同的返回类型,而哪些没有增加您的距离。
Optimizer

@Optimizer我不知道另一种测试素数的方法吗?其他语言有此内置的。
bacchusbeale

1
我什至没有在谈论改变算法。例如,此代码只有102个距离:int p(int x){int z=0;for(int i=2;1<x;i++){cout<<x<<' ';x=(x%2==0)?x/2:x*3+1;}cout<<x;return z;}
优化器
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.