Inspirado por esto
En el desafío vinculado, se nos pide que apliquemos la suma de los elementos del original y el reverso de la matriz de entrada. En este desafío, lo haremos un poco más difícil, introduciendo las otras operaciones matemáticas básicas.
Dada una matriz de enteros, recorra +, *, -, //, %, ^
, donde //
es la división de enteros y ^
es exponente, mientras se aplica al reverso de la matriz. O, en otras palabras, aplique una de las funciones anteriores a cada elemento de una matriz, siendo el segundo argumento el reverso de la matriz, con la función aplicada recorriendo la lista anterior. Esto aún puede ser confuso, así que analicemos un ejemplo.
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]
entonces la salida para [1, 2, 3, 4, 5, 6, 7, 8, 9]
sería[10, 16, -4, 0, 0, 1296, 10, 16, 8]
Para cubrir los casos de esquina, la entrada nunca contendrá un 0, pero puede contener cualquier otro número entero en el rango de infinito negativo a infinito positivo. Puede tomar la entrada como una lista de cadenas que representan dígitos si lo desea.
Casos de prueba
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 es un código de golf, por lo que gana el código más corto (en bytes).
fuente
Respuestas:
Gelatina, 10 bytes ( tenedor )
Estaba trabajando en implementar un rápido para esto el otro día, por lo que es bastante sorprendente ver un uso tan pronto. Todavía existe como una bifurcación, por lo que no puede probarlo en línea.
Salida de muestra
Explicación
fuente
ƭ
para admitir nilads (reemplazar valor) y mónadas (aplicar en el argumento de la izquierda) también2 1”q3ƭ€
de[7,4,9,0]
devoluciones[2, 1, 'q', 2]
Casco , 16 bytes
Este desafío favorece los idiomas que pueden crear infinitas listas de funciones.Quizás no,eval
FTWPruébalo en línea!
¿Cómo?
Solución alternativa de 17 bytes:
fuente
ë+*-÷%^
? ¿Por qué hacer loe
necesario?ë
toma 4 argumentos,e
toma 2. No hay uno para 605AB1E , 18 bytes
Pruébalo en línea!
Explicación
fuente
Ig∍
si quisieras usar el comando "newish" (no has visto mucho∍
aquí).Bash + utilidades GNU, 53
Este script toma un nombre de archivo como parámetro de línea de comando.
Pruébalo en línea .
Lo bueno aquí es que
paste -d
permite dar una lista de separadores, que se usan cíclicamente. El resto es solo obtener la entrada en el formato correcto para hacer esto.fuente
Jalea , 15 bytes
Pruébalo en línea!o ver el conjunto de pruebas .
¿Cómo?
fuente
ż“+×_:%*”;"ṚV
ż“+×_:%*”ṁ$;"ṚV
que también es de 15 bytes.Python 2 , 67 bytes
-3 bytes gracias a los ovs.
Pruébalo en línea!
Python 2 , 95 bytes
Pruébalo en línea!
eval
es malvado ... pero quizás más golfista. :PAGfuente
JavaScript (ES7),
6867 bytesMostrar fragmento de código
fuente
o
dentro de los paréntesis.pop()
para guardar algunos bytes.o
también se utiliza como condición del operador ternario. Eso rompería ese esquema.Perl 6 ,
6766 bytesGuardado 1 byte gracias a @nwellnhof.
Pruébalo en línea!
Solución muy poco imaginativa (y probablemente mala). Comprime el argumento consigo mismo invertido. La lista resultante se asigna con el bloque que
EVAL
es la cadenaa (operator) b
. El operador se elige de la lista de cadenas<+ * - div % **>
utilizando la variable librestate
(piensestatic
en C: el valor persiste en todas las llamadas del bloque)$
. Esto se crea para cada bloque por separado y se establece en 0. Puede hacer lo que quiera con él, pero puede hacer referencia a él solo una vez (cada aparición se$
refiere a otra variable, en realidad). Entonces, en$++%6
realidad es 0 durante la primera llamada, 1 durante la segunda, ... 5 durante la sexta, 0 durante la séptima y así sucesivamente.Al principio intenté prescindir de un
EVAL
. De hecho, los operadores son solo subs (= funciones), pero sus nombres son tan extremadamente despiadados (&infix:<+>
y así sucesivamente) que tuve que renunciar a ese enfoque.fuente
map {EVAL ".[0] ... .[1]"},zip $_,.reverse
es 1 byte más corto.Haskell ,
74117105 bytesPruébalo en línea!
Guardado 12 bytes gracias a @nimi
Ciertamente hay una mejor manera de lograr esto.
EDITAR 1. Exponente fijo para enteros; 2. Definitivamente hay una mejor manera, vea el comentario a continuación:
9591 bytesPruébalo en línea!
fuente
zipWith3($)(cycle[(+),(*),(-),div,mod,(^)])<*>reverse
Es una versión más corta, ahora eliminada de la suya.h
en la llamada deo
:o a b
y sin eso puede en líneah
( TIO ).Python 2 , 71 bytes
Pruébalo en línea!
¡Ahorré 2 bytes gracias a los ovs!
fuente
J,
4442 bytesTachado 44, yada yada ...
-2 bytes gracias a @ ConorO'Brien
Pruébalo en línea!
Tantos parens e insertos ... Seguramente hay una mejor manera de hacer esto (¿tal vez usando insert en lugar de infix?)
Explicación
Algunas notas:
J no tiene división entera, por lo que
%
componimos -división con -floor>.
. J's mod (|
) hace el orden inverso de lo que esperaríamos, por lo que tenemos que invertir su orden usando~
-reflexive.A pesar de que nos movemos en intervalos de 2, tenemos que usar
/
-insertar para insertar los verbos para que se usen de forma periódica, ya que así es como\
funciona -infix.fuente
()
y repetirlo/
- No pude resolverlo .../
una matriz invertida (ya que funciona al revés ...) con verbos como(,+)`(,*)
pero eso no ayuda mucho ... (tampoco funciona)+/`(*/)`...
Ruby ,
6357 bytesNada lujoso, de verdad. Simplemente itere en la matriz, use un índice como iterador inverso, únase a una cadena usando el operador correcto, evalúe, enjuague y repita.
Pruébalo en línea!
fuente
k , 40 bytes
Pruébalo en línea!
fuente
MAT ,
2723 bytes-4 bytes gracias a @LuisMendo
Pruébalo en línea!
Explicación:
fuente
Perl 5 , 68 + 1 (-p) = 69 bytes
Pruébalo en línea!
Toma la entrada como una lista de números separados por espacios.
fuente
R , 74 bytes
Pruébalo en línea!
Esta es la respuesta final que se me ocurrió. Devuelve una lista de longitud
length(l)
donde cada elemento es una lista que contiene el elemento correspondiente. Un poco horrible, pero todos están ahí. Si eso es inaceptable, cualquiera de los dosMap
puede reemplazarsemapply
por +3 bytes.Como los operadores R son todas funciones (la notación infija solo es azúcar sintáctica), intenté seleccionar una de una lista; por ejemplo, la solución de 94 bytes a continuación.
Para intentar deshacerme del ciclo, lo intenté
sapply
, pero eso solo funciona con una sola función y lista de entrada. Luego recordé la forma multivariadamapply
, que toma unan-ary
funciónFUN
yn
argumentos posteriores, aplicandoFUN
al primero, segundo, ..., elementos de cada uno de los argumentos, reciclando si es necesario . También hay una función de contenedor amapply
,Map
que "no hace ningún intento de simplificar el resultado" . Como es tres bytes más corto, es una buena oportunidad para jugar al golf.Así que definí una función trinaria (como en la solución de 80 bytes a continuación) que toma una función como su primer argumento y la aplica a su segunda y tercera. Sin embargo, me di cuenta de que
Map
es una función que toma una función como primer argumento y la aplica a las sucesivas. ¡Ordenado!Finalmente, subconjunto al final para asegurarnos de que solo devolvamos el primer
length(l)
valores.R , 80 bytes
Pruébalo en línea!
Este no funciona, ya que devolverá 6 valores para listas con menos de 6 elementos.
R , 94 bytes
Pruébalo en línea!
Explicación (levemente no golfista):
Debido a que cada una de las funciones está vectorizada, podemos indexar al final (
res[i]
). Esto es mejor que eleval
enfoque a continuación.R , 100 bytes
Pruébalo en línea!
Este es el
eval
enfoque más corto que pude encontrar; porque tenemos que recopilar los resultados en un vector, necesitamospaste
unc( )
alrededor de todas las expresiones, lo que agrega una tonelada de bytes innecesariosfuente
Casio-Basic, 108 bytes
Eso fue doloroso. Especialmente porque
mod(x,y)
regresax
cuando realmente no debería, lo que significa que tuve que hacer mi propia función de mod: de ahí elx-int(x/y)y
.Recorre
i
de 0 alength(l)-1
, tomando elementos sucesivos en lao
lista y solicitandol[i]
porx
yl[-i]
paray
. (Sin embargo, los índices negativos no funcionan, por lo que restoi
de la longitud de la lista y tomo ese índice).107 bytes para la función, +1 byte para agregar
l
en el cuadro de parámetros.fuente
Java 8, 336 bytes
Pruébalo aquí
Suspiro ..
Entrada como
int[]
, salida comojava.math.BigInteger[]
.Sin la regla " Para cubrir los casos de esquina, la entrada nunca contendrá un 0, pero puede contener cualquier otro número entero en el rango de infinito negativo a infinito positivo. ", Usando números enteros en el rango
-2147483648
de2147483647
, sería 186 bytes (entrada comoint[]
, y sin salida porque modifica esta matriz de entrada en su lugar para guardar bytes):Pruébalo aquí
Explicación:
fuente