Para esse desafio, você deve escrever um programa ou função que produza as diagonais de uma determinada matriz quadrada. No entanto, se você transpõe as linhas e colunas do código-fonte da sua solução, ele deve se tornar um programa ou função que retorna as antidiagonais da matriz. Leia para detalhes ...
Regras
- O código-fonte da sua solução é considerado como uma grade 2D de caracteres, separada por uma nova linha padrão de sua escolha (avanço de linha, retorno de carro ou uma combinação de ambos).
Nenhuma linha no seu código-fonte pode ser maior que a anterior. Aqui estão alguns exemplos de layouts válidos:
### ### ###
######## ####### ### ### #
E aqui está um exemplo de um layout inválido (como a terceira linha é maior que a segunda):
###### #### ##### ###
Suas duas soluções devem ser a transposição uma da outra, ou seja, você deve obter uma da outra trocando linhas e colunas. Aqui estão dois pares válidos:
abc def ghi
adg beh cfi
E
print 10 (~^_^)~ foo bar !
p(fb! r~oa i^or n_ t^ ) 1~ 0
Observe que os espaços são tratados como qualquer outro caractere. Em particular, os espaços finais são significativos, pois podem não ser espaços finais na transposição.
Cada solução deve ser um programa ou função que recebe como entrada uma matriz quadrada não vazia de números inteiros de um dígito. Uma solução deve exibir uma lista de todas as diagonais da matriz e a outra deve exibir uma lista de todas as antidiagonais. Você pode usar quaisquer formatos razoáveis e inequívocos de entrada e saída, mas eles devem ser idênticos entre as duas soluções (isso também significa que eles precisam ser as duas funções ou os dois programas).
- Cada diagonal é executada da parte superior esquerda para a parte inferior direita e deve ser solicitada de cima para baixo.
- Cada antidiagonal é executado da parte inferior esquerda para a parte superior direita e deve ser pedido de cima para baixo.
Pontuação
Para incentivar soluções o mais "quadradas" possível, a pontuação principal é o número de linhas ou o número de colunas da sua solução, o que for maior . Menos é melhor. Os laços são quebrados pelo número de caracteres na solução, sem contar as novas linhas. Novamente, menos é melhor. Exemplo:
abcd
efg
h
Isso e sua transposição teriam uma pontuação primária de 4 (pois existem 4 colunas) e uma pontuação de desempate de 8 (pois existem 8 caracteres que não são de nova linha). Cite os dois valores no cabeçalho da sua resposta.
Casos de teste
A tarefa real realizada pelas duas soluções não deve ser o principal desafio aqui, mas aqui estão dois exemplos para ajudá-lo a testar suas soluções:
Input:
1 2 3
4 5 6
7 8 9
Diagonals:
3
2 6
1 5 9
4 8
7
Antidiagonals:
1
4 2
7 5 3
8 6
9
Input:
1 0 1 0
0 1 0 1
1 0 1 0
0 1 0 1
Diagonals:
0
1 1
0 0 0
1 1 1 1
0 0 0
1 1
0
Antidiagonals:
1
0 0
1 1 1
0 0 0 0
1 1 1
0 0
1
fonte
Respostas:
Javascript, pontuação
2014, (258176 caracteres não-nova linha)e
Exemplo de trecho de código:
e
fonte
<!-- language-all: lang-javascript -->
antes do primeiro bloco de código.MATL , pontuação 10 (100 caracteres que não são de nova linha)
Existem 10 linhas de 10 caracteres (observe os espaços à direita).
O código acima produz as diagonais. Experimente online!
A versão transposta produz as antiagonais. Experimente online!
Explicação
Observe que
%
é um símbolo de comentário, que faz com que o restante da linha seja ignorado.Funções de dois caracteres, como
Xd
não podem ser divididas em umX
ed
em linhas consecutivas.Código original
O código original, linearizado e sem a parte comentada, é
que funciona da seguinte maneira:
Código transposto
O código transposto, linearizado, é
que possui as duas diferenças a seguir em relação ao código original:
T
e&
são trocados. Isso não tem efeito, porqueT
é literal, não é uma função, portanto não intercepta a&
especificação.P!
é adicionado no início.O código adicionado modifica a matriz de entrada para que as diagonais da matriz modificada sejam as antiagonais da entrada:
fonte
Geleia , pontuação 7, 49 bytes que não são de nova linha
Programa de impressão diagonal
Experimente online!
Programa de impressão anti-diagonal
Experimente online!
Resposta mais antiga (saída não ordenada), pontuação 3, 6 bytes que não são de nova linha
Programa de impressão diagonal
Experimente online!
Programa de impressão anti-diagonal
Experimente online!
fonte
Geléia , pontuação 4 (12 caracteres)
pontuações anteriores: 5 (16 caracteres), 4 (16 caracteres)
Original
Experimente online!
Transpor
Experimente online!
fundo
Diagonais
A maneira direta de obter as diagonais (de cima para baixo) de uma matriz quadrada é a seguinte.
Para uma matriz de entrada M ,
ŒD
lista as diagonais de M , começando pela diagonal principal e movendo-se para cima.Para a entrada
isso produz
ṙL
então calcula o comprimento de M comL
e gira as unidades de comprimento de resultado (M) para a esquerda.Para o nosso exemplo, o comprimento é 3 e obtemos
Finalmente,
Ṛ
inverte a ordem das diagonais, retornandopara o nosso exemplo de entrada.
Anti-diagonais
Os mesmos blocos de construção podem ser usados para obter as antiagonais (novamente, de cima para baixo) de uma matriz quadrada.
Para uma matriz de entrada M ,
Ṛ
primeiro inverta a ordem das linhas.Para a entrada
isso produz
Como antes,
ŒDṙL
gera as diagonais (de baixo para cima) do resultado.Para o nosso exemplo, isso retorna
como desejado.
Como funciona
No Jelly, cada linha define um link (função). Em particular, a última linha define o link principal , que é executado quando o programa é iniciado.
Outros links devem ser chamados. Esta resposta usa
ñ
, que executa o link abaixo de forma diádica.ñ
envolve, então, quando é chamado a partir do link principal, ele executa o link na primeira linha.Original
O link principal
pega uma matriz de entrada M , calcula seu comprimento com
L
, depois gira as unidades de comprimento de entrada (M) para a esquerda comṙ
(observe que isso não altera M ) e, finalmente, chama o primeiro link com o resultado ( M ) e comprimento ( M) como argumentos.O primeiro link
calcula as diagonais de M com
ŒD
(como visto na seção anterior), gira as unidades de comprimento do resultado (M) para a esquerda comṙ
e inverte a ordem do resultado comṚ
.O segundo link nunca é chamado.
Transpor
O link principal
pega uma matriz de entrada M e calcula seu inverso com
Ṛ
. Ele calcula o comprimento de M comL
e chama o primeiro link com argumentos reverso (M) e comprimento (M) .O primeiro link
depois calcula as diagonais de reversão (M) com
ŒD
(como visto na seção anterior) e, finalmente, gira as unidades de comprimento do resultado (M) para a esquerda comṙ
.Os links restantes nunca são chamados.
fonte
R, pontuação
14 1311 (9995 caracteres não-nova linha)Obrigado a @ Giuseppe por melhorar a pontuação em 1. Retirei alguns caracteres usando redundâncias nas transposições. Atualmente, a melhor pontuação para um idioma não-golfe!
E transposto:
Experimente online!
fonte
row(m)+col(m)
é mais curto para as antiagonais.Husk ,
794 caracteres, pontuação43Experimente online!
-4 caracteres graças ao BMO .
fonte