Forme una lista usando números primos

10

Te han dado N montones de monedas. Has decidido dividir cada una de esas pilas B 1 , B 2 , ..., B N entre grupos separados de personas. La cantidad de personas que reciben monedas tiene que ser un número primo y la cantidad de dinero otorgada a cada persona debe ser diferente en cada grupo.

Entrada: N, B 1 , B 2 , ..., B N (La cantidad de monedas en cada pila individual).

Salida: NP 1 , NP 2 , ..., NP N con NP es el número de personas (número primo) que reciben las monedas. Si esto es imposible, producir algún resultado inalcanzable (como 0, -1, None, [], o "impossible") o subir un error.

Ejemplo:

3
7 8 9

Salida: 7 2 3

Debido a que 7 es el único número primo que puede dividir 7 de manera uniforme, lo mismo para 8 y 2 y 9 y 3. Además, observe que (7/7 = 1) ≠ (8/2 = 4) ≠ (9/3 = 3 )

McLinux
fuente
2
Nes una entrada redundante, ¿podemos renunciar a tomarla?
Jonathan Allan
¿Podemos obtener algún otro resultado no alcanzable (por ejemplo 0, una lista vacía, una cadena como "imposible" o generar un error) para casos imposibles? (En realidad, recomendaría solo una entrada válida, o permitir un comportamiento indefinido en tales casos, pero depende de usted.)
Jonathan Allan
2
Puede renunciar a la entrada de N. Y sí a la segunda pregunta.
McLinux
Entonces, ¿el divisor primo más bajo de cada número?
Totalmente humano el
@totallyhuman no del todo - si la entrada fuera decir [7,8,8]que sería imposible (ya que el uso 2de ambos 8da como resultado dos 4s.) Por otra parte, si la entrada estuviera decir [7,30,30]entonces [7,2,2]sería válido, pero [7,2,3], y [7,3,2]entre otros funcionarían.
Jonathan Allan

Respuestas:

5

05AB1E , 13 bytes

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

Pruébalo en línea!

Un puerto de mi respuesta Pyth.

  • Òobtiene el hecho de primera Ò RS de cada uno.
  • pliegues un comando diádico, â(c â rtesi â n producto) entre cada dos elementos de la lista de derecha a izquierda con derecha / operandos opuestas izquierda.
  • €˜aplana ach.
  • ʒ...}FILT ʒ rs aquellos que satisfacen la siguiente condición:
    • ÷ división entera por pares con la entrada.
    • D D duplicar (empuja dos copias del elemento a la pila).
    • Ùquita elementos duplicados, manteniendo un Ù niq Ù e ocurrencia de cada elemento.
    • Qcomprueba si hay correo Q alidad.
  • θ Obtiene el último elemento.
Sr. Xcoder
fuente
4

Jalea ,  15  14 bytes

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

Un programa completo que acepta un argumento, una lista de números e imprime una representación de otra lista de números, o 0si la tarea es imposible.

Pruébalo en línea!

¿Cómo?

³:Œ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
fuente
+1 Jaja, creo µ⁼Qque funcionaría como una alternativa al tamiz distintivo, pero ¡buen trabajo!
Sr. Xcoder
2

Pyth , 15 bytes

ef{I/VQT.nM*FPM

Pruébalo aquí!

¿Cómo?

ef {I / VQT.nM * FPM | Programa completo, que renuncia al tamaño.
                El |
             PM | Factorización prima de cada número entero.
           * F | Doble el producto cartesiano sobre la lista de primos.
        .nM | Aplane cada uno.
 f | Filtrar.
  {I / VQT | Condición del filtro (utiliza una variable T).
    / V | División de enteros vectorizados ...
      QT | Sobre la entrada y el elemento actual.
  {I | ¿Es invariante sobre la deduplicación (eliminar duplicados)?
e | Toma el último elemento.
                El | Salida del resultado implícitamente.
Sr. Xcoder
fuente