换位,素数,我的天哪!


15

任务很简单:您的程序读取一个整数作为输入,并输出它是否为质数。您可以打印“是/否”,“是/否”或明确标识结果的任何内容。

挑战在于,代码必须将其行和列进行转置。

为了排除明显的解决方案(最短的“简单”解决方案使用注释垂直逐个字符重复地进行注释),该度量与通常的代码高尔夫有点不同:

因为格式化在此挑战中非常重要,所以代码大小是在代码适合的最小矩形区域中度量的。换句话说,空格确实很重要,并且行的长度应相等(您不要为简单起见,在发布解决方案时必须实际执行此操作)。例如

int main()   
{            
    return 0;
}            

的大小为4 * 13 = 52 (显然,它不符合以下两个条件之一:素数检测和可转位。)

最小尺寸获胜。

您可以使用任何语言和任何库函数,除非该函数的唯一目的是查找,生成或检测素数。

编辑:

虽然获胜者可能是Golfscript解决方案,但我将奖励50分以奖励最佳的C或C ++解决方案!


您的矩形指标无法阻止明显的解决方案-最好采用最长的边长。虽然,这将在GS答案降低其得分4
布思

你是对的。下一个转置的问题应具有不同的度量并禁止对称解。但是,我认为即使那样,仍然会有人规避规则,或者至少找到了质量保证在制定规则时没有想到的解决方案。
vsz 2012年

Answers:


7

GolfScript,13×1

~.,2>{1$\%!}?

GolfScript再次罢工!

如果输入是质数,则重复输入,否则将输出与其最小的适当除数相连的输入。是的,我知道这延伸了“明确标识结果的任何内容”的定义,但是做任何更奇特的事情都会花费一些额外的字符。如果想要更好的输出,请;]!在代码后附加三个字符以生成质1数和0复合数字。

该算法实际上是低效的,只是从2到n -1的蛮力试验划分。大多数GolfScript运算符只是单个字符,因此此代码的转换效果也很好。但是,令人讨厌的是,赋值运算符:不允许其自身与目标之间存在空格,因此我必须完全没有变量来执行此操作。


WRT“任何发烧友都会花费一些额外的字符” –您只需2就可以得到GolfScript风格的布尔值。–
Peter Taylor

@Peter:你的意思是像我上面的编辑一样,只是没有!?还是您有想念的东西?
Ilmari Karonen 2012年

1
我一直在思考),以便总能找到一个除数,=最后找到一个除数。
彼得·泰勒

:紧随其后的是换行符,然后分配给换行符-因此,这不是不允许使用空格,而只是将空格分配给了
gnibbler 2012年

@gnibbler:从技术上来说,我们都是对的。:不允许在其自身与目标之间使用空格或其他任何东西:紧随其后的是空格或其他任何标记(是,甚至是数字,字符串或代码块),都是被分配给它的对象。但是,空格是官方文档特别警告的地方,并且有充分的理由-因为在大多数其他地方,在GolfScript中的标记之间添加空格不会执行任何操作(通常,除非将其分配给...)。
Ilmari Karonen

21

C 2 * 70 2 * 60

打印y素数,没有其他内容。
编辑:更改代码以保存10个字符。必须在没有参数的情况下运行(so m=1)。

main(m,n){for(scanf("%d",&n);n%++m&&n>1;);n-m||puts("y");}/*
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ 

处理换位的方法非常通用,可以应用于任何程序。
它基于以下转换:

abcd/*
\\\\*/

对此:

a\
b\
c\
d\
/*
*/

两者都意味着简单abcd


哇,巧妙地滥用了行串联:)
vsz 2012年

2
这是一个高尔夫/拼图网站。没有滥用之类的东西。
2012年

2
@boothby,我想他的意思是虐待。但是我并不夸奖。
ugoren

14

C-13x13

从stdin读取输入,并输出a 1表示质数和a 0表示非质数。

////m(i;(a=)<
////aans")a;2
//:Di)tc%;;p)
//O n{ adfau+
main//bn"o%t4
(a){///f,r-c8
int b///&(-h)
;scanf///bba;
("%d",&///;r}
a);for(b///( 
=a;a%--b;//( 
);putchar((b 
<2)+48);}    

编辑:现在可以使用gcc和clang进行编译,其他编译器尚未经过测试


12

C,12x12个字符

我的其他答案不同,一种基于相同代码的二维解决方案(并且像它一样,它y用于素数打印,对于复合物则不打印)。
结构类似于Quasimodo的答案,但是我的代码更短,我认为我对comemnts的使用效率更高,因此可以容纳12x12。

////m()s";np
////am{c%n>u
////i,fad%1t
////nnon"+;s
main//rf,+)(
(m,n//((&m;"
){for(//n&ny
scanf(//)&-"
"%d",&n)//m)
;n%++m&&//|;
n>1;);n-m|| 
puts("y"); }

7

Perl,14 x 14

我想我明白了。将数字指定为命令行参数,输出01。可能还有更多的改进空间。

