Soma de matriz inversa

34

Seu programa deve ter uma matriz como entrada.

A matriz:

  1. Sempre será unidimensional
  2. Contém apenas números inteiros
  3. Pode estar vazio

O programa deve reverter a matriz e adicione os elementos ao original, por exemplo:

Entrada: [1, 2, 3]

Original: [1, 2, 3]

Invertida: [3, 2, 1]

[1, 2, 3]
 +  +  +
[3, 2, 1]

[1+3, 2+2, 3+1]

Saída: [4, 4, 4]


Casos de teste:

#In             #Out
[8, 92],        [100, 100]
[1, 2, 3],      [4, 4, 4]
[5, 24, 85, 6], [11, 109, 109, 11]
[],             []
[999],          [1998]

Este é o , o código mais curto (em bytes) vence!

Noah Cristino
fonte
J 3 bytes. Programa é t. t =: + |.
Richard Donovan
@RichardDonovan Nice Answer! Você pode enviar como resposta em vez de um comentário, por favor :)
Noah Cristino

Respostas:

13

Haskell , 20 bytes

Economize 5 bytes mudando para um ponto livre, conforme sugerido por nimi

zipWith(+)=<<reverse

Experimente online!

Assistente de Trigo
fonte
4
ir pointfree: zipWith(+)=<<reverse.
N
@nimi Uau, eu não pensei em fazer isso, mas isso é muito inteligente.
Assistente de trigo
Onde coloco a matriz? Eu tentei argumentos, e participei do TIO
Noah Cristino
@NoahCristino Corrigi o TIO. Esta é uma função sem pontos, portanto, basta inserir a entrada após a função, no entanto, o Haskell exige uma maincompilação.
Assistente de trigo
3
@maple_shaft: usamos =<<da Mônada função que é definido como: (=<<) f g x = f (g x) x. Aqui, escrito em infix: (zipWith(+) =<< reverse) x-> zipWith(+) (reverse x) x.
N
11

Geléia , 2 bytes

+U

Experimente online!

ou

+Ṛ

Experimente online! (obrigado @Mr. Xcoder pelo segundo programa)

explicação, embora seja bastante auto-explicativa

+U  Main link
+   Add, vectorizing, 
 U                    the input, reversed

+Ṛ  Main link
+   Add, vectorizing,
 Ṛ                    the input, reversed, without vectorizing (same thing for depth-1 lists)

Para uma matriz vazia [], isso não gera nada. Está correto. A representação de Jelly de uma lista vazia é simplesmente nada. Observe que a representação de Jelly de uma lista com um único elemento é apenas o próprio elemento. Anexe ŒṘao código para ver a representação interna do Python da saída.

HyperNeutrino
fonte
Encontrei 2 problemas. 1) Quando testado, [9]ele gera 18 em vez de [18]e 2) quando testado [], não produz nada.
Noah Cristino
@NoahCristino Não é um programa completo, e já existe uma explicação para isso na resposta.
Erik the Outgolfer
Então eu acho que isso é bom, é apenas como Jelly saídas lo
Noah Cristino
@NoahCristino Yeah. Adicionei uma parte ao final da minha resposta para que você possa colocar esse átomo no final do código para ver como o Python o imprimiria.
HyperNeutrino
+Ṛfunciona também
Mr. Xcoder
11

JavaScript (ES6), 27 bytes

a=>[...a].map(e=>e+a.pop())

Neil
fonte
Ah, cara, eu estava quase lá, mas não pensei em usar o operador de propagação para fazer o clone.
Rick Hitchcock
Você pode adicionar o incorporado experimentá-lo para javascript?
Noah Cristino
9

05AB1E , 2 bytes

Â+

Experimente online!

Erik, o Outgolfer
fonte
Passou em todos os meus testes!
Noah Cristino
R+também funciona para 2 bytes.
Riley
9

Python 2, 32 bytes

