Introdução
Algo com o qual eu brinquei em matemática recreativa foi a construção de uma tabela divisória para comparar / contrastar visualmente os divisores primos de um conjunto de números. O conjunto de números de entrada está na parte superior como rótulos de coluna, os divisores principais estão à esquerda como rótulos de linha e uma marca indica onde os dois estão alinhados.
Por exemplo, para entrada, 6, 9, 14, 22
uma tabela semelhante à seguinte seria construída:
6 9 14 22
2 * * *
3 * *
7 *
11 *
Isso ocorre porque 6
possui divisores primários de 2
e 3
, 9
possui divisores primários de 3
e assim por diante.
Construção
- A tabela é construída de forma que os números de entrada formem rótulos de colunas separados por espaços e em ordem crescente (você pode assumir que eles são pré-classificados) e os divisores principais são listados à esquerda em ordem crescente, um por linha que forma a linha etiquetas.
- Observe que os espaços iniciais nos divisores primos e nos números de entrada podem ser necessários se os números tiverem comprimentos diferentes, para que todas as colunas tenham a mesma largura e se alinhem adequadamente.
- Cada divisor é representado por um único
*
(ou outro caractere ASCII adequado de sua escolha, desde que o mesmo caractere seja usado para todas as ocorrências). - Vários divisores são ignorados (por exemplo,
3 x 3 = 9
mas há apenas um*
para essa interseção). - Ele
*
pode ser colocado em qualquer lugar horizontalmente na coluna, desde que não seja ambíguo (tenho todos os meus exemplos com o*
alinhado à direita).
Entrada
- Uma lista de números inteiros positivos em qualquer formato conveniente , cada um
>1
. - Você pode assumir que a entrada é pré-classificada.
- A entrada é garantida para ter apenas valores exclusivos.
Saída
A representação artística ASCII resultante da tabela do divisor principal.
Regras
- Novas linhas à esquerda ou à direita ou espaços em branco são opcionais, desde que os próprios caracteres estejam alinhados corretamente.
- Se for mais curto ter uma linha divisória que separa os títulos das colunas / linhas dos dados tabulares, isso também é permitido.
- Um programa completo ou uma função são aceitáveis. Se uma função, você pode retornar a saída em vez de imprimi-la.
- Se possível, inclua um link para um ambiente de teste on-line para que as pessoas possam experimentar seu código!
- As brechas padrão são proibidas.
- Isso é código-golfe, portanto todas as regras usuais de golfe se aplicam e o código mais curto (em bytes) vence.
Exemplos
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 *
Respostas:
Mathematica,
10190 bytesObrigado a ngenisis por salvar 11 bytes!
O
∣
caractere cerca de um terço do caminho é U + 2223 (3 bytes). Função sem nome de um número variável de argumentos, cada um dos quais é um número inteiro diferente de zero, que retorna umTableForm
objeto (saída formatada) da seguinte forma:f=#&@@@FactorInteger[1##]
definef
como o conjunto de todos os números primos que dividem qualquer uma das entradas (equivalentemente, dividindo seu produto1##
), enquantog
é a lista que consiste nas entradas.Outer[If[#∣#2,Y,""]&,f,g]
cria uma tabela deY
s e cadeias vazias correspondentes à divisibilidade (usamos o token indefinido emY
vez de uma cadeia"Y"
ou"*"
para salvar dois bytes). Em seguida, usamos oTableForm[...,TableHeadings->{f,g}]
formato da matriz resultante com os títulos de linha e coluna apropriados.Submissão anterior:
fonte
""
.TableForm[Outer[If[#∣#2,Y,""]&,f=#&@@@FactorInteger[1##],g={##}],TableHeadings->{f,g}]&
se divisores são permitidosp[f,]
.TableForm
é legal, espero que fique na minha caixa de ferramentas!Gelatina , 18 bytes
Usa em
1
vez de*
, conforme permitido pelas regras.Experimente online!
Como funciona
fonte
Geléia ,
2523 bytesExperimente online!
Quão?
Pode ser mais curto usar
ÆE
e filtrar linhas vazias.fonte
JavaScript (ES6),
264260...179173 bytesEu acho que essa abordagem agora excedeu permanentemente a recursiva (atualmente 178 bytes):
Usa
0
no lugar de*
, o que é permitido pelo desafio.Snippet de teste
Mostrar snippet de código
fonte
|
operador na instrução if, já que você está comparando 2 booleans ...i<2
verificação dentro da.map
função?...i<2?a:a.map(x=>x%i&&c)
para...a.map(x=>i<2?x:x%i&&c)
, não é mais curto. Se você quer dizer movê-lo para o outro.map
, talvez ...Python 2 - 197 bytes
Alterado para Python 2 para facilitar o manuseio de entrada e permitir `` a conversão de strings. Usa
gmpy2
para gerar o próximo prime. Formato de saída ainda baseado no envio anterior do Python 3 (veja abaixo), ou seja, preenchendo uma listag
com símbolos e formatando-a.Experimente online!
Explicação
Para aqueles que não querem decodificar eles mesmos.
Anterior
Python 3-251 bytes
Tenho certeza que alguém pode fazer melhor. Com base nesta resposta para gerar os números primos <
k
.A versão não-gasta e explicação seguirão.
fonte
i=list(map(int,input().split(',')))
, você pode simplesmente fazeri=input()
e receber informações no formulário[1, 2, 3, 4]
.p=gmpy2.next_prime(p);t=['*'[m%p:]for m in i]
e removendo o espaçoif"*" in
.Mathematica, 165 bytes
Bastante detalhado - talvez alguém possa fazer algo com isso:
fonte
Utilitários Bash + GNU,
134133132125123 bytesExperimente online!
fonte
Python 2 ,
181179 bytes-2 bytes graças ao FlipTack
A entrada deve ser uma tupla.
Experimente online!
fonte
all(i%j for j in p)
vez de usarmap
?Lote, 451 bytes
Explicação: Inicia calculando a largura do campo
w
através do máximo dos valores de entradam
. Gera a primeira linha de saída preenchendo uma string vazia e os números de entrada na larguraw
usando a sub-rotinat
. Em seguida, percorre os números inteiros começando em 2, gerando a linha de saída preenchendo o número inteiro e chamando a subc
- rotina para preencher uma sequência vazia ou um asterisco conforme apropriado para cada valor, no entanto, a linha gerada é ignorada se não contiver asteriscos. À medida que a saída é gerada, cada valor é dividido pelo número inteiro até deixar um restante, portanto o loop termina quando nenhum valor é maior que 1.Observe que os
set v=
executados após o%v%
são substituídos nofor
loop na mesma linha.fonte
Python 2 ,
157148146145 145143 bytesUsa em
0
vez de*
, conforme permitido pelas regras.Experimente online!
fundo
Para identificar números primos, usamos um corolário do teorema de Wilson :
Como funciona
A primeira linha define uma função auxiliar.
p recebe um número variável de argumentos que armazena na tupla t .
O
'%%%ds '%len(`x[-1]`)
usa uma string de formato para construir uma string de formato;%%
é um sinal de porcentagem literal,%d
é um espaço reservado para o número inteiro quelen(`x[-1]`)
retorna, ou seja, o número de dígitos do último elemento em x (a entrada, ainda não definida) es
é literal.Se, por exemplo, o último elemento de x tiver três dígitos, isso produzirá
%3s
, que se*len(t)
repete uma vez para cada elemento de x . Por fim,%t
aplica essa sequência de formatação à tupla t , construindo uma sequência de elementos de t , separados por espaço e todos justificados à direita para um determinado comprimento.A segunda linha define a submissão real: uma função f que recebe uma lista x como entrada. Depois de substituir a
exec
instrução, que executa a string que antecede osx[-1]
tempos, com umfor
loop, obtemos o código a seguir.Primeiro, f inicializa k e m para 1 . Note que (k - 1)! = 0! = 1 = m .
Em seguida,
p(' ',*x)
imprime um espaço e os números inteiros em x , usando a função p .Agora, entramos no loop para imprimir a saída restante.
Primeiro,
r=[n%k and' 'for n in x]
constrói a lista dos restantes de cada número inteiro n em x dividido por k . Restos positivos, isto é, restos que não correspondem a múltiplos de k , são verdadeiros e são substituídos por um espaço porand' '
.A seguir, construímos
m%k*r
. Como m = (k - 1)! , pelo corolário do teorema de Wilson, este será simplesmente r se k for primo, mas uma lista vazia se não. Se houver pelo menos um 0 no resultado, ou seja, se k for primo e pelo menos um número inteiro em x for divisível por k ,0in m%k*r
retornará True e seráp(k,*r)
chamado, imprimindo k e os indicadores de divisibilidade:0
se divisível, um espaço se não .Finalmente, multiplicamos m por k² e incrementamos k , para que a qualidade m = (k - 1)! continua a segurar.
fonte
MATL , 31 bytes
Isso usa em
1
vez de*
, conforme permitido pelo desafio.Experimente online! Ou verifique todos os casos de teste .
Explicação ( desatualizada )
fonte
Raquete 176 bytes
Ungolfed:
Teste:
Saída:
fonte