¡Recorta la matriz!

27

Dada una matriz entera y dos números como entrada, elimine una cierta cantidad del primer y último elemento, especificado por los números. La entrada puede estar en el orden que desee.

Debe eliminar los primeros elementos x , donde x es la primera entrada numérica, y también eliminar los últimos elementos y , donde y es la segunda entrada numérica.

Se garantiza que la matriz resultante tendrá una longitud de al menos dos.

Ejemplos:

[1 2 3 4 5 6] 2 1 -> [3 4 5]
[6 2 4 3 5 1 3] 5 0 -> [1 3]
[1 2] 0 0 -> [1 2]
Okx
fuente
2
¿Qué significa exactamente "eliminar" valores de una matriz, especialmente eliminarlos del final? En lenguajes como C, donde una matriz es solo un puntero al primer elemento y una longitud, ¿podemos cambiar la longitud para truncar la matriz? Eso es lo que normalmente se haría en la programación del mundo real, pero el desafío no está claro para mí.
Cody Gray
@CodyGray Eliminar los valores de la matriz es lo que debería ser , pero no necesariamente lo que sucede detrás de escena.
Okx
44
¿Qué quieres decir con "aspecto"? Las matrices no tienen un aspecto - que es todo detrás de las escenas!
Cody Gray
2
@ Ok No, eso es muy defectuoso, recomendaría agregar una tabla de clasificación.
Erik the Outgolfer

Respuestas:

16

Haskell, 55 39 33 29 bytes

Guardado 16 bytes gracias a Laikoni

Ahorré 6 bytes más gracias a Laikoni

Ahorré 4 bytes más gracias a Laikoni

Estoy seguro de que esto podría mejorarse, pero como principiante, di mi mejor oportunidad.

r=(reverse.).drop
a#b=r b.r a

Uso

(5#0) [6,5,4,3,2,1,3]

Pruébalo en línea!

Enrique
fuente
55
¡Bienvenido a PPCG y al golf Haskell en particular! El objetivo es utilizar la menor cantidad de bytes posible, por lo que puede, por ejemplo, eliminar la mayoría de los espacios y acortarlos xs.
Laikoni
@Laikoni Ah, gracias! Editado, no puedo verme más corto sin una función anónima y usando aplicativo para funciones (no estoy seguro de cómo funciona).
Henry
¡Se ve bien ahora! :) Si cambia f x a ba f a b x, puede simplemente dejar caer el x: f a b=reverse.drop b.reverse.drop a.
Laikoni
1
@Laikoni Wow, interesante truco infijo. ¡Gracias de nuevo! Pude acortarlo a 33 bytes, pero intentar hacerlo a#b=let r=reverse in r.drop b.r.drop aes de 38 bytes. ¿O se nos permite tener una función declarada fuera de esta?
Henry
1
@Laikoni Gracias por la introducción, muy útil. ¡Acabo de encontrar este sitio hoy, pero definitivamente espero jugar por aquí un poco más!
Henry
6

Mathematica, 17 bytes

#[[#2+1;;-#3-1]]&

entrada

[{1, 2, 3, 4, 5, 6}, 2, 1]

J42161217
fuente
Buen uso de ;;! Me las arreglé para vincularlo Drop@##2~Drop~-#&(si tomamos la entrada en un orden extraño como 1, {1,2,3,4,5,6}, 2), pero no mejor.
Greg Martin
6

Python , 28 26 bytes

-2 bytes gracias a @Rod

lambda a,n,m:a[n:len(a)-m]

Pruébalo en línea!

ovs
fuente
guardar 6 ...lambda a,n,m:a[n:~m]
Aaron
@ Aaron esto elimina demasiado un elemento.
ovs
mi mal ... Es un truco común que a veces uso, y no comprobé completamente los requisitos del desafío ...
Aaron
@Aaron el segmento tiene una precedencia de operador más alta que la +y, por lo tanto, se aplica a [0]. Usted necesitaría paréntesis: (a+[0])[n:~m].
ovs
Sí, me di cuenta de eso más tarde. Estoy tratando de hacer que mi idea funcione
Aaron
6

C # (.NET Core) , 55 54 bytes

