Su desafío es encontrar el número más suave en un rango determinado. En otras palabras, encuentre el número cuyo mayor factor primo es el más pequeño.
Un número liso es aquel cuyo mayor factor primo es pequeño. Los números de este tipo son útiles para el algoritmo de transformación rápida de Fourier, el criptoanálisis y otras aplicaciones.
Por ejemplo, en el rango 5, 6, 7, 8, 9, 10
, 8 es el número más liso, porque el factor primo más grande de 8 es 2, mientras que todos los demás números tienen un factor primo de 3 o mayor.
Entrada: La entrada será dos enteros positivos, que definen un rango. El número entero mínimo permitido en el rango es 2. Puede elegir si el rango es inclusivo, exclusivo, semi-exclusivo, etc., siempre que se pueda especificar un rango arbitrario dentro de los límites de su idioma. Puede tomar los números a través de la entrada de función, stdin, argumento de línea de comando o cualquier método equivalente para su idioma. No codifica información adicional en la entrada.
Salida: Devuelve, imprime o equivalente uno o más enteros en el rango de entrada que son máximamente suaves (mínimo factor máximo). Devolver múltiples resultados es opcional, pero si elige hacerlo, los resultados deben estar claramente delimitados. El formato de salida nativo está bien para múltiples resultados.
Indique en su respuesta cómo está tomando entrada y dando salida.
Puntuación: Código de golf. Cuenta por caracteres si está escrito en ASCII, o 8 * bytes / 7 si no está en ASCII.
Casos de prueba:
Nota: Estos son rangos de estilo Python, incluidos los de gama baja pero no los de gama alta. Cambie según corresponda a su programa. Solo un resultado es necesario.
smooth_range(5,11)
8
smooth_range(9,16)
9, 12
smooth_range(9,17)
16
smooth_range(157, 249)
162, 192, 216, 243
smooth_range(2001, 2014)
2002
fuente
Respuestas:
CJam - 13
Pruébalo en http://cjam.aditsu.net/
Ejemplo de entrada:
2001 2014
Ejemplo de salida:
2002
Explicación:
q~
lee y evalúa la entrada, empujando los 2 números en la pila (digamos min y max),
hace que una matriz [0 1 ... max-1]>
corte la matriz comenzando en min, resultando en [min ... max-1]{…}$
ordena la matriz usando el bloque para calcular la clave de clasificaciónmf
obtiene una matriz con todos los factores primos de un número, en ordenW=
obtiene el último elemento de la matriz (W = -1), obteniendo así el factor primo más grande para ser utilizado como La clave de clasificación0=
obtiene el primer elemento de la matriz (ordenada)fuente
mfW
alguien lo resolvió en 13 caracteres.Regex ( sabor
.NETPCRE),183129 bytes¡No intentes esto en casa!
Esto no es realmente un contendiente para la victoria. Pero Eric Tressler sugirió resolver este problema con nada más que una expresión regular, y no pude resistir intentarlo. Esto
podría serposible también en PCRE (e incluso más corto, ver más abajo), pero elegí .NET porque mi solución necesita mirar hacia atrás de longitud arbitraria. Aquí vamos:La entrada se codifica como un rango inclusivo separado por comas, donde ambos números se dan en notación unaria usando
1
s. La coincidencia será elS
1 al final, dondeS
es el número más suave en el rango. Los lazos se rompen a favor del número más pequeño.Entonces, el segundo ejemplo de la pregunta sería la siguiente cadena (coincidencia subrayada)
Se basa en la expresión regular de verificación principal (por ahora bastante conocida) , cuyas variaciones están incrustadas allí 6 veces.
Aquí hay una versión que usa espacios libres y comentarios para aquellos que quieren saber qué está pasando.
Puedes probarlo en línea aquí . Sin embargo, no intente entradas demasiado grandes, no garantizo el rendimiento de este monstruo.
Editar:
Terminé portando esto a PCRE (que solo requiere dos pasos), y acortando la expresión regular en casi un tercio. Aquí está la nueva versión:
Esto es esencialmente lo mismo, con dos cambios:
MIN
en el grupo1
). Sin embargo,PCRE
admite\K
qué restablece el comienzo del partido a la posición actual del cursor. Por lo tanto , se(?<=^(1+),.*)
convierte en lo^(1+),.*?\K
que ya guarda dos bytes.(?n)
para hacer coincidir el grupon
nuevamente, similar a una llamada de subrutina. Dado que la expresión regular original contenía el código para encontrar el factor primo más grande de un número dos veces, pude reemplazar todo el volumen del segundo con un simple(?2)
.fuente
3
o7
) sea realmente primo. Esto requiere que haya otra copia del factor después de capturarlo por primera vez, lo que no sería el caso de los números primos. Si bien evito eso en .NET poniendo un vistazo atrás en algún lugar allí para poder retroceder un poco para la verificación, esto no sería posible en la versión PCRE más corta debido a la falta de retrospectivas de longitud variable. Probablemente sea posible acortar ese bit, pero no creo que solo cambie+
a*
funcionar.(.*),.*?\K(?=(..+)((?=((?(R)\6|\2))*$).*(?=\4$)(?!(..+)\5+$)))(?!.+(?=\1)(?=(..+)(?3)).*(?!\2)\6).+
99 bytes en PCRE. Además, he encontrado mucho de su trabajo en este sitio y soy un gran admirador: D ¡Espero una batalla de expresiones regulares en el futuro!\4$
el lookahead y pegándolo después del lookahead negativo, pero esto afecta gravemente el rendimiento (cada subgrupo de dígitos <= \ 4 se comprueba la composición en lugar de solo \ 4 en sí mismo) y falla en entradas más largas.Regex (sabor PCRE), 66 (65🐌) bytes
Inspirado al ver que tanto Martin Ender como Jaytea , dos genios de expresiones regulares, escribieron soluciones de expresiones regulares para este código de golf, escribí la mía desde cero. La famosa expresión regular de verificación principal no aparece en ninguna parte de mi solución.
No leas esto si no quieres que te estropeen un poco de magia regex unaria. Si desea intentar descubrir esta magia usted mismo, le recomiendo comenzar resolviendo algunos problemas en ECMAScript regex:
(El motor de expresiones regulares que escribí puede ser de ayuda, ya que es muy rápido en expresiones regulares matemáticas simples e incluye un modo numérico unario que puede probar rangos de números naturales (pero también tiene un modo de cadenas que puede evaluar expresiones regulares no unitarias o unarias). con delimitadores). De manera predeterminada, es compatible con ECMAScript, pero tiene extensiones opcionales (que pueden agregar selectivamente subconjuntos de PCRE, o incluso anticipación molecular, algo que ningún otro motor de expresiones regulares tiene).
De lo contrario, siga leyendo y también lea este GitHub Gist (advertencia, muchos spoilers) que narra el viaje de empujar la expresión regular ECMAScript para abordar las funciones de números naturales de dificultad creciente (comenzando con el conjunto de acertijos de teukon, no todos matemáticos, lo que provocó esto viaje).
Al igual que con las otras soluciones de expresiones regulares para este problema, la entrada se da como dos números en bijetivo unario, separados por una coma, que representan un rango inclusivo. Solo se devuelve un número. La expresión regular podría modificarse para devolver todos los números que comparten el mismo factor primo más grande más pequeño, como coincidencias separadas, pero eso requeriría mirar hacia atrás de longitud variable y poner
\K
una anticipación o devolver el resultado como una captura en lugar de una coincidencia.La técnica utilizada aquí de división implícita repetida por el factor primo más pequeño es idéntica a la utilizada en las cadenas Match cuya longitud es una cuarta respuesta de potencia que publiqué hace un tiempo.
Sin más preámbulos:
((.+).*),(?!.*(?=\1)(((?=(..+)(\5+$))\6)*)(?!\2)).*(?=\1)\K(?3)\2$
Puedes probarlo aquí.
Y la versión de espacio libre, con comentarios:
El algoritmo se puede portar fácilmente a ECMAScript reemplazando la llamada de subrutina con una copia de la subrutina y devolviendo la coincidencia como un grupo de captura en lugar de usar \ K. El resultado es 80 bytes de longitud:
((x+)x*),(?!.*(?=\1)((?=(xx+)(\4+$))\5)*(?!\2)).*(?=\1)(((?=(xx+)(\8+$))\9)*\2$)
Pruébalo en línea!
Tenga en cuenta que
((.+).*)
se puede cambiar a((.+)+)
, bajando el tamaño en 1 byte (de 66 a 65 bytes ) sin pérdida de la funcionalidad correcta, pero la expresión regular explota exponencialmente en la lentitud.Pruébalo en línea! (Versión de desaceleración exponencial ECMAScript de 79 bytes)
fuente
Pitón 2, 95
Encuentra la suavidad de los números por división de prueba hasta que el número sea 1.
i
almacena la suavidad más pequeña hasta ahora,j
almacena el número que dio esa suavidad.Gracias a @xnor por los campos de golf.
fuente
if/else
tiene que ser acortable. Mi primer pensamiento esb=a%p<1;p+=1-b;a/=p**b
. O un ejecutivo que ejecuta uno de los dos en una cadena intercalada. Además, tal vezwhile~-a
funcione.s,p=a,2
,i,j=p,s
, @ ideas de XNOR, la eliminación de la sangría redundante y poner el bloque, mientras que en una sola línea de 95 caracteres produce. No estoy seguro de cómo se te ocurrió 98 ...J,
22 2019 caracteresP.ej
(Las funciones que toman dos argumentos están infijadas en J.)
fuente
(#~ (= <./)@:(i:"1&1)@:*@:(_&q:))@:([ + i.@-~)
{:
es lo mismo>./
y ahorra 1 byte.Haskell,
9694938680 caracteresuso a través de GHCi (un shell de Haskell):
EDITAR: ahora un algoritmo mucho más simple.
esta solución incluye ambos números en el rango (entonces
8 # 9
y7 # 8
son ambos 8)explicación:
la función (%) toma dos parámetros, x e y. cuando y es 2, la función devuelve la suavidad de x.
el algoritmo de aquí es simple: obtenga la lista combinada de todas las suavidades de los números en la entrada con cada suavidad almacenando una referencia a su número original, ordene para obtener el más pequeño y devuelva su número de referencia.
Aquí hay una versión de JavaScript sin golf con el mismo algoritmo:
fuente
m l=minimum l
Mathematica,
614539 caracteresImplementación muy sencilla de la especificación como una función sin nombre.
fuente
Lua - 166 caracteres
Yo
nono tenía (todavía!) Reputación suficiente para comentar sobre la solución de AndoDaan , pero aquí hay algunas mejoras en su códigoCambios:
n%d==0
por eln%d<1
cual es equivalente en este casotable.insert(f,d)
porf[#f+1]=d
(#f
es el número de elementos de f)fuente
Bash + coreutils, 56 bytes
La entrada proviene de exactamente dos argumentos de línea de comandos (¡Gracias @ nyuszika7h !!!). La salida es un resultado singular impreso en STDOUT.
seq
proporciona el rango de números, uno por línea, a partir de los argumentos de la línea de comandos.factor
lee esos números y genera cada número seguido de dos puntos y la lista ordenada de factores primos de ese número. Entonces el factor primo más grande está al final de cada línea.sed
elimina los dos puntos y todo, excepto el último / mayor factor primo, por lo que deja una lista de cada número (columna 1) y su factor primo más grande (columna 2).sort
numéricamente en orden creciente por la columna 2.sed
línea final coincide con la línea 1 (número cuyo factor primo más grande es el más pequeño de la lista), elimina todo, incluido y después del primer espacio, luego se cierra.sed
imprime automáticamente el resultado de esta sustitución antes de salir.Salida:
Los rangos de notas en este contexto incluyen ambos puntos finales.
fuente
seq $@
es 3 bytes más corto, si puede suponer que solo hay dos argumentos.Pitón 2, 67
Pensar en otro golf me dio la idea de un nuevo algoritmo para verificar la suavidad, de ahí la respuesta tardía.
La factorización prima del factorial
i!
incluye exactamente los primos como máximoi
. Entonces, sin
es un producto de primos distintos, su suavidad (factor primo más grande) es el más pequeñoi
para el cualn
es un divisori!
. Para tener en cuenta los factores primos repetidos enn
, podemos utilizar una potencia suficientemente alta dei!
. En particular, es(i!)**n
suficiente.El código intenta aumentar los factoriales
F=i!
, actualizados de forma recursiva. Filtramos los divisores deF
en el rango de entrada, y los enviamos si hay alguno, y de lo contrario pasamos a(i+1)!
.Caso de prueba:
fuente
C,
14995Respuesta editada:
No puedo reclamar crédito por esta solución. Esta respuesta actualizada toma prestado el hermoso método utilizado por Isaac en su solución Python. Quería ver si era posible escribirlo en C como un anidado
for
/while
bucle sin llaves, ¡y lo es!Explicación:
R(a,b,n,q,p,m)
explora el rangoa
deb-1
y devuelve el primer número más suave encontrado. Invocación requiere la adhesión a la siguiente forma:R(a,b,a,b,2,0)
por lo que las variables dentro de la función se inicializan de manera efectiva como sigue:n=a;q=b;p=2;m=0;
.Respuesta original :
Esta fue mi respuesta original ...
Explicación:
P(n,f,p)
prueba el valorn
de primalidad y devuelve verdadero (distinto de cero) sin
es primo o falso (cero) sin
no es primo.f
yp
ambos deben pasarse como 1.G(n,f)
devuelve el máximo factor primo den
.f
debe pasarse comon
.R(a,b,p,n)
explora el rangoa
deb-1
y devuelve el primer número más suave encontrado.p
debe pasarse como 1.n
puede ser cualquier valor.Conductor de prueba:
Salida:
fuente
Haskell - 120
Ejemplo de uso:
fuente
<1
lugar de==0
?Q, 91 caracteresK, 78 caracteresk probablemente afeitaría una docena de caracteres
editar: de hecho, tratar el límite superior como no inclusivo esta vez
fuente
Nota: esta respuesta no está permitida.
Esta respuesta utiliza múltiples características de Pyth agregadas después de que se le preguntó el desafío.
Agregué otra nueva característica, llamando al rango unario en una tupla de 2 elementos, que acorta la solución en dos caracteres, a esto:
Pyth , 7
La entrada ahora se toma separada por comas. El resto es igual.
Esta respuesta utiliza una característica de Pyth que se agregó después de que se hizo esta pregunta, específicamente después de ver la maravillosa solución CJam de @ aditsu. Dicho esto, quería demostrar lo que ha hecho posible agregar esa característica. La característica es
P
, que es una función arity-1 que en la entrada entera devuelve una lista de todos los factores primos de la entrada, ordenados de menor a mayor.Pyth , 9
Utiliza rangos de estilo Python, nueva línea separada en STDIN. Produce la solución más pequeña para STDOUT.
Explicación:
Pruebas:
fuente
Lua - 176 caracteres
Realmente debería dejar de jugar al golf en Lua. No tiene sentido.
fuente
Clojure -
173170 caracteresSoy un novato de Clojure. Golfizado:
Ejecuciones de muestra:
Los rangos incluyen los de gama baja, excluyen los de gama alta: [a, b) Solo imprime uno de los números más suaves, si se producen múltiples.
rendimientos:
Sin golf:
fuente
Rubí,
6562Con disculpas a https://codegolf.stackexchange.com/a/36484/6828 , esta es la versión golfizada (y ligeramente simplificada) de eso. Utiliza un rango inclusivo ya que es un personaje más corto.
Y gracias a YenTheFirst por salvar tres personajes.
fuente
C # LINQ:
317303289262Sin golf:
Toma el inicio y la longitud de la línea de comando y devolverá el número liso más grande.
Usé respuestas de aquí y de aquí para hacer mi respuesta.
¡Gracias a VisualMelon por ajustarlo y eliminar 12 bytes! También me deshice de las llaves en el caso de que ahorre 2 bytes, y CodeInChaos señaló algunas cosas obvias que me perdí (gracias de nuevo).
fuente
F
definiendoint b
junto a m. En un par de lugares de llevar a cabo la comparacióna%b==0
, ya
yb
es siempre positiva se puede cortar un byte para cada comprobando si es inferior a 1a%b<1
. También puede guardar un byte incrementandob
la condición if ena%++b<0
lugar de for for inicializándolo en 1. También creo que en este caso es más barato simplemente calificar completamenteSystem.Console.WriteLine
y evitar lanamespace
cláusula.m=...:m;
cosita queda fuera del bucle while. Por lo tanto, puede soltarm=0,
y reemplazarreturn m;
conreturn m=b>m?b:m;
. Entonces, puedes soltarlo porm=...:m;
completo.Aggregate
funciona, simplemente lo intenté después de verlo en otra respuesta para llegar a mi nuevo objeto en lugar de solo un campo dentro de él, y simplemente pasó a funcionar perfectamente :)R, 83
donde se asigna la parte inferior del rango de entrada y se asigna
a
la parte superior (inclusive)b
.gmp
es un paquete que está disponible en CRAN. Se sintió sucio hasta que vi esa absurdamf
función en CJam. Instalar escribiendoinstall.packages("gmp")
en la consola.fuente
lapply
3 veces, es posible que desee alias (es decir,l=lapply
y luego usarl(...
). De manera similar, dado quefactorize
es la única función que usa desde el paquetegmp
, puede usarla engmp::factorize
lugar de cargar la biblioteca y luego usarlafactorize
. Su código se convertiría enl=lapply;n=a:b;n[which.min(l(l(l(n,gmp::factorize),max),as.numeric))]
69 bytes.PowerShell - 85
Esto ordenará un rango de números (inclusive) basado en el factor primo máximo de cada número. Devuelve el elemento ordenado más bajo.
fuente
J - 16 char
Usando el estilo de rango ( inicio , longitud ), según lo permitido por los comentarios.
Para ser usado como un verbo diádico: el argumento izquierdo es el comienzo , el derecho es la longitud .
Una solución ( inicio , fin ) es +2 caracteres y excluye el final; incluyendo el final es +2 más. Pero en el lado positivo, se ve bastante bien ya que combinamos todas las {llaves}.
fuente
En serio, 8 * 14/7 = 16 (no competitivo)
En serio se creó después de este desafío, pero quería publicar esta respuesta porque ejemplifica el tipo de desafíos en los que Seriously es bueno.
Pruébalo en línea!
Explicación:
fuente
Pyth , 7 bytes
Pruébalo aquí!
}
r
fuente
Cobra - 150
Ni siquiera estoy seguro de por qué me molesté, la cobra simplemente no puede competir aquí.
fuente
Ruby - 113 caracteres
Usando el stdlib. Devuelve un resultado. Probado en rubí 2.1.2.
fuente
Perl (5.10+), 83
(se puede eliminar el salto de línea). Toma dos puntos finales de un rango inclusivo en dos líneas de stdin (porque
<>
es más barato que accederARGV
) y genera el más suave para stdout. Si hay un empate para el más suave, imprime el más pequeño. Podría imprimir la más grande a costa de un personaje.El algoritmo es básicamente la forma de Isaac de encontrar el mayor factor primo, aunque se nos ocurrió de forma independiente. Esa parte se reduce maravillosamente a una sola declaración en perl, el resto tiene más gastos generales de lo que me gustaría.
Debe ejecutarse debajo
perl -E
o con unuse 5.012
preámbulo. Si no puede hacer eso, reemplácelosay$r
conprint$r,$/
.fuente
Pitón 2 (84)
La solución de @ isaacg , pero con una
min
tecla de función by en lugar de min- find explícito, y una función recursiva que desempeña el papel de la iteración.Ejecute en Python apilable para evitar los límites de recursión.
Parece un desperdicio usar la condición paranthesized
(n%p<1)
, luego repetir su negación también en paréntesis(n%p>0)
, pero eso fue lo mejor que obtuve. Intenté muchas cosas, pero resultaron peores.Agradezco cualquier mejora que se te ocurra.
fuente
Java 8 - 422
454caracteresEstoy aprendiendo Java 8, y quería darle una oportunidad a esto en relación con Java (o incluso secuencias de Java 8).
En comparación con otros idiomas, este es brutal pero un ejercicio interesante.
Golfizado:
Sin golf:
ejemplo ejecutado usando:
fuente
MATL ( no competitivo ), 20 bytes
Este lenguaje fue diseñado después del desafío.
El alcance es inclusivo en ambos extremos. Los números se toman como dos entradas separadas.
Pruébalo en línea!
Explicación
fuente
&:[]y"@YfX>h]&X<)
o quizás 16:[]y"@YfX>h]&X<)
. La&
realidad era una gran idea (y supongo quey
no estaba disponible en ese entonces?).Yf
con 1 con prefijo también habría sido útil aquí, pero eso probablemente no sea suficiente para decidir que es una buena idea en general. :)y
o&
. Gracias a Suever por la semántica muy útil de este último (mi idea inicial fue hacer que significara "una entrada más que la predeterminada"). Si vemos más casos en los queYf
agregar útiles sería útil, realmente valdría la pena agregar esa característica. El problema es que hay alrededor de 34 respuestas que usanYf
(de acuerdo con este script ), por lo que es difícil saberloJelly , 7 bytes, puntaje = 7 ÷ 7 × 8 = 8, desafío de fechas posteriores al idioma
Pruébalo en línea!
Toma los puntos finales de rango inferior y superior como dos argumentos separados. Emite una lista de todos los números más suaves en el rango. (Esto se puede ver como una función, en cuyo caso el resultado es una lista Jelly, o como un programa completo, en cuyo caso el resultado utiliza la misma representación de lista que JSON).
Explicación
Esos momentos en que su programa Jelly es solo una traducción literal de la especificación ...
fuente