lambda l:map(sum,zip(l,l[::-1]))

Solução alternativa sem zip(35 bytes):

lambda l:map(int.__add__,l,l[::-1])

Experimente online!

vaultah
fonte
7

Python 2 , 40 bytes

lambda l:[i+j for i,j in zip(l,l[::-1])]

Experimente online!

A outra resposta Python mais curta substitui a compreensão da lista map. Gostaria de ter pensado em fazer isso mais rápido. ; -;

totalmente humano
fonte
1
Passa em todos os meus testes!
Noah Cristino
7

Japonês , 7 bytes

mÈ+Ug~Y

Experimente online! com o -Qsinalizador para formatar a matriz de saída.

Explicação

Implícito: U= matriz de entrada

Mapeie a entrada pela seguinte função ...

+Ug

O valor, mais o valor na matriz de entrada no índice ...

~Y

-(index+1), que obtém elementos do final da matriz.

Justin Mariner
fonte
1
Bom trabalho! Eu gosto da coisa de entrada múltipla!
Noah Cristino
1
I really like the multiple-input Japt interpreter. Nice job!
Oliver
That's really cool :-) I'd add that feature to the "official" interpreter, but with the current design it's sorta unextendable...
ETHproductions
7

Ruby, 25 bytes

->a{[*a].map{|i|i+a.pop}}

Try it online!

Ventero
fonte
6

Python 2, 33 32 bytes

-1 byte thanks to @xnor

lambda l:[i+l.pop()for i in l*1]

Try it online!

ovs
fonte
Passed all my tests good job :)
Noah Cristino
What an unusual method. l*1 saves a byte.
xnor
I am having difficulties understanding the par l*1, any elaboration
dhssa
@dhssa l*1 makes a copy of the list l. If we would not make a copy, pop() would delete elements from the list before they were accessed in the for loop.
ovs
Thanks for the explanation, I got it now. good trick to know for coding.
dhssa
5

C# (.NET Core), 61 60 bytes

-1 byte thanks to TheLethalCoder

a=>a.Reverse().Zip(a,(x,y)=>x+y).ToArray()

Try it online!

Byte count also includes:

using System.Linq;

For explanation - Zip function in LINQ takes two collections and executes given function for all corresponding elements, ie. both first elements together, both second elements etc.

Grzegorz Puławski
fonte
1
Good answer. Thanks for the comment about the input.
Noah Cristino
1
Hello and welcome to PPCG! You don't need the trailing semi colon in the byte count. I believe you can return the collection straight from the Zip call to so no need for the ToArray(). Nice job!
TheLethalCoder
@TheLethalCoder Thanks, and I added ToArray() since the challenge is about arrays, so I wanted the self-contained lambda to be array -> array.
Grzegorz Puławski
4

CJam, 7 bytes

{_W%.+}

Try it online!

Erik the Outgolfer
fonte
It outputs "" for [], that's weird. Not your fault just the language.
Noah Cristino
@NoahCristino That's CJam's representation of [].
Erik the Outgolfer
Yup, it's hard to have a standard output for my challenge since many languages display arrays differently especially [], and [4], so it's fine.
Noah Cristino
4

APL (Dyalog), 3 bytes

⌽+⊢

Try it online!

Explanation

          The argument reversed
+           Plus
          The argument
Kritixi Lithos
fonte
1
ninja'd. I need to move to an APL keyboard... xD
Uriel
@Uriel I am always on my APL keyboard :D
Kritixi Lithos
Love the simplicity. It outputs ⌽+⊢ with no input
Noah Cristino
@NoahCristino An empty input is specified with , the empty vector. With no argument, it prints the train by itself
Kritixi Lithos
4

R, 17 16 bytes

-1 byte thanks to djhurio

rev(l<-scan())+l

Reads from stdin; returns the vector; numeric(0) is the zero-length numeric vector for the empty list.

Try it online!

