Fattori primi palindromici


15

I primi problemi palindromici sono piuttosto comuni, ma non è questo il problema. In questa sfida, il numero non deve essere un palindromo, i suoi fattori primi lo fanno.

Compito

Il tuo codice deve prendere un singolo intero positivo come input. Quindi controlla se una qualsiasi delle permutazioni dei fattori primi di quell'intero è palindromica quando concatenata. In tal caso, genera uno di questi (l'elenco dei fattori, non la stringa concatenata). Altrimenti, devi produrre -1.

Questo è , quindi vince il codice più breve in byte !

Casi test

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

1
Possono -1essere restituiti altri valori distinguibili ? In Perl 6 sto pensando Nil, Failo altri valori indefiniti. Inoltre, l'output può avere un valore posizionale?
— Brad Gilbert b2gills

List, Array, Seq, Range, Buf, Slip sono tutti valori posizionali. Cioè svolgono il ruolo posizionale.
— Brad Gilbert b2gills

Quindi .. dovremmo produrre un elenco vuoto per 1, o -1?
— Jo King,

-1 come elemento è diverso da un array che contiene solo -1
— RosLuP

Risposte:


4

05AB1E , 7 byte

Òœ.ΔJÂQ

Provalo online!

Spiegazione:

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

(il .Δvalore predefinito è -1, quindi non è necessario alcun lavoro aggiuntivo)


3

Pyth, 14 byte

-2 byte di @FryAmTheEggman

h+f_IjkT.pPQ_1

Spiegazione:

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

Grazie @FryAmTheEggman per avermelo ricordato I. Non credo di averlo usato prima.

Suite di test


jkè lo stesso dis`M
— Maltysen, il

3

CJam - 17 byte

Grazie a Martin Büttner per avermi salvato 10 byte!

Wqimfe!{s_W%=}=p;

La mia prima volta che scrivo in CJam! Spiegazione:

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
È possibile invertire una stringa (o matrice) con W%. È inoltre possibile utilizzare =con un blocco per ottenere la prima fattorizzazione primaria palindromica. Ciò significa 18 byte: Wrimfe!{s_W%=}=p];... puoi salvarne un altro terminando con un errore (poiché l'output dell'errore va a STDERR):Wrimfe!{s_W%=}=p;
— Martin Ender,

3
@ MartinBüttner Questo è il motivo per cui amo PPCG. Tutti sono così gentili e disponibili!
— KoreanwGlasses

2

Rubino, 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 per la -rprimebandiera.

Sospiro , alcuni builtin di Ruby hanno nomi così lunghi ... almeno questo rende il codice abbastanza autoesplicativo.

Il flat_mapbit è perché prime_divisionrestituisce ex. [[2, 2], [3, 1]]per input 12(che rappresenta ).2231

Grazie a @histocrat per 13 byte!


@histocrat È stato un errore da parte di OP (vedi commenti sulla domanda). Grazie, è un bel trucco con lo splat.
— Maniglia della porta

2

Julia, 132 122 byte

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

Questa è una funzione lambda che accetta un numero intero e restituisce un array o -1. Per chiamarlo, assegnarlo a una variabile.

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

Risparmiato 10 byte grazie a Glen O!


A colpo d'occhio, vedo alcuni modi per migliorare questo (solo sulla base del golf di base). Usa foldlpiuttosto che reduce(fanno la stessa cosa, ma foldlha un ordine definito ed è più corto di un byte). Usa un confronto diretto con una struttura vuota anziché isempty(non sono sicuro al 100% di che tipo xsia, ma se è un set, ad esempio, usa x==[]). E usa (q=join(p))e poi solo qnel filtro per salvare altri due byte.
— Glen O

Inoltre, potrei sbagliarmi, ma se xè un array, allora piuttosto che first(x)usare x[].
— Glen O

@GlenO Grazie mille come sempre! Inizialmente avevo provato ==[]e mi stava dando errori ma ho riprovato ora e funziona. Devo aver sbagliato qualcosa prima. ¯ \ _ (ツ) _ / ¯ L'unico suggerimento che non potevo usare è liberarmi di first; in questo caso devo usare firstperché xè un iteratore / raccolta / qualcosa che non ha getindexdefinito.
— Alex A.

2

Brachylog , 10 byte

ḋp.cX↔X∨_1

Provalo online!

  .           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.

Inizialmente, mi aspettavo che il fatto di dover emettere -1invece di non riuscire avrebbe avuto un costo in byte abbastanza grande, ma poiché l'output in caso di successo non può essere concatenato, costa solo i due byte necessari per scrivere _1(se abbiamo rimosso quelli, lascerebbe l'output non vincolato a default 0, e se cambiassimo ulteriormente ∨a ∧, il predicato fallirebbe invece), perché dobbiamo interrompere l'unificazione con l'output implicito in entrambi i modi. (Se la concatenazione fosse l'output per il successo ma -1fosse comunque l'output per il fallimento, avremmo ḋpc.↔|∧_1o ḋpc.↔.∨_1. Nel caso più breve, in cui l'output è concatenato e il predicato può fallire, il tutto è solo cinque byte:ḋpc.↔. Sebbene non esporre i fattori reali gli dà più una sensazione di ...)


1

Haskell, 122 byte

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

Esempio di utilizzo: f 39-> [3,13].

L'ovvio approccio della forza bruta. Scorrere su tutte le permutazioni dei fattori primi e verificare la presenza di palindromi. Scegli il primo. Se non ce ne sono, l'elenco è vuoto e viene aggiunto l'aggiunta [-1].


1

Perl 6 , 100 byte

{$/=$_;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
}

Uso:

# 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

Circa la metà (53 byte) è occupata con il codice di fattorizzazione principale.

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

Se esistesse un prime-factorizemetodo, l'intera cosa potrebbe essere significativamente più breve.

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

Una sezione di codice del fattore primo più breve potrebbe essere$!=$_;({+$!/($!/=1+(2...$!%%*))}...{2>$!})
— Jo King,

1

Gelatina , 16 byte

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

Più a lungo di quanto mi aspettassi, sia nel conteggio dei byte che nel tempo impiegato per scrivere.

Provalo online!

Spiegazione:

Æ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 byte

k á æ_¬êS

Provalo


Il tuo link non è ok in questo telefono con finestra ...
— RosLuP,

@RosLuP L'interprete è ancora abbastanza nuovo. Chiamo Ping Shaggy, il creatore. Ecco un link TIO
— Oliver,

1
@RosLuP, quale browser stai usando?
— Shaggy,

Internet Explorer per Windows Phone 8.1: (cellulare) qualcosa che sta scomparendo, forse è meglio che io usi il mio nuovissimo telefono Android o il browser di Windows 10 (Edge sembra che chiamino)
— RosLuP,

0

Japt, 18 byte

Quasi quanto CJam ...

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

Provalo online!

Come funziona

        // 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 byte

36 byte salvati grazie a @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")

Definisce una funzione anonima; anteporre ad esempio F=per usarlo. In realtà è abbastanza veloce sull'input di 2352, impiegando solo circa 150 millisecondi per finire sul mio computer.


Non so più veloce ma sicuramente più breve: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 Grazie, anche questo sembra essere un po 'più veloce del mio algoritmo!
— ETHproductions

36 byte? Penso che debba essere un record per me.
— Neil,

0

APL (NARS), 169 caratteri, 338 byte

∇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 sarebbe la funzione trovare le permutazioni e f è la funzione di questo esercizio; test:

  ⎕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
└∊───────────────────────────────────────────────────┘
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.