Forme uma lista usando números primos

10

Você recebeu N pilhas de moedas. Você decidiu dividir cada uma dessas pilhas B 1 , B 2 , ..., B N entre grupos de pessoas separados. A quantidade de pessoas que recebem moedas deve ser um número primo e a quantidade de dinheiro dada a cada pessoa deve ser diferente em cada pilha.

Entrada: N, B 1 , B 2 , ..., B N (A quantidade de moedas em cada pilha individual).

Saída: NP 1 , NP 2 , ..., NP N sendo NP o número de pessoas (número primo) que recebem as moedas. Se isso for impossível, em seguida, produzir algum resultado inatingível (como 0, -1, None, [], ou "impossible") ou gerar um erro.

Exemplo:

3
7 8 9

Resultado: 7 2 3

Como 7 é o único número primo que pode dividir 7 igualmente, o mesmo para 8 e 2 e 9 e 3. Além disso, observe que (7/7 = 1) ≠ (8/2 = 4) ≠ (9/3 = 3 )

McLinux
fonte
2
Né uma entrada redundante, podemos deixar de tomá-la?
Jonathan Allan
Podemos produzir outros resultados não alcançáveis ​​(por exemplo 0, uma lista vazia, uma string como "impossível" ou gerar um erro) para casos impossíveis? (Na verdade, eu recomendaria apenas entradas válidas, ou permitir comportamentos indefinidos nesses casos, mas depende de você.) #
1113 Jonathan Allan
2
Você pode renunciar à entrada de N. E sim à segunda pergunta.
22417 McLinux
Então, o menor divisor principal de cada número?
totallyhuman
@totallyhuman não completamente - se a entrada foram dizer [7,8,8]que seria impossível (uma vez usando 2para ambos os 8resultados em dois 4s.) Além disso, se a entrada fosse dizer [7,30,30], em seguida, [7,2,2]seria inválida, mas [7,2,3]e [7,3,2]entre outros iria funcionar.
Jonathan Allan

Respostas:

5

05AB1E , 13 bytes

Ò.»â€˜ʒ÷DÙQ}θ

Experimente online!

Um porto da minha resposta Pyth.

  • Òfica o fato de primos Ò rs de cada um.
  • dobras um comando dyadic, â(c â rtesi â n produto) entre cada dois elementos na lista da direita para a esquerda, direita / esquerda opostas operandos.
  • €˜nivela ach.
  • ʒ...}Filt ʒ rs aqueles que satisfazem a seguinte condição:
    • ÷ divisão inteira pareada com a entrada.
    • D D uplicate (empurra duas cópias do item à pilha).
    • Ùremove elementos duplicados, mantendo uma Ù niq Ù e ocorrência de cada elemento.
    • Qverifica e Q ualidade.
  • θ obtém o último elemento.
Mr. Xcoder
fonte
4

Geléia ,  15  14 bytes

³:ŒQẠ
ÆfŒpÇÐfṪ

Um programa completo que aceita um argumento, uma lista de números e imprime uma representação de outra lista de números, ou 0se a tarefa é impossível.

Experimente online!

Como?

³:ŒQẠ - Link 1, unique after division?: list of primes, Ps   e.g. [7,2,2]  or  [7,3,3]
³     - program's first input                                e.g. [7,8,8]  or  [7,9,30]
 :    - integer division by Ps                                    [1,4,4]      [1,3,10]
  ŒQ  - distinct sieve                                            [1,1,0]      [1,1,1]
    Ạ - all truthy?                                               0            1

ÆfŒpÇÐfṪ - Main link: list of coin stack sizes, Bs   e.g. [7,8,12]
Æf       - prime factorisation (vectorises)               [[7],[2,2,2],[2,2,3]]
  Œp     - Cartesian product                              [[7,2,2],[7,2,2],[7,2,3],[7,2,2],[7,2,2],[7,2,3],[7,2,2],[7,2,2],[7,2,3]]
     Ðf  - filter keep if:
    Ç    -   call last link (1) as a monad                 1       1       0       1       1       0       1       1       0
         -                                                [[7,2,2],[7,2,2],[7,2,2],[7,2,2],[7,2,2],[7,2,2]]
       Ṫ - tail (note: tailing an empty list yields 0)    [7,2,2]
         - implicit print
Jonathan Allan
fonte
+1 Haha, acho µ⁼Qque funcionaria como uma alternativa à peneira distinta, mas bom trabalho!
Xcoder
2

Pitão , 15 bytes

ef{I/VQT.nM*FPM

Experimente aqui!

Como?

ef {I / VQT.nM * FPM | Programa completo, que renuncia ao tamanho.
                |
             PM Fatoração primária de cada número inteiro.
           * F Dobre o produto cartesiano sobre a lista de números primos.
        .nM | Achate cada um.
 f Filtro.
  {I / VQT | Condição de filtro (usa uma variável T).
    / V Divisão inteira vetorizada ...
      QT Sobre a entrada e o item atual.
  {Eu | É invariante sobre a desduplicação (removendo duplicatas)?
e Pegue o último elemento.
                | Saída do resultado implicitamente.
Mr. Xcoder
fonte