Giuseppe
fonte
For an empty "array" it returns numeric(0)
Noah Cristino
1
@NoahCristino an empty vector is represented as numeric(0) in R.
Leaky Nun
That's fine. @LeakyNun
Noah Cristino
1
rev(l<-scan())+l, 16 bytes?
djhurio
For the record, an R+pryr functional alternative is just one byte longer: pryr::f(rev(x)+x)
JayCe
4

Clojure, 20 17 bytes

3 bytes saved thanks to @MattPutnam

#(map +(rseq %)%)

Seems to be quite competitive with non-golfing languages.

See it online

cliffroot
fonte
Use rseq instead of reverse.
MattPutnam
3

Pyth, 3 bytes

+V_

Try it here.

Erik the Outgolfer
fonte
Yay passes all my tests!
Noah Cristino
Equivalent: sV_
Mr. Xcoder
@Mr.Xcoder nevermind
Erik the Outgolfer
3

PowerShell, 26 bytes

($a=$args)|%{+$a[--$i]+$_}

Try it online!

Takes input as command-line arguments.

Joey
fonte
Can you add a TIO? and a link under the name like this one: codegolf.stackexchange.com/a/135427/61877
Noah Cristino
@NoahCristino: Like this? Haven't used that thing so far, so no idea what I may have done wrong. By the way, if you expect people to use a certain service in their answers, then please state so in the task description.
Joey
That's fine. It's not required it just makes the answers more high quality, and easier to test out for future viewers.
Noah Cristino
3

C, 49 bytes

f(a,n,b)int*a,*b;{for(b=a+n;a<b--;a++)*a=*b+=*a;}
orlp
fonte
Shouldn't a,n,b be a,b,n or something?
Erik the Outgolfer
@EriktheOutgolfer No, b isn't a parameter for the function, just an extra definition stuffed in there for golfing reasons. a must be a pointer to integers, and n must be how many integers there are in the array.
orlp
Could you please add a TIO link?
Noah Cristino
3

PowerShell, 40 32 bytes

($n=$args)|%{$n[-++$i]+$n[$i-1]}

Try it online!

Takes input as individual command-line arguments, which is allowed as one of the native list format for PowerShell. Then loops through each element (i.e., a shorter way of looping through the indices), adding the element counting from the back (-1 indexed) to the current element (0 indexed, hence the decrement -1). Those are left on the pipeline and output is implicit.

Saved 8 bytes thanks to @briantist

AdmBorkBork
fonte
it doesn't output an array.
Noah Cristino
1
@NoahCristino PowerShell input/output is, in general, weird. It is outputting as an array, it's just there's nothing capturing said array, and so when the implicit Write-Output happens, it puts things on stdout one item per line. For example, you can see here that, when captured, the object is indeed an array type.
AdmBorkBork
Good enough then :) atleast it tried
Noah Cristino
I'm on mobile and can't test so easily, but isn't it 1 byte shorter to remove the param and then replace 1..$n with 1..($n=$args)?
briantist
@briantist Not quite, but you did give me a different way of thinking about it, saving a bunch of bytes. Thanks!
AdmBorkBork
3

Java 8, 61 57 56 53 bytes

a->{for(int l=0,r=a.length;l<r;a[l]=a[--r]+=a[l++]);}

-1 byte and bug-fixed thanks to @Nevay.
-3 bytes thanks to @OliverGrégoire.

(It was a port of (and golfed by 4 8 bytes) of @jkelm's C# answer, but now it's a different shorter solution thanks to @OliverGrégoire.)

Explanation:

Try it here.

The method modifies the input-array to save bytes, so no need for a return-type.

