Trim the array!

27

2

Given an integer array and two numbers as input, remove a certain amount of the first and last elements, specified by the numbers. The input can be in any order you want.

You should remove the first x elements, where x is the first numerical input, and also remove the last y elements, where y is the second numerical input.

The resulting array is guaranteed to have a length of at least two.

Examples:

[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

Posted 2017-06-26T14:14:04.033

Reputation: 15 025

2What, exactly, does it mean to "remove" values from an array—especially to remove them from the end? In languages like C, where an array is just a pointer to the first element and a length, can we just change the length to truncate the array? That's what would normally be done in real-world programming, but the challenge is unclear to me. – Cody Gray – 2017-06-26T16:40:56.837

@CodyGray Removing values from the array is what it should look like, but not necessarily what goes on behind the scenes. – Okx – 2017-06-26T16:42:45.927

4What do you mean by "look like"? Arrays don't have a look – it is all behind the scenes! – Cody Gray – 2017-06-26T16:43:19.537

@CodyGray It doesn't matter. – Okx – 2017-06-26T16:43:38.603

Due to the multitude of answer, you can maybe add a leaderboard snippet to your question? – Michthan – 2017-06-27T04:56:32.200

1

@Michthan Try installing the PPCG userscript

– Okx – 2017-06-27T10:59:11.823

2@Okx Nope, that's very buggy, I'd recommend adding a leaderboard. – Erik the Outgolfer – 2017-06-27T11:01:30.677

@EriktheOutgolfer It's been working pretty well for me. – Okx – 2017-06-27T11:03:56.920

@Okx Try to use TIO provided by the userscript. – Erik the Outgolfer – 2017-06-27T11:05:37.380

@EriktheOutgolfer Well that doesn't work, but the leaderboard does. – Okx – 2017-06-27T11:11:08.260

@Okx Also, please stop being lazy...:P...btw the userscript also has unwanted side-effects. – Erik the Outgolfer – 2017-06-27T11:11:54.467

@EriktheOutgolfer You do know that there's nothing stopping you from using the edit button, right? ;)

– Sanchises – 2017-06-27T13:28:30.087

@Sanchises I'm not sure if OP wants a leaderboard though. – Erik the Outgolfer – 2017-06-27T13:30:28.263

Does there need to be a space between the returned values? – BruceWayne – 2017-06-27T18:34:35.163

@BruceWayne No, it just needs to be some sort of integer list. – Okx – 2017-06-27T18:44:52.570

Answers

16

Haskell, 55 39 33 29 bytes

Saved 16 bytes thanks to Laikoni

Saved 6 more bytes thanks to Laikoni

Saved 4 more bytes thanks to Laikoni

Am sure this could be improved, but as a beginner, gave it my best shot.

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

Usage

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

Try it online!

Henry

Posted 2017-06-26T14:14:04.033

Reputation: 461

5Welcome to PPCG and Haskell golfing in particular! The objective is to use as few bytes as possible, so you can for example remove most of the spaces and shorten xs. – Laikoni – 2017-06-26T14:24:27.700

@Laikoni Ah, thanks! Edited, can't see myself going any shorter without an anonymous function and using applicative for functions (not sure how that works). – Henry – 2017-06-26T14:28:04.117

Looking good now! :) If you change f x a b to f a b x, you can simply drop the x: f a b=reverse.drop b.reverse.drop a. – Laikoni – 2017-06-26T14:32:41.490

An additional handy trick from our Tips for golfing in Haskell is to use an infix operator instead of f, that is for example a#b=... instead of f a b. Your usage is then (5#0)[6,5,4,3,2,1,3]. Finally you can declare r=reverse as auxiliary function and shorten both usages in your main function.

– Laikoni – 2017-06-26T14:37:11.620

1@Laikoni Wow, interesting infix trick. Thanks again! I was able to shorten it to 33 bytes, but trying to do a#b=let r=reverse in r.drop b.r.drop a is 38 bytes. Or are we allowed to have a function declared outside this one? – Henry – 2017-06-26T14:42:12.327

