Potong array!


27

Diberikan array integer dan dua angka sebagai input, hapus sejumlah elemen pertama dan terakhir, ditentukan oleh angka. Input dapat dalam urutan apa pun yang Anda inginkan.

Anda harus menghapus elemen x pertama , di mana x adalah input numerik pertama, dan juga menghapus elemen y terakhir , di mana y adalah input numerik kedua.

Array yang dihasilkan dijamin memiliki panjang setidaknya dua.

Contoh:

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

2
Apa sebenarnya yang dimaksud dengan "menghapus" nilai-nilai dari sebuah array — terutama untuk menghapusnya dari akhir? Dalam bahasa seperti C, di mana array hanyalah sebuah penunjuk ke elemen pertama dan panjang, bisakah kita mengubah panjangnya untuk memotong array? Itulah yang biasanya dilakukan dalam pemrograman dunia nyata, tetapi tantangannya tidak jelas bagi saya.
Cody Gray

@CodyGray Menghapus nilai dari array adalah apa yang seharusnya terlihat seperti, tapi belum tentu apa yang terjadi di balik layar.
Okx

4
Apa yang Anda maksud dengan "terlihat seperti"? Array tidak memiliki tampilan - itu adalah semua di belakang layar!
Cody Gray


2
@ Ok Tidak, itu sangat buggy, saya sarankan menambahkan leaderboard.
Erik the Outgolfer

Jawaban:


16

Haskell, 55 39 33 29 byte

Disimpan 16 byte berkat Laikoni

Disimpan 6 byte lebih banyak berkat Laikoni

Disimpan 4 byte lebih banyak berkat Laikoni

Saya yakin ini bisa ditingkatkan, tetapi sebagai pemula, berikan yang terbaik.

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

Pemakaian

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

Cobalah online!


5
Selamat datang di PPCG dan golf Haskell khususnya! Tujuannya adalah untuk menggunakan byte sesedikit mungkin, jadi Anda dapat misalnya menghapus sebagian besar ruang dan mempersingkat xs.
Laikoni

@Laikoni Ah, terima kasih! Diedit, tidak dapat melihat diri saya menjadi lebih pendek tanpa fungsi anonim dan menggunakan aplikasi untuk fungsi (tidak yakin bagaimana cara kerjanya).
Henry

Terlihat bagus sekarang! :) Jika Anda mengubah f x a bke f a b x, Anda hanya bisa drop x: f a b=reverse.drop b.reverse.drop a.
Laikoni

1
@Laikoni Wow, trik infiks yang menarik. Terima kasih lagi! Saya dapat mempersingkat menjadi 33 byte, tetapi coba lakukan a#b=let r=reverse in r.drop b.r.drop aadalah 38 byte. Atau apakah kita diizinkan memiliki fungsi yang dideklarasikan di luar yang ini?
Henry

1
@Laikoni Terima kasih atas perkenalannya, sangat membantu. Baru saja menemukan situs ini hari ini, tetapi pasti ingin bermain-main lagi di sini!
Henry


6

Mathematica, 17 byte

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

memasukkan

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


Penggunaan yang bagus ;;! Saya berhasil mengikat Anda dengan Drop@##2~Drop~-#&(jika kami mengambil input dalam urutan yang aneh seperti 1, {1,2,3,4,5,6}, 2), tetapi tidak lebih baik.
Greg Martin

6

Python , 28 26 byte

-2 byte terima kasih kepada @Rod

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

Cobalah online!


simpan 6 ...lambda a,n,m:a[n:~m]
Aaron

@ Harun ini menghapus satu item terlalu banyak.
ovs

buruk saya .. Ini adalah trik umum yang kadang-kadang saya gunakan, dan tidak sepenuhnya memeriksa terhadap persyaratan tantangan ..
Aaron

@ Harun slice memiliki prioritas operator yang lebih tinggi daripada +dan karenanya diterapkan [0]. Anda akan perlu kurung: (a+[0])[n:~m].
ovs

yah, baru sadar itu nanti .. Aku sedang berusaha mewujudkan ideku
Aaron

