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, 22
se construiría una tabla similar a la siguiente:
6 9 14 22
2 * * *
3 * *
7 *
11 *
Esto se debe a que 6
tiene divisores primos de 2
y 3
, 9
tiene 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 = 9
pero 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 unTableForm
objeto (salida formateada) así:f=#&@@@FactorInteger[1##]
definef
como el conjunto de todos los números primos que dividen cualquiera de las entradas (de manera equivalente, dividiendo su producto1##
), mientras queg
es la lista que consta de las entradas.Outer[If[#∣#2,Y,""]&,f,g]
crea una tabla deY
sy cadenas vacías correspondientes a la divisibilidad (utilizamos el token indefinido enY
lugar 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,]
.TableForm
es genial, ¡espero que se quede en mi caja de herramientas!Jalea , 18 bytes
Utiliza en
1
lugar 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
ÆE
y filtrar filas vacías.fuente
JavaScript (ES6),
264260...179173 bytesCreo que este enfoque ahora ha superado permanentemente el recursivo (actualmente 178 bytes):
Usos
0
en 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<2
cheque dentro de la.map
funció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
gmpy2
para 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 listag
con 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
w
travé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 anchow
usando la subrutinat
. Luego recorre los enteros comenzando en 2, generando la línea de salida rellenando el entero y luego llamando a la subrutinac
para 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 elfor
bucle en la misma línea.fuente
Python 2 ,
157148146145143 bytesUtiliza en
0
lugar 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,%d
es 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), ys
es 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,%t
aplica 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
exec
declaración, que ejecuta la cadena que precede ax[-1]
veces, con unfor
bucle, 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*r
devolverá Verdadero yp(k,*r)
se llamará, imprimiendo k y los indicadores de divisibilidad:0
si 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
1
lugar 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