From the Guide to golfing Rules in Haskell: "you can have auxiliary functions and/or constants defined on separate lines". You can save even more by defining r y=reverse.drop y, which again is equal to r=(reverse.).drop.

– Laikoni – 2017-06-26T14:48:02.867

1@Laikoni Thanks for the introduction, very helpful. Just found this site today, but definitely look forward to playing around here some more! – Henry – 2017-06-26T14:55:50.953

I'm glad you enjoy the site so far. Using pointfree.io I found one more byte to save: The rules allow also anonymous functions and OP stated that the arguments can be in any order, so a#b=r b.r a can be shortened to the anonymous function (.r).(.).r. Note that this changes the calling pattern to function y x [list].

– Laikoni – 2017-06-26T15:14:52.917

And to conclude my introduction tour, you can add a link to an online testing environment for the conveninece of others: Try it online!

– Laikoni – 2017-06-26T15:15:09.023

7

Octave, 20 bytes

@(a,x,y)a(x+1:end-y)

Try it online!

rahnema1

Posted 2017-06-26T14:14:04.033

Reputation: 5 435

6

Mathematica, 17 bytes

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

input

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

J42161217

Posted 2017-06-26T14:14:04.033

Reputation: 15 931

Nice use of ;;! I managed to tie you with Drop@##2~Drop~-#& (if we take the input in a weird order like 1, {1,2,3,4,5,6}, 2), but no better. – Greg Martin – 2017-06-26T17:30:24.500

6

Python, 28 26 bytes

-2 bytes thanks to @Rod

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

Try it online!

ovs

Posted 2017-06-26T14:14:04.033

Reputation: 21 408

save 6... lambda a,n,m:a[n:~m] – Aaron – 2017-06-26T16:48:59.867

@Aaron this removes one item too much. – ovs – 2017-06-26T16:52:44.427

my bad.. It's a common trick I sometimes use, and didn't fully check against the requirements of the challenge.. – Aaron – 2017-06-26T17:00:13.517

@Aaron the slice has a higher operator precedence than the + and is therefore applied to [0]. You would need brackets: (a+[0])[n:~m]. – ovs – 2017-06-26T17:07:41.643

yah, realized that later.. I'm trying to make my idea work – Aaron – 2017-06-26T17:08:16.553

can't you do lambda a,n,m:a[n:-m]? – Cowabunghole – 2017-09-21T19:13:23.540

6

C# (.NET Core), 55 54 bytes

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

Try it online!

Uses a List<int> as input.

  • 1 byte saved thanks to TheLethalCoder!

Charlie

Posted 2017-06-26T14:14:04.033

Reputation: 11 448

1I was just about to answer this +1. However, you can save a byte by taking a List as input so you can use Count instead of Length. – TheLethalCoder – 2017-06-26T14:45:08.530

I came up with a solution using Where that is only slightly longer than this way that I'm quite happy with as well :) – TheLethalCoder – 2017-06-26T15:09:21.487

You don't need to add using System.Linq; to the byte count :) – Stefan – 2017-06-27T13:19:24.353

@Stefan I need to count every using I add in my answer, and the methods Skip and Take need that using. – Charlie – 2017-06-27T13:22:41.353

hm. okay. On some other challenge I was told that those usings where not necessary. – Stefan – 2017-06-27T13:24:42.073

@Stefan Note for both of you usings are always required if you need to add them in for C#. However, if you use C# Interactive or C# Linqpad or similar you might not need some of them as they are included by default. But then your answer is no longer just C# so you should update the header accordingly. – TheLethalCoder – 2017-06-27T16:20:42.823

5

Perl 5, 21 bytes

19 bytes of code + -ap flags.

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

Try it online!

Uses -a to autosplit the input inside @F, then only keep a slice of it according to the other inputs: from index <> (second input) to index $#F-<> (size of the array minus third input). And $_ is implicitly printed thanks to -p flag.