6

C # (.NET Core) , 55 54 byte

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

Cobalah online!

Menggunakan List<int>input sebagai.

  • 1 byte disimpan berkat TheLethalCoder!

1
Saya baru saja akan menjawab +1 ini. Namun, Anda dapat menyimpan byte dengan mengambil Listsebagai masukan sehingga Anda dapat menggunakan Countbukan Length.
TheLethalCoder

Saya datang dengan menggunakan solusi Whereyang hanya sedikit lebih lama dari cara ini yang saya cukup senang juga :)
TheLethalCoder

Anda tidak perlu menambahkan using System.Linq;ke hitungan byte :)
Stefan

@Stefan saya harus menghitung setiap usingsaya menambahkan jawaban saya, dan metode Skipdan Takemembutuhkannya using.
Charlie

hm baik. Pada beberapa tantangan lain saya diberitahu bahwa usings itu di mana tidak perlu.
Stefan

5

Perl 5 , 21 byte

19 byte kode + -apbendera.

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

Cobalah online!

Menggunakan -auntuk otomatis memasukkan input di dalam @F, maka hanya menyimpan sepotong sesuai dengan input lainnya: dari indeks <>(input kedua) ke indeks $#F-<>(ukuran array dikurangi input ketiga). Dan $_dicetak secara tersirat berkat -pbendera.


5

Karat, 29 byte

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

Sebut saja sebagai berikut:

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

Saya banyak bersenang-senang berkelahi dengan pemeriksa pinjaman mencari tahu apa pendekatan yang paling pendek untuk membuatnya menyimpulkan seumur hidup dari potongan yang dikembalikan. Perilakunya di sekitar penutupan agak tidak menentu, karena akan menyimpulkan masa hidup, tetapi hanya jika Anda tidak benar-benar mendeklarasikan parameter sebagai tipe referensi. Sayangnya konflik ini dengan yang diperlukan untuk mendefinisikan tipe argumen dalam tanda tangan sebagai pemanggilan metode n.len perlu mengetahui jenis itu beroperasi.

Pendekatan lain saya mencoba mengatasi masalah ini:

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


4

C #, 62 byte

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

Mengambil List<int>input as dan mengembalikan IEnumerable<int>.


Ini juga berfungsi untuk 64 byte:

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

4

TIS-100, 413 405 Bytes

472 siklus, 5 node, 35 baris kode

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

M4,6 di bagian atas bukan bagian dari kode, tetapi menandakan penempatan modul memori.

masukkan deskripsi gambar di sini

Mainkan level ini sendiri dengan menempelkan ini ke dalam permainan:


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

Jadi saya kira ini juga dianggap sebagai jawaban lua ...


Anda sekarang dapat mencobanya secara online! Catatan: Saya harus melakukan yang cerdas, dan menggunakan bagian atas file kode sebagai satu sumber input, karena TIO saat ini hanya menyediakan satu file input.
Phlarx

4

MATL , 6 byte

QJi-h)

Cobalah online!

Input diberikan sebagai 1) jumlah elemen yang harus dipotong dari awal; 2) jumlah elemen yang harus dipotong dari ujung; 3) array. Penjelasan

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.


3

JavaScript (ES6), 27 byte

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

Parameter kedua negatif untuk sliceberhenti mengiris mdari ujung, namun ketika mnol kita harus melewati placeholder (di Infinitysini, meskipun (a,n,m,o)=>a.slice(n,-m||o)juga berfungsi).


3

R , 32 31 30 byte

-1 byte berkat Rift

-1 byte terima kasih kepada Jarko Dubbeldam

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

Mengevaluasi fungsi anonim:

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

1+ldiperlukan karena R memiliki pengindeksan berbasis 1. sum(n|1)setara dengan length(n)tetapi satu byte lebih pendek.

Cobalah online!


1
hemat 1 byte denganpryr::f(n[(1+l):(length(n)-r)])
Rift

1
Jumlah (n | 1) lebih pendek dari panjang (n)
JAD

@JarkoDubbeldam luar biasa, terima kasih.
Giuseppe