using System.Linq;(a,x,y)=>a.Skip(x).Take(a.Count-x-y)

Pruébalo en línea!

Utiliza a List<int>como entrada.

  • ¡1 byte guardado gracias a TheLethalCoder!
Charlie
fuente
1
Estaba a punto de responder este +1. Sin embargo, puede guardar un byte tomando un Listcomo entrada para poder usarlo en Countlugar de Length.
TheLethalCoder
Se me ocurrió una solución Whereque solo es un poco más larga que esta de la que estoy bastante contento :)
TheLethalCoder
No es necesario agregar using System.Linq;al conteo de bytes :)
Stefan
@Stefan Necesito contar cada vez usingque agrego mi respuesta, y los métodos Skipy lo Takenecesito using.
Charlie
hm. bueno. En otro desafío me dijeron que esos usos no eran necesarios.
Stefan
5

Perl 5 , 21 bytes

19 bytes de código + -apbanderas.

$_="@F[<>..$#F-<>]"

Pruébalo en línea!

Se utiliza -apara dividir automáticamente la entrada en el interior @F, luego solo se mantiene una porción de ella de acuerdo con las otras entradas: desde el índice <>(segunda entrada) hasta el índice $#F-<>(tamaño de la matriz menos la tercera entrada). Y $_se imprime implícitamente gracias a la -pbandera.

Dada
fuente
5

Óxido, 29 bytes

|n,i,j|&n[i..<[_]>::len(n)-j]

Llámalo como sigue:

let a = &[1, 2, 3, 4, 5, 6];
let f = |n,i,j|&n[i..<[_]>::len(n)-j];
f(a, 2, 1)

Me divertí mucho peleando con el verificador de préstamos descubriendo cuál era el enfoque más corto para que infiriera la vida útil de una porción devuelta. Su comportamiento en torno a los cierres es algo errático, ya que inferirá las vidas, pero solo si no declara realmente el parámetro como un tipo de referencia. Desafortunadamente, esto entra en conflicto con la obligación de definir el tipo de argumento en la firma ya que la llamada al método n.len necesita saber el tipo en el que está operando.

Otros enfoques que probé para solucionar este problema:

fn f<T>(n:&[T],i:usize,j:usize)->&[T]{&n[i..n.len()-j]}     // full function, elided lifetimes
let f:for<'a>fn(&'a[_],_,_)->&'a[_]=|n,i,j|&n[i..n.len()-j] // type annotation only for lifetimes. Currently in beta.
|n:&[_],i,j|n[i..n.len()-j].to_vec()                        // returns an owned value
|n,i,j|&(n as&[_])[i..(n as&[_]).len()-j]                   // casts to determine the type
|n,i,j|&(n:&[_])[i..n.len()-j]                              // type ascription (unstable feature)
|n,i,j|{let b:&[_]=n;&b[i..b.len()-j]}                      // re-assignment to declare the type
Nombre de usuario censurado
fuente
4

C #, 62 bytes

using System.Linq;(l,x,y)=>l.Where((n,i)=>i>=x&i<=l.Count-y-1)

Toma un List<int>como entrada y devuelve un IEnumerable<int>.


Esto también funciona para 64 bytes:

using System.Linq;(l,x,y)=>l.Skip(x).Reverse().Skip(y).Reverse()
TheLethalCoder
fuente
4

TIS-100, 413405 bytes

472 ciclos, 5 nodos, 35 líneas de código

m4,6
@0
MOV 0 ANY
S:MOV UP ACC
JEZ A
MOV ACC ANY
JMP S
A:MOV RIGHT ACC
L:JEZ B
MOV DOWN NIL
SUB 1
JMP L
B:MOV 0 RIGHT
MOV RIGHT NIL
@1
MOV RIGHT LEFT
MOV LEFT DOWN
MOV RIGHT DOWN
MOV DOWN LEFT
@2
MOV UP ACC
MOV UP LEFT
MOV ACC LEFT
@4
MOV 0 RIGHT
MOV UP NIL
S:MOV LEFT ACC
JEZ A
MOV ACC RIGHT
JMP S
A:MOV UP ACC
L:JEZ B
MOV RIGHT NIL
SUB 1
JMP L
B:MOV 0 UP
K:MOV RIGHT ACC
MOV ACC DOWN
JNZ K
@7
MOV UP ANY

