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.