ปัจจัยสำคัญของ Palindromic


15

ปัญหาสำคัญของ Palindromic นั้นเป็นเรื่องธรรมดา แต่ก็ไม่ใช่คำถามนี้ ในการท้าทายนี้ตัวเลขไม่จำเป็นต้องเป็นสีส้มซึ่งเป็นปัจจัยสำคัญของมัน

งาน

รหัสของคุณจะต้องเป็นจำนวนเต็มบวกเดียวเป็นอินพุต จากนั้นตรวจสอบว่าการเรียงสับเปลี่ยนของปัจจัยสำคัญของจำนวนเต็มนั้นเป็น palindromic เมื่อตัดแบ่ง ถ้าเป็นเช่นนั้นให้ส่งออกหนึ่งในนั้น (รายการปัจจัยไม่ใช่สตริงที่ต่อกัน) -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 ฉันคิดเกี่ยวกับNil, Failหรือค่าอื่น ๆ ที่ไม่ได้กำหนด เอาท์พุทยังสามารถเป็นค่าตำแหน่งใด ๆ ?
แบรดกิลเบิร์ต b2gills

รายการ Array, Seq, Range, Buf, Slip เป็นค่าตำแหน่งทั้งหมด นั่นคือพวกเขาทำหน้าที่ตำแหน่ง
Brad Gilbert b2gills

ดังนั้น .. เราควรจะออกรายการที่ว่างเปล่าสำหรับ1หรือ-1?
Jo King เมื่อ

-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 ไบต์

-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ขอขอบคุณสำหรับการเตือนฉันเกี่ยวกับ ฉันไม่คิดว่าฉันเคยใช้มาก่อน

ชุดทดสอบ


jkเป็นเช่นเดียวกับs`M
Maltysen

3

CJam - 17 ไบต์

ขอบคุณ Martin Bü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%ด้วย นอกจากนี้คุณยังสามารถใช้=กับบล็อกเพื่อรับตัวประกอบนายกรัฐมนตรี Palindromic ตัวแรก ที่ทำเพื่อ 18 bytes: Wrimfe!{s_W%=}=p];... คุณสามารถบันทึกอีกหนึ่งโดยยกเลิกด้วยข้อผิดพลาด (เนื่องจากข้อผิดพลาดออกไป STDERR):Wrimfe!{s_W%=}=p;
Martin Ender

3
@ MartinBüttnerนี่คือเหตุผลที่ฉันรัก PPCG ทุกคนให้ความช่วยเหลือและเป็นมิตร!
KoreanwGlasses

2

Ruby, 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}

+7 สำหรับ-rprimeธง

ถอนหายใจทับทิมในตัวบางตัวมีชื่อยาวขนาดนี้ ... อย่างน้อยก็ทำให้โค้ดสามารถอธิบายตนเองได้อย่างเป็นธรรม

flat_mapบิตเป็นเพราะprime_divisionผลตอบแทนที่อดีต [[2, 2], [3, 1]]สำหรับอินพุต12(ซึ่งแสดงถึง)2231

ขอบคุณ@histocratสำหรับ 13 ไบต์!


@histocrat นั่นเป็นข้อผิดพลาดในส่วนของ OP (ดูความคิดเห็นในคำถาม) ขอบคุณนั่นเป็นกลลวงที่เรียบร้อย
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)

นี่คือฟังก์ชั่นแลมบ์ดาที่รับจำนวนเต็มและส่งกลับอาร์เรย์หรือ -1 หากต้องการเรียกใช้กำหนดค่าให้กับตัวแปร

Ungolfed:

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

บันทึก 10 ไบต์ด้วย Glen O!


ฉันเห็นสองสามวิธีในการปรับปรุงนี้ (ขึ้นอยู่กับการตีกอล์ฟพื้นฐาน) ใช้foldlแทนreduce(พวกเขาทำสิ่งเดียวกัน แต่foldlได้กำหนดลำดับและสั้นกว่าหนึ่งไบต์) ใช้การเปรียบเทียบโดยตรงกับโครงสร้างว่างเปล่าแทนisempty(ฉันไม่แน่ใจ 100% ว่าxเป็นประเภทใด แต่ถ้าเป็นชุดให้ใช้x==[]) และใช้(q=join(p))แล้วเพียงแค่qในตัวกรองเพื่อบันทึกอีกสองไบต์
เกลน O

นอกจากนี้ฉันอาจเข้าใจผิด แต่ถ้าxเป็นอาเรย์ก็ควรfirst(x)ใช้x[]แทน
เกลน 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]

วิธีการบังคับเดรัจฉานที่ชัดเจน วนซ้ำของปัจจัยสำคัญทั้งหมดและตรวจสอบ palindroms เลือกอันแรก หากไม่มีรายการนั้นจะว่างเปล่าและการต่อท้าย[-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 ล่ามยังค่อนข้างใหม่ ฉันจะ ping Shaggy ผู้สร้าง นี่คือลิงค์ของTIO
Oliver

1
@RosLuP คุณใช้เบราว์เซอร์ใดอยู่
Shaggy

Internet Explorer สำหรับ Windows Phone 8.1: (มือถือ) สิ่งที่หายไปอาจจะดีกว่าถ้าฉันใช้ 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 ไบต์

บันทึกแล้ว 36 ไบต์ขอบคุณ @Neil

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")

กำหนดฟังก์ชั่นที่ไม่ระบุชื่อ prepend เช่น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.