3

MATL , 10 byte

tniQwi-&:)

Cobalah online!

Penjelasan:

Agak panjang untuk hanya 11 byte, tapi saya menulisnya secara rinci, untuk mempelajarinya sendiri juga.

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


(masih, ada upvote - saya percaya ini baik golf dan menjelaskan mempertimbangkan metode yang Anda gunakan)
Sanchises

Tidak, saya tidak melupakannya! Saya mencoba, tetapi saya tidak tahu bagaimana cara membuatnya bekerja, (dan saya benar-benar mencoba). Saya menyimpulkan bahwa tidak mungkin untuk mengurangi sesuatu dari J, ketika digunakan seperti ini. Saya curiga saya salah, saya hanya tidak bisa mengetahuinya untuk kehidupan saya ... Terima kasih telah menghubungkan ke jawaban Anda, saya sangat pemula di MATL ...
Stewie Griffin

Jangan khawatir, saya juga masih belajar banyak - misalnya, urutan input ke )dan lebih terkenal ( menggigil ...
Sanchises

@Sanchises Sangat terlambat komentar, tapi saya senang bukan hanya saya yang menemukan urutan input (membingungkan. :) Saya selalu membaca "ddi" (= "tujuan, data, indeks" dari manual) setiap waktu, dan kadang-kadang masih salah.
sundar - Reinstate Monica

3

C ++, 96 95 byte

Terima kasih kepada @Tas karena telah menghemat satu byte!

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

Cobalah online!

C ++ (MinGW), 91 byte

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

Apakah maksud Anda #include<list>? Anda bisa mencukur byte dengan memiliki int f. Compiler akan memungkinkan suatu fungsi untuk tidak kembali, tetapi mereka akan memperingatkannya
Tas

Ya, terima kasih, int fakan bekerja pada sebagian besar kompiler, saya akan mengeditnya. Pada MinGW, bahkan sepenuhnya menghilangkan jenis fungsi berfungsi. Dan ya, #include<list>akan menjadi cara yang sesuai standar untuk memasukkan header, tetapi #import<list>harus bekerja setidaknya pada GCC, MinGW, dan MSVC, jadi itu juga tidak masalah.
Steadybox

2

APL (Dyalog) , 8 7 byte

⌽⎕↓⌽⎕↓⎕

Cobalah online!

Ini mengambil array sebagai input pertama, diikuti oleh dua angka secara terpisah.

Penjelasan

            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

Alternatif 7 byte solusi:⎕↓⎕↓⍨-⎕
Adám


2

Brain-Flak , 60 byte

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

Cobalah online!

Input dalam format ini:

x

a
r
r
a
y

y

Di mana xnomor yang akan diambil dari depan, ynomor yang akan diambil dari belakang, dan susunannya hanyalah berapa banyak angka yang Anda inginkan, dipisahkan oleh baris baru. Inilah dua upaya pertama saya (lebih lama):

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

Dan inilah penjelasannya:

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

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

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

>)[()]}{}

1
Senang melihat solusi tarpit turing setiap sekarang dan kemudian.
Okx

2

APL (Dyalog) , 5 byte

(⌽↓)/

Cobalah online!


Format input adalah y x A

Penjelasan

/ adalah Reduce, yang menyisipkan fungsi ke kiri di antara setiap pasangan elemen argumen

(⌽↓)adalah fungsi yang setara dengan kereta {⌽⍺↓⍵}, yang menghilangkan elemen pertama dari array dan kemudian membalikkan array. ( adalah argumen kiri dan argumen kanan)

Jadi, (⌽↓)/y x Asama dengan ⌽y↓⌽x↓A, yang dibutuhkan.


2

Java 8, 82 byte

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

Coba di sini.

Alternatif dengan penghitungan byte yang sama ( 82 ) menggunakan 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;}

Coba di sini.

Penjelasan:

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()Metode salinan array dari sumber array yang ditentukan, dimulai pada posisi yang ditentukan, untuk posisi tertentu dari array tujuan. Selanjutnya komponen array disalin dari array sumber yang dirujuk oleh srcke array tujuan yang direferensikan oleh dest. Jumlah komponen yang disalin sama denganlength argumen.

