Apresentado em homenagem à APL como uma ferramenta interativa que completa 50 anos este ano
fundo
Ken [Iverson] apresentou seu artigo Formalismo em linguagens de programação em agosto de 1963, em uma Conferência de Trabalho sobre Estruturas Mecânicas de Linguagem, Princeton, NJ. (Backus, Caril, Dijkstra, Floyd, Iverson, Newell, Perlis, Wilkes). O artigo também registra a discussão que ocorreu após a apresentação, terminando com uma troca entre Ken e [Edsger] Dijkstra , na qual a resposta de Ken à pergunta de Dijkstra foi uma frase.
Desafio
Como você representaria uma operação mais complexa, por exemplo, a soma de todos os elementos de uma matriz M que são iguais à soma dos índices de linha e coluna correspondentes?
Escreva um trecho ou expressão (sem necessidade de um programa ou função completo) para calcular a soma de cada elemento em uma matriz inteira que é igual à soma de seus índices. Ou, como FryAmTheEggman coloca: dada uma matriz M com elementos a ij retorna a soma de cada a ij onde a ij = i + j.
Você pode assumir que a matriz já está em um local de variável ou memória, ou pode ser aceita como argumento ou entrada. Você pode usar índices baseados em 0 ou 1.
Casos de teste
0
para matriz vazia
2
0
para índices baseados em 0 ou 2
para índices baseados em 1
1 5 2
9 4 2
5 9 6
2
para 0 com base ou 10
para 1 com base
0 3 0 4
0 4 1 4
4 3 1 2
-2 4 -2 -1
11
3 -1 3 3
3 -1 3 1
6
para 0 com base ou 3
para 1 com base
Anedota
A resposta de Iverson foi ++ / ( M = ⍳ ¹ ⨢ ⍳ ) // M , que não é válida na Notação Iverson conforme definida em A Programming Language , nem no que acabou se tornando APL. Em notação Iverson, que teria sido + / ( M = ⍳ ¹ ( μ ( M )) ⨢ ⍳ ¹ ( ν ( M ))) / M . Nas primeiras versões do APL era +/(,M=(⍳1↑⍴M)∘.+⍳1↓⍴M)/,M
.
fonte
Respostas:
APL,
1312 bytes1 byte graças a @ jimmy23013.
1 indexado.
A matriz é armazenada na variável
m
.Experimente online!
Com base na resposta em J , que é uma linguagem baseada no APL.
No TryAPL, para digitar:
+/m`em`c`1+/`1`i`rm
Com a matriz:
+/m`em`c`1+/`1`i`rm `[ 2 4 `r 3 `21 3 3 3 `21 3 1
Explicação
fonte
`
significa "chave APL".+/∊m∩¨+/¨⍳⍴m
.MATL ,
151410 bytesA entrada possui linhas separadas por
;
. Por exemplo:[1 5 2; 9 4 2; 5 9 6]
. A indexação baseada em 1 é usada.Experimente online! Ou verifique todos os casos de teste .
Explicação
Vou usar o exemplo com entrada
[3 -1 3 3; 3 -1 3 1]
na explicação.fonte
JavaScript,
4946 bytesEditar: salvou 3 bytes graças a @MartinEnder, indicando que os snippets são permitidos.
fonte
Retina , 46 bytes
A contagem de bytes assume a codificação ISO 8859-1.
A entrada usa separadores de espaço e avanço de linha para representar a matriz. Os índices são baseados em 0.
Experimente online!
Explicação
Não é exatamente o tipo de desafio para o qual a Retina foi criada, mas está surpreendentemente bem ... :)
Etapa 1: Substituição
Isso simplesmente expande todos os números inteiros na string como números unários usando
1
como dígito unário. Números negativos como-3
simplesmente se tornarão coisas assim-111
.Etapa 2: partida
Devido à
!
opção, isso imprime todas as correspondências do regex especificado. O referido regex usa grupos de balanceamento para verificar se o número atual é igual à soma de seus índices.Para fazer isso, primeiro determinamos a soma dos índices com o lookbehind
(?<=(\S* |.*¶)*)
. Isso adiciona uma captura para cada número na frente do atual na mesma linha (via\S*
), bem como uma captura para cada linha na frente do atual (via.*¶
) para agrupar1
. Portanto, obtemos a soma dos índices com base em zero como resultado.Em seguida, tentamos corresponder o próximo número inteiro enquanto removemos capturas dessa pilha com
(?<-1>1)+\b
. E, então, fazer o jogo falhar se quaisquer capturas são deixados em grupo1
com(?(1)1)
para assegurar a igualdade.Observe que os números negativos nunca são correspondidos, porque o lookbehind não pode passar da
-
frente da lista de1
s e(?<-1>1)+
também não pode corresponder.Isso nos fornece uma lista de todos os números unários que são iguais à soma de seus índices.
Etapa 3: partida
Terminamos com outro estágio de correspondência, mas sem a
!
opção, isso apenas conta o número de correspondências, que soma todos os números unários do resultado anterior e também converte essa soma em decimal.fonte
Geléia,
151410 bytes4 bytes graças a Adnan.
1 indexado.
Experimente online!
Verifique todos os casos de teste de uma só vez. (Ligeiramente modificado.)
fonte
J€
vez deL€R€
?Python 2 -
6057 bytesÉ um trecho de código, portanto, seriam mais alguns bytes se eu realmente retornasse o valor, eu acho.
e=enumerate;sum(i*(x+y==i)for x,r in e(a)for y,i in e(r))
Obrigado pela ajuda Leaky Num :-)
Explicação rápida.
a
é uma matriz contendo números. Basta percorrer os índices e somar todos os valores em que o valor é igual à soma do índice.fonte
e=enumerate;sum(i*(x+y==i)for x,r in e(a)for y,i in e(r))
R, 24 bytes
Baseado em 1.
Casos de teste:
fonte
J, 15 bytes
Usos indexação baseado em zero e assume a matriz já está armazenado na variável M .
Explicação
fonte
CJam,
232120 bytesAgradecemos a Peter Taylor por salvar 3 bytes.
Espera que a matriz esteja na pilha e deixa a soma. Os índices são baseados em zero em ambos os casos.
Teste aqui.
fonte
_,,
vez do interioree
e.
para o loop interno:ee{~_,,@f+1$.=.*~}%1b
ee{~_@f-_,,.=.*~}%1b
k4, 24 bytes
Assume que a matriz está armazenada
m
.Esse é um daqueles quebra-cabeças em que as simplificações envolvidas no projeto de k de APL (e J) realmente doem - k's
!
é equivalente a APLs,⍳
mas só funciona em vetores, então eu mesmo tenho que montar a matriz de índices; produto interno é um caractere em APL, mas cinco em k; e perco três caracteres ao manipular adequadamente a matriz vazia porque k não possui matrizes fortemente tipadas.fonte
Pitão, 14 bytes
Indexado a 0.
Suíte de teste.
fonte
PowerShell v2 +, 43 bytes
Como um trecho. O uso é canalizar explicitamente a matriz para isso (veja exemplos abaixo). Assume que
$i
e$o
é nulo ou zero no início (eu os configurei explicitamente como tal nos exemplos abaixo) e utiliza o índice 0.Faz um loop foreach em cada linha da matriz. Definimos
$j
como0
e depois percorremos cada elemento da linha em outro loop$_|%{...}
. Cada loop interno, incrementamos$o
pelo elemento atual multiplicado por um booleano($_-eq$i+$j++)
, ou seja, se esse booleano for$TRUE
, será o1
contrário0
. Então saímos do loop interno, incrementamos$i
e iniciamos a próxima linha. Finalmente, partimos$o
no oleoduto no final.Exemplos
fonte
Ruby, 63 bytes
Com z como uma matriz bidimensional de números:
Não é nada empolgante.
Se z é uma matriz achatada com x e y com os tamanhos das matrizes, como:
Então temos essa monstruosidade - talvez mais rubi-ish com seus produtos sofisticados e zíperes, mas na verdade maiores:
fonte
Na verdade, 21 bytes
Experimente online!
Agradeço ao Leaky Nun por me fazer parar de ser preguiçoso e finalmente escrever isso.
Isso usa matrizes indexadas a 0 e recebe a entrada como uma lista aninhada.
Explicação:
fonte
Matlab / Octave, 48 bytes
1 indexado.
Não manipulará o primeiro caso de teste porque
[1:0]
, por algum motivo, tem tamanho 1x0Testado na oitava 3.
Programa completo:
fonte
sum((M.*(M-[1:size(M,1)]'-[1:size(M,2)]==0))(:))
. Além disso, acho que você pode alterar==0
e inicial~
para reduzir ainda mais a contagem de bytes. Finalmente, note que você precisa para lidar com todos os casos de teste ou então a questão deve ser excluídaLua, 70 bytes
1 indexado.
Bônus: funciona para matrizes irregulares!
Entrada armazenada
a
, saída armazenada ems
.Programa completo:
fonte
PHP, 59 bytes
espera matriz $ a definida; deve estar vazio ou bidimensional, com indexação 0.
calcula a soma para
inserção de $ s (anteriormente 0 ou indefinido - 0 é igual a NULL)
+2
antes da final)
para o comportamento indexado a 1Feliz aniversário APL!
funções e suíte de testes
fonte
Braquilog , 15 bytes
Experimente online!
fonte
Wolfram Language (Mathematica) , 42 bytes
Experimente online!
1 indexado.
fonte