回答:
n=input()
e=m=0
f=2
while~-n:q=n%f<1;f+=1-q;e=q*-~e;m=max(m,e);n/=f**q
print m
-5 ovsに感謝します。
この答えはプライムチェックを行いません。代わりに、素因数の最高指数が数値の因数分解における他の因子の指数以上になるという事実を利用します。
-h
、k ü mÊn
k ü mÊn :Implicit input of integer
k :Prime factors
ü :Group by value
m :Map
Ê : Length
n :Sort
:Implicit output of last element
ü
等しい値のサブ配列を作成します。それはありません最初のソート値でも、それはここでは関係ありません。
Max@@Last/@FactorInteger@#&
。残念ながら、これはバイトを保存しません。
ḋḅlᵐ⌉
ḋ Prime decomposition
ḅ Group consecutive equal values
lᵐ Map length
⌉ Maximum
*無限のスタックを想定(コードゴルフの課題と同様)
P=(n,i=2,k)=>i>n?k:n%i?k>(K=P(n,i+1))?k:K:P(n/i,i,-~k)
console.log(P(2 )== 1)
console.log(P(3 )== 1)
console.log(P(4 )== 2)
console.log(P(5 )== 1)
console.log(P(6 )== 1)
console.log(P(7 )== 1)
console.log(P(8 )== 3)
console.log(P(9 )== 2)
console.log(P(10 )== 1)
console.log(P(11 )== 1)
console.log(P(12 )== 2)
console.log(P(144 )== 4)
console.log(P(200 )== 3)
console.log(P(500 )== 3)
console.log(P(1024 )== 10)
//console.log(P(3257832488 )== 3)
n->vecmax(factor(n)[,2])
n->
部品を数えないと、21バイトです。
eS/LPQP
(7バイト)、eSlM.gkP
(8バイト)。
f=lambda n,i=2,l=[0]:(n<2)*max(map(l.count,l))or n%i and f(n,i+1,l)or f(n/i,2,l+[i])
@(x)max(histc(a=factor(x),a));
a=factor(x)
の素因数を含むベクトルを返しますx
。これは、ベクトル内のすべての数値が素数になるように、すべての数値の乗算がそれ自体をfactor(x)
もたらす昇順でソートさx
れたベクトルです。histc(...,a)
ビンが素因数である素因数ベクトルのヒストグラムを計算します。ヒストグラムは、各素数を見た回数をカウントアップするため、各素数の指数が得られます。factor(x)
重複する数値またはビンを返す場合でも、素数が表示される合計時間をキャプチャするのはビンの1つだけであるため、ここで少しごまかすことができます。max(...)
したがって、最大の指数を返します。/o
\i@/w].D:.t$Kq
/o
\i@/...
これは、10進数のI / Oを備えた単純な算術プログラムの単なるフレームワークです。の...
は実際のプログラムであり、既にスタックに入力があり、スタックの最上部に出力が残ります。
アリスには、整数の素因数分解を行うための組み込み関数があります(素数と指数のペアを使用する場合でも)が、これを使用して考え出した最短はこれより10バイト長くなります。
代わりに、1に達するまで、入力から各素因数の1つのコピーを繰り返し分割するという考え方です。これがとるステップの数は、最大の素数指数に等しくなります。カウンター変数としてテープヘッドを悪用します。
w Remember the current IP position. Effectively starts a loop.
] Move the tape head to the right, which increments our counter.
.D Duplicate the current value, and deduplicate its prime factors.
That means, we'll get a number which is the product of the value's
unique prime factors. For example 144 = 2^4 * 3^2 would become
6 = 2 * 3.
: Divide the value by its deduplicated version, which decrements the
exponents of its prime factors.
.t Duplicate the result and decrement it. This value becomes 0 once we
reach a result of 1, which is when we want to terminate the loop.
$K Jump back to the beginning of the loop if the previous value wasn't 0.
q Retrieve the tape head's position, i.e. the number of steps we've taken
through the above loop.
print()
。また、TIOでコードをそのまま実行することができませんでした。そこで利用できない言語の他のバージョンでも動作すると思いますか?これはTIOで正常に実行されます print(maximum(collect(values(factor(parse(BigInt,readline()))))))
print()
答えは完全なプログラムをする必要があるために必要とされる(つまりディスプレイ出力)または関数(そのリターン出力)。それ以外の場合、ソリューションは問題ありません。次のように、いくつかのバイトを保存(および印刷を回避)できるようですf(x)=maximum(collect(values(factor(x))))
H.PWizのおかげで-4バイト。
lambda n:max(a*(n%k**a<1)for a in range(n)for k in range(2,-~n))
H.PWizのHaskell回答のポート。これを共有しているのは、このHaskellコードを理解して翻訳できたことを誇りに思っているからです。:P
range(1,n)
ませんか?
range(1, n)
[1、n)のすべての整数を生成します。
a
(λ(n)(cadr(argmax cadr((let()(local-require math/number-theory)factorize)n))))
(完全なRacketソリューションを構成するものについてコンセンサスがあるかどうかはわかりませんので、純粋な関数が重要であるというMathematicaの慣習に従います。)
factorize
分解をペアのリストとして(factorize 108)
与える:gives '((2 2) (3 3))
。ペアの2番目の要素は、(リストの先頭)と(リストの末尾)のcadr
合成の省略形であるによって与えられます。car
cdr
(cadr (argmax cadr list))
2番目の要素の最大値を見つけるために愚かなことをしているように感じますが、max
リストに対しては(max (map cadr list))
機能しません。私はラケットの専門家ではないので、これを行うための標準的なより良い方法があるかもしれません。
(λ(n)(define(p d m)(if(=(gcd m d)d)(+(p d(/ m d))1)0))(p(argmax(λ(d)(p d n))(range 2 n))n))
インポートせずfactorize
、代わりにすべてをほぼゼロから実行する代替バージョン。機能は、(p m d)
最高のパワー見つけるd
こと除算をm
し、我々はただの最高値を見つける(p n d)
ためのd
間2
とをn
。(これを素数に制限する必要はありません。素数の力よりもうまく機能する複合力はないからです。)
max
ソリューションです(apply max (map cadr list)
が、(cadr (argmax cadr list))
残念ながら短いです。
{⌈/+/¨v∘=¨v←π⍵}
test:
f←{⌈/+/¨v∘=¨v←π⍵}
f¨2..12
1 1 2 1 1 1 3 2 1 1 2
f¨144 200 500 1024 3257832488
4 3 3 10 3
comment:
{⌈/+/¨v∘=¨v←π⍵}
v←π⍵ π12 return 2 2 3; assign to v the array of prime divisors of argument ⍵
v∘=¨ for each element of v, build one binary array, show with 1 where are in v array, else puts 0
return one big array I call B, where each element is the binary array above
+/¨ sum each binary element array of B
⌈/ get the max of all element of B (that should be the max exponet)