Language agnostic 代码高尔夫:快乐的Primes!
今天是星期天,该打一轮代码高尔夫了Language agnostic 代码高尔夫:快乐的Primes!,language-agnostic,code-golf,rosetta-stone,Language Agnostic,Code Golf,Rosetta Stone,今天是星期天,该打一轮代码高尔夫了 Public Sub G(N) Dim Z, D, X, O X = N Z = N Do Until Z = 1 Or X > N Or X = 0 X = 0 For D = 1 To Len(CStr(Z)) X = X + CLng(Mid(CStr(Z), D, 1) ^ 2) Next D Z = X Loop If Z = 1 Then O = "Happy" Else O = "Sad" D
Public Sub G(N)
Dim Z, D, X, O
X = N
Z = N
Do Until Z = 1 Or X > N Or X = 0
X = 0
For D = 1 To Len(CStr(Z))
X = X + CLng(Mid(CStr(Z), D, 1) ^ 2)
Next D
Z = X
Loop
If Z = 1 Then O = "Happy" Else O = "Sad"
D = 2
Do
If N / D = Int(N / D) Then O = O & " Not Prime": Debug.Print O: Exit Sub
D = D + 1
Loop While D < N
O = O & " Prime"
Debug.Print O
End Sub
挑战
通过字符计数编写最短的源代码,以确定输入的数字是“快乐素数”、“悲伤素数”、“快乐非素数”还是“悲伤非素数”
输入
输入应该是来自命令行参数或stdin的整数。不要担心处理大的数字,但是如果你可以/想要的话就这样做。对于小于1的输入值,行为将是未定义的,但1有一个确定的结果
输出
输出应打印数字类型:“快乐素数”、“悲伤素数”、“快乐非素数”或“悲伤非素数”。尾随换行符是可选的
例子
定义
以防万一,你的大脑需要重新振作一下
快乐数字
来自维基百科
A由
下面的过程。从任何
正整数,替换数字
通过它的平方和
然后重复此过程,直到
这个数字等于1(它将
停留),或者它在一个循环中无休止地循环
不包括1的循环。那些
此过程结束的数字
1是快乐的数字,而那些
不要以1结尾是不愉快的数字
(或可悲的数字)
比如说,
- 139
- 1^2+3^2+9^2=91
- 9^2+1^2=82
- 8^2+2^2=68
- 6^2+8^2=100
- 1^2+0^2+0^2=1
h={1=>'happy'};s=->x{y=0;(y+=(x%10)**2;x/=10)while x>0;h[y]||(h[y]='sad';s[y])}
$><<s[n=$*[0].to_i]+" #{'non-'if '1'*n=~/^1?$|^(11+?)\1+$/}prime"
function happyprime(a)
h={'non-prime','prime'};
h=h{isprime(str2num(a))+1};
for i=1:99
a=num2str(sum(str2num((a)').^2));
end
s={'Sad ','Happy '};
[s{(str2num(a)==1)+1},h]
其中是_prime
方法留给读者作为练习;) Python 2.6
happy.py:280314333个字符,14行
import re
def q(z):
while z!=1:z=sum((int(a)**2 for a in `z`));yield z
def h(g):
l=[]
while 1:
try:z=g.next()
except:return 'happy '
if z in l:return 'sad '
l.append(z)
p=lambda n:not re.match(r'^1$|^(11+?)\1+$','1'*n)
n=int(input())
print h(q(n))+'non-prime'[4*p(n):]
用法:
$ echo 139 | python happy.py
happy prime
$ echo 2 | python happy.py
sad prime
$ echo 440 | python happy.py
happy non-prime
$ echo 1234567 | python happy.py
sad non-prime
--
可读版本:
import re, sys
def happy_generator(z):
while z != 1:
z = sum((int(a)**2 for a in str(z)))
yield z
def is_happy(number):
last = []
hg = happy_generator(number)
while True:
try:
z = hg.next()
except StopIteration:
return True
if z in last:
return False
last.append(z)
def is_prime(number):
"""Prime test using regular expressions :)"""
return re.match(r'^1?$|^(11+?)\1+$', '1'*number) is None
n = int(sys.argv[1])
print "%s %sprime" % (('sad','happy')[is_happy(n)], ('non-','')[is_prime(n)])
C、 188 187 185 184 180 172 171 165
这是一个递归函数,它从不发出返回
,而是在完成时调用自身或打印输出。递归函数对平方数字求和,并确定两个for循环中的素数。scanf返回1
,作为h()
的参数,保存一个代码>和一个1
(代价是必须使用前缀++p
而不是后缀p++
,这将使p>C
成为可能,而不是p>=C
)
r&~5
是0
表示1
4
5
,其中1
表示快乐,其他表示悲伤
下一次尝试:删除h()
并使main()
递归。Java:294286285277262260个字符
- 更新1:替换为。节省了8个字符
- 更新2:将
&
替换为&
(oops)。保存了1个字符
- 更新3:稍微重构了
s
。节省了3个字符
- 更新4:测试
n=1
是多余的。节省了5个字符
- 更新5:将regex替换为for循环,并对happy for循环进行重构。节省了15个字符
- 更新6:将
int/Integer
替换为long/long
。节省了2个字符
import java.util.*;类H{publicstaticvoidmain(String[]a){long n=new long(a[0]),p=n>1?1:0,s,d=1;while(++d1?“sad”:“happy”,p>0?:“non-”;}}
使用换行符:
import java.util.*;
class H{
public static void main(String[]a){
long n=new Long(a[0]),p=n>1?1:0,s,d=1;
while(++d<n)if(n%d<1)p=0;
for(Set c=new HashSet();c.add(n);n=s)for(s=0;n>0;s+=d*d,n/=10)d=n%10;
System.out.printf("%s %sprime",n>1?"sad":"happy",p>0?"":"non-");
}
}
import java.util.*;
H类{
公共静态void main(字符串[]a){
长n=新长(a[0]),p=n>1?1:0,s,d=1;
而(++d1?“悲伤”:“快乐”,p>0?:“非-”;
}
}
Mathematica 115 108 107 102 100 99 91 87字符
87个字符
--巫师先生
大猴子学会了一些技巧(91个字符)
援引
%[7]
编辑5-99个字符/
九次迭代就足够了。谢谢@Nabb,@mjshultz
h = Print[
If[Nest[Plus @@ (IntegerDigits@#^2) &, #, 9] > 1, "Sad ", "Happy "]
, If[PrimeQ@#, "", "non-"], "prime"] &
编辑4-100个字符/
与编辑3相同,将10^2替换为99(允许84位输入值)。。。谢谢,格雷格
h = Print[
If[Nest[Plus @@ (IntegerDigits@#^2) &, #, 99] > 1, "Sad ", "Happy "]
, If[PrimeQ@#, "", "non-"], "prime"] &
编辑3-102个字符/
再次修改了循环
有趣的是,直到最终达到1为止的递归深度以(15+参数位数)为界。看
因此,对于小于85位的数字(我认为这一限制非常符合OP的“不要担心处理大数字”考虑),下面的代码可以工作
h = Print[
If[Nest[Plus @@ (IntegerDigits@#^2) &, #, 10^2] > 1, "Sad ", "Happy "]
, If[PrimeQ@#, "", "non-"], "prime"] &
我将“nestwile”改为较短的“Nest”,因此,不必为递归指定停止条件,而是足以硬编码所需的递归深度(10^2)
这不是很有效,但那是
Print[
If[Nest[Plus@@(IntegerDigits@ #^2) &, #, 9] > 1, Sad, Happy ],
If[PrimeQ@#, " ", " non-"], prime
] &
h = Print[
If[Nest[Plus @@ (IntegerDigits@#^2) &, #, 9] > 1, "Sad ", "Happy "]
, If[PrimeQ@#, "", "non-"], "prime"] &
h = Print[
If[Nest[Plus @@ (IntegerDigits@#^2) &, #, 99] > 1, "Sad ", "Happy "]
, If[PrimeQ@#, "", "non-"], "prime"] &
h = Print[
If[Nest[Plus @@ (IntegerDigits@#^2) &, #, 10^2] > 1, "Sad ", "Happy "]
, If[PrimeQ@#, "", "non-"], "prime"] &
h = Print[
If[NestWhile[Plus @@ (IntegerDigits@#^2) &, #, # > 4 &] > 1,"Sad ","Happy "]
,If[PrimeQ@#, "", "non-"]
, "prime"] &
NestWhile[Plus @@ (IntegerDigits@#^2) &, #, # > 4 &]
h = Print[
NestWhile[Plus@@(IntegerDigits@#^2) &, #, #>4 &] /.{1 →"Happy ",_→"Sad "}
, If[PrimeQ@#, "", "non-"]
, "prime"] &
h = Print[
If[NestWhile[Plus @@ (IntegerDigits@#^2) &, #, Unequal, All] == 1
,"Happy ", "Sad "],
If[PrimeQ@#, "", "non-"], "prime"] &
NestWhile[Plus @@ (IntegerDigits@#^2) &, #, Unequal, All]
h[7]
Happy prime
h[2535301200456458802993406410753]
Sad non-prime
1 Happy non-prime
2 Sad prime
3 Sad prime
4 Sad non-prime
5 Sad prime
6 Sad non-prime
7 Happy prime
8 Sad non-prime
9 Sad non-prime
10 Happy non-prime
11 Sad prime
12 Sad non-prime
13 Happy prime
sub h{$_==1&& happy||$s{$_}++&& sad
||do{$m=0;$m+=$_**2for split//;$_=$m;&h}}$n=$_=pop;
die h,$",(1x$n)=~/^1?$|^(11+?)\1+$/&&"non-","prime\n"
x=input()
def p(x):
if x==1 or 1 in [1 for i in range(2,x) if x%i==0]: return True
def h(x):
l=[]
while x not in l:
l.append(x)
x=sum([int(i)**2 for i in str(x)])
if 1 in l: return True
if h(x):print'happy',
elif not h(x):print'sad',
if p(x):print'non-prime'
elif not p(x):print'prime'
$ cat happyprimes
[happy][sad]?dsI[[I~d*rd0<H+]dsHxd4<h]dshx[r]sr1=rP[ ][ non-]_1lI[1-d2>rdlIr%0<p]dspx-2=rP[prime]p
$ echo 1 |dc happyprimes
happy non-prime
$ echo 139|dc happyprimes
happy prime
$ echo 2 |dc happyprimes
sad prime
$ echo 440|dc happyprimes
happy non-prime
$ echo 78 |dc happyprimes
sad non-prime
class P{static void Main(string[]a){var s=new System.Collections.Generic.HashSet<int>();int n=int.Parse(a[0]),p=n>1?4:0,c,d=1;for(;++d<n;)if(n%d<1)p=0;for(;n>1&s.Add(n);n=c)for(c=0;n>0;c+=d*d,n/=10)d=n%10;System.Console.Write((n>1?"sad":"happy")+" non-prime".Remove(1,p));}}
class P
{
static void Main(string[] a)
{
var s = new System.Collections.Generic.HashSet<int>();
int n = int.Parse(a[0]),
p = n > 1 ? 4 : 0,
c,
d = 1;
// find out if the number is prime
while (++d < n)
if (n % d < 1)
p = 0;
// figure out happiness
for (; n > 1 & s.Add(n); n = c)
for (c = 0; n > 0; c += d * d, n /= 10)
d = n % 10;
System.Console.Write(
(n > 1 ? "sad" : "happy")
+ " non-prime".Remove(1,p)
);
}
}
(defn h[x m](cond(= x 1)"happy "(m x)"sad ":else(recur(reduce +(for[n(map #(-(int %)48)(str x))](* n n)))(assoc m x 1))))(println(let [x (read)](str(h x{})(if(re-matches #"^1$|^(11+)?\1+"(apply str(repeat x\1)))"non-""")"prime")))
ptimac:clojure pti$ clj happy.clj 139
CP=/Users/pti/playpen/clojure:/Users/pti/Library/Clojure/lib/clojure.jar:/Users/pti/Library/Clojure/lib/jline.jar:/Users/pti/Library/Clojure/lib/clojure-contrib.jar
happy prime
ptimac:clojure pti$ clj happy.clj 440
CP=/Users/pti/playpen/clojure:/Users/pti/Library/Clojure/lib/clojure.jar:/Users/pti/Library/Clojure/lib/jline.jar:/Users/pti/Library/Clojure/lib/clojure-contrib.jar
happy non-prime
ptimac:clojure pti$ clj happy.clj 2
CP=/Users/pti/playpen/clojure:/Users/pti/Library/Clojure/lib/clojure.jar:/Users/pti/Library/Clojure/lib/jline.jar:/Users/pti/Library/Clojure/lib/clojure-contrib.jar
sad prime
ptimac:clojure pti$ clj happy.clj 78
CP=/Users/pti/playpen/clojure:/Users/pti/Library/Clojure/lib/clojure.jar:/Users/pti/Library/Clojure/lib/jline.jar:/Users/pti/Library/Clojure/lib/clojure-contrib.jar
sad non-prime
(defn h[x m]
(cond
(= x 1) "happy "
(m x) "sad "
:else (recur
(reduce +
(for [n (map #(- (int %) 48) (str x))] (* n n)))
(assoc m x 1))))
(println
(let [x (read)]
(str
(h x{})
(if (re-matches #"^1$|^(11+)?\1+"(apply str(repeat x \1)))
"non-"
"")
"prime")))
sub h{my$s;$s+=$_**2for split//,pop;($s-4)?($s-1)?&h($s):1:0}$a=pop;
print h($a)?happy:sad,$",(1x$a)=~/^1?$|^(11+?)\1+$/&&"non-",prime
let n=stdin.ReadLine()|>int
let rec s x=seq{yield x;yield!string x|>Seq.sumBy(fun c->(int c-48)*(int c-48))|>s}
printfn"%s %sprime"(if s n|>Seq.take 99|>Seq.exists((=)1)then"happy"else"sad")(if[2..n/2]|>Seq.exists(fun d->n%d=0)then"non-"else"")
n=input()
s='prime'
for i in range(2,n):
if n%i==0:
s='non'+s
break
f=list(str(n))
g=set()
while n!=1:
n=sum([int(z)**2 for z in f])
if n in g:
s='sad '+s
break
else:
f=list(str(n))
g.add(n)
else:
s='happy '+s
print s
import re
s=lambda n,l:0if n==1 else n in l or s(sum(int(a)**2for a in str(n)),l+[n])
n=input()
print['happy','sad'][s(n,[])],'non-'*bool(re.match(r'1?$|(11+?)\1+$','1'*n))+'prime'
h s n|n`notElem`s=h(n:s)$sum[read[k]^2|k<-show n]|1`elem`s="happy "|0<1="sad "
c n|n<2||any((0==).mod n)[2..n-1]="non-"|0<1=[]
y n=h[]n++c n++"prime"
main=readLn>>=putStr.y
function h(n){p=n=n<2?10:n;a=",";w="";s=[];while((y=a+s.join(a)+a).indexOf(a+n+a)<0){s.push(n);k=""+n;n=0;for(i=0;i<k.length;)c=k.charAt(i++),n+=c*c}w+=y.indexOf(",1,")<0?"sad ":"happy ";for(i=2;i<p;)p=p%i++?p:0;w+=p?"":"non-";return w+"prime"}
h(139) // returns "happy prime"
#include<iostream>
#define w while
int m,n,i,j,t=10;int main(){w(std::cin>>n){j=0,m=n;w(n>1){i=0;do i+=n%t*(n%t);w(n/=t);n=n*n+i;n=++j&0xFFFF?n:0;}i=1;w(m%++i&&j>1);std::cout<<(n?"happy":"sad")<<(i-m?" non-":" ")<<"prime\n";}}
object H{def main(a:Array[String]){var s=Set(0)
val n=a(0)toInt
def r(m:Int):String={val k=""+m map(c=>c*(c-96)+2304)sum;if(k<2)"happy"else if(s(k))"sad"else{s+=k;r(k)}}
printf("%s %sprime",r(n),if(n<2|(2 to n-1 exists(n%_==0)))"non-"else"")}}
l=n=input()
while l>4:l=sum(int(i)**2for i in str(l))
print['sad','happy'][l==1and str(n)!=1],
print['non-',''][n!=1 and sum(n%i==0for i in range(1,n))<2]+"prime"
Public Sub G(N)
Dim Z, D, X, O
X = N
Z = N
Do Until Z = 1 Or X > N Or X = 0
X = 0
For D = 1 To Len(CStr(Z))
X = X + CLng(Mid(CStr(Z), D, 1) ^ 2)
Next D
Z = X
Loop
If Z = 1 Then O = "Happy" Else O = "Sad"
D = 2
Do
If N / D = Int(N / D) Then O = O & " Not Prime": Debug.Print O: Exit Sub
D = D + 1
Loop While D < N
O = O & " Prime"
Debug.Print O
End Sub
function happyprime(a)
h={'non-prime','prime'};
h=h{isprime(str2num(a))+1};
for i=1:99
a=num2str(sum(str2num((a)').^2));
end
s={'Sad ','Happy '};
[s{(str2num(a)==1)+1},h]
happyprime 139
ans =
Happy prime
l=n=input()
while l>4:l=sum(int(i)**2for i in`l`)
print['sad','happy'][l<2],'non-prime'[4*all(n%i for i in range(2,n))*(n>1):]
n=input('');
s=n;
c={'happy ','sad ','non-'};
while s>6,
s=int2str(s)-48;
s=s*s'; %'# Comment to fix code highlighting
end;
disp([c{[s<2 s>1 ~isprime(n)]} 'prime'])
h=.1=$:@([:+/[:*:@"."0":)`]@.(e.&1 4)
1!:2&2;(({&('sad ';'happy '))@h,({&('non-prime';'prime'))@(1&p:))".(1!:1]3)
$ echo -n 7 | jc happy.ijs
happy prime
$ echo -n 139 | jc happy.ijs
happy prime
$ echo -n 2 | jc happy.ijs
sad prime
$ echo -n 440 | jc happy.ijs
happy non-prime
$ echo -n 78 | jc happy.ijs
sad non-prime
$t=$argv[1];for($z=$t-1,$p=1;$z&&++$p<$t;)$z=$t%$p;$f=array(1);while(!in_array($t,$f,1)){$f[]=$t;$t=array_reduce(str_split($t),function($v,$c){return $v+=$c*$c;});}print($t<2?"happy ":"sad ").(!$z?"non-":"")."prime";
$ php -r '$t=$argv[1];for($z=$t-1,$p=1;$z&&++$p<$t;)$z=$t%$p;$f=array(1);while(!in_array($t,$f,1)){$f[]=$t;$t=array_reduce(str_split($t),function($v,$c){return $v+=$c*$c;});}print($t<2?"happy ":"sad ").(!$z?"non-":"")."prime";' 139
happy prime
for(x=2,y=m=n=prompt();x*x<y&&n%x++;);for(s={};!s[m];m=p)for(s[m]=1,p=0;m;m=(m-=k=m%10)/10,p+=k*k);alert((m-1?'sad':'happy')+(n-1&&x*x>y?' ':' non-')+'prime')
// Getting the number from the input and checking for primeness
// (ie. if after the loop x>y => n is prime)
for (x=2, y=m=n=prompt(); x*x<y && n%x++;)
// Checking for happiness
// the loop is broken out of if m is already encountered
// the m==1 after the loop indicates happy number
for(s={}; !s[m]; m=p)
for (s[m]=1, p=0; m; m=(m -= k=m%10)/10, p+=k * k);
alert((m-1 ? 'sad' : 'happy') + (n-1 && x*x>y ? ' ' : ' non-') + 'prime')
~:@.{0\`{15&.*+}/}*1=!"happy sad "6/=@,{@\)%!},,2=4*"non-prime">
~:@9{0\`{15&.*+}/}*1=!"happy sad "6/=@,2>{@\%!},!4*"non-prime">
$n=$s=<>;$s=0,s/\d/$s+=$&*$&/ge while($_=$s)>4;die$s>1?sad:happy,$","non-"x(1x$n)=~/^1$|(^11+)\1+$/,prime
n=input();L=[n];print"%s non-prime"[4*([1for f in range(1,n)if L.append(sum(int(x)**2for x in`L[-1]`))or n%f<1]==[1]):]%['sad','happy'][1in L]
h
s/^/printf %*s /e
s/^ $|^( +)\1+$/non-/
s/ *$/prime/
x
:a
s/./+&*&/g
s//bc<<</e
tb
:b
s/^1$/happy/
s/^4$/sad/
Ta
G
s/\n/ /
h
:a
s/./+&*&/g
s/.*/echo 0&|bc/e
tb
:b
s/^1$/happy/
s/^4$/sad/
Ta
x
s/^/yes|head -/e
s/\n//g
s/^y$|^(yy+)\1+$/non-/
s/y*$/prime/
x
G
s/\n/ /
h
:a
s/./+&*&/g
s//bc<<</e
tb
:b
s/^1$/happy/
s/^4$/sad/
Ta
p
g
s/^/printf %*s /e
s/^ $|^( +)\1+$/non-/
s/$/prime/