Dada

Posted 2017-06-26T14:14:04.033

Reputation: 8 279

5

Rust, 29 bytes

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

Call it as follows:

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

I had a lot of fun fighting with the borrow checker figuring out what the shortest approach was in order to have it infer the lifetime of a returned slice. Its behavior around closures is somewhat erratic, as it will infer the lifetimes, but only if you do not actually declare the parameter as a reference type. Unfortunately this conflicts with being required to define the argument type in the signature as the n.len method call needs to know the type it's operating on.

Other approaches I tried working around this issue:

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

CensoredUsername

Posted 2017-06-26T14:14:04.033

Reputation: 951

4

Neim, 3 bytes

Try it here

Thanks to Okx for encouraging me to do this...:)

Erik the Outgolfer

Posted 2017-06-26T14:14:04.033

Reputation: 38 134

4

C#, 62 bytes

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

Takes a List<int> as input and returns an IEnumerable<int>.


This also works for 64 bytes:

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

TheLethalCoder

Posted 2017-06-26T14:14:04.033

Reputation: 6 930

4

TIS-100, 413 405 Bytes

472 cycles, 5 nodes, 35 lines of code

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

The m4,6 at the top is not part of the code, but signals the placement of the memory modules.

enter image description here

Play this level yourself by pasting this into the game:


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

So I suppose this also counts as a lua answer...

junkmail

Posted 2017-06-26T14:14:04.033

Reputation: 131

You can now try it online! Note: I had to do a clever, and use the top of the code file as one source of input, since TIO currently only provides a single input file.

– Phlarx – 2018-05-02T20:17:54.217

4

MATL, 6 bytes

QJi-h)

Try it online!

Input is given as 1) number of elements to trim from the start; 2) number of elements to trim from the end; 3) array. Explanation

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

Posted 2017-06-26T14:14:04.033

Reputation: 8 530

4

Java (OpenJDK 8), 32 bytes

(l,i,j)->l.subList(i,l.size()-j)

Try it online!

If we really restrict to arrays, then it's 53 bytes:

(a,i,j)->java.util.Arrays.copyOfRange(a,i,a.length-j)

Try it online!

Olivier Grégoire

Posted 2017-06-26T14:14:04.033

Reputation: 10 647

3

R, 32 31 30 bytes

-1 byte thanks to Rift

-1 byte thanks to Jarko Dubbeldam

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

Evaluates to an anonymous function:

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

1+l is necessary since R has 1-based indexing. sum(n|1) is equivalent to length(n) but it's a byte shorter.

Try it online!

Giuseppe

Posted 2017-06-26T14:14:04.033

Reputation: 21 077

1saving 1 byte with pryr::f(n[(1+l):(length(n)-r)]) – Rift – 2017-06-26T15:30:25.573

1Sum(n|1) is shorter than length(n) – JAD – 2017-06-26T18:07:23.897

@JarkoDubbeldam excellent, thank you. – Giuseppe – 2017-06-26T18:15:10.997

3

C++, 96 95 bytes

Thanks to @Tas for saving a byte!

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

Try it online!

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

Posted 2017-06-26T14:14:04.033

Reputation: 15 798

Did you mean #include<list>? You could shave a byte by having int f. Compilers will allow a function to not return, but they'll warn against it – Tas – 2017-06-28T02:23:30.440

Yeah, thanks, int f will work on most compilers, I'll edit that in. On MinGW, even completely omitting the type of the function works. And yes, #include<list> would be a standard-compliant way to include the header, but #import<list> should work at least on GCC, MinGW and MSVC, so it should be fine too. – Steadybox – 2017-06-28T02:51:55.980

3

JavaScript (ES6), 27 bytes

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

A negative second parameter to slice stops slicing m from the end, however when m is zero we have to pass a placeholder (Infinity here, although (a,n,m,o)=>a.slice(n,-m||o) also works).