$   n=pop;$p|=
 !  ($n%$_)for
  2 ..$n/2;   
   print!$p+m~
n(.r          
=$.i          
pn$n          
o%nt          
p$/!          
;_2$          
$);p          
pf +          
|o m          
=r ~          

3

针对对称,字符效率低下的解决方案的注释已遭滥用。

/{/////////////////////////////////
{(~)any 0=mod[x;2+(!)x-2]}"I"$(0:)0
/~
/)
/a
/n
/y
/ 
/0
/=
/m
/o
/d
/[
/x
/;
/2
/+
/(
/!
/)
/x
/-
/2
/]
/}
/"
/I
/"
/$
/(
/0
/:
/)
/0

从STDIN接受输入,返回一个布尔值。


注意到sqrt那里。当在代码高尔夫球中寻找素数时,通常最好将(浪费)一路除以n,而不是在sqrt n停止。
gnibbler 2012年

非常正确,谢谢。我还没有机会尝试获得更好的成绩。
skeevey

您应该在答案中添加分数
FlipTack

2

果冻,2x2平方

PÆ
ÆP

在线尝试!

我认为我的转置部分正确,如果是,则此转置部分为

PÆ
ÆP

在线尝试!

(这是相同的代码)


4
这是无效的:“ 您可以使用任何语言和任何库函数,除非该函数的唯一目的是查找,生成或检测素数
Kevin Cruijssen

1

05AB1E1×5 1×3(5 3 个字节

这不是一个大程序。每行是一个单独的替代程序,用于处理素数检查(不使用素数内置函数)。

ÑPQ
ÒgΘ
ÒQP
ÕαΘ
fQO
fs¢
f`Q

-2个字节感谢Grimy

行之间的空格在05AB1E中是空操作,并且由于我仅使用1字节命令,因此在转置后可以正常工作。

输出1/ 0对truthy / falsey分别。

在线尝试第一个验证所有其他的测试用例(内置eval .V
转置:在线尝试第一个

说明:

Ñ    # Get a list of all divisors of the (implicit) input-integer
     # (which would be only 1 and the integer itself for primes)
 P   # Take the product of that list
  Q  # And check if it's equal to the (implicit) input-integer

Ò    # Get a list of all prime factors of the (implicit) input-integer 
 g   # Get the amount of those prime factors by taking the length of the list
  Θ  # Check if that's equal to 1 (so only itself is a prime factor)

Ò    # Get a list of all prime factors of the (implicit) input-integer including duplicates
 Q   # Check for each if it's equal to the (implicit) input-integer
     # (1 if truthy; 0 if falsey)
  P  # Take the product of those checks (resulting in either 1 or 0 as well)

Õ    # Get the Euler totient of the (implicit) input-integer
 α   # Take the absolute difference with the (implicit) input-integer
  Θ  # Check if that's equal to 1

f    # Get a list of all prime factors of the (implicit) input-integer without duplicates
 Q   # Check for each if it's equal to the (implicit) input-integer
  O  # And take the sum of that (resulting in either 1 or 0)

f    # Get a list of all prime factors of the (implicit) input-integer without duplicates
 s   # Swap to get the (implicit) input-integer
  ¢  # And count how many time it occurs in the list

f    # Get a list of all prime factors of the (implicit) input-integer without duplicates
 `   # Dump all the content of this list onto the stack
  Q  # Check if the top two values are equal, or if only a single value is present, it will
     # use the (implicit) input-integer as second value

     # For all these program the same applies at the end:
     # (implicitly output the result with trailing newline)

注:如果只有truthy / falsey值是有效的,而且它并不一定必须是不同的,无论是ÒgÕα可以作为有效的2-byters,因为只有1是在truthy 05AB1E,一切是falsey:尝试两个他们为一些测试用例

如果允许使用内置函数,那么只需一个p就足够了:在线尝试验证更多测试用例


1
ÑPQÒgΘÒQP3个字节。(Ñ而且Ò两者的目的都不是“查找,生成或检测素数”,因此,根据我的阅读,它们不包含在禁令中)。
Grimmy

1
更多3 byters: ,ÕαΘ,,fQOfs¢f`Q
Grimmy

@Grimy啊,真不敢相信我没有想到除数或素数内建函数。我想我回答得太快了。Õα不过不知道!那是一个非常不错的。
凯文·克鲁伊森





0

APL(Dyalog Unicode),10x11

{⍵∊∘.×⍨1↓⍳⍵          
           
           
 .          
 ×          
           
 1          
           
           
          }

在线尝试!

更正了符合规格的功能。感谢@Adám的注意。

对于true,返回0,对于falsy,返回1

怎么样

{⍵∊∘.×⍨1↓⍳⍵  Dfn. everything below this is a noop up until closing the brace
         ⍳⍵  Range [1..arg]
       1    Dropping the first element (yields [2..arg])
   ∘.×⍨      Multiplication table for each element in the vector
 ⍵∊          Check if the argument is in the table.

转置版本完全相同。

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.