Dado (por qualquer meio):
- Um dois-argumento (ou argumento único constituído por uma lista de dois elementos) função caixa preta , (entrada e saída são 1, 2, 3, ...)
f: ℤ+ × ℤ+ → ℤ+
- Uma matriz inteira estritamente positiva com pelo menos duas linhas e duas colunas
retornar o rastreio de função da matriz .
O que é um rastreamento de função ?
Um rastreio de matriz normal é a soma da diagonal principal (canto superior esquerdo para canto inferior direito) de uma matriz:
[[1,2,3],[4,5,6],[7,8,9]]
→ [1,5,9]
→ 1+5+9
→15
Mas, em vez de somar, queremos aplicar f
ao longo da diagonal:
[[1,2,3],[4,5,6],[7,8,9]]
→ [1,5,9]
→ f(f(1,5),9)
ouf(1,f(5,9))
Indique se você usa da esquerda para a direita ou da direita para a esquerda.
A matriz fornecida e todos os valores intermediários serão números inteiros estritamente positivos no domínio inteiro do seu idioma. A matriz pode ser não quadrada.
Exemplos
f(x,y) = xy
, [[1,2,3],[4,5,6],[7,8,9]]
→ 1×5×9
→45
f(x,y) = xy
, [[1,2,3],[4,5,6],[7,8,9]]
→ →159
1
f(x,y) = x-y
, [[4,5,6],[1,2,3]]
→ 4-2
→2
f(x,y) = (x+y)⁄2
, [[2,3,4],[5,6,7],[8,9,10]]
→ 5
ou7
f(x,y) = x+2y
, [[1,2,3],[4,5,6],[7,8,9]]
→ 47
ou29
f(x,y) = max(x,y)
, [[1,2,3],[4,5,6],[7,8,9]]
→ max(1,5,9)
→9
f(x,y) = 2x
, [[1,2,3],[4,5,6],[7,8,9]]
→ 2
ou4
f(x,y) = lcm(x,y)
, [[2,2,2],[2,2,3],[2,3,3],[4,4,4]]
→ lcm(2,2,3)
→6
[[2,2,2],[2,2,3],[2,3,3],[4,4,4]]
?[2,2,3]
Respostas:
R ,
4030 bytesExperimente online!
Verifique os casos de teste.
Percorre a diagonal, portanto, da esquerda para a direita. Para operadores aritméticos, você pode usar
"+"
ou dar backticks aos operadores (+,*,-,%/%,^,%%
)Bem direto:
Reduce
R é equivalente a afold
, ea diagonal de uma matriz são aqueles elementosa_ij
ondei==j
, ie, onde os índicesrow
ecol
umn são os mesmos.diag
tem o comportamento apropriado para matrizes não quadradas.fonte
Haskell , 39 bytes
Obrigado @Laikoni por me ajudar a corrigir a solução anteriormente inválida!
Associados à esquerda, experimente online! (substitua
foldl1
porfoldr1
por associativo à direita)fonte
foldl1 f$zipWith(!!)m[0..]
?Mathematica , 16 bytes
-1 byte graças a Martin Ender.
Experimente online!
Solução alternativa, 17 bytes
Experimente online!
fonte
@*{}
sintaxe não faz muito sentido (você provavelmente quis dizer@*List
), mas o fato de funcionar de qualquer maneira é bem legal. De fato, isso significa que você pode substituir o{}
por a0
e salvar um byte.List
primeiro, mas tentei{}
apenas por isso e fiquei extremamente surpreso que funcionou. Faz sentido, mas como0
funciona? o0{}
. Você está usando atualmente{}
como uma função (ou na verdade como uma "cabeça" usando a terminologia do Mathematica). Se você usasse um genéricof
lá, obteriaf[1,2,3]
(se essa for a diagonal). Mas com{}
você{}[1,2,3]
. Essa é uma expressão completamente sem sentido, mas as cabeças podem ser expressões arbitrárias e, se o Mathematica não sabe o que fazer com elas, apenas as deixa como estão. A maioria das funções de manipulação de lista do Mathematica realmente funciona com expressões com uma cabeça arbitrária e, no caso deFold
, a cabeça é apenas ignorada. [a confirmar]0
como cabeça, o que dá o0[1,2,3]
que ainda não tem sentido, mas funciona da mesma forma.Oitava ,
615753 bytesExperimente online!
Define uma função
g
que recebe um identificador de funçãof
e matrizm
. Na primeira iteração,m(1)
retorna o elemento da matriz superior esquerdo; depois disso, apenas retornam
.fonte
Limpo , 56 bytes
Experimente online! Dobras da direita para a esquerda.
[t\\[_:t]<-r]
é o mesmo quemap tl r
, mas não precisaimport StdEnv
.fonte
StdEnv
Haskell ,
474542 bytesExperimente online! Define uma função
(%)
que assume uma função e uma matriz como uma lista de listas como entrada.A função é dobras da direita para a esquerda:
Edit: -2 bytes graças ao BMO e -3 bytes graças ao Zgarb !
fonte
$
e simplificando o condicional com*>
.*>
!APL (Dyalog Unicode) , 7 bytes ( SBCS de Adám )
Experimente online!
-3 graças a uma sugestão de converter isso em um programa completo da Adám .
Direita para esquerda.
fonte
Haskell , 44 bytes
Experimente online!
fonte
ML padrão (MLton) , 59 bytes
Experimente online! Dobras da direita para a esquerda.
Ungolfed:
Experimente online!
fonte
Python 2 , 61 bytes
Experimente online!
Isso funciona da esquerda para a direita.
fonte
(x+y)⁄2
ex+2y
JavaScript (ES6),
5856 bytesDobras da esquerda para a direita. Editar: salvou 2 bytes usando o fato de que a matriz é estritamente positiva. Solução alternativa, também 56 bytes:
fonte
1/
e você pode economizar mais 2 bytes movendo algumas coisas em torno de:f=>a=>(h=r=>(e=a[++i]&&a[i][i])?h(f(r,e)):r)(a[i=0][0])
. TIOf,
) da primeira versão?f,
quando ligarg
novamente.JavaScript, 46 bytes
Graças a @Shaggy, use bit a bit ou salve um byte. Isso é mágico.
Mostrar snippet de código
fonte
Java 8,
888170 bytesDobras
[[1,2,3],[4,5,6],[7,8,9]]
paraf(f(1,5),9)
.-7 bytes indiretamente, graças a @KamilDrakari , usando um truque semelhante ao usado em sua resposta C # : em vez de ter um limite máximo para o loop com base nas linhas / colunas, simplesmente tente pegar o
ArrayIndexOutOfBoundsException
.-11 bytes substituindo
catch(Exception e)
porfinally
.Experimente online.
Resposta antiga de 88 bytes:
Experimente online.
Explicação:
Formato de entrada da caixa preta:
Supõe que uma função nomeada
int f(int x,int y)
esteja presente, o que é permitido de acordo com esta meta resposta .Eu tenho uma classe abstrata
Test
contendo a função padrãof(x,y)
, bem como a lambda acima:Para os casos de teste, substituo essa função
f
. Por exemplo, o primeiro caso de teste é chamado assim:fonte
Anexo , 14 bytes
Experimente online! Defina como
f
e chame comof[function, array]
.Explicação
Este é um garfo de duas funções:
Fold
e/Diagonal
. Isso, para argumentosf
ea
, é equivalente a:/
, quando aplicado monadicamente a uma função, retorna uma função aplicada ao seu último argumento. Portanto, isso é equivalente a:Isso dobra a função
f
sobre a diagonal principal dea
.fonte
AWK , 77 bytes
Experimente online!
Fiquei curioso para saber se
AWK
poderia fazer programação funcional. Eu acho que isso conta.A "Matriz" é definida como uma matriz associativa padrão, com campos extras
M[1]=#rows
eM[2]=#columns
. O nome da função é passado como uma sequência que é avaliada através da@F(...)
sintaxe. A avaliação é realizada da esquerda para a direita. Or
parâmetro é um espaço reservado para evitar a substituição de umar
variável existente e para evitar a necessidade de reinicializar para cada chamada. Geralmente, é adicionado espaço extra para designar esses espaços reservadosAWK
, mas esse é um código de golfe, portanto, cada byte conta. :)O link TIO implementa todos os casos de teste.
fonte
05AB1E ,
1510 bytesDobras da direita para a esquerda
Salva 5 bytes usando um novo built-in, como sugerido por Kevin Cruijssen
Explicação
Funciona da mesma forma que a versão antiga, exceto que
Å\
é um novo built-in para empurrar a diagonal principal.Experimente online! ou como um conjunto de testes
Versão antiga
Experimente online! ou como um conjunto de testes
Explicação
fonte
¬g£vyNè}[
pode serÅ\`[
agora, economizando 5 bytes.Casca , 7 bytes
Obrigado @Zgarb por corrigir meu envio!
Associados à esquerda, Experimente online! (para uma versão associativa correta, basta substituir
Ḟ
porF
)Explicação
Infelizmente, não há uma maneira fácil de obter a diagonal de uma matriz; portanto, a maioria dos bytes é para isso:
fonte
SNOBOL4 (CSNOBOL4) , 86 bytes
Experimente online!
Define uma função
T
(paraTRACE
) que recebe umaARRAY
e uma sequênciaF
que é o nome de uma função. Dobras da esquerda para a direita.Usar referência indireta (
$
) não funciona com funções. Portanto, usarEVAL
e passar uma string para o nome parece ser a única maneira de obter uma função de caixa preta no SNOBOL.Além disso, é bastante doloroso definir matrizes; no entanto, como as referências de matriz inválidas causam
FAILURE
, isso funciona para matrizes não quadradas - seI
estiver fora dos limites em qualquer dimensão, issoF(RETURN)
força a função a retornar.Editar:
Possivelmente, com base neste meta post , posso assumir que a função de caixa preta
F
está definida sob o nomeF
, o que diminuiria para 75 bytes (remova o uso deEVAL
e,F
na definição de função). No entanto, prefiro esta versão, pois está mais próxima de passar uma referência a uma função.fonte
C, 76 bytes
Esquerda para a direita.
Experimente online!
fonte
tinylisp , 79 bytes
A última linha é uma função lambda sem nome que pega uma função e uma matriz e retorna o rastreamento da matriz. O traço é associativo à esquerda (ie
f(f(1,5),9)
). Experimente online!Ungolfed
Definimos uma função auxiliar para calcular a diagonal; então
generalized-trace
é apenas um pequeno invólucro em torno da função da bibliotecafoldl
.Ao calcular a diagonal recursivamente, verificamos se
(head matrix)
é verdade. Se a matriz estiver fora de linhas, será a lista vazia (nil) ehead
nil é nil - falsey. Ou, se a matriz estiver sem colunas, sua primeira linha (cabeçalho) será a lista vazia (zero) - falsey. Caso contrário, haverá uma primeira linha não vazia, que é verdadeira.Portanto, se a primeira linha não existir ou estiver vazia, retornaremos nulo. Caso contrário, se houver uma primeira linha não vazia, pegamos
(head (head matrix))
- o primeiro elemento da primeira linha - econs
o adicionamos ao resultado da chamada recursiva. O argumento para a chamada recursiva é(map tail (tail matrix))
- ou seja, pega todas as linhas, exceto a primeira, e pega todos, exceto o primeiro elemento de cada linha.fonte
Pari / GP , 42 bytes
Experimente online!
fonte
C # (Compilador Visual C #) ,
726960 bytesExperimente online!
try/catch
permite que a diagonal seja alcançada corretamente, basta avançar e terminar quando estiver fora dos limites.3 bytes salvos porque, como apontado por Kevin Cruijssen, pode-se supor que as funções de caixa preta existam sob um nome específico .
9 bytes salvos retornando através da modificação de um argumento .
Assim, a função é chamada armazenando a função desejada sob o nome
f
, chamandotrace(matrix)
, e o resultado é armazenado emmatrix[0][0]
.Como alternativa, se você realmente gosta de verbosidade,
C # (Compilador Visual C #) ,
97 + 13 = 1107869 bytesExperimente online!
32 bytes salvos usando uma função predefinida, porque não tomar a função como parâmetro permitiu remover a
System
importação e oFunc
tipo genérico longo .fonte
catch(Exception e)
vez decatch
. :) EDIT: Ah, consegui substituir ocatch(Exception e)
porfinally
para economizar mais bytes. Obrigado novamente. +1 de mim.finally
paracatch(Exception e)
, porque não vou mais voltar para dentro do finalmente. Entãom->{try{for(int i=1;;m[0][0]=f(m[0][0],m[i][i++]));}catch(Exception e){}}
(73 bytes) é, infelizmente, mais para mim em comparação com a minha resposta atualm->{int r=m[0][0],i=1;try{for(;;)r=f(r,m[i][i++]);}finally{return r;}}
(70 bytes) Mas na verdade, uma boa maneira de economizar bytes na sua resposta! :) Pena que só posso marcar sua resposta com +1 uma vez.JavaScript,
61575652504442 bytesReduz da esquerda para a direita. Assume que a função está atribuída à variável
f
, conforme esta meta post que me foi trazida à atenção pelo Sr. Xcoder e totalmente humano. Não posso dizer que concordo com ele, pois contradiz diretamente o nosso consenso existente de que não podemos assumir que a entrada seja atribuída a uma variável predefinida, mas utilizarei os poucos bytes salvos por enquanto.Casos de teste
fonte
NARS APL, 20 bytes, 10 caracteres
teste:
fonte
Geléia , 5 bytes
Esquerda para a direita.
Experimente online!
Isenção de responsabilidade: não sei se esse é um método de entrada aceitável para funções de caixa preta. Isso pressupõe que a função é implementada no link acima e, portanto, é "nomeada" (ou seja, é possível chamar)
ç
, mas, caso contrário, não tenho como atribuí-laç
. Se alguém tiver mais experiência com as funções da caixa preta do Jelly +, agradeceria a opinião. Depois de passar algum tempo no bate-papo, descobrimos que o usoç
poderia ser realmente válido.fonte
Clojure, 30 bytes
Reduz "da esquerda".
fonte
Ruby ,
5553 bytesExperimente online!
fonte