パリンドローム素因数


15

回文の素数の問題はかなり一般的ですが、それはこの質問の目的ではありません。この挑戦では、数は回文である必要はありません、その主な要因はそうです。

仕事

コードは、入力として単一の正の整数を取る必要があります。次に、その整数の素因数の順列のいずれかが連結時に回文的であるかどうかを確認します。その場合、それらの1つを出力します(連結された文字列ではなく、因子のリスト)。そうでなければ、出力する必要があります-1

これはなので、バイト単位の最短コードが勝ちです!

テストケース

11 -> [11]
4 -> [2, 2]
39 -> [3, 13]
6 -> -1
1207 -> [17, 71]
393 -> -1
2352 -> [2, 2, 7, 3, 7, 2, 2]

1
-1返される以外の識別可能な値はありますか?Perl 6のでは、私は考えているNilFailまたは他の未定義の値。また、出力は任意の位置値にすることができますか?
ブラッドギルバートb2gills

リスト、配列、シーケンス、範囲、バフ、スリップはすべて位置値です。それは彼らが位置的役割をするということです。
ブラッドギルバートb2gills

だから、空のリストを出力する1必要があり-1ますか?
ジョーキング

要素としての-1は、-1のみを含む1つの配列とは異なる
-RosLuP

回答:



3

Pyth、14バイト

-FryAmTheEggmanによる-2バイト

h+f_IjkT.pPQ_1

説明:

h                 first element of
 +                (append a -1 to the end in case the filter is empty)
  f                 filter by lambda T:
   _I                 is invariant under reversing
     jkT              stringified list
   .p                over permutations of
     P Q             prime factors of Q with duplicates
  _1              -1

思い出させてくれてありがとう@FryAmTheEggman I。私は前にそれを使用したとは思わない。

テストスイート


