회문 소인수


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반환 할 수 있습니까 ? 펄 6에서 나는 대략 생각하고 Nil, Fail또는 다른 정의되지 않은 값. 또한 출력이 위치 값이 될 수 있습니까?
브래드 길버트 b2gills

List, Array, Seq, Range, Buf, Slip은 모두 위치 값입니다. 그것은 그들이 위치 역할을하는 것입니다.
브래드 길버트 b2gills

따라서. 1또는에 대한 빈 목록을 출력해야 -1합니까?
조 왕

요소는 하나 개의 어레이에 대한 상이한 -1 즉 만 포함 -1
RosLuP

답변:


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 바이트

@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. 나는 전에 그것을 사용했다고 생각하지 않습니다.

테스트 스위트


jks`M
Maltysen

3

CJam-17 바이트

10 바이트 를 절약 해 준 Martin Bü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];... 오류로 종료하여 하나 더 저장할 수 있습니다 (오류 출력은 STDERR로 이동하기 때문에) :Wrimfe!{s_W%=}=p;
Martin Ender

3
@ MartinBüttner 이것이 PPCG를 좋아하는 이유입니다. 모두가 매우 도움이되고 친절합니다!
KoreanwGlasses

2

루비, 89 + 7 = 96102 + 7 = 109

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

-rprime깃발 은 +7입니다 .

한 마디 로 일부 루비 내장에는 긴 이름이 있습니다.

flat_map비트가 있기 때문입니다 prime_division반환 예. [[2, 2], [3, 1]]입력 12()을 나타냅니다 .2231

13 바이트의 @histocrat 에게 감사 합니다!


@histocrat 그것은 OP 측의 실수였습니다 (질문에 대한 의견 참조). 고마워, 그것은 표시와 함께 깔끔한 트릭입니다.
Doorknob

2

줄리아, 132122 바이트

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

Glen O 덕분에 10 바이트를 절약했습니다!


한눈에, 나는 이것을 향상시키는 몇 가지 방법을 봅니다 (기본 골프를 기반으로 함). foldl오히려 사용하십시오 reduce(같은 작업을 수행하지만 foldl순서를 정의했으며 1 바이트 더 짧습니다). 빈 구조 대신 직접 비교를 사용하십시오 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

하스켈, 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

펄 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

apt -F-1 , 9 바이트

k á æ_¬êS

시도 해봐


이 윈도우 전화에서 귀하의 링크가 확인되지 않습니다 ...
RosLuP

@RosLuP 통역사는 여전히 새롭습니다. 제작자 인 Shaggy를 핑합니다. 여기에 TIO 링크가 있습니다
Oliver

1
@RosLuP, 어떤 브라우저를 사용하고 있습니까?
얽히고 설킨 Shaggy

Windows Phone 8.1 용 Internet Explorer : (휴대폰) 사라지고있는 일, 아마도 새로운 휴대폰 안드로이드 또는 Windows 10의 브라우저를 사용하는 것이 좋습니다 (전화하는 것 같습니다)
RosLuP

0

apt, 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

자바 스크립트 (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

36 바이트? 나는 그것이 저의 기록이어야한다고 생각합니다.
Neil

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.