Eu sou um grande fã da teoria dos números. Uma grande coisa na teoria dos números é a aritmética modular; a definição sendo se e somente se . Uma coisa divertida a se fazer é aumentar os poderes: especialmente quando o módulo é um número primo. Em particular, ficou provado que se e são relativamente primos (não compartilham fatores comuns além de ), existe um número tal que .
Vou explicar o que é o exercício por um exemplo. Vamos dar um módulo . Uma saída possível do programa ou função seria:
3 2 6 4 5 1
2 4 1 2 4 1
6 1 6 1 6 1
4 2 1 4 2 1
5 4 6 2 3 1
1 1 1 1 1 1
Cada linha é uma lista dos poderes do primeiro número nessa linha: a primeira linha é , o que equivale a módulo . A segunda linha do quadrado acima são as potências de , etc., até a última linha, que são apenas potências de 1 .
Este é um quadrado de módulo mágico porque:
- O quadrado é simétrico; isto é, a ésima coluna é a ésima linha.
- Todos os valores de a aparecem pelo menos uma vez.
Abaixo está a única outra saída válida para , começando com potências de :
5 4 6 2 3 1
4 2 1 4 2 1
6 1 6 1 6 1
2 4 1 2 4 1
3 2 6 4 5 1
1 1 1 1 1 1
O desafio
Crie uma função ou programa que, dado um número primo, p
produza um quadrado de módulo mágico, ou seja, um quadrado com comprimentos laterais p-1
, de modo que cada linha seja uma lista dos poderes consecutivos do primeiro elemento na linha e o mesmo para as colunas. Todos os números entre 0
e p
devem ocorrer, e o quadrado pode conter apenas números nesse intervalo.
A entrada é um número ou uma string e a saída pode ser ascii, uma matriz, uma matriz de matrizes (qualquer formato razoável).
Isso é código-golfe, então o código mais curto vence.
fonte
Respostas:
Geléia ,
1310 bytes-3 graças a Nick Kennedy
Sente comoo código repetidodeve seré o golfe-capaz, mas eujánão conseguiud-lo ...Experimente online! (rodapé formatos bonitos como uma grade)
Quão?
fonte
Carvão , 36 bytes
Experimente online! Link é a versão detalhada do código. Nota: Espaço à direita. Explicação:
Criar um
p-1
porp-1
conjunto de poderes1..p-1
da índices1..p-1
(módulop
).Mapeie sobre uma das linhas que possui exatamente uma
1
.Reorganize as linhas na ordem dada pela linha selecionada e formate a saída.
fonte
J ,
353231 bytesExperimente online!
fonte
Wolfram Language (Mathematica) ,
4643 bytesExperimente online!
-3 graças a alefalpha
fonte
JavaScript (ES7),
9186 bytesEsta versão tenta calcular os poderes antes de aplicar o módulo e falhará em devido à perda de precisão. Caso contrário, está usando a mesma lógica da versão comentada abaixo.p ≥ 11
Experimente online!
JavaScript (ES6),
9287 bytesEsta versão usa exponenciação modular para suportar valores de entrada (muito) mais altos.
Experimente online!
Quão?
Localizando a primeira linha
Dado , usamos a função auxiliar para calcular para .1 ≤ k < p g umak( n ) = knmod p 1 ≤ n < p
Procuramos modo que haja apenas um valor tal que . Fazemos isso classificando a matriz e testando se o 2 nd elemento é maior do que .k n umak( n ) = 1 1
Isso funciona mesmo em ordem lexicográfica - que é o comportamento padrão de
sort()
- porque:Exemplo:
Para :p = 17
Construindo a matriz
Depois de encontrarmos , invocamos novamente (para recuperar a versão não classificada da matriz) e invocamos em cada elemento de para criar as linhas da matriz.k g( K ) g g(k)
Esta parte pode ser simplesmente escrita como:
fonte
.indexOf(1)>p-3
economiza 3 bytes acima.every
.Zsh ,
11790 bytesExperimente online!Experimente online!Que Deus tenha piedade da minha alma. Há muita prática ruim envolvida aqui, deixe-me explicar pelo menos o maior infrator:
Exemplo para
b=4
:Finalmente, onde
$c
aparece no restante do programa, os elementos da matriz são avaliados comoeval set -- ....
.Por fim,
${#${(u)@}}
conta os elementos únicos nos parâmetros posicionais (ou seja: existe um ciclo / existem1
?)Comentários relevantes para a resposta de 117 bytes abaixo.
Desafios que temos que superar:
${#${(M)a:#1}
::#
remove a correspondência e(M)
reverte a correspondência. Portanto, isso será expandido para o número (${# }
) de1
s na matriz. Infelizmente, essa expansão não funciona muito bem com o loop for aritmético que usamos aqui. Se o fizesse, poderia salvar potencialmente um byte.${${:-1}:*a}
: Esta é a interseção do conjunto entre o singleton1
e o conjuntoa
. Isso será expandido para o único1
se for encontrado na matriz. Usando essa opção, salvamos um caractere aqui, mas perdemos 1 no geral, adiando a adição de1
s na última linha e coluna até o final.fonte
Perl 6 ,
6557 bytesExperimente online!
Provavelmente, há alguma maneira de apenas exibir o quadrado em si, mas isso faz o mesmo processo descrito na pergunta, classificando as listas por suas posições na primeira lista, que é apenas uma permutação de 1 para entrada-1. Retorna como uma lista de listas.
BTW, existem muitas brincadeiras, tentando contornar algumas das irritantes limitações do Perl 6 que envolvem sequências versus matrizes e variáveis anônimas.
Explicação:
fonte
Python 2 , 108 bytes
Experimente online!
fonte
print
vez de retornar?05AB1E ,
1916 bytes-3 bytes graças a @Emigna .
Experimente on-line (o rodapé é para imprimir a lista em 2D).
Explicação:
fonte
LεI<LmI%}ÐΘOÏн<è
por 16 bytes.<è
que teria sido suficiente em vez do queUΣXyk
eu tinha.Wolfram Language (Mathematica) , 67 bytes
Experimente online!
fonte
Pari / GP , 48 bytes
Experimente online!
fonte
APL (NARS), 29 caracteres, 58 bytes
teste:
fonte