¿Es un número esférico?

29

Un número esfénico es un número que es el producto de exactamente tres primos distintos. Los primeros pocos números esfénicos son 30, 42, 66, 70, 78, 102, 105, 110, 114. Esta es la secuencia A007304 en el OEIS.

Tu tarea:

Escriba un programa o función para determinar si un entero ingresado es un número esfénico.

Entrada:

Un número entero entre 0 y 10 ^ 9, que puede o no ser un número esférico.

Salida:

Un valor verdadero / falso que indica si la entrada es un número esférico.

Ejemplos:

30  -> true
121 -> false
231 -> true
154 -> true
4   -> false
402 -> true
79  -> false
0   -> false
60  -> false
64  -> false
8   -> false
210 -> false

Tanteo:

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

Gryphon - Restablece a Monica
fuente
¿Es 60un número esférico? 2 × 2 × 3 × 5
Erik the Outgolfer
1
@EriktheOutgolfer no es el producto de 3 primos distintos, sino el producto de 3 primos distintos y 1 primo duplicado.
Rɪᴋᴇʀ
1
@Riker No estoy realmente seguro de si "3 primos distintos" significa "3 primos que son distintos" o "cuando no se han certificado, deben quedar 3 primos" EDITAR: Oh, ya veo, 60no es un número esférico. (esperando la aclaración del OP)
Erik the Outgolfer
@EriktheOutgolfer Según la definición de números esféricos, 60 no es uno de ellos. Sin embargo, no sé si 60 es válido para este desafío.
Wheat Wizard
@WheatWizard, 60 no es un número esférico (p. Ej., Salida / retorno falso).
Gryphon - Restablece a Monica el

Respuestas:

7

Brachylog , 6 3 bytes

ḋ≠Ṫ

Pruébalo en línea!

Explicación

ḋ        The prime factorization of the Input…
 ≠       …is a list of distinct elements…
  Ṫ      …and there are 3 elements
Fatalizar
fuente
2
Y luego está el único idioma que tiene un gusto incorporado .
Erik the Outgolfer
Y el incorporado también.
Zacharý
1
Sin embargo, @ Zacharý no es realmente un predicado incorporado; Es una variable incorporada: una lista de 3 elementos variables. Es una variable preconstreñida bastante útil en muchos desafíos diferentes.
Fatalize
Felicitaciones por la respuesta más corta.
Gryphon - Restablece a Mónica el
11

bash, 43 bytes

factor $1|awk '{print $2-$3&&$3-$4&&NF==4}'

Pruébalo en línea!

Entrada mediante argumento de línea de comando, salidas 0o 1stdout.

Bastante autoexplicativo; analiza la salida de factorpara verificar que el primer y el segundo factor son diferentes, el segundo y el tercero son diferentes (están ordenados, por lo que es suficiente), y hay cuatro campos (el número de entrada y los tres factores).

Pomo de la puerta
fuente
11

MATL , 7 bytes

_YF7BX=

Pruébalo en línea! O verificar todos los casos de prueba .

Explicación

_YF   % Implicit input. Nonzero exponents of prime-factor decomposition
7     % Push 7
B     % Convert to binary: gives [1 1 1] 
X=    % Is equal? Implicit display
Luis Mendo
fuente
@Suever Estaba pensando en eso, pero luego la salida falsa se vuelve más fea (ya sea vacía con error o una matriz con algunos ceros). No estoy seguro si debería ...
Luis Mendo
44
X=es la obra más triste que he visto en mi vida.
Erik the Outgolfer
9

C, 88 78 126 58 77 73 + 4 ( lm) = 77 bytes

l,j;a(i){for(l=1,j=0;l++<i;fmod(1.*i/l,l)?i%l?:(i/=l,j++):(j=9));l=i==1&&j==3;}

Explicación comentada sin golf:

look, div; //K&R style variable declaration. Useful. Mmm.