El m4,6 en la parte superior no es parte del código, pero indica la ubicación de los módulos de memoria.

ingrese la descripción de la imagen aquí

Juega este nivel tú mismo pegando esto en el juego:


function get_name()
    return "ARRAY TRIMMER"
end
function get_description()
    return { "RECIEVE AN ARRAY FROM IN.A", "RECIEVE TWO VALUES A THEN B FROM IN.T", "REMOVE THE FIRST A TERMS AND LAST B TERMS FROM IN.A", "ARRAYS ARE 0 TERMINATED" }
end

function get_streams()
    input = {}
    trim = {}
    output = {}

  arrayLengths = {}

    a = math.random(1,5) - 3

    b = math.random(1,7) - 4

    arrayLengths[1] = 9+a
    arrayLengths[2] = 9+b
    arrayLengths[3] = 8-a
    arrayLengths[4] = 9-b

    s = 0

    trimIndex = 1

  for i = 1,4 do
      for k = 1,arrayLengths[i] do
          x = math.random(1,999)
      input[k+s] = x
            output[k+s] = x
        end

        input[s + arrayLengths[i] + 1]= 0
        output[s + arrayLengths[i] + 1]= 0

        a = math.random(0,3)
        b = math.random(0,arrayLengths[i]-a)

        trim[trimIndex] = a
        trim[trimIndex+1] = b

        trimIndex = trimIndex + 2

    s = s + arrayLengths[i] + 1
    end

    s = 1
    trimIndex = 1

    for i = 1,4 do

      for i = s,s+trim[trimIndex]-1 do
          output[i]=-99
        end

        for i = s + arrayLengths[i] - trim[trimIndex+1], s + arrayLengths[i]-1 do
      output[i]=-99
        end

  trimIndex = trimIndex +2
  s = s + arrayLengths[i] + 1
    end

    trimmedOut = {}
    for i = 1,39 do
            if(output[i] ~= -99) then
                    table.insert(trimmedOut, output[i])
            end
    end

    return {
        { STREAM_INPUT, "IN.A", 0, input },
        { STREAM_INPUT, "IN.T", 2, trim },
        { STREAM_OUTPUT, "OUT.A", 1, trimmedOut },
    }
end
function get_layout()
    return {
        TILE_COMPUTE,   TILE_COMPUTE,   TILE_COMPUTE,   TILE_COMPUTE,
        TILE_MEMORY,    TILE_COMPUTE,    TILE_MEMORY,   TILE_COMPUTE,
        TILE_COMPUTE,   TILE_COMPUTE,   TILE_COMPUTE,   TILE_COMPUTE,
    }
end

Así que supongo que esto también cuenta como una respuesta lua ...

correo basura
fuente
¡Ahora puedes probarlo en línea! Nota: Tuve que hacerlo de manera inteligente y usar la parte superior del archivo de código como una fuente de entrada, ya que TIO actualmente solo proporciona un único archivo de entrada.
Phlarx
4

MATL , 6 bytes

QJi-h)

Pruébalo en línea!

La entrada se da como 1) número de elementos para recortar desde el principio; 2) número de elementos para recortar desde el final; 3) matriz. Explicación

Q   % Implicit input (1). Increment by 1, since MATL indexing is 1-based.
Ji- % Complex 1i minus real input (2). In MATL, the end of the array is given by `1i`.
h   % Concatenate indices to get range-based indexing 1+(1):end-(2).
)   % Index into (implicitly taken) input array. Implicit display.
Sanchises
fuente
3

JavaScript (ES6), 27 bytes

(a,n,m)=>a.slice(n,-m||1/m)

Un segundo parámetro negativo para slicedetener el corte mdesde el final, sin embargo, cuando mes cero, tenemos que pasar un marcador de posición ( Infinityaquí, aunque (a,n,m,o)=>a.slice(n,-m||o)también funciona).

Neil
fuente
3

R , 32 31 30 bytes

-1 byte gracias a Rift

