Fattorizzazione reciproca massima reciproca


14

definizioni

  • Due numeri sono co-primi se il loro unico divisore comune positivo è 1.
  • Un elenco di numeri viene reciprocamente ricaricato se ogni coppia di numeri all'interno di tale elenco è coordinata tra loro.
  • Una fattorizzazione del numero nè un elenco di numeri il cui prodotto è n.

Compito

Dato un numero positivo n, nproduce la fattorizzazione reciprocamente co-primaria di con la lunghezza massima che non include 1.

Esempio

Perché n=60, la risposta è [3,4,5], perché 3*4*5=60e nessuna altra fattorizzazione reciprocamente co-primaria senza 1lunghezza maggiore o uguale a 3, la lunghezza della fattorizzazione.

Regole e libertà

  • È possibile utilizzare qualsiasi formato di input / output ragionevole.
  • Non è necessario che le voci nell'elenco di output siano ordinate.

Casi test

n   output
1   []
2   [2]
3   [3]
4   [4]
5   [5]
6   [2, 3]
7   [7]
8   [8]
9   [9]
10  [2, 5]
11  [11]
12  [3, 4]
13  [13]
14  [2, 7]
15  [3, 5]
16  [16]
17  [17]
18  [2, 9]
19  [19]
20  [4, 5]
21  [3, 7]
22  [2, 11]
23  [23]
24  [3, 8]
25  [25]
26  [2, 13]
27  [27]
28  [4, 7]
29  [29]
30  [2, 3, 5]
31  [31]
32  [32]
33  [3, 11]
34  [2, 17]
35  [5, 7]
36  [4, 9]
37  [37]
38  [2, 19]
39  [3, 13]
40  [5, 8]
41  [41]
42  [2, 3, 7]
43  [43]
44  [4, 11]
45  [5, 9]
46  [2, 23]
47  [47]
48  [3, 16]
49  [49]
50  [2, 25]
51  [3, 17]
52  [4, 13]
53  [53]
54  [2, 27]
55  [5, 11]
56  [7, 8]
57  [3, 19]
58  [2, 29]
59  [59]
60  [3, 4, 5]
61  [61]
62  [2, 31]
63  [7, 9]
64  [64]
65  [5, 13]
66  [2, 3, 11]
67  [67]
68  [4, 17]
69  [3, 23]
70  [2, 5, 7]
71  [71]
72  [8, 9]
73  [73]
74  [2, 37]
75  [3, 25]
76  [4, 19]
77  [7, 11]
78  [2, 3, 13]
79  [79]
80  [5, 16]
81  [81]
82  [2, 41]
83  [83]
84  [3, 4, 7]
85  [5, 17]
86  [2, 43]
87  [3, 29]
88  [8, 11]
89  [89]
90  [2, 5, 9]
91  [7, 13]
92  [4, 23]
93  [3, 31]
94  [2, 47]
95  [5, 19]
96  [3, 32]
97  [97]
98  [2, 49]
99  [9, 11]

punteggio

Questo è . Vince la risposta più breve in byte.




Sfida di follow-up più dura: solo le coppie adiacenti nell'elenco risultante devono essere co-prime.
Martin Ender,

4
È solo una fattorizzazione in poteri primari?
Paŭlo Ebermann,

1
@ PaŭloEbermann sì, lo è.
Leaky Nun,

Risposte:



9

Brachylog , 4 byte

ḋḅ×ᵐ

Provalo online!

Spiegazione

       # output is the list of
  ×ᵐ   # products of each
 ḅ     # block of consecutive equal elements
ḋ      # of the prime factors
       # of the input

2
Congratulazioni per la tua prima risposta su Brachylog! ... almeno penso?
Fatalizza

1
@Fatalize: il mio secondo penso. Ho avuto questo da prima. Sicuramente il mio più corto però :)
Emigna

5

05AB1E , 3 5 byte

+2 byte per correggere il caso limite di 1. Grazie a Riley per la patch (e per la suite di test, il mio 05ab1e non è così forte!)

