Introducción
Algo con lo que he jugado en matemáticas recreativas ha sido la construcción de una tabla de divisores para comparar / contrastar visualmente los divisores primos de un conjunto de números. El conjunto de números de entrada se encuentra en la parte superior como etiquetas de columna, los divisores primos están a la izquierda como etiquetas de fila y una marca indica dónde se alinean los dos.
Por ejemplo, para la entrada 6, 9, 14, 22se construiría una tabla similar a la siguiente:
6 9 14 22
2 * * *
3 * *
7 *
11 *
Esto se debe a que 6tiene divisores primos de 2y 3, 9tiene divisores primos de 3, y así sucesivamente.
Construcción
- La tabla está construida de tal manera que los números de entrada forman etiquetas de columna que están separadas por espacios y en orden ascendente (puede suponer que están ordenadas previamente), y los divisores primos se enumeran a la izquierda en orden ascendente uno por línea que forma la fila etiquetas.
- Tenga en cuenta que los espacios iniciales en los divisores primos y los números de entrada pueden ser necesarios si los números tienen longitudes diferentes, de modo que todas las columnas tengan el mismo ancho y se alineen adecuadamente.
- Cada divisor está representado por un solo
*(u otro carácter ASCII adecuado de su elección, siempre que se utilice el mismo carácter para todas las ocurrencias). - Se ignoran múltiples divisores (por ejemplo,
3 x 3 = 9pero solo hay uno*para esa intersección). - El
*se puede colocar en cualquier lugar horizontalmente en la columna, siempre que no sea ambiguo (tengo todos mis ejemplos con el*alineado a la derecha).
Entrada
- Una lista de enteros positivos en cualquier formato conveniente , cada uno
>1. - Puede suponer que la entrada está ordenada previamente.
- Se garantiza que la entrada solo tiene valores únicos.
Salida
La representación de arte ASCII resultante de la tabla de divisores primos.
Reglas
- Las nuevas líneas o espacios en blanco iniciales o finales son opcionales, siempre que los caracteres se alineen correctamente.
- Si es más corto tener una línea divisoria que separe los encabezados de columna / fila de los datos tabulares, también está permitido.
- Un programa completo o una función son aceptables. Si es una función, puede devolver el resultado en lugar de imprimirlo.
- Si es posible, incluya un enlace a un entorno de prueba en línea para que las personas puedan probar su código.
- Las lagunas estándar están prohibidas.
- Este es el código de golf, por lo que se aplican todas las reglas habituales de golf, y gana el código más corto (en bytes).
Ejemplos
6,9,14,22
6 9 14 22
2 * * *
3 * *
7 *
11 *
2,3,5,7
2 3 5 7
2 *
3 *
5 *
7 *
2,4,8,16,32
2 4 8 16 32
2 * * * * *
75,99,151,153
75 99 151 153
3 * * *
5 *
11 *
17 *
151 *