-1 byte gracias a Jarko Dubbeldam

pryr::f(n[(1+l):(sum(n|1)-r)])

Evalúa a una función anónima:

function (l, n, r) 
    n[(1 + l):(sum(n|1) - r)]

1+les necesario ya que R tiene indexación basada en 1. sum(n|1)es equivalente a length(n)pero es un byte más corto.

Pruébalo en línea!

Giuseppe
fuente
1
ahorrando 1 byte conpryr::f(n[(1+l):(length(n)-r)])
Rift
1
Suma (n | 1) es más corta que la longitud (n)
JAD
@JarkoDubbeldam excelente, gracias.
Giuseppe
3

MATL , 10 bytes

tniQwi-&:)

Pruébalo en línea!

Explicación:

Es un poco largo para solo 11 bytes, pero lo estoy escribiendo en detalle, para aprenderlo yo mismo también.

---- Input ----
[1 2 3 4 5 6]
2
1
----- Code ----
           % Implicit first input
t          % Duplicate input.
           % Stack: [1 2 3 4 5 6], [1 2 3 4 5 6]
 n         % Number of elements
           % Stack: [1 2 3 4 5 6], 6
  i        % Second input
           % Stack: [1 2 3 4 5 6], 6, 2
   Q       % Increment: [1 2 3 4 5 6], 6, 3
    w      % Swap last two elements
           % Stack: [1 2 3 4 5 6], 3, 6
     i     % Third input
           % Stack: [1 2 3 4 5 6], 3, 6, 1
      -    % Subtract
           % Stack: [1 2 3 4 5 6], 3, 5
       &:  % Range with two input arguments, [3 4 5]
           % Stack: [1 2 3 4 5 6], [3 4 5]
         ) % Use as index
           % Stack: [3 4 5]
           % Implicit display