a->{                    // Method with integer-array parameter and no return-type
  for(int l=0,          //  Left-integer (starting at 0)
          r=a.length;   //  Right-integer (starting at the length of the input-array)
      l<r;              //  Loop as long as left is smaller than right
    a[l]=               //   Change the number at the current left index to:
         a[--r]+=a[l++] //    The number at the right index + itself
                        //    (The += adds the number at the left index also to the right index)
                        //    (And the --/++ increases/decreases the indexes by 1,
                        //     until we've reached the middle of the array)
  );                    //  End of loop
}                       // End of method
Kevin Cruijssen
fonte
1
You can save 1 byte by using a->{for(int i=0,l=a.length;i<l/2;a[i]=a[l+~i]+=a[i++]);}.
Nevay
1
Besides that the code fails for arrays with an odd length 1,2,3 (returns 4,2,4 instead of 4,4,4), the loop has to run as long as 2*i<l, not i<l/2.
Nevay
@Nevay Thanks. I knew it should be possible to golf l-i-1, just couldn't come up with it..
Kevin Cruijssen
2
53 bytes: a->{for(int l=0,r=a.length;l<r;a[l]=a[--r]+=a[l++]);}.
Olivier Grégoire
1
@OlivierGrégoire Thanks. And your l and r makes sense for your implementation, so I've used those as well (and added an explanation).
Kevin Cruijssen
2

Ohm, 3 bytes

DR+

Try it online!

totallyhuman
fonte
It outputs floats, but I never said it couldn't, so that's fine, and for [] it doesn't output anything but that's just the language.
Noah Cristino
2

Actually, 4 bytes

;R♀+

Try it online!

Erik the Outgolfer
fonte
Perfect, great job.
Noah Cristino
Erik, solving my problem in like 7 languages xD
Noah Cristino
@NoahCristino Yeah I'm trying to keep it under 15...;)
Erik the Outgolfer
I'm going to have to start adding a -1 for every submission xD
Noah Cristino
2

anyfix, 3 bytes

"U+

The version on TryItOnline! is an outdated version of anyfix, which contains a few fatal errors such as not being able to add lists because of typos in the source code. Use the code on GitHub instead.

"U+  Program
"    Duplicate top of stack
 U   Reverse top of stack if it is a list (which it should be...)
  +  Add, vectorizing for lists
HyperNeutrino
fonte
2

Neim, 2 bytes

This is a function that takes input on the top of the stack and outputs on the top of the stack.

𝕓𝔻

Try it online!

Okx
fonte
Is it allowed to modify the input stack via actual Neim code instead of normal input methods?
LiefdeWen
@LiefdeWen Yes, that's allowed in the defaults for I/O meta post.
Okx
2

Röda, 22 bytes

{reverse(_)<>_1|[_+_]}

Try it online!

This is an anonymous function that takes in an array and returns a stream of values, which the TIO link outputs separated over newlines.

Explanation

reverse(_)          The array reversed
<>                  interleaved with
_1                  the array itself
                    Push each element to the stream
[_+_]               Pull two values and push their sum
Kritixi Lithos
fonte
Passes my tests! Great answer.
Noah Cristino
2

JavaScript (ES6), 34 33 bytes

Saved a byte thanks to @ETHproductions.

a=>a.map((e,i)=>e+a[a.length+~i])

Rick Hitchcock
fonte
I love how you put in the test cases, +2
Noah Cristino
I think you can save a byte by changing -i-1 to +~i.
ETHproductions
@ETHproductions, yes, thanks!
Rick Hitchcock
2

MATL, 3 bytes

tP+

Try it online!

Extremely straightforward. t duplicates the input. P flips (reverses) it, and + adds the two arrays element wise.

DJMcMayhem
fonte
2

PHP, 59 bytes

for(;a&$c=$argv[++$i];)$a[]=$c+$argv[$argc-$i];print_r($a);

takes input from command line arguments; empty output for empty input

Yields a warning in PHP>7.0. This version does not (60 bytes):

for(;++$i<$argc;)$a[]=$argv[$i]+$argv[$argc-$i];print_r($a);
Titus
fonte
Nice answer! :)
Noah Cristino