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.


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:




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

8

Mathematica 38 30 bytes

¡Gracias @MartinEnder por 8 bytes!

Join@@Table@@@FactorInteger@#&

¿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)]


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

Probablemente puedas usar oahora, ¿verdad?
Oliver

@Oliver Sí, pero por lo general no actualizo las respuestas antiguas con las incorporadas.
Mego




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.


2

MATLAB, 6 bytes

Creo que esto no requiere ninguna explicación.

factor

1

Bash + coreutils, 19 bytes

factor|sed s/.*:.//

Pruébalo en línea!


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


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.




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]));
}




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
}

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

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)!!()}

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!


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.


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.