jkと同じですs`M
マルティセン

3

CJam-17バイト

10バイト節約してくれたMartinBüttnerに感謝します!

Wqimfe!{s_W%=}=p;

CJamで初めて書いた!説明:

W              # Push a -1 onto the stack
q               # Get input
i               # Convert to integer
mf              # Find prime factorization
e!              # Find all permutations
{...}=          # Find permutation which...
s               # Convert to string
_               # Copy string
W%              # Get inverse
=               # Check if inverse == original
p;              # Print top of stack and discard the rest

3
を使用して文字列(または配列)を反転できW%ます。また、使用することができます=最初の回文素数因数分解を取得するブロックで。それは18バイトになります:Wrimfe!{s_W%=}=p];...エラーで終了することでもう1つ節約できます(エラー出力はSTDERRに送られるため):Wrimfe!{s_W%=}=p;
Martin Ender

3
@MartinBüttnerこれがPPCGが大好きな理由です。誰もがとても親切でフレンドリーです!
KoreanwGlasses

2

ルビー、89 + 7 = 96 102 + 7 = 109

->n{n.prime_division.flat_map{|*a,b|a*b}.permutation.find{|x|x.join==x.join.reverse}||-1}

-rprimeフラグの場合は+7 。

ため息、いくつかのRubyビルトインはそのような長い名前を持っています...少なくともそれはコードをかなり自明にします。

flat_mapビットがあるためであるprime_division返すEX。[[2, 2], [3, 1]]入力用12(これは2231)。

13バイトの@histocratに感謝します!


@histocratこれはOP側の間違いでした(質問に関するコメントを参照)。おかげで、それは感嘆符のきちんとしたトリックです。
ドアノブ

2

ジュリア、132 122バイト

n->(x=filter(p->(q=join(p))==reverse(q),permutations(foldl(vcat,[[repeated(k,v)...]for(k,v)=factor(n)]))))==[]?-1:first(x)

これは、整数を受け入れ、配列または-1を返すラムダ関数です。呼び出すには、変数に割り当てます。

ゴルフをしていない:

function f(n::Int)
    # Construct an array of all prime factors of n
    P = foldl(vcat, [[repeated(k, v)...] for (k, v) in factor(n)])

    # Filter the set of permutations of this array to only
    # those such that the string constructed by concatenating
    # all elements is a palindrome
    x = filter(p -> (q = join(p)) == reverse(q), P)

    # If x is empty, return -1, otherwise get the first array
    # in the collection
    return x == [] ? -1 : first(x)
end

グレンOのおかげで10バイト節約できました!


一見すると、これを改善するいくつかの方法があります(基本的なゴルフに基づいています)。foldl代わりに使用しますreduce(これらは同じことを行いますが、foldl順序が定義されており、1バイト短くなっています)。代わりに、空の構造との直接比較を使用しますisempty(タイプxが100%かどうかはわかりませんが、たとえばセットの場合はを使用しますx==[])。そして、使用(q=join(p))だけで、その後とq2つのバイトを保存するためのフィルタで。
グレンO

また、私は誤解される可能性がありますxが、配列の場合、ではなくfirst(x)、を使用しますx[]
グレンO

@GlenOいつもありがとう!私は最初に試してみまし==[]たが、エラーが発生していましたが、今もう一度試してみましたが、うまくいきました。前に何かを台無しにしたに違いない。¯\ _(ツ)_ /¯私が使用できなかった唯一の提案は、取り除くことですfirst。この場合、定義されていないイテレータ/コレクション/何かであるfirstため、使用する必要xがありますgetindex
アレックスA.

2

Brachylog、10バイト

ḋp.cX↔X∨_1

オンラインでお試しください!

  .           The output is
 p            a permutation of
ḋ             the prime factorization of
              the input
   c          such that concatenated
    X         it is the variable X
     ↔        which reversed
      X       is still X;
       ∨      if this is not possible,
              the output is
        _1    -1.

最初は、-1失敗を許可する代わりに出力する必要があることはかなり大きなバイトコストになると予想していましたが、成功した場合の出力は連結できないため、書き込むのに必要な2バイトしかかかりません_1(それらを削除すると、出力は制約なしでデフォルトのままになり、0さらにtoを変更すると、代わりに述語が失敗します)、暗黙的な出力との統合をどちらかの方法で解除する必要があるためです。(連結が成功-1の出力であるが、失敗の出力である場合は、ḋpc.↔|∧_1またはになりḋpc.↔.∨_1ます。出力が連結され、述部が失敗する可能性がある最短の場合、全体は5バイトのみです。ḋpc.↔。実際の要因を出力しないと、より多くの感覚が得られます...)


1

Haskell、122バイト

import Data.Numbers.Primes
import Data.List
f x=head$[p|p<-permutations$primeFactors x,s<-[show=<<p],s==reverse s]++[[-1]]

使用例:f 39-> [3,13]

明白なブルートフォースアプローチ。素因数のすべての順列を反復処理し、回文をチェックします。最初のものを選んでください。存在しない場合、リストは空で、追加されたものが[-1]ジャンプします。


1

Perl 6、100バイト

{$/=$_;map(->\f{|({$/%f||($//=f)&&f}...^*!==f)},2..$_).permutations.first({.join.flip eq.join})||-1}
{
  # store copy of argument in $/
  $/ = $_;
  # uses $/ so that I don't have to declare a variable

  # find the prime factors
  map(
    ->\f{
      # Slip so that outer list of all prime factors is flat
      |(
        {
          $/ % f    # return modulus
          ||        # or
          ($/ /= f) # factor the prime out of $/
          &&        # and
          f         # return factor
        }
        # produce a list of them and
        # stop when it returns something other than the factor
        # also ignoring the last non-factor value
        ...^ * !== f
      )
    },
    # find the factors out of the values from 2
    # up to the original argument
    2..$_
    # don't need to skip the non-primes as their
    # prime factorization will have already be
    # factored out of $/
  )

  # try all permutations of the prime factors
  .permutations

  # find the first palindromic one
  .first({ .join.flip eq .join })

  # return -1 if .first returned Nil or empty list
  || -1
}

使用法:

# give it a lexical name
my &prime-palindrome = {...}

say prime-palindrome    1; # -1
say prime-palindrome    2; # (2)
say prime-palindrome   11; # (11)
say prime-palindrome   13; # -1
say prime-palindrome   39; # (3 13)
say prime-palindrome   93; # (31 3)
say prime-palindrome    6; # -1
say prime-palindrome 1207; # (17 71)
say prime-palindrome  393; # -1
say prime-palindrome 2352; # (2 2 7 3 7 2 2)
say prime-palindrome 2351; # -1
say prime-palindrome 2350; # -1

約半分(53バイト)が素因数分解コードで使用されます。

$/=$_;map(->\f{|({$/%f||($//=f)&&f}...^*!= f)},2..$_)

prime-factorizeメソッドがあれば、全体がかなり短くなる可能性があります。

{.prime-factorize.permutations.first({.join.flip eq.join})||-1} # 63

短い素因数コードセクションは次のようになります$!=$_;({+$!/($!/=1+(2...$!%%*))}...{2>$!})
ジョーキング

1

ゼリー、16バイト

ÆFŒṙŒ!VŒḂ$ƇḢ¹-¹?

バイト数と書き込みにかかった時間の両方で、予想よりも長くなりました。

オンラインでお試しください!

説明:

ÆFŒṙŒ!VŒḂ$ƇḢ¹-¹?
ÆFŒṙ                Get the prime factors (gets them as exponents then run-length decodes).
    Œ!              Get the permutations.
          Ƈ         Filter (keep) the ones that...
       ŒḂ$          ...are palindromic when...
      V             ...joined.
           Ḣ        Take the first.
              ¹?    If the value is truthy...
            ¹       ...return the value...
             -      else return -1.

1

Japt -F-1、9バイト

k á æ_¬êS

それを試してみてください


このウィンドウの電話ではリンクは
正常

@RosLuPインタープリターはまだかなり新しいです。作成者のShaggyにpingを送信します。これがTIOリンクです
オリバー

1
@RosLuP、どのブラウザを使用していますか?
シャギー

Internet Explorer for Windows Phone 8.1:(携帯電話)消えつつあるもの、おそらく新しい携帯電話のアンドロイドまたはWindows 10のブラウザーを使用する方が良い(エッジと呼ばれるようです)
-RosLuP

0

Japt、18バイト

CJamとほぼ同じくらい短い...

Uk á f_¬¥Z¬w} g ªJ

オンラインでお試しください!

使い方

        // Implicit: U = input, e.g. 2352
Uk      // Factorize the input.      [2,2,2,2,3,7,7]
á       // Take permutations.        [[2,2,2,2,3,7,7],[2,2,2,2,7,3,7],[2,2,2,7,2,3,7],...]
f_   }  // Filter to only the ones that return truthily to this function:
Z¬¥Z¬w  //  Return Z.join('') == Z.join('').reverse().
        //                           [[2,2,7,3,7,2,2],[2,7,2,3,2,7,2],[7,2,2,3,2,2,7]]
g       // Take the first item.      [2,2,7,3,7,2,2]
ªJ      // If falsy, resort to -1.   [2,2,7,3,7,2,2]

0

JavaScript(ES6)、256 244 208 187バイト

@Neilのおかげで36バイト節約

x=>eval("for(a=[],i=2;x>1;x%i?i++:(a.push(i),x/=i));p=-1,f=(z,t=[])=>z[0]?z.map((u,i)=>f([...z.slice(0,i),...z.slice(i+1)],[...t,u])):(y=t.join``)==[...y].reverse().join``&&(p=t),f(a),p")

無名関数を定義します。例えばF=、それを使用するために追加します。2352の入力では実際に非常に高速で、コンピューターで完了するまでに約150ミリ秒しかかかりません。


私はより速く知りませんが、間違いなくより短く:x=>eval("for(a=[],i=2;x>1;x%i?i++:(a.push(i),x/=i));p=[],f=(z,t=[])=>z.length?z.map((u,i)=>f([...z.slice(0,i),...z.slice(i+1)],[...t,u])):(y=t.join``)==[...y].reverse().join``&&p.push(t),f(a),p[0]||-1")
ニール

@Neilありがとう、それはたまたま私のアルゴリズムよりも数倍速いです!
ETHproductions

36バイト?それは私にとっての記録だと思う。
ニール

0

APL(NARS)、169文字、338バイト

∇r←F w;i;k;a;m;j
  r←⊂,w⋄→0×⍳1≥k←↑⍴w⋄a←⍳k⋄j←i←1⋄r←⍬⋄→C
A: m←i⊃w⋄→B×⍳(i≠1)∧j=m⋄r←r,m,¨∇w[a∼i]⋄j←m
B: i+←1
C: →A×⍳i≤k
∇
G←{F⍵[⍋⍵]}
f←{∨/k←{⍵≡⌽⍵}¨∊¨⍕¨¨v←Gπ⍵:↑k/v⋄¯1}

Gは順列を見つける関数であり、fはこのエクササイズの関数です。テスト:

  ⎕fmt f¨11 4 39 6 1207 393 2352 
┌7───────────────────────────────────────────────────┐
│┌1──┐ ┌2───┐ ┌2────┐    ┌2─────┐    ┌7─────────────┐│
││ 11│ │ 2 2│ │ 3 13│ ¯1 │ 17 71│ ¯1 │ 2 2 7 3 7 2 2││
│└~──┘ └~───┘ └~────┘ ~~ └~─────┘ ~~ └~─────────────┘2
└∊───────────────────────────────────────────────────┘
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.