Neil

Posted 2017-06-26T14:14:04.033

Reputation: 95 035

3

MATL, 10 bytes

tniQwi-&:)

Try it online!

Explanation:

It's a bit long for just 11 bytes, but I'm writing it out in detail, to learn it myself too.

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

Posted 2017-06-26T14:14:04.033

Reputation: 43 471

You forgot about end-based indexing ;)

– Sanchises – 2017-06-27T08:52:17.807

(still, have an upvote - I believe this is well golfed and explained considering the method you used) – Sanchises – 2017-06-27T09:04:22.320

Nope, I didn't forget it! I tried, but I didn't figure out how to make it work, (and I really tried). I concluded that it was impossible to subtract something from J, when used like this. I suspected I was wrong, I just couldn't figure it out for the life of me... Thanks for linking to your answer, I'm very much a MATL novice... – Stewie Griffin – 2017-06-27T09:09:54.710

Don't worry, I'm also very much learning still - e.g., the order of the inputs to ) and more notoriously ( shiver... – Sanchises – 2017-06-27T09:18:27.320

@Sanchises Very late comment, but I'm glad it's not just me that finds the input order to ( confusing. :) I've taken to reciting "ddi" (= "destination, data, indices" from the manual) every time, and still get it wrong sometimes. – sundar - Reinstate Monica – 2018-07-23T21:38:55.223

@sundar "diff diff input?" :) Yeah combined with the 'reversed' way the stack works I still struggle with that. – Sanchises – 2018-07-24T05:52:25.030

2

APL (Dyalog), 8 7 bytes

⌽⎕↓⌽⎕↓⎕

Try it online!

This takes the array as the first input, followed by the two numbers separately.

Explanation

⎕            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

user41805

Posted 2017-06-26T14:14:04.033

Reputation: 16 320

Alternative 7 byte solution: ⎕↓⎕↓⍨-⎕ – Adám – 2017-06-26T22:54:21.327

2

PHP>=7.1, 59 bytes

<?[$a,$b,$e]=$_GET;print_r(array_slice($a,$b,$e?-$e:NULL));

PHP Sandbox Online

Jörg Hülsermann

Posted 2017-06-26T14:14:04.033

Reputation: 13 026

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

Try it here.

Alternative with same (82) byte-count using a loop:

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

Try it here.

Explanation:

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

The java.lang.System.arraycopy() method copies an array from the specified source array, beginning at the specified position, to the specified position of the destination array. A subsequence of array components are copied from the source array referenced by src to the destination array referenced by dest. The number of components copied is equal to the length argument.

The components at positions srcPos through srcPos + length - 1 in the source array are copied into positions destPos through destPos + length - 1, respectively, of the destination array.

Kevin Cruijssen

Posted 2017-06-26T14:14:04.033

Reputation: 67 575

Can you save bytes by not using currying? – TheLethalCoder – 2017-06-26T15:14:53.143

@TheLethalCoder No, in this case not. (a,n,m)-> has the same byte-count as a->n->m->. Although you're right I could have just used a regular call instead of currying. I'm kinda used of using currying when I have two (or more) parameters.. I've already made the mistake of using currying when I have four parameters a few times.. – Kevin Cruijssen – 2017-06-26T16:49:50.687

Ahh you're right I miscounted the bytes and I've done that as well currying is definitely a go to now! – TheLethalCoder – 2017-06-26T17:24:15.120

No TIO link? -- – totallyhuman – 2017-06-26T18:48:22.967

@totallyhuman It did contain a TIO link for the first solution, but I've added a TIO-link for the alternative solution as well now. – Kevin Cruijssen – 2017-06-27T06:55:01.687

2

Sorry, can't let that pass. I posted my own answer because... there's a built-in (ok, not exactly, but nearly)! :o

– Olivier Grégoire – 2017-06-27T15:58:41.330

@OlivierGrégoire Nice, that's a lot shorter! – Kevin Cruijssen – 2017-06-27T20:18:49.837