Stewie Griffin
fuente
Se olvidó de la indexación basada en el final ;)
Sanchises
(aún así, tenga un voto a favor - Creo que esto está bien desarrollado y explicado teniendo en cuenta el método que utilizó)
Sanchises
¡No, no lo olvidé! Lo intenté, pero no descubrí cómo hacerlo funcionar (y realmente lo intenté). Llegué a la conclusión de que era imposible restar algo Jcuando se usaba así. Sospeché que estaba equivocado, simplemente no podía resolverlo por mi vida ... Gracias por vincularme a su respuesta, soy un novato de MATL ...
Stewie Griffin
No se preocupe, estoy también en gran medida el aprendizaje todavía - por ejemplo, el orden de las entradas a )y más notoriamente ( escalofrío ...
Sanchises
@Sanchises Comentario muy tardío, pero me alegro de que no solo yo encuentre el orden de entrada (confuso. :) He recurrido a recitar "ddi" (= "destino, datos, índices" del manual) cada vez, y todavía me equivoco a veces.
sundar - Restablecer Monica
3

C ++, 96 95 bytes

¡Gracias a @Tas por guardar un byte!

#import<list>
int f(std::list<int>&l,int x,int y){for(l.resize(l.size()-y);x--;)l.pop_front();}

Pruébalo en línea!

C ++ (MinGW), 91 bytes

#import<list>
f(std::list<int>&l,int x,int y){for(l.resize(l.size()-y);x--;)l.pop_front();}
Steadybox
fuente
Quiso decir #include<list>? Usted podría afeitarse un byte por tener int f. Los compiladores permitirán que una función no regrese, pero advertirán en contra de ella
Tas
Sí, gracias, int ffuncionará en la mayoría de los compiladores, lo editaré. En MinGW, incluso omitiendo completamente el tipo de función funciona. Y sí, #include<list>sería una forma compatible con el estándar para incluir el encabezado, pero #import<list>debería funcionar al menos en GCC, MinGW y MSVC, por lo que también debería estar bien.
Steadybox
2

APL (Dyalog) , 8 7 bytes

⌽⎕↓⌽⎕↓⎕

Pruébalo en línea!

Esto toma la matriz como la primera entrada, seguida de los dos números por separado.

Explicación

            from the input array
⎕↓           drop the first input elements
            reverse the array
⎕↓           drop first input elements
            reverse again to go back to the original array
Kritixi Lithos
fuente
Solución alternativa de 7 bytes:⎕↓⎕↓⍨-⎕
Adám
2

Brain-Flak , 60 bytes

(()()){({}<{({}<{}>[()])}{}([]){{}({}<>)<>([])}{}<>>[()])}{}

Pruébalo en línea!

La entrada está en este formato:

x

a
r
r
a
y

y

¿Dónde xestá el número para tomar desde el frente, yes el número para tomar desde la parte posterior, y la matriz tiene todos los números que desee, separados por nuevas líneas. Aquí están mis primeros dos intentos (más largos):

({}<>)<>{({}<{}>[()])}([])<>({}<><{{}({}<>)<>([])}{}><>){({}<{}>[()])}{}([]){{}({}<>)<>([])}<>{}
{({}<{}>[()])}{}([]){{}({}<>)<>([])}{}<>{({}<{}>[()])}{}([]){{}({}<>)<>([])}<>

Y aquí hay una explicación:

#Two times:
(()()){({}<

    #Remove *n* numbers from the top of the stack
    {({}<{}>[()])}{}

    #Reverse the whole stack
    ([]){{}({}<>)<>([])}{}<>

>)[()]}{}
DJMcMayhem
fuente
1
Es bueno ver una solución de tarpit turing de vez en cuando.
Okx
2

APL (Dyalog) , 5 bytes

(⌽↓)/

Pruébalo en línea!


El formato de entrada es y x A

Explicación

/ es Reducir, que inserta la función a la izquierda entre cada par de elementos del argumento

(⌽↓)es un tren de funciones equivalente a {⌽⍺↓⍵}, que elimina los primeros elementos de la matriz y luego invierte la matriz. ( es el argumento izquierdo y es el argumento correcto)

Por lo tanto, (⌽↓)/y x Aes equivalente a ⌽y↓⌽x↓A, que es lo que se necesita.

TwiNight
fuente
2

Java 8, 82 bytes

a->n->m->{int l=a.length-m-n,r[]=new int[l];System.arraycopy(a,n,r,0,l);return r;}

Pruébalo aquí

Alternativa con el mismo ( 82 ) conteo de bytes usando un bucle:

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

Pruébalo aquí

Explicación:

a->n->m->{                      // Method with integer-array and two integer parameters and integer-array return-type
  int l=a.length-m-n,           //  Length of the array minus the two integers
      r[]=new int[l];           //  Result integer-array
  System.arraycopy(a,n,r,0,l);  //  Java built-in to copy part of an array to another array
  return r;                     //  Return result-String
}                               // End of method

System.arraycopy:

arraycopy(Object src, int srcPos, Object dest, int destPos, int length):

El java.lang.System.arraycopy()método copia una matriz de la matriz de origen especificada, comenzando en la posición especificada, a la posición especificada de la matriz de destino. Una subsecuencia de componentes de la matriz se copia de la matriz de origen srca la que hace referencia la matriz de destino a la que hace referencia dest. El número de componentes copiados es igual al lengthargumento.

Los componentes en las posiciones a srcPostravés srcPos + length - 1de la matriz de origen se copian en posiciones a destPostravés destPos + length - 1, respectivamente, de la matriz de destino.

Kevin Cruijssen
fuente
¿Puedes guardar bytes al no usar curry?
TheLethalCoder
@TheLethalCoder No, en este caso no. (a,n,m)->tiene el mismo número de bytes que a->n->m->. Aunque tienes razón, podría haber usado una llamada normal en lugar de curry. Estoy un poco acostumbrado a usar curry cuando tengo dos (o más) parámetros ... Ya he cometido el error de usar curry cuando tengo cuatro parámetros varias veces ...
Kevin Cruijssen
Ahh tienes razón, he contado mal los bytes y lo he hecho también, ¡curry es definitivamente una oportunidad ahora!
TheLethalCoder
No hay enlace TIO? -
totalmente humano
2
Lo siento, no puedo dejar pasar eso. Publiqué mi propia respuesta porque ... hay un incorporado (bueno, no exactamente, pero casi). : o
Olivier Grégoire
2

Kotlin , 30 bytes

{a,s,e->a.drop(s).dropLast(e)}

Pruébalo en línea!

Toma List<Int>como entrada y cae desde el principio y luego desde el final.

Yolybév
fuente
1
Yo no tengo acceso a try it online. ¿Puedes agregar un código de llamada? ¿Cómo compilar lambda sin definiciones de tipo en Kotlin? Gracias.
mazzy
1
@mazzy probablemente podría ser un truco, pero puede especificar tipos en la definición de tipo variable comoval f: (List<Int>, Int, Int) -> List<Int>
YGolybev
¡Lo tengo! Agradable. No sé si esto es válido en CodeGolf.
mazzy
2

Brachylog , 11 10 bytes

kb₍B&t;Bk₍

Pruébalo en línea!

Toma la entrada como [x, A, y] donde A es la matriz a recortar.

(-1 byte gracias a @Fatalize.)

sundar - Restablecer a Monica
fuente
Puede reducir su longitud por 1 byte tales como: kb₍B&t;Bk₍. ,se agrega (vea el resultado de este programa parcial ), no actúa como . Tampoco intente copiar cosas de las respuestas antiguas de Brachylog (2016-principios de 2017) porque era la primera versión del lenguaje y los programas no son retrocompatibles (en particular, ,en Brachylog v1 ahora está en Brachylog v2)
Fatalize
@Fatalize Gracias, actualizado. Así ,que anexé en la versión anterior, pero simplemente no importó en este caso porque hubo un tdespués de todos modos, una coincidencia afortunada. Y sí, me di cuenta de las diferencias de versión después de publicar esto, todavía estaba resolviendo cosas y dando vueltas en esta etapa. :)
sundar - Restablecer Monica
1

