回文素因子


15

回文质素问题很普遍,但这不是这个问题的实质。在这个挑战中,数字不一定是回文,它的主要因素就是如此。

任务

您的代码必须采用单个正整数作为输入。然后,在连接时检查该整数的质数因子的任何排列是否回文。如果是这样,则输出其中之一(因子列表,而不是串联字符串)。否则,您必须输出-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 '16

列表,数组,序列,范围,缓冲,滑动都是位置值。那就是他们扮演位置角色。
布拉德·吉尔伯特b2gills '16

所以..我们应该为1或输出一个空列表-1吗?
乔·金

-1作为元素不同于仅包含-1的一个数组
RosLuP

Answers:


4

05AB1E,7个字节

Òœ.ΔJÂQ

在线尝试!

说明:

Ò            # prime factorization of the input
 œ           # permutations
  .Δ         # find the first one such that
    J        # concatenated
     ÂQ      # is a palindrome

方便地默认为-1,因此不需要额外的工作)


3

Pyth,14个字节

-2字节@FryAmTheEggman

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。我不认为我曾经使用过它。

测试套件


jks`M
Maltysen '16

3

CJam-17个字节

感谢MartinBüttner为我节省了10个字节!

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];...您可以通过终止错误来保存一个字节(因为错误输出到达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

感谢@histocrat的13个字节!


@histocrat那是OP的一个错误(请参阅问题注释)。谢谢,这是splat的巧妙技巧。
Doorknob

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)

这是一个lambda函数,它接受一个整数并返回一个数组或-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

感谢Glen O,节省了10个字节!


乍一看,我看到了几种改进方法(仅基于基础打高尔夫球)。使用foldl而不是reduce(它们做同样的事情,但是foldl已经定义了顺序并且短了一个字节)。使用直接比较而不是空结构isempty(我不是100%知道是什么类型x,但是例如,如果是集合,请使用x==[])。然后使用(q=join(p)),然后q在过滤器中保存另外两个字节。
Glen O

另外,我可能是错误的,但如果x是一个数组,然后而不是first(x),只是使用x[]
Glen O

@GlenO一如既往的感谢!我最初尝试过==[],但是却给我带来了错误,但现在我又尝试了一次,并且可以正常工作。我以前一定搞砸了。¯\ _(ツ)_ /¯我唯一无法使用的建议是摆脱first;在这种情况下,我必须使用,first因为它x是一个没有getindex定义的迭代器/集合/东西。
Alex 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而不是允许失败会花费相当大的字节成本,但是由于无法串联输出成功的情况下的输出,因此仅花费了写入所需的两个字节_1(如果我们去掉这些,它会离开输出不受约束默认为0,如果我们还改变了,谓词反而会失败),因为我们需要打破统一与隐性输出两种方式。(如果串联是成功的输出,但-1仍然是失败的输出,我们将具有ḋpc.↔|∧_1ḋpc.↔.∨_1。在最短的情况下,将输出串联在一起并且谓词可能会失败,则整个过程只有五个字节:ḋ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>$!})
Jo King

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

@RosLuP解释器仍然很新。我将对创作者Shaggy进行ping操作。这是TIO链接
Oliver的

1
@RosLuP,您使用的是什么浏览器?
毛茸茸的

Windows Phone 8.1的Internet Explorer :(手机)正在消失的某些东西,可能更好些,我使用我的全新手机android或Windows 10的浏览器(似乎他们叫Edge)
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

@Neil谢谢,这恰好比我的算法快几倍!
ETHproductions 2016年

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
└∊───────────────────────────────────────────────────┘
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.