在此任务中,您必须编写一个程序,该程序可以计算数字的素数。输入为自然数1 <n <2 ^ 32。输出是采用以下格式的数字素数的列表。如果指数为1,则必须省略。仅输出质数。(假设输入为131784):
131784 = 2 ^ 3 * 3 * 17 ^ 2 * 19
不需要使用相同数量的空格;可以在适当的地方插入空格。您的程序应在不到10分钟的时间内完成输入。字符数最短的程序获胜。
在此任务中,您必须编写一个程序,该程序可以计算数字的素数。输入为自然数1 <n <2 ^ 32。输出是采用以下格式的数字素数的列表。如果指数为1,则必须省略。仅输出质数。(假设输入为131784):
131784 = 2 ^ 3 * 3 * 17 ^ 2 * 19
不需要使用相同数量的空格;可以在适当的地方插入空格。您的程序应在不到10分钟的时间内完成输入。字符数最短的程序获胜。
Answers:
N=input()
print N,"=",factor(N)
测试用例:
83891573479027823458394579234582347590825792034579235923475902312344444
输出:
83891573479027823458394579234582347590825792034579235923475902312344444 = 2^2 * 3^2 * 89395597 * 98966790508447596609239 * 263396636003096040031295425789508274613
perl -pe '$_=`factor $_`;s%( \d+)\K\1+%-1-length($&)/length$1%ge;y, -,*^,;s;\D+;=;'
从标准输入中获取输入编号。如果提供,将计算多个输入的因子。
算作与的差额perl -e
。\K
正则表达式元字符需要5.10 。
factor
。
p
选项吗?
split/\D/,~factor $_~;$_="@_";
你不能写$_=~factor $_~;s/\D/ /g;
吗?(当然~
要用反引号代替。)
$_=`factor $_`;s/\D/ /g;
?双重反引号包围有帮助。
最佳Python代码的直接命令翻译:
let(%)s d=if!d>1then Printf.printf"%s%d"s!d
let f n=let x,d,e,s=ref n,ref 1,ref 0,ref"="in""%x;while!d<65536do
incr d;e:=0;while!x mod!d=0do x:=!x/ !d;incr e
done;if!e>0then(!s%d;"^"%e;s:="*")done;!s%x
例如,
# f 4294967292;;
4294967292=2^2*3^2*7*11*31*151*331- : unit = ()
(请注意,我省略了输出最终的结束语。)只是为了娱乐,纯功能性的版本只有213个字符,通过自由使用运算符将其彻底混淆了:
let(%)s d=if d>1then Printf.printf"%s%d"s d
let f x=let s=ref"="in""%x;let rec(@)x d=if d=65536then!s%x else
let rec(^)x e=if x/d*d<x then x,e else x/d^e+1in
let x,e=x^0in if e>0then(!s%d;"^"%e;s:="*");x@d+1in x@2
M=N=input()
s=''
f=1
while f<4**8:
f+=1;e=0
while N%f<1:e+=1;N/=f
if e:s+='*%d'%f+'^%d'%e*(e>1)
print M,'=',(s+'*%d'%N*(N>1))[1:]
' * %d'
...而两两件事:65536 == 4**8
; 7号线:if e:s+='*%d'%f+'^%d'%e*(e>1)
(":*/f),'=',([,'*',])/(":"0~.f),.(('^',":)`(''"0)@.(=&1))"0+/(=/~.)f=.q:161784
典型的J。大部分工作由两个角色完成,而60个角色则可以完成。
编辑:固定字符数。
161784
是您的输入,仍然是72个字符。
|: __ q: y
?
此解决方案采用了randomra解决方案中的rplc
技巧,但也提出了一些原始想法。
":,'=',(":@{.,'^','*',~":@#)/.~@q:}:@rplc'^1*';'*'"_
在非默认表示法中,此功能变为
f =: 3 : 0
(": y) , '=' , }: (g/.~ q: y) rplc '^1*' ; '*'
)
在哪里g
定义为
g =: 3 : 0
": {. y) , '^' , (": # y) , '*'
)
q: y
是的向量质因数的y
。例如,q: 60
yields 2 2 3 5
。x u/. y
适用u
于y
带键的通过x
,即,u
被施加到的元素的向量y
为这在条目x
是相等的。这是一个复杂的位来解释,但在特殊的情况y u/. y
或u/.~ y
,u
被施加到在不同元件的每个矢量y
,其中每个元素重复经常因为它出现在y
。例如,</.~ 1 2 1 2 3 1 2 2 3
收益
┌─────┬───────┬───┐
│1 1 1│2 2 2 2│3 3│
└─────┴───────┴───┘
# y
是吻合的y
,即在项目的数量y
。
": y
格式化 y
为字符串。x , y
追加 x
和y
。{. y
是head y
,即它的第一项。(": {. y), '^' , (": # y) , '*'
的n个重复的向量格式化为形式为k ^ n * 的字符串。这个默认的短语是,我们将其传递给上面进一步描述的副词。:@{.,'^','*',~":@#
/.
x rplc y
是库函数替换字符。 y
具有形式,a ; b
并且a
in中的string的每个实例均被x
替换b
。x
在进行操作之前将其弄平(即重塑以使其具有等级1),在此使用。此代码替换^1*
用*
的符合规定的输出格式。}: y
是缩减的y
,即所有,但其最后一个项目。这用于删除结尾*
。Python 119个字符
M=N=input()
i=1
s=""
while N>1:
i+=1;c=0
while N%i<1:c+=1;N/=i
if c:s+=" * %d"%i+['','^%d'%c][c>1]
print M,'=',s[3:]
$f[$n=$c=$argv[1]]++;echo"$n=";while($c){$c=0;foreach($f as$k=>$n)for($r=~~($k/2);$r>1;$r--){if($k%$r==0){unset($f[$k]);$f[$r]++;$f[$k/$r]++;$c=1;break;}}}foreach($f as$k=>$n)if(--$n)$f[$k]="$k^".++$n;else$f[$k]=$k;echo implode("*",$f);
131784的输出:2 ^ 3 * 3 * 17 ^ 2 * 19
在测试时几秒钟内完成所有数字。
4294967296=2^32
Time: 0.000168
从来没有指定输入,所以我选择使用命令行参数来调用它。
php factorize.php 4294967296
def f(i:Int,c:Int=2):List[Int]=if(i==c)List(i)else
if(i%c==0)c::f(i/c,c)else f(i,c+1)
val r=f(readInt)
class A(val v:Int,val c:Int,val l:List[(Int,Int)])
def g(a:A,i:Int)=if(a.v==i)new A(a.v,a.c+1,a.l)else new A(i,1,(a.v,a.c)::a.l)
val a=(new A(r.head,1,Nil:List[(Int,Int)])/:(r.tail:+0))((a,i)=>g(a,i))
a.l.map(p=>if(p._2==1)p._1 else p._1+"^"+p._2).mkString("", "*", "")
松散:
def factorize (i: Int, c: Int = 2) : List [Int] = {
if (i == c) List (i) else
if (i % c == 0) c :: f (i/c, c) else
f (i, c+1)
}
val r = factorize (readInt)
class A (val value: Int, val count: Int, val list: List [(Int, Int)])
def g (a: A, i: Int) =
if (a.value == i)
new A (a.value, a.count + 1, a.list) else
new A (i, 1, (a.value, a.count) :: a.list)
val a = (new A (r.head, 1, Nil: List[(Int,Int)]) /: (r.tail :+ 0)) ((a, i) => g (a, i))
a.l.map (p => if (p._2 == 1) p._1 else
p._1 + "^" + p._2).mkString ("", "*", "")
f=.3 :0
(":y),'=',' '-.~('^1 ';'')rplc~}:,,&' *'"1(,'^'&,)&":/"{|:__ q:y
)
f 131784
131784=2^3*3*17^2*19
64个字符,输入变量x
:
x=.131784
(":x),'=',' '-.~('^1 ';'')rplc~}:,,&' *'"1(,'^'&,)&":/"{|:__ q:x
131784=2^3*3*17^2*19
3 : 0
定义。
3 : 0
版本中放入未转义的字符串,但由于某种原因它不起作用。我可能稍后再尝试默认。这是我尝试的3:0:pastebin.com/rmTVAk4j。
y
?
''
而不是a:
在一个地方。也许那是区别?
n->{var r=n+"=";for(int i=1,f;i++<n;r+=f<1?"":(f<2?i:i+"^"+f)+(n>1?"*":""))for(f=0;n%i<1;n/=i)f++;return r;}
class M{public static void main(String[]a){long n=new Long(a[0]),i=1,f;String r=n+"=";for(;i++<n;r+=f<1?"":(f<2?i:i+"^"+f)+(n>1?"*":""))for(f=0;n%i<1;n/=i)f++;System.out.print(r);}}
-1个字节感谢@ceilingcat。
说明:
n->{ // Method with integer parameter and String return-type
var r=n+"="; // Result-String, starting at the input with an appended "="
for(int i=1,f;i++<n;
// Loop in the range [2, n]
r+= // After every iteration: append the following to the result-String:
f<1? // If the factor `f` is 0:
"" // Append nothing
: // Else:
(f<2? // If the factor `f` is 1:
i // Append the current prime `i`
: // Else:
i+"^"+f) // Append the current prime `i` with it's factor `f`
+(n>1? // And if we're not done yet:
"*" // Also append a "*"
: // Else:
"")) // Append nothing more
for(f=0; // Reset the factor `f` to 0
n%i<1; // Loop as long as `n` is divisible by `i`
n/=i) // Divide `n` by `i`
f++; // Increase the factor `f` by 1
return r;} // Return the result-String
param($x)(2..$x|%{for(;!($x%$_)){$_
$x/=$_}}|group|%{$_.Name+"^"+$_.Count-replace'\^1$'})-join'*'
解释测试脚本:
$f = {
param($x) # let $x stores a input number > 0
(2..$x|%{ # loop from 2 to initial input number
for(;!($x%$_)){ # loop while remainder is 0
$_ # push a current value to a pipe
$x/=$_ # let $x is $x/$_ (new $x uses in for condition only)
}
}|group|%{ # group all values
$_.Name+"^"+$_.Count-replace'\^1$' # format and remove last ^1
})-join'*' # make string with *
}
&$f 2
&$f 126
&$f 129
&$f 86240
#&$f 7775460
输出:
2
2*3^2*7
3*43
2^5*5*7^2*11
³”=³ÆFḟ€1j€”^j”*
我的第一个果冻答案之一,因此绝对可以打高尔夫球(特别是³”=³
)。
说明:
³ # Push the first argument
”= # Push string "="
³ÆF # Get the prime factor-exponent pairs of the first argument
ḟ€1 # Remove all 1s from each pair
j€”^ # Join each pair by "^"
j”* # Join the pair of strings by "*"
# (implicitly join the entire 'stack' together)
# (which is output implicitly as result)
(non-competing)
。:)
ÐfsÓ0Køε1K'^ý}'*ý'=ý
-2个字节,感谢@Emigna。
说明:
Ð # Triplicate the (implicit) input-integer
f # Pop and push all prime factors (without counting duplicates)
s # Swap to take the input again
Ó # Get all prime exponents
0K # Remove all 0s from the exponents list
ø # Zip it with the prime factors, creating pairs
ε # Map each pair to:
1K # Remove all 1s from the pair
'^ý '# And then join by "^"
}'*ý '# After the map: join the string/integers by "*"
'=ý '# And join the stack by "=" (with the input we triplicated at the start)
# (after which the result is output implicitly)
1K
应该在循环中工作而不是`≠iy。
{(⍕⍵),'=',3↓∊{m←' * ',⍕↑⍵⋄1=w←2⊃⍵:m⋄m,'^',⍕w}¨v,¨+/¨{k=⍵}¨v←∪k←π⍵}
测试和评论:
f←{(⍕⍵),'=',3↓∊{m←' * ',⍕↑⍵⋄1=w←2⊃⍵:m⋄m,'^',⍕w}¨v,¨+/¨{k=⍵}¨v←∪k←π⍵}
f 131784
131784=2^3 * 3 * 17^2 * 19
f 2
2=2
f (2*32)
4294967296=2^32
{(⍕⍵),'=',3↓∊{m←' * ',⍕↑⍵⋄1=w←2⊃⍵:m⋄m,'^',⍕w}¨v,¨+/¨{k=⍵}¨v←∪k←π⍵}
k←π⍵ find the factors with repetition of ⍵ and assign that array to k example for 12 k is 2 2 3
v←∪ gets from k unique elements and put them in array v
+/¨{k=⍵}¨ for each element of v count how many time it appear in k (it is array exponents)
v,¨ make array of couples from element of v (factors unique) and the array above (exponents unique)
∊{m←' * ',⍕↑⍵⋄1=w←2⊃⍵:m⋄m,'^',⍕w}¨ pretty print the array of couples factor exponent as array chars
3↓ but not the first 3 chars
(⍕⍵),'=' but print first the argument and '=' in char format
如果某人有很多时间使用这些原语,请对它们非常了解,对我来说,代码可能更清晰地注释...因此代码比注释更清晰,注释无用...
n=prompt()
s=n+'='
c=0
for(i=2;;){if(n%i<1){c++
n/=i}else{if(c)s+=i+'^'+c+'*'
c=0
if(++i>n)break}}
alert(s)
120
n=prompt()
o={2:0}
for(i=2,c=n;i<=c;)!(c%i)?++o[i]?c/=i:0:o[++i]=0
s=n+'='
for(i in o)s+=o[i]?i+'^'+o[i]+'*':''
alert(s)
*
在输出和打印指数即使是1
*
假定乘以1
。如果有这么大的问题,我会解决。
1
不应打印指数。不,这 *
也是反对的。如果可以自由选择输出格式,那么炮轰到factor(1)
将是最容易的一种。如果答案都解决相同的问题,则只能合理地比较答案。