a ( num ) { // K&R style function and argument definitions.

  for (
    look = 1, div = 0; // initiate the loop variables.
    look++ < num;) // do this for every number less than the argument:

      if (fmod(1.0 * num / look, look))
      // if num/look can't be divided by look:

        if( !(num % look) ) // if num can divide look
          num /= look, div++; // divide num by look, increment dividers
      else div = 9;
      // if num/look can still divide look
      // then the number's dividers aren't unique.
      // increment dividers number by a lot to return false.

  // l=j==3;
  // if the function has no return statement, most CPUs return the value
  // in the register that holds the last assignment. This is equivalent to this:
  return (div == 3);
  // this function return true if the unique divider count is 3
}

Pruébalo en línea!

Betseg
fuente
1
Considere en i*1.0/llugar del elenco para flotar. (Y puesto que l, json globales se inicializan a 0 de forma gratuita, no es necesario hacerlo si la función sólo se llama una vez No está seguro de cuál es la regla para eso..)
Mat
76 bytes
ceilingcat
5

CJam , 11 bytes

rimFz1=7Yb=

Pruébalo en línea! O verificar todos los casos de prueba .

Explicación

Basado en mi respuesta MATL.

ri    e# Read integer
mF    e# Factorization with exponents. Gives a list of [factor exponent] lists
z     e# Zip into a list of factors and a list of exponents
1=    e# Get second element: list of exponents
7     e# Push 7
Yb    e# Convert to binary: gives list [1 1 1]
=     e# Are the two lists equal? Implicitly display
Luis Mendo
fuente
5

Jalea , 8 bytes

ÆEḟ0⁼7B¤

Pruébalo en línea!

Utiliza el algoritmo de Luis Mendo.

Explicación:

ÆEḟ0⁼7B¤
ÆE       Prime factor exponents
  ḟ0     Remove every 0
    ⁼7B¤ Equal to 7 in base 2?
Erik el Outgolfer
fuente
4

Casco , 6 bytes

≡ḋ3Ẋ≠p

Pruébalo en línea!

Devuelve 1 para números esféricos y 0 en caso contrario.

Explicación

≡ḋ3Ẋ≠p    Example input: 30
     p    Prime factors: [2,3,5]
   Ẋ≠     List of absolute differences: [1,2]
≡         Is it congruent to...       ?
 ḋ3           the binary digits of 3: [1,1]

En el último pasaje, la congruencia entre dos listas significa tener la misma longitud y la misma distribución de valores de verdad / falsedad. En este caso, estamos verificando que nuestro resultado esté compuesto por dos valores verdaderos (es decir, que no sean cero).

León
fuente
4

Mathematica, 31 bytes

SquareFreeQ@#&&PrimeOmega@#==3&
martín
fuente
Como ya está probando la libertad de expresión, funcionará PrimeNuigual de bien PrimeOmegay es más corto.
Mark S.
4

Jalea , 6 bytes

ÆE²S=3

Pruébalo en línea!

Cómo funciona

ÆE²S=3  Main link. Argument: n

ÆE      Compute the exponents of n's prime factorization.
  ²     Take their squares.
   S    Take the sum.
    =3  Test the result for equality with 3.
Dennis
fuente
2

En realidad , 7 bytes

w♂N13α=

Pruébalo en línea!

Explicación:

w♂N13α=
w       Push [prime, exponent] factor pairs
 ♂N     Map "take last element"
   1    Push 1
    3   Push 3
     α  Repeat
      = Equal?
Erik el Outgolfer
fuente
2

J , 15 bytes

