Um quadrado mágico é uma matriz quadrada de números com o lado n constituído pelos números inteiros positivos distintos 1, 2, ..., n² dispostos de modo que a soma dos n números em qualquer linha horizontal, vertical ou diagonal principal seja sempre a mesmo número, conhecido como constante mágica.
Seu programa deve inserir, através de entrada padrão, um número que especifique o comprimento do lado do seu quadrado e, em seguida, os números no quadrado. Nenhum número pode ser usado mais de uma vez, nenhum número maior que n ² pode ser usado e todos os números devem ser maiores que 0. O programa deve determinar se essa combinação de números é um quadrado mágico.
(i,j)
mais eficiente como um único númerox
, levandoi=x%C
ej=x/C
para alguns grandes o suficienteC
. Pode tentar depois.APL, 35
A explicação
x←⎕⍴⍨,⍨⎕
solicita a entrada, formate-a em uma matriz e atribua ax
⌽
Inverter a matriz da esquerda para a direitax(...)
Crie uma matriz de matrizes:x
ex
inverta1 1∘⍉¨
Para cada uma dessas matrizes, use a diagonal+/↑
como uma matriz 2 × n dos números nessas diagonais e somar as linhas⍉x
Transponhax
x,
e concatene comx
para formar uma matriz × 2n+⌿
e somar as colunas(+⌿x,⍉x),+/↑1 1∘⍉¨x(⌽x←⎕⍴⍨,⍨⎕)
concatenar para formar uma matriz de somas,2=/
verificar se pares consecutivos são iguais∧/
e AND juntos todos esses resultadosfonte
Mathematica
128125Recebe entradas como
fonte
Input[r=Reverse]
para salvar um byte.#&@@
é um byte menor que[[1]]
. Você provavelmente também pode usar a notação infixPartition
para outro byte. EThread
deve funcionar em vez deTranspose
. Como alternativa, use esse caractere Unicode como um operador de correção posterior (o Mathematica o usa para T sobrescrito para transposição).APL
4732Usando a excelente solução do TwiNight e aplicando mais alguns ajustes:
Explicação:
Isso usa trens funcionais, que foram introduzidos na v14 do intérprete Dyalog. APL é executado da direita para a esquerda, são entradas, então primeiro as dimensões, depois o vetor dos números.
⍨⎕, ⍨⎕ cria a matriz NxN
Depois disso, vem o trem de funções, que são basicamente apenas uma sequência de funções (entre colchetes) aplicada ao argumento correto. As funções são:
⊢ Retorna o argumento correto (que é a matriz)
Transpõe a matriz de argumentos correta
1 1∘⍉ Retorna a diagonal
1 1∘⍉∘⌽ Retorna a diagonal da matriz invertida (horizontalmente)
Todos os resultados são concatenados com a função ","
Neste ponto, o resultado é uma matriz cujas colunas são somadas (+ ⌿). Os valores obtidos dessa maneira são verificados para serem os mesmos com ∧ / 2 = /
Vou deixar minha solução antiga aqui também:
toma dimensão como argumento à esquerda, vetor de elementos como argumento à direita, por exemplo:
Pode ser experimentado online aqui: www.tryapl.org
fonte
GolfScript 67 ( demo )
fonte
JavaScript (E6) 194
Usando o prompt para ler a entrada e exibir a saída.
Teste no console com FireFox> 31 (o Array.fill é muito novo)
Menos golfe
fonte
Pitão,
2430 bytesExperimente online aqui .
Edit: corrigido um bug, obrigado a @KevinCruijssen por me informar: o)
fonte
True
quadrados mágicos com números muito grandes ou nem todos únicos. Ou seja,4
e[12,26,23,13,21,15,18,20,17,19,22,16,24,14,11,25]
ou4
e[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
saída ambosTrue
. (Resposta Quase todos os existentes têm o mesmo problema, porém, mas uma vez que eles são postados mais de 4 anos atrás, eu não se preocupou em corrigir seus erros em um comentário.)LUA 186 Chars
fonte
05AB1E , 24 bytes
Formato de entrada:
4\n[2,16,13,3,11,5,8,10,7,9,12,6,14,4,1,15]
. Saídas1
/0
para verdade / falsey, respectivamente.Experimente online ou verifique mais alguns casos de teste .
Explicação:
fonte