Calcule los factores primos

27

Tuvimos un desafío de factorización principal hace un tiempo, pero ese desafío tiene casi seis años y apenas cumple con nuestros requisitos actuales, por lo que creo que es hora de uno nuevo.

Reto

Escriba un programa o función que tome como entrada un número entero mayor que 1 y genere o devuelva una lista de sus factores primos.

Reglas

  • La entrada y salida se pueden dar por cualquier método estándar y en cualquier formato estándar.
  • Se deben incluir factores duplicados en la salida.
  • La salida puede estar en cualquier orden.
  • La entrada no será inferior a 2 ni superior a 2 31-1 .
  • Se permiten los elementos integrados, pero se recomienda incluir una solución no incorporada.

Casos de prueba

2 -> 2
3 -> 3
4 -> 2, 2
6 -> 2, 3
8 -> 2, 2, 2
12 -> 2, 2, 3
255 -> 3, 5, 17
256 -> 2, 2, 2, 2, 2, 2, 2, 2
1001 -> 7, 11, 13
223092870 -> 2, 3, 5, 7, 11, 13, 17, 19, 23
2147483646 -> 2, 3, 3, 7, 11, 31, 151, 331
2147483647 -> 2147483647

Tanteo

Este es el , por lo que gana el código más corto en bytes.

ETHproducciones
fuente
2
Hubiera sido mucho mejor si rechazaras las incorporaciones.
Buffer Over Read
2
@TheBitByte Los desafíos que no permiten las incorporaciones se consideran generalmente como desafíos de Do X sin Y , especialmente dado que a veces es difícil saber si una solución es técnicamente incorporada.
ETHproductions
1
¡Pues bien, disfrute de la afluencia de soluciones de <5 bytes! Mientras escribo esto, Pyth ya lo hace en 1 byte.
Buffer Over Read
2
@TheBitByte Piense en ello como un desafío idioma por idioma, principalmente. Intenta superar la solución de Python, o algún otro idioma sin un incorporado.
isaacg
1
@isaacg Bueno, idioma por idioma es una mejor manera de verlo, estoy de acuerdo.
Buffer Over Read

Respuestas:

15

Pyth , 1 byte

P

Me gustan las posibilidades de Pyth en este desafío.

isaacg
fuente
16
Hasta que
aparezca el
13

Python 2 , 55 bytes

f=lambda n,k=2:n/k*[0]and(f(n,k+1),[k]+f(n/k,k))[n%k<1]

Pruébalo en línea!

Dennis
fuente
1
Apuesto a que has tenido esto esperando durante casi una hora ...
ETHproductions
10

Python 2, 53 bytes

f=lambda n,i=2:n/i*[f]and[f(n,i+1),[i]+f(n/i)][n%i<1]

Intenta cada divisor potencial i por turno. Si ies un divisor, lo antepone y se reinicia con n/i. De lo contrario, intenta el siguiente divisor más alto. Debido a que los divisores se verifican en orden creciente, solo se encuentran los primos.

Como programa, para 55 bytes:

n=input();i=2
while~-n:
 if n%i:i+=1
 else:n/=i;print i
xnor
fuente
8

Mathematica 38 30 bytes

¡Gracias @MartinEnder por 8 bytes!

Join@@Table@@@FactorInteger@#&
JungHwan Min
fuente
¿Qué tal FactorInteger[#][[All, 1]]&? 26 bytes
David G. Stork
@ DavidG.Stork que no funcionaría porque no repetiría los factores primos si el poder es mayor que 1.
JungHwan Min
4

JavaScript (ES6), 44 bytes

f=(n,x=2)=>n-1?n%x?f(n,x+1):[x,...f(n/x)]:[]

Horriblemente ineficiente debido al hecho de que itera desde 2 hasta cada factor primo, incluido el último. Puede reducir la complejidad del tiempo dramáticamente a un costo de 5 bytes:

f=(n,x=2)=>x*x>n?[n]:n%x?f(n,x+1):[x,...f(n/x,x)]
ETHproducciones
fuente
3

En realidad , 6 bytes

w`in`M

Pruébalo en línea!

Explicación:

w`in`M
w       factor into primes and exponents
 `in`M  repeat each prime # of times equal to exponent
Mego
fuente
Probablemente puedas usar oahora, ¿verdad?
Oliver
@Oliver Sí, pero por lo general no actualizo las respuestas antiguas con las incorporadas.
Mego
3

J, 2 bytes

q:

El cuerpo debe tener al menos 30 caracteres.

alephalpha
fuente
3

Japt, 2 bytes

Uk

Un incorporado kutilizado en la entrada U. También se refiere a un país.

¡Pruébalo en línea!

ETHproductions
fuente
2

sordo , 3 bytes

Este lenguaje es bastante joven y aún no está listo para nada importante, pero puede hacer factorización principal:

A/D

Esto esperará la entrada del usuario y luego generará la lista de factores primos.

Kade
fuente
2

MATLAB, 6 bytes

Creo que esto no requiere ninguna explicación.

factor
falla
fuente
1

Bash + coreutils, 19 bytes

factor|sed s/.*:.//

Pruébalo en línea!

Dennis
fuente
Puede eliminar un byte si el espacio en blanco no importa en la salida usando factor|sed s/.*://. Además factor|cut -d: -f2(o factor|cut -d\ -f2para que coincida con su salida actual) tiene la misma longitud de bytes pero se ejecutará más rápido y usará menos sobrecarga de memoria.
Caleb
Le preguntaré al OP sobre espacios en blanco. Lamentablemente, necesitaría factor|cut -d\ -f2-eliminar el espacio inicial, que es un byte más.
Dennis
1

Lote, 96 bytes

@set/an=%1,f=2,r=0
:l
@set/af+=!!r,r=n%%f
@if %r%==0 echo %f%&set/an/=f
@if %n% gtr 1 goto l
Neil
fuente
1

Hexagonía , 58 bytes.

Aún no he terminado de jugar al golf, pero @MartinEnder debería poder destruir esto de todos modos

Imprime factores separados por espacios, con un espacio final

Golfizado:

2}\..}$?i6;>(<...=.\'/})."@...>%<..'':\}$"!>~\{=\)=\}&<.\\

Dispuesto:

     2 } \ . .
    } $ ? i 6 ;
   > ( < . . . =
  . \ ' / } ) . "
 @ . . . > % < . .
  ' ' : \ } $ " !
   > ~ \ { = \ )
    = \ } & < .
     \ \ . . .

