Somma matrice inversa


34

Il tuo programma dovrebbe prendere un array come input.

La matrice:

  1. Sarà sempre 1 dimensionale
  2. Conterrà solo numeri interi
  3. Può essere vuoto

Il programma dovrebbe invertire l'array e quindi aggiungere gli elementi all'originale, ad esempio:

Ingresso: [1, 2, 3]

Originale: [1, 2, 3]

invertito: [3, 2, 1]

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

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

Produzione: [4, 4, 4]


Casi test:

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

Questo è , vince il codice più breve (in byte)!


J 3 byte. Il programma è t. t =: + |.
Richard Donovan,

@RichardDonovan Nice Answer! Puoi inviare una risposta anziché un commento per favore :)
Noah Cristino,

Risposte:


13

Haskell , 20 byte

5 byte salvati cambiando in un punto libero come suggerito da nimi

zipWith(+)=<<reverse

Provalo online!


4
andare pointfree: zipWith(+)=<<reverse.
nimi,

@nimi Wow, non pensavo di farlo, ma è piuttosto intelligente.
Wheat Wizard

Dove metto l'array? Ho provato gli argomenti e ho inserito TIO
Noah Cristino il

@NoahCristino Ho corretto il TIO. Questa è una funzione senza punti, quindi inserisci semplicemente l'input dopo la funzione, tuttavia Haskell richiede una maincompilazione.
Wheat Wizard

3
@maple_shaft: usiamo =<<dalla monade funzione che è definita come: (=<<) f g x = f (g x) x. Qui, scritto in infisso: (zipWith(+) =<< reverse) x-> zipWith(+) (reverse x) x.
nimi,

11

Gelatina , 2 byte

+U

Provalo online!

o

+Ṛ

Provalo online! (grazie @Mr. Xcoder per il secondo programma)

spiegazione, anche se è piuttosto autoesplicativo

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

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

Per array vuoti [], questo non produce nulla. È corretto. La rappresentazione di Jelly di un elenco vuoto è semplicemente nulla. Nota che la rappresentazione di Jelly di una lista con un singolo elemento è solo l'elemento stesso. Aggiungi ŒṘal codice per vedere la rappresentazione interna Python dell'output.


Ho trovato 2 problemi. 1) Se testato su [9]esso produce 18 invece di [18], e 2) quando testato su di []esso non produce nulla.
Noah Cristino,

@NoahCristino Non è un programma completo e nella risposta c'è già una spiegazione.
Erik the Outgolfer,

Quindi immagino che vada bene, è così che Jelly lo produce
Noah Cristino,

@NoahCristino Sì. Ho aggiunto una parte alla fine della mia risposta in modo da poter mettere quell'atomo alla fine del codice per vedere come Python lo stamperebbe.
HyperNeutrino,

+Ṛfunziona anche.
Mr. Xcoder,

11

JavaScript (ES6), 27 byte

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


Oh, amico, ero quasi arrivato, ma non pensavo di usare l'operatore spread per fare il clone.
Rick Hitchcock,

Puoi aggiungere l'embedded provare per javascript?
Noah Cristino,


9

Python 2, 32 byte

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

Soluzione alternativa senza zip(35 byte):

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

Provalo online!


7

Python 2 , 40 byte

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

Provalo online!

L'altra, la risposta più breve di Python sostituisce una comprensione dell'elenco con map. Vorrei aver pensato di farlo più velocemente. ; -;


1
Supera tutti i miei test!
Noah Cristino,

7

Japt , 7 byte

mÈ+Ug~Y

Provalo online! con il -Qflag per formattare l'array di output.

Spiegazione

Implicito: U= array di input

Mappa l'ingresso con la seguente funzione ...

+Ug

Il valore, più il valore nella matrice di input nell'indice ...

~Y

-(index+1), che ottiene elementi dalla fine dell'array.


1
Buon lavoro! Mi piace la cosa a più ingressi!
Noah Cristino,

1
Mi piace molto l'interprete Japt a input multiplo. Bel lavoro!
Oliver,

È davvero bello :-) Aggiungerei questa funzione all'interprete "ufficiale", ma con il design attuale è in qualche modo inestendibile ...
ETHproductions



6

Python 2 , 33 32 byte

-1 byte grazie a @xnor

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

Provalo online!


Ho superato tutti i test, buon lavoro :)
Noah Cristino,

Che metodo insolito. l*1salva un byte.
xnor

Sto l*1
riscontrando

@dhssa l*1crea una copia dell'elenco l. Se non avessimo creato una copia, pop()elimineremmo gli elementi dall'elenco prima di accedervi nel ciclo for.
Ovs,

Grazie per la spiegazione, l'ho capito ora. buon trucco da sapere per la codifica.
dhssa,


5

C # (.NET Core) , 61 60 byte

-1 byte grazie a TheLethalCoder

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

Provalo online!

Il conteggio dei byte include anche:

using System.Linq;

Per una spiegazione: la funzione Zip in LINQ accetta due raccolte ed esegue una determinata funzione per tutti gli elementi corrispondenti, ad es. entrambi i primi elementi insieme, entrambi i secondi elementi ecc.


1
Buona risposta. Grazie per il commento sull'input.
Noah Cristino,

1
Ciao e benvenuto in PPCG! Non è necessario il punto e virgola finale nel conteggio dei byte. Credo che puoi restituire la raccolta direttamente dalla Zipchiamata a quindi non è necessario per il ToArray(). Bel lavoro!
TheLethalCoder il

@TheLethalCoder Grazie e ho aggiunto ToArray () poiché la sfida riguarda gli array, quindi volevo che il lambda autonomo fosse array -> array.
Grzegorz Puławski,




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!


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


Use rseq instead of reverse.
MattPutnam


3

PowerShell, 26 bytes

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

Try it online!

Takes input as command-line arguments.


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;}

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


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

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

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

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!


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

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])


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

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);

Nice answer! :)
Noah Cristino
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.