2

Brain-Flak, 60 bytes

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

Try it online!

Input is in this format:

x

a
r
r
a
y

y

Where x is the number to take from the front, y is the number to take from the back, and the array is just however many numbers you want, separated by newlines. Here are my first two (longer) attempts:

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

And here is an explanation:

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

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

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

>)[()]}{}

James

Posted 2017-06-26T14:14:04.033

Reputation: 54 537

1Nice to see a turing tarpit solution every now and then. – Okx – 2017-06-26T15:53:06.930

2

C++, 50 48 46 bytes

#define f(a,x,y)decltype(a)(&a[x],&*a.end()-y)

Try it online!

rahnema1

Posted 2017-06-26T14:14:04.033

Reputation: 5 435

2

APL (Dyalog), 5 bytes

(⌽↓)/

Try it online!


Input format is y x A

Explanation

/ is Reduce, which inserts the function to the left between each pair of elements of the argument

(⌽↓) is a function train equivalent to {⌽⍺↓⍵}, which removes the first elements of the array and then reverses the array. ( is the left argument and is the right argument)

Thus, (⌽↓)/y x A is equivalent to ⌽y↓⌽x↓A, which is what is needed.

TwiNight

Posted 2017-06-26T14:14:04.033

Reputation: 4 187

2

Kotlin, 30 bytes

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

Try it online!

Takes List<Int> as input and drops from begin and then from end.

YGolybev

Posted 2017-06-26T14:14:04.033

Reputation: 111

1I have not access to try it online. Can you add a caller code? how compile lambda without type definitions in Kotlin? Thanks. – mazzy – 2018-07-25T07:29:41.323

1@mazzy it could probably be a hack, but you can specify types in variable type definition as val f: (List<Int>, Int, Int) -> List<Int> – YGolybev – 2018-07-25T07:49:58.917

Got it! Nice. I don't know if this is valid in CodeGolf. – mazzy – 2018-07-25T07:57:26.413

2

Brachylog, 11 10 bytes

kb₍B&t;Bk₍

Try it online!

Takes input as [x, A, y] where A is the array to trim.

(-1 byte thanks to @Fatalize.)

sundar - Reinstate Monica

Posted 2017-06-26T14:14:04.033

Reputation: 5 296

You can shorten it by 1 byte as such: kb₍B&t;Bk₍. , does append (see the result of this partial program), it doesn't act like . Also do not try to copy things from old (2016-early 2017) Brachylog answers because it was the first version of the language, and programs are not retrocompatible (in particular, , in Brachylog v1 is now in Brachylog v2)

– Fatalize – 2018-07-25T06:38:31.293

@Fatalize Thanks, updated. So , did append in the previous version, but it just didn't matter in this case because there was a t after it anyway - lucky coincidence. And yeah, I realized the version differences after I posted this, I was still figuring things out and bumbling around at this stage. :) – sundar - Reinstate Monica – 2018-07-25T20:45:20.473

1

Dyalog APL, 16 bytes

{(⍵↓⍨⊃⍺)↓⍨-⍺[2]}

Try it online!

Uriel

Posted 2017-06-26T14:14:04.033

Reputation: 11 708

1why was this downvoted? – Uriel – 2017-06-26T22:55:35.930

1

Pyth, 5 bytes

>E<QE

Try it here

Takes the arguments in the opposite order. < and > in Pyth trim based on argument order. For example, <Q5 will trim off all values in the input after the fifth one.

FryAmTheEggman

Posted 2017-06-26T14:14:04.033

Reputation: 16 206

1

CJam, 8 bytes

{_,@-<>}

Anonymous block that takes the inputs from the stack in the order x, y, array, and replaces them by the output array.

Try it online!

Explanation

Consider inputs 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

Posted 2017-06-26T14:14:04.033

Reputation: 87 464

1