ÒγP1K

Test suite su Provalo online!

Come?

Ò     - prime factorisation, with duplicates
 γ    - split into chunks of consecutive equal elements
  P   - product of each list
   1  - literal one
    K - removed instances of top from previous
      - implicitly display top of stack

@Adnan è il link migliore per "byte" o c'è una tabella codici formattata da qualche parte?
Jonathan Allan,

Sì, esiste una tabella codici che mostra tutti i byte.
Adnan,

1
Oh, come mi sono perso> _ <Grazie mille :)
Jonathan Allan,

Non funziona per 1.
Leaky Nun,

@LeakyNun risolto con aiuto :)
Jonathan Allan,


3

Haskell , 51 byte

(2#) è una funzione anonima che accetta un numero intero e restituisce un elenco.

Usare come (2#) 99 .

m#n|m>n=[]|x<-gcd(m^n)n=[x|x>1]++(m+1)#div n x
(2#)

Provalo online!

Ispirato dal trucco di potere che alcune persone hanno usato nella recente sfida dei numeri quadrati liberi .

  • m#n genera fattori di n partire da m.
  • Se m>n , ci fermiamo, concludendo che abbiamo già trovato tutti i fattori.
  • x=gcd(m^n)nè il più grande fattore di ncui sono tutti fattori primi m. Si noti che poiché i più piccoli mvengono testati per primi, questo sarà 1salvom sia primo.
  • Includiamo xnella lista risultante se non è 1, e poi recurse con il prossimo m, dividendo nda x. Si noti che xediv n x non può avere fattori comuni.
  • (2#)prende un numero e inizia a trovare i suoi fattori 2.

3

MATL , 7 byte

&YF^1X-

Provalo online! Oppure verifica tutti i casi di test .

Spiegazione

Considera l'input 80 come esempio.

&YF    % Implicit input. Push array of unique prime factors and array of exponents
       % STACK: [2 3 5], [4 0 1]
^      % Power, element-wise
       % STACK: [16 1 5]
1      % Push 1
       % STACK: [16 1 5], 1
X-     % Set difference, keeping order. Implicitly display
       % STACK: [16 5]

EDIT (9 giugno 2017): YFcon due uscite è stato modificato nella versione 20.1.0 : i numeri primi non fattoriali e i loro (zero) esponenti vengono saltati. Ciò non influisce sul codice sopra, che funziona senza richiedere modifiche (ma 1X-potrebbe essere rimosso).


Presumo che il mezzo di modifica 1X-sia ridondante nella nuova versione ... inoltre, sembra una differenza prestabilita piuttosto che un'intersezione per me.
Ørjan Johansen,

@ ØrjanJohansen Corretto su entrambi. Grazie!
Luis Mendo,

2

Gelatina , 5 byte

ÆF*/€

Test suite su Provalo online!

Come?

ÆF*/€ - Main link: n
ÆF    - prime factors as [prime, exponent] pairs
   /€ - reduce €ach with:
  *   - exponentiation

Una soluzione di 6 byte si alternano nel tentativo di trovare un altro metodo che legherebbe con la vostra (purtroppo non): ÆfŒgZP. Ha lo stesso numero di token ma troppi atomi a due byte;)
HyperNeutrino,

... e come la mia voce 05ab1e cancellata restituisce 1per un input di 1cui non è consentito (l'effetto di eseguire un prodotto vuoto).
Jonathan Allan,

:( Beh, whoops, ha ignorato questo.
Accidenti

2

Alice , 10 byte

Ifw.n$@EOK

Provalo online!

Sfortunatamente, questo usa nuovamente i punti di codice come I / O intero . Il caso di test nel collegamento TIO è l'input 191808 che si decompone in 64 , 81 e 37 . Nota che questa soluzione stampa i poteri primi in ordine dal più grande al più piccolo primo, così otteniamo l'output %Q@.

Per comodità, ecco una soluzione a 16 byte con I / O decimale che utilizza lo stesso algoritmo core:

/O/\K
\i>fw.n$@E

Provalo online!

Spiegazione

Come le altre risposte, questo decompone l'ingresso in poteri primi.

I      Read a code point as input.
f      Compute its prime factorisation a prime/exponent pairs and push them
       to the stack in order from smallest to largest prime.
w      Remember the current IP position on the return address stack. This
       starts a loop.
  .      Duplicate the current exponent. This will be zero once all primes
         have been processed.
  n$@    Terminate the program if this was zero.
  E      Raise the prime to its corresponding power.
  O      Output the result as a character.
K      Return to the w to run the next loop iteration.

2

matematica 46 byte

#[[1]]^#[[2]]&/@If[#==1,#={},FactorInteger@#]&

Provalo online!


Bella risposta, ma sta dando un output leggermente errato per alcuni dei casi di test. Attualmente il tuo codice viene generato {}; {2}; {3}; {2}; {5}; {2,3}; {7}; {2}; {3}; {2,5}; {11}; {2,3}; {13}; ... ma dovrebbe {}; {2}; {3}; {4}; {5}; {2,3}; {7}; {8}; {9}; {2,5}; {11}; {4,3}; {13}; ...invece essere generato .
Kevin Cruijssen,

Penso di averlo corretto
J42161217,

Sembra funzionare davvero in TIO . +1 Oh, e benvenuto in PPCG, vedo che sei abbastanza nuovo qui. Probabilmente l'hai già visto, ma in caso contrario, consigli per giocare a golf a Mathematica potrebbero essere interessanti da leggere. Goditi la permanenza! :)
Kevin Cruijssen,

1
Se ti ritrovi ad accedere ai componenti di #più di #se stesso, puoi salvare molti byte usando Apply( @@@) invece di Map( /@):#^#2&@@@If...
Martin Ender,

1

PHP, 62 byte

stampa un array associativo con il primo come chiave e con quale frequenza il primo è usato come valore e niente per l'input 1

for($i=2;1<$n=&$argn;)$n%$i?++$i:$n/=$i+!++$r[$i];print_r($r);

Provalo online!

Uscita per 60

Array
(
    [2] => 2
    [3] => 1
    [5] => 1
)

PHP, 82 byte

for($i=2;1<$n=&$argn;)$n%$i?++$i:$n/=$i+!($r[$i]=$r[$i]?$r[$i]*$i:$i);print_r($r);

Provalo online!

non stampa nulla per l'input 1se si desidera invece un array vuoto e un array ordinato sarà un po 'più lungo

for($r=[],$i=2;1<$n=&$argn;)$n%$i?++$i:$n/=$i+!($r[$i]=$r[$i]?$r[$i]*$i:$i);sort($r);print_r($r);

1

In realtà , 6 byte

w⌠iⁿ⌡M

Provalo online!

Spiegazione:

w⌠iⁿ⌡M
w       factor into [prime, exponent] pairs
 ⌠iⁿ⌡M  for each pair:
  i       flatten
   ⁿ      prime**exponent


0

miniml , 47 byte

Le sfide che coinvolgono la scomposizione in fattori primi sono terribilmente sovrarappresentate qui, quindi siamo tutti tristemente costretti ad avere una fattorizzazione nella libreria standard.

fun n->map(fun p->ipow(fst p)(snd p))(factor n)

Nota che "mini" in miniml si riferisce alla dimensione del set di funzionalità, non alla dimensione del codice sorgente scritto in esso.


0

Rubino, 61 byte

require 'prime'
->n{(2..n).select{|e|n/e.to_f%1==0&&e.prime?}}

Sono davvero deluso dopo aver cercato soluzioni a 6-7 byte -))


0

Mathematica, 24 byte

Power@@@FactorInteger@#&

Peccato @@@*non è una cosa. Inoltre, mi piacerebbe /@*, @@*e in effetti, il cambiamento @@@a /@@, //@per @@@o qualsiasi altra cosa e aggiungi la famiglia infinita di //@, ///@...

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.