7&(=2#.~:@q:)~*

Pruébalo en línea!

Explicación

7&(=2#.~:@q:)~*  Input: integer n
              *  Sign(n)
7&(         )~   Execute this Sign(n) times on n
                 If Sign(n) = 0, this returns 0
          q:       Prime factors of n
       ~:@         Nub sieve of prime factors
    2#.            Convert from base 2
   =               Test if equal to 7
millas
fuente
Muy buen uso de ~: y #. Una alternativa podría ser (7 & (= #. @ ~: @Q:) ~ *) que me parece un poco más fácil de leer, pero no es más corto.
bob
2

Ruby, 81 49 46 bytes

Incluye 6 bytes para opciones de línea de comando -rprime.

->n{n.prime_division.map(&:last)==[1]*3}

Pruébalo en línea!

daniero
fuente
2

Python 3 , 54 53 bytes

lambda n:sum(1>>n%k|7>>k*k%n*3for k in range(2,n))==6

¡Gracias a @xnor por jugar golf en 1 byte!

Pruébalo en línea!

Dennis
fuente
Puede verificar la libertad de espacio con en k*k%nlugar den%k**2
xnor
Bien, solo necesito una falla. ¡Gracias!
Dennis
2

C, 91 102 bytes, corregido (de nuevo), golfizado y probado en tiempo real esta vez:

<strike>s(c){p,f,d;for(p=2,f=d=0;p<c&&!d;){if(c%p==0){c/=p;++f;if(c%p==0)d=1;}++p;}c==p&&f==2&&!d;}</strike>
s(c){int p,f,d;for(p=2,f=d=0;p<c&&!d;){if(c%p==0){c/=p;++f;if(c%p==0)d=1;}++p;}return c==p&&f==2&&!d;}

/ * Esto también funciona en 93 bytes, pero como me olvidé de las reglas estándar que prohíben el tipo int predeterminado en las variables dinámicas, y de no permitir valores de retorno implícitos sin asignaciones, no lo voy a tomar:

p,f,d;s(c){for(p=2,f=d=0;p<c&&!d;){if(c%p==0){c/=p;++f;if(c%p==0)d=1;}++p;}p=c==p&&f==2&&!d;}

(¿Quién dijo que sabía algo sobre C? ;-)

Aquí está el marco de prueba con script de shell en los comentarios:

/* betseg's program for sphenic numbers from 
*/
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <math.h> /* compile with -lm */

/* l,j;a(i){for(l=1,j=0;l<i;i%++l?:(i/=l,j++));l=i==1&&j==3;} */
#if defined GOLFED
l,j;a(i){for(l=1,j=0;l++<i;fmod((float)i/l,l)?i%l?:(i/=l,j++):(j=9));l=i==1&&j==3;}
#else 
int looker, jcount;
int a( intval ) {
  for( looker = 1, jcount = 0; 
    looker++ < intval; 
    /* Watch odd intvals and even lookers, as well. */
    fmod( (float)intval/looker, looker )  
      ? intval % looker /* remainder? */
        ? 0 /* dummy value */
        : ( inval /= looker, jcount++ /* reduce the parameter, count factors */ ) 
      : ( jcount = 9 /* kill the count */ ) 
  )
    /* empty loop */;
  looker = intval == 1 && jcount == 3; /* reusue looker for implicit return value */
}
#endif

/* for (( i=0; $i < 100; i = $i + 1 )) ; do echo -n at $i; ./sphenic $i ; done */

Tomé prestada la respuesta anterior de betseg para obtener mi versión.

Esta es mi versión del algoritmo de betseg, que jugué para llegar a mi solución:

/* betseg's repaired program for sphenic numbers
*/
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

int sphenic( int candidate )
{
  int probe, found, dups;
  for( probe = 2, found = dups = 0; probe < candidate && !dups; /* empty update */ ) 
  { 
    int remainder = candidate % probe;
    if ( remainder == 0 ) 
    {
      candidate /= probe;
      ++found;
      if ( ( candidate % probe ) == 0 )
        dups = 1;
    }
    ++probe;
  } 
  return ( candidate == probe ) && ( found == 2 ) && !dups;
}

int main( int argc, char * argv[] ) { /* Make it command-line callable: */
  int parameter;
  if ( ( argc > 1 ) 
       && ( ( parameter = (int) strtoul( argv[ 1 ], NULL, 0 ) ) < ULONG_MAX ) ) {
    puts( sphenic( parameter ) ? "true" : "false" );
  }
  return EXIT_SUCCESS; 
}

/* for (( i=0; $i < 100; i = $i + 1 )) ; do echo -n at $i; ./sphenic $i ; done */
Joel Rees
fuente
¿Responde la pregunta ahora?
Joel Rees
Sí lo hace Insertar este enlace a la respuesta de betseg: [betseg's answer](/codegolf//a/135203/65836). También puede hacer clic en editar en su respuesta para sugerir una edición, si lo desea, que incluiría la explicación, sin promesas de si se aprobará o no.
Stephen
Estoy aquí ahora, y arreglé mi programa, ahora está a 87 bytes; pero tu programa también se ve bien.
betseg
@betseg Interesante que haya usado coma flotante esta vez. Ah, y gracias por dejarme tomar prestado tu algoritmo. ;-)
Joel Rees
@JoelRees agregué una explicación a mi respuesta, ¿también tu respuesta tiene un problema, creo? no parece funcionar correctamente: Pruébelo en línea
betseg
1

Javascript (ES6), 87 bytes

n=>(a=(p=i=>i>n?[]:n%i?p(i+1):[i,...p(i,n/=i)])(2)).length==3&&a.every((n,i)=>n^a[i+1])

Fragmento de código de ejemplo:

f=
n=>(a=(p=i=>i>n?[]:n%i?p(i+1):[i,...p(i,n/=i)])(2)).length==3&&a.every((n,i)=>n^a[i+1])

for(k=0;k<10;k++){
  v=[30,121,231,154,4,402,79,0,60,64][k]
  console.log(`f(${v}) = ${f(v)}`)
}

Herman L
fuente
1

Python 2 , 135 121 bytes

  • Mucho tiempo, ya que esto incluye todos los procedimientos: verificación de prima, factores de obtención de prima y verificación de la condición del número de esfera.
lambda x:(lambda t:len(t)>2and t[0]*t[1]*t[2]==x)([i for i in range(2,x)if x%i<1and i>1and all(i%j for j in range(2,i))])

Pruébalo en línea!

officialaimm
fuente
1

Python 2 , 59 bytes

lambda x:6==sum(5*(x/a%a+x%a<1)+(x%a<1)for a in range(2,x))

Pruébalo en línea!

Asistente de trigo
fuente
Esto da falsos positivos como 48. Había estado intentando lo mismo.
xnor
@xnor Fijo, pero a costa de bytes.
Wheat Wizard
1

J, 23 bytes

0:`((~.-:]*.3=#)@q:)@.*

Pruébalo en línea!

El manejo de 8 y 0 básicamente arruinó este ...

q: le da todos los factores primos, pero no maneja 0. el resto simplemente dice "los factores únicos deberían ser iguales a los factores" y "el número de ellos debería ser 3"

Jonás
fuente
Esto falla para la entrada60
Conor O'Brien
@ ConorO'Brien gracias. Vea mi edición: arreglar 60 ayudó , pero me di cuenta de que tampoco estaba manejando 0 correctamente, y manejar eso más que duplica los bytes
Jonah
La última fue mi idea original, y eso falla 8.
Conor O'Brien
Tengo (6=]#@,~.)@q:como posible solución
Conor O'Brien el
@ ConorO'Brien ah buen punto sobre 8. el tuyo fallará por 0, sin embargo.
Jonás
1

Japt , 14 bytes

k
k@è¥X ÉÃl ¥3

Pruébalo en línea!

Justin Mariner
fuente
@Oliver Eso daría como resultado pasar una función a Number.k(), que no tendría ningún efecto y solo comprobaría si la entrada tiene 3 factores primos, no 3 factores primos distintos . Eso significaría 8(con tres factores primos :)2, 2, 2 pasaría a pesar de no estar en A007304
Justin Mariner
Ah, tienes razon. Estaba pasando por los casos de prueba.
Oliver
@ Oliver Sí, eso realmente me dejó sin aliento al trabajar en esta solución. Acabo de agregar 8a los casos de prueba por esa razón.
Justin Mariner
1

VB.NET (.NET 4.5), 104 bytes

Function A(n)
For i=2To n
If n Mod i=0Then
A+=1
n\=i
End If
If n Mod i=0Then A=4
Next
A=A=3
End Function

Estoy usando la función de VB donde el nombre de la función también es una variable. Al final de la ejecución, dado que no hay una declaración de retorno, pasará el valor de la 'función'.

Lo último A=A=3se puede pensar return (A == 3)en lenguajes basados ​​en C.

Comienza en 2 y extrae los números primos de forma iterativa. Como empiezo con los primos más pequeños, no se puede dividir por un número compuesto.

Intentará dividir por segunda vez por la misma prima. Si es así (por ejemplo, cómo 60 se divide dos veces por 2), establecerá el recuento de primos en 4 (por encima del máximo permitido para un número esférico).

¡Pruébelo en línea!

Brian J
fuente
1

Dyalog APL, 51 49 48 46 45 43 bytes

1∊((w=×/)∧⊢≡∪)¨(⊢∘.,∘.,⍨){⍵/⍨2=≢∪⍵∨⍳⍵}¨⍳w←⎕

Pruébalo en línea! (modificado para que pueda ejecutarse en TryAPL)

Quería enviar uno que no se base en el espacio de nombres dfns, incluso si es largo .

Zacharý
fuente
1

J, 15 14 19 bytes

Intento previo: 3&(=#@~.@q:)~*

Versión actual: (*/*3=#)@~:@q: ::0:

Cómo funciona:

(*/*3=#)@~:@q: ::0:  Input: integer n
               ::0:  n=0 creates domain error in q:, error catch returns 0
            q:       Prime factors of n
         ~:@         Nub sieve of prime factors 1 for first occurrence 0 for second
(*/*3=#)@            Number of prime factors is equal to 3, times the product across the nub sieve (product is 0 if there is a repeated factor or number of factors is not 3)

Esto pasa para los casos 0, 8 y 60 que la versión anterior no tenía.

mover
fuente
1
¿Por qué no 3 = # ~ .q: para 7 caracteres? De una sesión J 3 = # ~ .q: 30 ==> 1 y 3 = # ~ .q: 20 ==> 0
Richard Donovan el
Richard, tu sugerencia da un falso positivo para n = 60 y crea un error de dominio para n = 0, pero mi versión anterior también falló para n = 60. ¡Su comentario me llevó a luchar por una solución correcta!
bob
0

Mathematica, 66 57 bytes

Length@#1==3&&And@@EqualTo[1]/@#2&@@(FactorInteger@#)&

Define una función anónima.

es transponer .

Explicación

FactorIntegerda una lista de pares de factores y sus exponentes. Por ej FactorInteger[2250]=={{2,1},{3,2},{5,3}}. Esto se transpone para facilitar su uso y se alimenta a la función Length@#1==3&&And@@EqualTo[1]/@#2&. La primera parte Length@#1==3verifica que hay 3 factores únicos, mientras que la segunda And@@EqualTo[1]/@#2verifica que todos los exponentes sean 1.

DanTheMan
fuente
0

PHP, 66 bytes:

for($p=($n=$a=$argn)**3;--$n;)$a%$n?:$p/=$n+!++$c;echo$c==7&$p==1;

Ejecutar como tubería -nRo probarlo en línea .

Bucle infinito para 0; inserte $n&&antes --$nde arreglar.

Descompostura

for($p=($n=$a=$argn)**3;    # $p = argument**3
    --$n;)                  # loop $n from argument-1
    $a%$n?:                     # if $n divides argument
        $p/=$n                      # then divide $p by $n
        +!++$c;                     # and increment divisor count
echo$c==7&$p==1;            # if divisor count is 7 and $p is 1, argument is sphenic


argumento de ejemplo = 30:
los factores primos son 2, 3y 5
otros divisores son 1, 2 * 3 = 6, 2 * 5 = 10y 3 * 5 = 15
su producto: 1*2*3*5*6*10*15es 27000==30**3

Titus
fuente
0

Python 99 bytes

def s(n):a,k=2,0;exec('k+=1-bool(n%a)\nwhile not n%a:n/=a;k+=10**9\na+=1\n'*n);return k==3*10**9+3

Primera presentación Perdóname si hice algo mal. Un poco tonto, cuenta el número de factores de n, y luego el número de veces nes divisible por cada uno (sumando 10 ** 9).

Estoy bastante seguro de que hay algunas maneras fáciles de cortar ~ 10-20 caracteres, pero no lo hice.

Además, esto es intratablemente lento a 10 ** 9. Podría hacerse bien cambiando '...a+=1\n'*na '...a+=1\n'*n**.5, ya que solo necesitamos ir a la raíz cuadrada de n.

Backerupper
fuente