Good point, then just for fun, here is an alternative 8-byte solution :) https://tio.run/##S85KzP1vxGXIFW1ooGBkoGBsoGBioGBqoGBmEPu/Olg7ps7GrvZ/XcF/AA

– Martin Ender – 2017-06-26T15:52:32.330

1

tcl, 19

lrange $L $x end-$y

where L is the array.

demo

sergiol

Posted 2017-06-26T14:14:04.033

Reputation: 3 055

1

q/kdb, 12 bytes

Solution:

{(0-z)_y _x}

Example:

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

Explanation:

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

streetster

Posted 2017-06-26T14:14:04.033

Reputation: 3 635

1

Racket, 33 bytes

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

It can be called like so:

((λ(a i j)(drop-right(drop a i)j)) '(1 2 3 4 5 6) 2 1)

Ultimate Hawk

Posted 2017-06-26T14:14:04.033

Reputation: 127

Can I have a link to the language's website? – Okx – 2017-06-26T22:16:43.797

@Okx https://racket-lang.org/

– Ultimate Hawk – 2017-06-26T22:16:59.683

1

Pyth, 4 bytes

<E>E

Demonstration

Put the list last.

isaacg

Posted 2017-06-26T14:14:04.033

Reputation: 39 268

1

Ruby, 17 bytes

->a,b,c{a[b..~c]}

Try it online!

G B

Posted 2017-06-26T14:14:04.033

Reputation: 11 099

1

Kona/K4, 12 bytes

{x _(-y)_ z}

Usage:

   {x _(-y)_ z}[2;1;"hello world"]
"llo worl"

hoosierEE

Posted 2017-06-26T14:14:04.033

Reputation: 760

1

K (oK), 10 bytes

{(-z)_y_x}

Try it online!

Port of my q/kdb+ answer...

streetster

Posted 2017-06-26T14:14:04.033

Reputation: 3 635

0

Japt, 8 7 bytes

sVUl -W

Try it online!

Saved a byte thanks to ETHproductions

Tom

Posted 2017-06-26T14:14:04.033

Reputation: 3 078

1Hmm, do you need the comma? – ETHproductions – 2017-06-27T00:55:17.930

@ETHproductions A bit late, but the comma isn't needed; I keep forgetting that trick. Thanks! – Tom – 2017-06-27T09:12:39.907

6 bytes – Shaggy – 2017-06-27T16:08:16.830

0

05AB1E, 6 bytes

F¦}sF¨

Try it online!

F }    # For 0 .. number of elements to remove from front
 ¦     #   Remove the first element
   s   # Get the next input
    F  # For 0 .. number of elements to remove from back
     ¨ #   Remove the last element

Riley

Posted 2017-06-26T14:14:04.033

Reputation: 11 345

0

Jelly, 5 bytes

Ṗ¡Ḋ⁴¡

Try it online!

Erik the Outgolfer

Posted 2017-06-26T14:14:04.033

Reputation: 38 134

1Also 5 bytes :) – HyperNeutrino – 2017-06-26T14:37:13.253

@HyperNeutrino I had this version too...but I decided this is more elegant. :) – Erik the Outgolfer – 2017-06-26T16:50:53.060

0

V, 9 8 bytes

ÀñdñGÀñd

Try it online!

One byte saved thanks to Erik the golfer!

James

Posted 2017-06-26T14:14:04.033

Reputation: 54 537

You don't need last ñ. – Erik the Outgolfer – 2017-06-27T10:46:33.903

The first four bytes can become Àd. – user41805 – 2017-06-27T16:51:46.327

@kritixilithos Unfortunately, that doesn't work for two reasons. 1) d by itself doesn't work. You'd need dd and 2) That doesn't work if the first input is 0. – James – 2017-06-27T19:33:47.633

0

Clojure, 28 bytes

#(subvec % %2(-(count %)%3))

Well there is the built-in.

NikoNyrh

Posted 2017-06-26T14:14:04.033

Reputation: 2 361

0

NewStack, 5 bytes

