Inspirado por isso
No desafio vinculado, somos solicitados a aplicar adição aos elementos do original e o inverso da matriz de entrada. Neste desafio, tornaremos um pouco mais difícil, apresentando as outras operações matemáticas básicas.
Dada uma matriz de números inteiros, percorra +, *, -, //, %, ^
, onde //
é a divisão inteira e ^
é expoente, enquanto a aplica no reverso da matriz. Ou, em outras palavras, aplique uma das funções acima a cada elemento de uma matriz, com o segundo argumento sendo o inverso da matriz, com a função aplicada percorrendo a lista acima. Isso ainda pode ser confuso, então vamos trabalhar com um exemplo.
Input: [1, 2, 3, 4, 5, 6, 7, 8, 9]
Reverse: [9, 8, 7, 6, 5, 4, 3, 2, 1]
[ 1, 2, 3, 4, 5, 6, 7, 8, 9]
Operand: + * - / % ^ + * -
[ 9, 8, 7, 6, 5, 4, 3, 2, 1]
Result: [10, 16, -4, 0, 0, 1296, 10, 16, 8]
então a saída para [1, 2, 3, 4, 5, 6, 7, 8, 9]
seria[10, 16, -4, 0, 0, 1296, 10, 16, 8]
Para cobrir os casos de canto, a entrada nunca conterá um 0, mas pode conter qualquer outro número inteiro no intervalo de infinito negativo a infinito positivo. Você pode receber a entrada como uma lista de cadeias que representam dígitos, se desejar.
Casos de teste
input => output
[1, 2, 3, 4, 5, 6, 7, 8, 9] => [10, 16, -4, 0, 0, 1296, 10, 16, 8]
[5, 3, 6, 1, 1] => [6, 3, 0, 0, 1]
[2, 1, 8] => [10, 1, 6]
[11, 4, -17, 15, 2, 361, 5, 28] => [39, 20, -378, 7, 2, 3.32948887119979e-44, 9, 308]
Este é um código-golfe, pelo que o código mais curto (em bytes) vence!
fonte
Respostas:
Gelatina, 10 bytes ( bifurcação )
Eu estava trabalhando na implementação de um rápido para isso outro dia, então é bastante surpreendente ver um uso para ele tão cedo. Ele ainda existe apenas como um fork, portanto você não pode experimentá-lo online.
Saída de amostra
Explicação
fonte
ƭ
a nilads apoio (substituir valor) e monads (aplicar no argumento esquerda) bem2 1”q3ƭ€
de[7,4,9,0]
devoluções[2, 1, 'q', 2]
Casca , 16 bytes
Esse desafio favorece idiomas que podem criar listas infinitas de funções.Talvez não,eval
FTWExperimente online!
Quão?
Solução alternativa de 17 bytes:
fonte
ë+*-÷%^
? Por que oe
necessário?ë
leva 4 argumentos,e
leva 2. Não há um para 605AB1E , 18 bytes
Experimente online!
Explicação
fonte
Ig∍
se você quiser usar o comando "newish" (não viu muito∍
aqui).Utilitários Bash + GNU, 53
Este script usa um nome de arquivo como um parâmetro de linha de comando.
Experimente online .
O bom aqui é que
paste -d
permite uma lista de separadores, que são usados ciclicamente. O resto é apenas colocar a entrada no formato certo para fazer isso.fonte
Gelatina , 15 bytes
Experimente online! ou veja a suíte de testes .
Quão?
fonte
ż“+×_:%*”;"ṚV
ż“+×_:%*”ṁ$;"ṚV
que também é de 15 bytes.Python 2 , 67 bytes
-3 bytes graças a ovs.
Experimente online!
Python 2 , 95 bytes
Experimente online!
eval
é mau ... mas talvez mais golfista. : Pfonte
JavaScript (ES7),
6867 bytesMostrar snippet de código
fonte
o
parênteses.pop()
para salvar alguns bytes.o
também é usada como condição do operador ternário. Isso quebraria esse esquema.Perl 6 ,
6766 bytesGuardou 1 byte graças a @nwellnhof.
Experimente online!
Solução muito sem imaginação (e provavelmente ruim). Fecha o argumento invertido. A lista resultante é então mapeada com o bloco que
EVAL
é a stringa (operator) b
. O operador é escolhido na lista de strings<+ * - div % **>
usando a variável freestate
(pensestatic
em C - o valor persiste nas chamadas do bloco)$
. Isso é criado para cada bloco separadamente e definido como 0. Você pode fazer o que quiser com ele, mas pode fazer referência apenas uma vez (cada ocorrência de$
refere-se a outra variável, na verdade). Então,$++%6
na verdade, é 0 durante a primeira chamada, 1 durante a segunda, ... 5 durante a 6ª, 0 durante a 7ª e assim por diante.Eu primeiro tentei fazer sem um
EVAL
. Os operadores são de fato apenas subs (= funções), mas seus nomes são tão extremamente não-voláteis (&infix:<+>
e assim por diante) que eu tive que renunciar a essa abordagem.fonte
map {EVAL ".[0] ... .[1]"},zip $_,.reverse
é 1 byte mais curto.Haskell ,
74117105 bytesExperimente online!
Guardado 12 bytes graças a @nimi
Certamente, há uma maneira melhor de conseguir isso.
EDIT 1. Expoente fixo para números inteiros; 2. Definitivamente, existe uma maneira melhor, veja o comentário abaixo:
9591 bytesExperimente online!
fonte
zipWith3($)(cycle[(+),(*),(-),div,mod,(^)])<*>reverse
É uma versão mais curta e agora excluída.h
na chamada deo
:o a b
e sem isso você pode integrarh
( TIO ).Python 2 , 71 bytes
Experimente online!
Economizou 2 bytes graças a ovs!
fonte
J,
44bytes 42Riscado 44, yada yada ...
-2 bytes graças a @ ConorO'Brien
Experimente online!
Tantas parênteses e inserções ... Certamente, há uma maneira melhor de fazer isso (talvez usando a inserção em vez do infix?)
Explicação
Algumas notas:
J não tem divisão inteira, então compomos
%
-division com -floor>.
. O mod (|
) de J faz a ordem inversa do que esperávamos, portanto, temos que inverter sua ordem usando~
-reflexive.Mesmo nos movendo sobre os intervalos de 2, temos que usar
/
-insert para inserir os verbos para que eles sejam usados diariamente, pois é assim que o\
-infix funciona.fonte
()
e repetiu/
- Eu não era capaz de descobrir isso ..../
uma matriz invertida (uma vez que opera de trás para a frente ...) com verbos como,(,+)`(,*)
mas isso não ajuda muito ... (também não funciona)+/`(*/)`...
Ruby ,
6357 bytesNada extravagante, realmente. Apenas itere na matriz, use um índice como iterador reverso, junte-se a uma string usando o operador certo, avalie, enxágue e repita.
Experimente online!
fonte
k , 40 bytes
Experimente online!
fonte
MATL ,
2723 bytes-4 bytes graças a @LuisMendo
Experimente online!
Explicação:
fonte
Perl 5 , 68 + 1 (-p) = 69 bytes
Experimente online!
Aceita entrada como lista de números separados por espaço.
fonte
R , 74 bytes
Experimente online!
Esta é a resposta final que eu vim. Retorna uma lista de comprimento em
length(l)
que cada elemento é uma lista que contém o elemento correspondente. Meio ruim, mas estão todos lá. Se isso é inaceitável, qualquer um dosMap
pode ser substituído pormapply
por +3 bytes.Como os operadores R são todas funções (a notação infix sendo apenas açúcar sintático), tentei selecionar uma em uma lista; por exemplo, a solução de 94 bytes abaixo.
Para tentar me livrar do loop, tentei
sapply
, mas isso só funciona com uma única função e lista de entradas. Lembrei-me então da forma multivariadamapply
, que assume uman-ary
funçãoFUN
en
os argumentos seguintes, aplicandoFUN
ao primeiro, segundo, ..., elementos de cada um dos argumentos, reciclando se necessário . Há também uma função de invólucro paramapply
,Map
que "não faz nenhuma tentativa para simplificar o resultado" . Como é três bytes mais curto, é uma boa oportunidade de golfe.Então, eu defini uma função trinária (como na solução de 80 bytes abaixo) que assume uma função como seu primeiro argumento e a aplica ao seu segundo e terceiro. No entanto, percebi que
Map
é uma função que assume uma função como seu primeiro argumento e a aplica a sucessivas. Arrumado!Por fim, fazemos um subconjunto no final para garantir que retornemos apenas os primeiros
length(l)
valores.R , 80 bytes
Experimente online!
Este não funciona, pois retornará 6 valores para listas com menos de 6 elementos.
R , 94 bytes
Experimente online!
Explicação (levemente não destruída):
Como cada uma das funções é vetorizada, podemos indexar no final (
res[i]
). Isso é melhor que oeval
abordagem abaixo.R , 100 bytes
Experimente online!
Essa é a
eval
abordagem mais curta que pude encontrar; porque temos de recolher os resultados em um vetor, é precisopaste
umc( )
em torno de toda a expressão, o que acrescenta uma tonelada de bytes desnecessáriosfonte
Casio-Basic, 108 bytes
Isso foi doloroso. Especialmente porque
mod(x,y)
retornax
quando realmente não deveria, o que significava que eu tinha que fazer minha própria função de mod: daí ox-int(x/y)y
.Loops
i
de 0 alength(l)-1
, pegando elementos sucessivos nao
lista e aplicandol[i]
parax
el[-i]
paray
. (índices negativos não funcionam, então eu subtraioi
o comprimento da lista e pego esse índice.)107 bytes para a função, +1 byte para adicionar
l
na caixa de parâmetros.fonte
Java 8, 336 bytes
Experimente aqui.
Suspiro ..
Entrada como
int[]
, saída comojava.math.BigInteger[]
.Sem a regra " Para cobrir os casos de canto, a entrada nunca conterá um 0, mas pode conter qualquer outro número inteiro no intervalo de infinito negativo a infinito positivo. ", Usando números inteiros no intervalo
-2147483648
até2147483647
, seria 186 bytes (entrada comoint[]
, e nenhuma saída porque modifica essa matriz de entrada para salvar bytes):Experimente aqui.
Explicação:
fonte