Respuestas:
Mathematica,
10190 bytes¡Gracias a ngenisis por guardar 11 bytes!
El
∣carácter de aproximadamente un tercio del camino es U + 2223 (3 bytes). Función sin nombre de un número variable de argumentos, cada uno de los cuales es un número entero distinto de cero, que devuelve unTableFormobjeto (salida formateada) así:f=#&@@@FactorInteger[1##]definefcomo el conjunto de todos los números primos que dividen cualquiera de las entradas (de manera equivalente, dividiendo su producto1##), mientras queges la lista que consta de las entradas.Outer[If[#∣#2,Y,""]&,f,g]crea una tabla deYsy cadenas vacías correspondientes a la divisibilidad (utilizamos el token indefinido enYlugar de una cadena"Y"o"*"para guardar dos bytes). Luego, usamosTableForm[...,TableHeadings->{f,g}]para formatear la matriz resultante con encabezados de fila y columna apropiados.Presentación previa:
fuente
"".TableForm[Outer[If[#∣#2,Y,""]&,f=#&@@@FactorInteger[1##],g={##}],TableHeadings->{f,g}]&si se permiten divisoresp[f,].TableFormes genial, ¡espero que se quede en mi caja de herramientas!Jalea , 18 bytes
Utiliza en
1lugar de*, según lo permitido por las reglas.Pruébalo en línea!
Cómo funciona
fuente
Jalea ,
2523 bytesPruébalo en línea!
¿Cómo?
Puede ser más corto de usar
ÆEy filtrar filas vacías.fuente
JavaScript (ES6),
264260...179173 bytesCreo que este enfoque ahora ha superado permanentemente el recursivo (actualmente 178 bytes):
Usos
0en lugar de*, que está permitido por el desafío.Fragmento de prueba
Mostrar fragmento de código
fuente
|operador de la sentencia if, ya que está comparando 2 booleanos ...i<2cheque dentro de la.mapfunción?...i<2?a:a.map(x=>x%i&&c)a...a.map(x=>i<2?x:x%i&&c), eso no es más corto. Si te refieres a moverlo al otro.map, tal vez ...Python 2 - 197 bytes
Cambió a Python 2 para facilitar el manejo de entradas y permitir `` la conversión de cadenas. Usos
gmpy2para generar el próximo primo. El formato de salida aún se basa en el envío anterior de Python 3 (ver más abajo), es decir, llenar una listagcon símbolos y formatearla.Pruébalo en línea!
Explicación
Para aquellos que no quieren decodificarlo ellos mismos.
Anterior
Python 3 - 251 bytes
Estoy bastante seguro de que alguien puede hacerlo mejor. Basado en esta respuesta para generar los primos <
k.Seguirá una versión no explicada y una explicación.
fuente
i=list(map(int,input().split(',')))hacerloi=input(), podría hacerlo y tomar la entrada en el formulario[1, 2, 3, 4].p=gmpy2.next_prime(p);t=['*'[m%p:]for m in i]y eliminar el espacio enif"*" in.Mathematica, 165 bytes
Más bien detallado, tal vez alguien pueda hacer algo con él:
fuente
Bash utilidades + GNU,
134133132125123 bytesPruébalo en línea!
fuente
Python 2 ,
181179 bytes-2 bytes gracias a FlipTack
La entrada debe ser una tupla.
Pruébalo en línea!
fuente
all(i%j for j in p)Funciona en lugar de usarmap?Lote, 451 bytes
Explicación: Comienza calculando el ancho del campo a
wtravés del máximo de los valores de entradam. Genera la primera línea de salida rellenando una cadena vacía y los números de entrada al anchowusando la subrutinat. Luego recorre los enteros comenzando en 2, generando la línea de salida rellenando el entero y luego llamando a la subrutinacpara rellenar una cadena vacía o un asterisco según corresponda para cada valor, sin embargo, la línea generada se omite si no contiene asteriscos. A medida que se genera la salida, cada valor se divide por el entero hasta que quede un resto, por lo que el ciclo termina cuando ningún valor es mayor que 1.Tenga en cuenta que el
set v=es ejecutado después de la%v%se sustituye en elforbucle en la misma línea.fuente
Python 2 ,
157148146145143 bytesUtiliza en
0lugar de*, según lo permitido por las reglas.Pruébalo en línea!
Fondo
Para identificar números primos, usamos un corolario del teorema de Wilson :
Cómo funciona
La primera línea define una función auxiliar.
p toma un número variable de argumentos que almacena en la tupla t .
El
'%%%ds '%len(`x[-1]`)utiliza una cadena de formato para construir una cadena de formato;%%es un signo de porcentaje literal,%des un marcador de posición para el entero quelen(`x[-1]`)devuelve, es decir, el número de dígitos del último elemento en x (la entrada, aún no está definido), yses literal.Si, por ejemplo, el último elemento de x tiene tres dígitos, esto produce
%3s, que se*len(t)repite una vez para cada elemento de x . Finalmente,%taplica esa cadena de formato a la tupla t , construyendo una cadena de elementos de t , separados por espacios y todos justificados a la derecha en cierta longitud.La segunda línea define el envío real: una función f que toma una lista x como entrada. Después de reemplazar la
execdeclaración, que ejecuta la cadena que precede ax[-1]veces, con unforbucle, obtenemos el siguiente código.En primer lugar, f inicializa k y m a 1 . Tenga en cuenta que (k - 1)! = 0! = 1 = m .
Luego,
p(' ',*x)imprime un espacio y los enteros en x , utilizando la función p .Ahora, ingresamos al bucle para imprimir la salida restante.
Primero,
r=[n%k and' 'for n in x]construye la lista de los restos de cada número entero n en x dividido por k . Los residuos positivos, es decir, los residuos que no corresponden a múltiplos de k , son verdaderos y se reemplazan con un espacio porand' '.A continuación, construimos
m%k*r. ¡Ya que m = (k - 1)! , por el corolario del teorema de Wilson, esto será simplemente r si k es primo, pero una lista vacía si no. Si hay al menos un 0 en el resultado, es decir, si k es primo y al menos un entero en x es divisible por k ,0in m%k*rdevolverá Verdadero yp(k,*r)se llamará, imprimiendo k y los indicadores de divisibilidad:0si es divisible, un espacio si no .Finalmente, multiplicamos m por k² e incrementamos k , entonces la calidad m = (k - 1). continúa aguantando.
fuente
MATL , 31 bytes
Esto utiliza en
1lugar de*, según lo permitido por el desafío.Pruébalo en línea! O verificar todos los casos de prueba .
Explicación ( obsoleta )
fuente
Raqueta 176 bytes
Sin golf:
Pruebas:
Salida:
fuente