Komponen pada posisi srcPosmelalui srcPos + length - 1dalam larik sumber disalin ke posisi destPosmelalui destPos + length - 1, masing-masing, dari larik tujuan.


Bisakah Anda menyimpan byte dengan tidak menggunakan currying?
TheLethalCoder

@TheLethalCoder Tidak, dalam hal ini tidak. (a,n,m)->memiliki byte-count yang sama dengan a->n->m->. Meskipun Anda benar, saya bisa saja menggunakan panggilan biasa alih-alih menjilat. Saya agak terbiasa menggunakan currying ketika saya memiliki dua (atau lebih) parameter .. Saya sudah membuat kesalahan menggunakan currying ketika saya memiliki empat parameter beberapa kali ..
Kevin Cruijssen

Ahh Anda benar saya salah menghitung byte dan saya sudah melakukannya juga kari pasti pergi sekarang!
TheLethalCoder

Tidak ada tautan TIO? -
totallyhuman

2
Maaf, tidak bisa membiarkan itu berlalu. Saya memposting jawaban saya sendiri karena ... ada built-in (ok, tidak persis, tetapi hampir)! : o
Olivier Grégoire


2

Kotlin , 30 byte

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

Cobalah online!

Dibawa List<Int>sebagai input dan turun dari awal dan kemudian dari ujung.


1
Saya tidak punya akses try it online. Bisakah Anda menambahkan kode penelepon? bagaimana mengkompilasi lambda tanpa jenis definisi di Kotlin? Terima kasih.
mazzy

1
@ Mazzy itu mungkin bisa hack, tetapi Anda dapat menentukan jenis dalam definisi tipe variabel sebagaival f: (List<Int>, Int, Int) -> List<Int>
YGolybev

Oke! Bagus. Saya tidak tahu apakah ini valid di CodeGolf.
mazzy

2

Brachylog , 11 10 byte

kb₍B&t;Bk₍

Cobalah online!

Mengambil input sebagai [x, A, y] dengan A adalah larik yang akan dipotong.

(-1 byte berkat @Fatalize.)


Anda dapat mempersingkat dengan 1 byte seperti: kb₍B&t;Bk₍. ,tidak menambahkan (lihat hasil dari program parsial ini ), itu tidak bertindak seperti . Juga jangan mencoba untuk menyalin sesuatu dari yang lama (2016-awal 2017) jawaban Brachylog karena itu adalah versi bahasa pertama, dan program tidak kompatibel ulang (khususnya, ,di Brachylog v1 sekarang di Brachylog v2)
Fatalkan

@Terima kasih, diperbarui. Begitu ,juga menambahkan dalam versi sebelumnya, tapi itu tidak masalah dalam kasus ini karena ada tsetelahnya - kebetulan kebetulan. Dan ya, saya menyadari perbedaan versi setelah saya memposting ini, saya masih memikirkan hal-hal dan kikuk pada tahap ini. :)
sundar - Reinstate Monica


1

Pyth, 5 byte

>E<QE

Coba di sini

Membawa argumen dalam urutan yang berlawanan. <dan >dalam Pyth trim berdasarkan urutan argumen. Misalnya, <Q5akan memangkas semua nilai dalam input setelah yang kelima.



1

CJam , 8 byte

{_,@-<>}

Blok anonim yang mengambil input dari tumpukan dalam urutan x , y , larik, dan menggantinya dengan larik keluaran.

Cobalah online!

Penjelasan

Pertimbangkan input 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]

1
Poin yang bagus, kemudian hanya untuk bersenang-senang, berikut ini adalah solusi alternatif 8-byte :) tio.run/##S85KzP1vxGXIFW1ooGBkoGBsoGBqoGBmEPu/Olg7ps7GrvZ/…
Martin Ender

1

q / kdb, 12 byte

Larutan:

{(0-z)_y _x}

Contoh:

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

Penjelasan:

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.