ᵢqᵢpᵢ

The symmetry is an amazing coincidence

The breakdown:

ᵢ      Append an input (the array).
 qᵢ    Pop off an input's amount off the bottom.
   pᵢ  Pop off an input's amount off the top.

Graviton

Posted 2017-06-26T14:14:04.033

Reputation: 2 295

0

F#, 39 bytes

let f(i:int[])s e=i.[s..(i.Length-1-e)]

Try it online!

user20151

Posted 2017-06-26T14:14:04.033

Reputation:

0

Braingolf, 22 21 bytes

1-<1-[v$_R][v<$_R]v=;

Try it online!

Skidsdev

Posted 2017-06-26T14:14:04.033

Reputation: 9 656

0

LOGO, 33 bytes

[cascade ?2 "bf cascade ?3 "bl ?]

Try it on FMSLogo.

This is a template-list in LOGO, which is the equivalent of lambda (anonymous) function in many other languages.

Where:

  • cascade outputs the result of applying a template repeatedly, in this case is ?2 times bf and ?3 times bl.
  • bf and bl stands for ButFirst and ButLast respectively.
  • ? is used to access parameters. So ?2 is the second parameter, ?3 is the third parameter, etc.

Test:

show apply [cascade ?2 "bf cascade ?3 "bl ?] [[1 2 3 4 5 6] 2 1]

print [3 4 5].

user202729

Posted 2017-06-26T14:14:04.033

Reputation: 14 620

0

Clojure, 26 bytes

#(drop %2(drop-last %3 %))

MattPutnam

Posted 2017-06-26T14:14:04.033

Reputation: 521

0

Perl 6, 18 bytes

{@^a[$^x..^*-$^y]}

@^a is the input array (first parameter), $^x is the number of elements to remove from the front (second parameter), and $^y is the number of elements to remove from the end (third parameter).

$^x ..^ *-$^y is a slicing subscript that selects a range of elements from the one with index $^x until one prior to the one with index *-$^y (* meaning "the length of the array" in a subscript context).

Sean

Posted 2017-06-26T14:14:04.033

Reputation: 4 136

0

C++, 81 bytes

#include<vector>
int f(std::vector<int>&v,int x,int y){v={v.begin()+x,v.end()-y};}

Not as short as this use of a macro.

std::vector provides random access, and we simply create a new vector from the start point v.begin() + x, to the new end point v.end() - y elements.

Uses the iterator overload v.begin() and v.end() since it's the same length as the pointer one &v[0] and &*(v.end()), but more readable.

Function doesn't return an int like it promises, which is only a compiler warning.

Tas

Posted 2017-06-26T14:14:04.033

Reputation: 593

0

8th, 33 bytes

Code

This code leaves resulting array on TOS

( a:rev swap -1 a:slice ) 2 times

Usage

ok> 2 1 [1,2,3,4,5] ( a:rev swap -1 a:slice ) 2 times .
[3,4]
ok> 5 0 [6,2,4,3,5,1,3] ( a:rev swap -1 a:slice ) 2 times .
[1,3]
ok> 
ok> 0 0 [1,2] ( a:rev swap -1 a:slice ) 2 times .
[1,2]
ok>

Chaos Manor

Posted 2017-06-26T14:14:04.033

Reputation: 521

0

Common Lisp, 41 bytes

(lambda(a x y)(subseq a x(-(length a)y)))

Try it online!

Renzo

Posted 2017-06-26T14:14:04.033

Reputation: 2 260

0

J, 17 bytes