Explicación que viene más tarde.

Azul
fuente
1

C, 92 bytes

int p(int n){for(int i=2;i<n;i++)if(n%i==0)return printf("%d, ",i)+p(n/i);printf("%d\n",n);}

Versión sin golf:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int prime(int number) {
    for (int i = 2; i < number; i++) {
        if (number % i == 0) {
            printf("%d, ", i);
            return prime(number / i); //you can golf away a few bytes by returning the sum of your recursive function and the return of printf, which is an int
        }                             //this allow you to golf a few more bytes thanks to inline calls
    }
    printf("%d\n", number);
}

int main(int argc, char **argv) {
    prime(atoi(argv[1]));
}
Valentin Mariette
fuente
0

Perl 6 , 77 64 bytes  

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

Intentalo

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

Pruébelo (Nota: no tiene suficiente tiempo para terminar)


Una versión mucho más eficiente es un poco más larga con 100 bytes.

{my$a=$_;map ->\f{|({$a.is-prime??($/=$a)&&($a=0)||$/!!($a%f||($a div=f)&&f)}...^ f>*)},(2... *>$a)}

Intentalo


Ampliado: (versión de 64 bytes)

{
  my $a = $_;  # the input 「$_」 is read-only by default
  map
    -> \f {
      |(              # slip ( flattens into outer list )

        # generate sequence of 0 or more 「f」s
        {
          $a % f      # is it not evenly divisible

          ||          # if it is evenly divisible
          ($a div=f)  # divide it
          &&          # and
          f           # return 「f」
        }
        ...^   # keep doing that until
        f > *  # 「f」 is bigger
      )

    },

    # do that over the following list

    (2 ... * > $a) # generate a sequence from 2
                   # up to whatever the value of $a
                   # is at the time of the check
}
Brad Gilbert b2gills
fuente
0

VB.NET, 86 bytes

Tenía esto sentado en algunos programas del Proyecto Euler. Se eliminaron las optimizaciones en aras de la brevedad, y este es el resultado. Naturalmente, VB es muy detallado, por lo que es bastante largo. No estoy contando el espacio en blanco principal. Se puede omitir, pero es más fácil de leer con él.

Esto toma un número entero como parámetro e imprime los factores primos con una coma después. Hay una coma final al final.

Sub A(a)
    For i=2To a ' VB re-evaluates a each time, so the /= at the end of the loop shortens this
        While a Mod i=0 ' this is a factor. We've grabbed primes before this, so this must be a prime factor
            Console.Write(i &",") ' output
            a/=i ' "mark" the prime as "used"
        End While
    Next
End Sub
Brian J
fuente
0

Perl 6 , 51 bytes

Una solución recursiva:

sub f(\n,\d=2){n-1??n%d??f n,d+1!!(d,|f n/d,d)!!()}
Sean
fuente
0

Java (OpenJDK) , 259 bytes

import java.util.*;interface g{static void main(String[]z){int a=new Scanner(System.in).nextInt();int b=0;int[]l={};for(int i=2;i<=a;i++){for(;a%i<1;l[b-1]=i){l=Arrays.copyOf(l,b=l.length+1);a/=i;}}for(int i=0;i<b;i++)System.out.print(l[i]+(i<b-1?", ":""));}}

Pruébalo en línea!

Pavel
fuente
Consulte este resumen para ver cómo se puede seguir desarrollando esta presentación: gist.github.com/kritixilithos/fde37dc5a8ae54852aa134a6e70ea495 . Si necesita aclarar algo, no dude en enviarme un ping al byte 19 :)
Kritixi Lithos
0

Ruby, 61 bytes

require'prime';->x{x.prime_division.flat_map{|x|[x[0]]*x[1]}}

La versión incorporada más corta que se me ocurra.

Seims
fuente
0

Ruby , 48 bytes

->x{r,*c=2;0while(x%r<1?(x/=r)&&c<<r:x>=r+=1);c}

Pruébalo en línea!

Un poco tarde para la fiesta, pero ... ¿por qué no?

GB
fuente