Pyth, 5 bytes

>E<QE

Pruébalo aquí

Toma los argumentos en el orden opuesto. <y >en Pyth trim basado en el orden de los argumentos. Por ejemplo, <Q5recortará todos los valores en la entrada después del quinto.

FryAmTheEggman
fuente
1

CJam , 8 bytes

{_,@-<>}

Bloque anónimo que toma las entradas de la pila en el orden x , y , matriz y las reemplaza por la matriz de salida.

Pruébalo en línea!

Explicación

Considere insumos 2, 1, [10 20 30 40 50 60].

{      }    e# Block
            e# STACK: 2, 1, [10 20 30 40 50 60]
 _          e# Duplicate
            e# STACK: 2, 1, [10 20 30 40 50 60], [10 20 30 40 50 60]
  ,         e# Length
            e# STACK: 2, 1, [10 20 30 40 50 60], 6
   @        e# Rotate
            e# STACK: 2, [10 20 30 40 50 60], 6, 1
    -       e# Subtract
            e# STACK: 2, [10 20 30 40 50 60], 5
     <      e# Slice before
            e# STACK: 2, [10 20 30 40 50]
      >     e# Slice after
            e# STACK: [30 40 50]
Luis Mendo
fuente
1
Buen punto, entonces solo por diversión, aquí hay una solución alternativa de 8 bytes :) tio.run/##S85KzP1vxGXIFW1ooGBkoGBsoGBioGBqoGBmEPu/Olg7ps7GrvZ/…
Martin Ender
1

q / kdb, 12 bytes

Solución:

{(0-z)_y _x}

Ejemplo:

q){(0-z)_y _x}[1 2 3 4 5 6;2;1]
3 4 5
q){(0-z)_y _x}[6 2 4 3 5 1 3;5;0]
1 3
q){(0-z)_y _x}[1 2;0;0]
1 2

Explicación:

{          } / lambda function
          x  / input array
       y _   / drop y elements from .. (takes from start)
 (0-z)       / negative z ()
      _      / drop -z elements from ... (takes from end)
callejero
fuente
1

Raqueta, 33 bytes

(λ(a i j)(drop-right(drop a i)j))

Se le puede llamar así:

((λ(a i j)(drop-right(drop a i)j)) '(1 2 3 4 5 6) 2 1)
Halcón supremo
fuente
¿Puedo tener un enlace al sitio web del idioma?
Okx
@Okx racket-lang.org
Ultimate Hawk