(-@{:@[}.{.@[}.])

Usage:

   2 1 (-@{:@[}.{.@[}.]) 11 12 13 14 15 16
13 14 15

hoosierEE

Posted 2017-06-26T14:14:04.033

Reputation: 760

0

Husk, 3 bytes

↓↓_

Try it online!

Explanation

                                               |  1 [1,2,3,4,5,6] 2
  _  -- negate y                               | -1 [1,2,3,4,5,6] 2
 ↓   -- drop y from end (negative argument)    |  [1,2,3,4,5] 2
↓    -- drop x from beginning                  |  [3,4,5]

ბიმო

Posted 2017-06-26T14:14:04.033

Reputation: 15 345

0

Japt, 6 bytes

oW UsV

Try it

sVWnUl

Try it

Shaggy

Posted 2017-06-26T14:14:04.033

Reputation: 24 623

0

C++, 50 bytes

[](auto&v,int x,int y){v={v.begin()+x,v.end()-y};}

Just construct a new container from the existing one. This requires v to be of a type with random-access iterators and constructible from an iterator pair - std::vector is ideally suited.

Demo

auto const trim =
    [](auto&v,int x,int y){v={v.begin()+x,v.end()-y};}
    ;

#include<iostream>
#include<vector>
int main(int argc, char **argv)
{
    if (argc < 4) {
        std::cerr << "Usage: " << argv[0] << " X Y ELE...";
        return 1;
    }

    auto const x = std::atoi(argv[1]);
    auto const y = std::atoi(argv[2]);
    std::vector<int> v;
    v.reserve(argc - 3);
    for (int i = 3;  i < argc;  ++i)
        v.push_back(std::atoi(argv[i]));

    auto const print_vector = [](auto v){for(auto i:v)std::cout<<i<<" ";std::cout<<'\n';};

    print_vector(v);
    trim(v, x, y);
    print_vector(v);
}

Toby Speight

Posted 2017-06-26T14:14:04.033

Reputation: 5 058

0

Scala, 52 bytes

def f(a:Seq[Int],c:Int,d:Int)=a.dropRight(d).drop(c)

Try it online!

V. Courtois

Posted 2017-06-26T14:14:04.033

Reputation: 868

0

Lua, 94 bytes

n,s=loadstring('return{},'..p[1])()for x=1,#s do n[#n+1]=x>0+p[2]and#s>=x+p[3]and s[x]or _ end

Try it online!

If I used something that I couldn't please tell me.

Explanation

p = {...} -- (Header) It gets the 3 arguments (the list and the 2 numbers and stores in a table)


n,s=loadstring('return{},'..p[1])() -- is the same as (i) and (ii):
 (i) n = {} -- initializes an empty table
(ii) s = loadstring('return '..p[1])() -- makes the string '{1,2,3}' become a table with 3 elements (1, 2 and 3)

for x=1,#s do -- from 1 to the number of elements in s, repeat:
  n[#n+1] = x>0+p[2] and #s>=x+p[3] and s[x] or _
  n[#n+1]   -- append to n
              0+p[2]   -- convert "2" to the number 2
            x>0+p[2] and #s>=x+p[3]   -- if we're past the start limit and before the end limit
                                    and s[x]   -- then the element to be appended is the one with index x of the original list
                                             or _   -- else append nil (the same as doing nothing)
end


print(table.concat(n, ", ")) -- (Footer) print the elements of n separated by commas

I used _ as nil just to be a little bit more clear (although this is not the point of these answers hahah). I could've used any variable that wasn't previously declared. _ doesn't have anything special in Lua.
And the comparisons are really messy because I tried to organize the math in a way that special characters would help me to use less space. ... and a>#b uses 1 more byte than ... and#b>a.

If you have any questions ask and I'll try to answer them.

Visckmart

Posted 2017-06-26T14:14:04.033

Reputation: 151

0

Recursiva, 7 bytes

Zba-Lac

Try it online!

officialaimm

Posted 2017-06-26T14:14:04.033

Reputation: 2 739

0

C (gcc), 16 bytes

The compiler instruction:

-DX(a,x,y)=(a+x)

As most would know, an array in C is just a known length and a pointer to the beginning of an array. Thus, we get an array with x members removed from the left and y members removed from the right by just moving the pointer to the array by +x.

Try it online!

user77406

Posted 2017-06-26T14:14:04.033

Reputation: