Suma de matriz inversa


34

Su programa debe tomar una matriz como entrada.

La matriz:

  1. Siempre será 1 dimensional
  2. Solo contendrá enteros
  3. Puede estar vacío

El programa debe revertir la matriz y luego agregar los elementos al original, por ejemplo:

Entrada: [1, 2, 3]

Original: [1, 2, 3]

Invertido: [3, 2, 1]

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

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

Salida: [4, 4, 4]


Casos de prueba:

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

Este es el , gana el código más corto (en bytes).


J 3 bytes. El programa es t. t =: + |.
Richard Donovan

@RichardDonovan ¡Buena respuesta! ¿Puedes enviar una respuesta en lugar de un comentario, por favor :)
Noah Cristino

Respuestas:


13

Haskell , 20 bytes

Ahorro de 5 bytes cambiando a un punto libre como lo sugiere nimi

zipWith(+)=<<reverse

Pruébalo en línea!


44
ir pointfree: zipWith(+)=<<reverse.
nimi

@nimi Wow No pensé hacer eso, pero eso es bastante inteligente.
Wheat Wizard

¿Dónde pongo la matriz? Intenté argumentos y aportes sobre TIO
Noah Cristino

@NoahCristino Arreglé el TIO. Esta es una función sin puntos, por lo que solo debe poner la entrada después de la función, sin embargo, Haskell requiere una mainpara compilar.
Wheat Wizard

3
@maple_shaft: utilizamos =<<desde la mónada función que se define como: (=<<) f g x = f (g x) x. Aquí, escrito en infijo: (zipWith(+) =<< reverse) x-> zipWith(+) (reverse x) x.
nimi

11

Jalea , 2 bytes

+U

Pruébalo en línea!

o

+Ṛ

Pruébalo en línea! (Gracias @ Mr. Xcoder por el segundo programa)

explicación, aunque es bastante evidente

+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 una matriz vacía [], esto no genera nada. Eso es correcto. La representación de Jelly de una lista vacía es simplemente nada. Tenga en cuenta que la representación de Jelly de una lista con un solo elemento es solo el elemento en sí. Agregue ŒṘal código para ver la representación interna de Python de la salida.


Encontré 2 problemas. 1) Cuando se prueba en [9]él, genera 18 en lugar de [18], y 2) cuando se prueba en []él no genera nada.
Noah Cristino

@NoahCristino No es un programa completo, y ya hay una explicación para eso en la respuesta.
Erik the Outgolfer

Así que supongo que esto está bien, así es como Jelly lo saca
Noah Cristino

@NoahCristino Sí. Agregué una parte al final de mi respuesta para que pueda poner ese átomo al final del código para ver cómo Python lo imprimiría.
HyperNeutrino

+Ṛtambién funciona
Sr. Xcoder

11

JavaScript (ES6), 27 bytes

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


Oh, hombre, ya casi estaba allí, pero no pensé en usar el operador de propagación para hacer el clon.
Rick Hitchcock

¿Se puede agregar el incrustado probarlo para JavaScript?
Noah Cristino




7

Japt , 7 bytes

mÈ+Ug~Y

Pruébalo en línea! con la -Qbandera para formatear la matriz de salida.

Explicación

Implícito: U= matriz de entrada

Asigne la entrada mediante la siguiente función ...

+Ug

El valor, más el valor en la matriz de entrada en el índice ...

~Y

-(index+1), que obtiene elementos desde el final de la matriz.


1
¡Buen trabajo! ¡Me gusta la entrada múltiple!
Noah Cristino

1
Realmente me gusta el intérprete Japt de entradas múltiples. ¡Buen trabajo!
Oliver

Eso es realmente genial :-) Agregaría esa característica al intérprete "oficial", pero con el diseño actual es algo inextensible ...
ETHproductions



6

Python 2 , 33 32 bytes

-1 byte gracias a @xnor

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

Pruébalo en línea!


Pasé todas mis pruebas buen trabajo :)
Noah Cristino

Qué método tan inusual. l*1Guarda un byte.
xnor

Tengo dificultades para entender el par l*1, cualquier elaboración
dhssa

@dhssa l*1hace una copia de la lista l. Si no hiciéramos una copia, pop()eliminaríamos elementos de la lista antes de acceder a ellos en el bucle for.
ovs

Gracias por la explicación, lo tengo ahora. buen truco para saber para codificar.
dhssa


5

C # (.NET Core) , 61 60 bytes

-1 byte gracias a TheLethalCoder

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

Pruébalo en línea!

El recuento de bytes también incluye:

using System.Linq;

Para explicación: la función Zip en LINQ toma dos colecciones y ejecuta una función dada para todos los elementos correspondientes, es decir. los dos primeros elementos juntos, los dos segundos elementos, etc.


1
Buena respuesta. Gracias por el comentario sobre la entrada.
Noah Cristino

1
Hola y bienvenidos a PPCG! No necesita el punto y coma final en el recuento de bytes. Creo que puede devolver la colección directamente desde la Zipllamada para que no necesite la ToArray(). ¡Buen trabajo!
TheLethalCoder

@TheLethalCoder Gracias, y agregué ToArray () ya que el desafío es sobre matrices, por lo que quería que la lambda autónoma fuera matriz -> matriz.
Grzegorz Puławski




4

R , 17 16 bytes

-1 byte gracias a djhurio

rev(l<-scan())+l

Lee de stdin; devuelve el vector; numeric(0)es el vector numérico de longitud cero para la lista vacía.

Pruébalo en línea!


Para una "matriz" vacía, regresanumeric(0)
Noah Cristino

1
@NoahCristino un vector vacío se representa como numeric(0)en R.
Leaky Nun

Esta bien. @LeakyNun
Noah Cristino

1
rev(l<-scan())+l, 16 bytes?
djhurio

Para el registro, una alternativa funcional R + pryr es solo un byte más:pryr::f(rev(x)+x)
JayCe

4

Clojure, 20 17 bytes

3 bytes guardados gracias a @MattPutnam

#(map +(rseq %)%)

Parece ser bastante competitivo con los idiomas que no son de golf.

Véalo en línea


Usar en rseqlugar de reverse.
MattPutnam


3

PowerShell , 26 bytes

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

Pruébalo en línea!

Toma datos como argumentos de línea de comandos.


¿Puedes agregar un TIO? y un enlace bajo este nombre: codegolf.stackexchange.com/a/135427/61877
Noah Cristino

@NoahCristino: ¿Te gusta esto? No he usado esa cosa hasta ahora, así que no tengo idea de lo que he hecho mal. Por cierto, si espera que las personas utilicen un determinado servicio en sus respuestas, indíquelo en la descripción de la tarea.
Joey

Esta bien. No es necesario, solo hace que las respuestas sean de mayor calidad y más fáciles de probar para futuros espectadores.
Noah Cristino

3

C, 49 bytes

f(a,n,b)int*a,*b;{for(b=a+n;a<b--;a++)*a=*b+=*a;}

¿No debería a,n,bser a,b,no algo así?
Erik the Outgolfer

@EriktheOutgolfer No, bno es un parámetro para la función, solo una definición adicional incluida por razones de golf. adebe ser un puntero a enteros, yn debe ser cuántos enteros hay en la matriz.
orlp

¿Podría agregar un enlace TIO?
Noah Cristino

3

PowerShell , 40 32 bytes

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

Pruébalo en línea!

Toma datos como argumentos de línea de comandos individuales, lo que está permitido como uno de los formatos de lista nativos para PowerShell. Luego recorre cada elemento (es decir, una forma más corta de recorrer los índices), agregando el elemento que cuenta desde atrás ( -1indexado) al elemento actual ( 0indexado, de ahí el decremento -1). Esos quedan en la tubería y la salida es implícita.

Guardado 8 bytes gracias a @briantist


no genera una matriz.
Noah Cristino

1
La entrada / salida de @NoahCristino PowerShell es, en general, extraña. Se está emitiendo como una matriz, es simplemente no hay nada captura de dicha matriz, y así, cuando lo implícito Write-Outputsucede, se pone las cosas en stdout un elemento por línea. Por ejemplo, puede ver aquí que, cuando se captura, el objeto es de hecho un arraytipo.
AdmBorkBork

Lo suficientemente bueno entonces :) al menos lo intentó
Noah Cristino

Estoy en móvil y no puedo probar tan fácilmente, pero ¿no es más corto de 1 byte para eliminar el paramy luego reemplazar 1..$ncon 1..($n=$args)?
briantist

@briantist No del todo, pero me diste una forma diferente de pensarlo, ahorrando un montón de bytes. ¡Gracias!
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 y corrección de errores gracias a @Nevay .
-3 bytes gracias a @ OliverGrégoire .

(Era un puerto de (y golfizado por 4 8 bytes) de la respuesta C # de @jkelm , pero ahora es una solución más corta diferente gracias a @ OliverGrégoire ).

Explicación:

Pruébalo aquí

El método modifica la matriz de entrada para guardar bytes, por lo que no es necesario un tipo de retorno.

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
Puede guardar 1 byte usando a->{for(int i=0,l=a.length;i<l/2;a[i]=a[l+~i]+=a[i++]);}.
Nevay

1
Además de eso, el código falla para matrices con una longitud impar 1,2,3 (devuelve en 4,2,4lugar de 4,4,4), el bucle debe ejecutarse siempre que2*i<l no i<l/2.
Nevay

@Nevay Gracias. Sabía que debería ser posible jugar al golf l-i-1, pero no se me ocurrió.
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 Gracias. Y tu ly rtiene sentido para tu implementación, así que también los he usado (y he agregado una explicación).
Kevin Cruijssen



2

anyfix , 3 bytes

"U+

La versión en TryItOnline! es una versión desactualizada de anyfix, que contiene algunos errores fatales, como no poder agregar listas debido a errores tipográficos en el código fuente. Use el código en GitHub en su lugar.

"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

Esta es una función que toma la entrada en la parte superior de la pila y las salidas en la parte superior de la pila.

𝕓𝔻

Pruébalo en línea!


¿Está permitido modificar la pila de entrada a través del código Neim real en lugar de los métodos de entrada normales?
LiefdeWen

@LiefdeWen Sí, eso está permitido en los valores predeterminados para la meta publicación de E / S.
Okx

2

Röda , 22 bytes

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

Pruébalo en línea!

Esta es una función anónima que toma una matriz y devuelve una secuencia de valores, que el enlace TIO genera en líneas separadas.

Explicación

reverse(_)          The array reversed
<>                  interleaved with
_1                  the array itself
                    Push each element to the stream
[_+_]               Pull two values and push their sum

¡Pasa mis pruebas! Gran respuesta.
Noah Cristino

2

JavaScript (ES6), 34 33 bytes

Guardado un byte gracias a @ETHproductions.

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


Me encanta cómo pones los casos de prueba, +2
Noah Cristino

Creo que puede guardar un byte cambiando -i-1a +~i.
ETHproductions

@ETHproductions, sí, gracias!
Rick Hitchcock


2

PHP, 59 bytes

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

toma datos de los argumentos de la línea de comandos; salida vacía para entrada vacía

Produce una advertencia en PHP> 7.0. Esta versión no (60 bytes):

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

¡Buena respuesta! :)
Noah Cristino
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.