Riffle Array Umum


22

Golf sederhana untuk memulai minggu! Anda diberi tiga larik: larik dasar B , larik nilai V dan larik indeks I . Anda harus menghasilkan array lain di mana nilai-nilai dari Vdimasukkan ke Bdalam indeks yang ditentukan oleh I. Berikut ini sebuah contoh:

Base:    [5, 1, 4, 1, 3]
Values:  [0, 0, 7]
Indices: [5, 0, 3]

Indeks menunjuk pada posisi berikut dalam array dasar:

[ 5, 1, 4, 1, 3 ]
 ^        ^    ^
 0        3    5

Jadi, memasukkan elemen yang sesuai dari array nilai, hasilnya harus:

[0, 5, 1, 4, 7, 1, 3, 0]

Aturan

Anda dapat menulis suatu program atau fungsi, mengambil input melalui STDIN (atau alternatif terdekat), argumen baris perintah atau argumen fungsi dan output hasilnya melalui STDOUT (atau alternatif terdekat), nilai pengembalian fungsi, atau dengan memodifikasi array yang diberikan sebagai Bparameter .

Jika kiriman Anda adalah fungsi, Idan Vdapat dimodifikasi dengan cara apa pun, serta Bjika tidak digunakan untuk output.

Anda dapat membuat asumsi berikut tentang input:

  • Semua elemen basis dan nilai array akan menjadi bilangan bulat non-negatif.
  • Array nilai akan memiliki paling banyak satu elemen lebih dari array basis.
  • Array nilai dan array indeks akan memiliki jumlah elemen yang sama.
  • Array indeks tidak akan berisi indeks berulang, dan semua indeks akan berada dalam kisaran.
  • Basis dan nilai array dapat berisi elemen berulang.
  • Setiap atau semua array mungkin kosong.
  • Anda tidak boleh berasumsi bahwa indeks diberikan dalam urutan tertentu.
  • Anda dapat menerima input dan menghasilkan output dalam bentuk string atau daftar yang mudah, tidak ambigu. Anda juga dapat memilih untuk menerima tiga array dalam urutan yang berbeda.
  • Anda dapat memilih antara pengindeksan berbasis 0 dan 1.

Ini adalah kode golf, jadi jawaban tersingkat (dalam byte) menang.

Uji Kasus

Diberikan dalam format B V I => Resultpengindeksan berbasis 0. Jika Anda menggunakan pengindeksan berbasis 1, tambahkan elemen array ketiga dengan 1.

[] [] [] => []
[] [1] [0] => [1]
[1,2] [] [] => [1,2]
[1,2] [3] [0] => [3,1,2]
[1,2] [3] [1] => [1,3,2]
[1,2] [3] [2] => [1,2,3]
[0,0,0] [1,1,1,1] [0,1,2,3] => [1,0,1,0,1,0,1]
[5,1,4,1,3] [0,0,7] [5,0,3] => [0,5,1,4,7,1,3,0]
[1,2,3,4] [4,3,2,1] [4,0,3,1] => [3,1,1,2,3,2,4,4]

Beri tahu saya jika Anda menemukan casing tepi menarik lainnya, dan saya akan menambahkannya.

Papan peringkat

Berikut ini adalah Stack Snippet untuk menghasilkan leaderboard biasa dan gambaran umum pemenang berdasarkan bahasa.

Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:

# Language Name, N bytes

di mana Nukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda dapat menyimpan skor lama di headline, dengan mencoretnya. Contohnya:

# Ruby, <s>104</s> <s>101</s> 96 bytes


4
Bagaimana perasaan Anda tentang NULLarray kosong untuk bahasa di mana array kosong berada NULL?
Alex A.

@AlexA. Jika itu adalah umum / yang representasi dari array kosong dalam bahasa kata (s), aku baik-baik dengan itu.
Martin Ender

3
Sebuah golf sederhana ? Itu hal paling sulit yang saya lakukan di CJam sepanjang minggu. : P
Dennis

Jawaban:


13

Pyth, 14 byte

s.icFPQmedSCtQ

Demonstrasi.

Program ini mengambil input sebagai 3-tupel daftar dalam urutan Basis, Indeks, Nilai.

Penjelasan pada contoh [5, 1, 4, 1, 3], [5, 0, 3], [0, 0, 7]:

  1. Ambil input: implisit, Q adalah input.

  2. Buat indeks, pasangan nilai: CtQ=[(5, 0), (0, 0), (3, 7)]

  3. Urutkan pasangan ke dalam urutan indeks yang meningkat: SCtQ=[(0, 0), (3, 7), (5, 0)]

  4. Keluarkan nilai dari setiap pasangan: medSCtQ=[0, 7, 0]

  5. Membagi daftar pangkalan di lokasi indeks: cFPQ=[[], [5, 1, 4], [1, 3], []]

  6. Interleave 3 dan 4: .icFPQmedSCtQ=[[], 0, [5, 1, 4], 7, [1, 3], 0, []]

  7. Gabungkan menjadi satu daftar: s.icFPQmedSCtQ=[0, 5, 1, 4, 7, 1, 3, 0]


Mengutuk. Sejak kapan kita memiliki metode interleave? Hanya ingin memposting ssC,cFPQamedSCtQ].
Jakube

5
@Jakube isaac diam-diam melakukan itu dalam 6 hari yang lalu.
orlp


3
@ Jakube sejak Pyth dapat tumbuh untuk memecahkan masalah apa pun. Itulah masalah dengan bahasa golf. Bahasa esoteris ada demi bahasa esoterik; karena mereka dirancang * sesudahnya.
sentiao

@ sentiao Agar adil, bahasa host (Python) telah interleaving dengan nama yang berbeda untuk sementara waktu.
Mego

16

Python 2, 54

lambda B,*X:map(B.insert,*zip(*sorted(zip(*X))[::-1]))

Mengambil input sebagai B,I,V. Memodifikasi input Bsaat dipanggil (terima kasih kepada Martin Büttner karena mengingatkan saya bahwa ini mungkin).

Penggunaan mapuntuk memanggil B.insertsetiap pasangan indeks / elemen. Untuk menghindari masalah pergeseran daftar indeks saat elemen dimasukkan, urutkan pasangan dalam urutan indeks yang menurun dengan zip / sort / unzip yang jelek. Jika bukan karena masalah pergeseran, kita bisa melakukannya map(B.insert,*X).

Metode lama (65):

B,V,I=input()
for i,v in sorted(zip(I,V))[::-1]:B[i:i]=v,
print B

5

Haskell, 62 byte

import Data.List
f b v i=map snd$sort$zip[0.5,1.5..]b++zip i v

Contoh penggunaan: f [5,1,4,1,3] [0,0,7] [5,0,3]-> [0,5,1,4,7,1,3,0].

Cara kerjanya: tambahkan daftar basis dengan indeks "and-a-setengah" mulai dari 0.5(misalnya [(0.5,5),(1.5,1),(2.5,4),(3.5,1),(4.5,3)]) dan menyatukannya dengan pasangan nilai indeks. Sortir dan buang indeks.

Komentar : tidak tahu apakah saya curang di sini. Dari sudut pandang matematis tidak apa-apa, tetapi seorang programmer mungkin berpendapat bahwa daftar indeks [5,0,3]bukanlah daftar Integersseperti yang diminta, tetapi daftar Fractionals(tepatnya, tipenya adalah polimorfik, tetapi harus milik Fractionalkelas, misalnya Floatatau Double).


5

Ruby, 60 59 53 byte

->a,b,c{c.zip(b).sort.reverse.map{|i,v|a.insert i,v}}

Dan versi yang tidak diserang

def riffle(array, values, indices)
    indices.zip(values).sort.reverse.each do |index, value|
        array.insert(index, value)
    end
end

2
Anda dapat mempersingkat ini dengan membuatnya fungsi yang tidak disebutkan namanya sebagai gantinya: ->a,b,c{...}. Kemungkinan insertjuga tidak perlu tanda kurung.
Martin Ender

@ MartinBüttner Saya memang tahu tentang fungsi yang tidak disebutkan namanya dengan lambda, tapi saya tidak merasa itu adalah semangat tantangan (yang biasanya meminta fungsi yang disebutkan). Terima kasih telah melihat parensnya.
Dylan Frese

Kecuali tantangan secara khusus meminta fungsi yang disebutkan , fungsi yang tidak disebutkan namanya selalu dapat diterima . Dan saya tidak meminta fungsi bernama (Saya tidak pernah melakukannya;)).
Martin Ender

5

CJam, 34 23 18 byte

{.\2/\ee+{0=}$1f=}

Pengajuan CJam pertama saya. Saran dipersilahkan, saya yakin ada banyak golf.

16 byte disimpan dengan bantuan @ MartinBüttner dan @Dennis.

Berfungsi mengharapkan input pada stack secara berurutan B V I(I adalah yang teratas).

Contoh penggunaan:

[5 1 4 1 3] [0 0 7] [5 0 3] {.\2/\ee+{0=}$1f=}~

Metode:

  • pasangkan ielemen th array dengani+0.5
  • memasangkan nilai-nilai insert dengan posisi insert
  • menggabungkan dua array yang dihasilkan
  • mengurutkan array berdasarkan elemen posisi
  • menjaga elemen nilai

Pendekatan floating point itu sangat pintar dan (sayangnya) lebih baik dari pada pendekatan saya. Anda bisa turun ke 19 byte dengan q~.5fm.\2/\ee+$1f=pdan ke 18 byte dengan menggunakan fungsi anonim:{.5fm.\2/\ee+$1f=}
Dennis

Gagasan yang sama tanpa trik floating-point: {.\2/\ee+{0=}$1f=}(masih 18 byte)
Dennis

@ Dennis Terima kasih, saya tidak dapat menemukan get array elementoperator untuk 1f=. Saya akan meninggalkannya sebagai program penuh sekalipun.
randomra

Panggilanmu. Apakah Anda keberatan saya bertanya mengapa Anda menentang memposting fungsi?
Dennis

@ Dennis Saya baru saja memulai CJam dan tidak yakin bagaimana cara menggunakan fungsinya. Sekarang saya menemukan jawabannya jadi saya mengubah jawaban untuk itu.
randomra

5

K, 22 21 byte

{,//+(y@<z;(z@<z)_ x)}

Kami mendefinisikan fungsi 3 argumen {…}dengan variabel implisit x, ydan zmewakili daftar awal, daftar nilai dan daftar indeks, masing-masing. Operator "cut" ( _) digunakan untuk memisahkan daftar awal pada daftar yang diurutkan dari indeks yang diberikan ( (z@<z)). Kami interleave nilai (setelah mengurutkannya) dengan potongan yang dibagi dari array asli dengan membentuk daftar ( (a;b)), mengambil transposnya ( +) dan meratakan hasilnya ( ,//).

Contoh penggunaan:

  f:{,//+(y@<z;(z@<z)_ x)}
{,//+(y@<z;(z@<z)_ x)}

  f[1 2 3 4;4 3 2 1;4 0 3 1]
3 1 1 2 3 2 4 4

  f[5 1 4 1 3;0 0 7;5 0 3]
0 5 1 4 7 1 3 0

Spasi di sekitar garis bawah diperlukan karena K memungkinkan garis bawah pada pengidentifikasi. K5 menghilangkan ambiguitas potensial ini. Jika kita dapat mengandalkan indeks yang datang dalam urutan naik dan garis bawah bukan pengidentifikasi yang valid, kita dapat menggunakan program 13 byte yang jauh lebih baik:

{,//+(y;z_x)}

(mendesah.)

edit:

{,//+(y@<z;(z@<z)_ x)} / before
{,//+(y@<z;z[<z]_ x)}  / after

Mematahkan simetri, tetapi kita dapat menyimpan byte dengan menggunakan pengindeksan braket ( […]) alih-alih @operator pengindeksan infiks . Biasanya ini membuat program lebih lama, tetapi dalam hal ini kami memerlukan parens untuk menyortir zsebelum melakukan pemotongan.


4

Pyth, 17 byte

ssC,cFPQamedSCtQ]

@isaacg sudah mengalahkan solusi saya. Tapi karena dokumentasi saya sudah selesai, saya hanya akan mempostingnya.

Ini mengambil input dalam format B, I, V. Anda dapat mencobanya di sini: Demonstrasi atau Test Suite

Penjelasan:

Saya menggunakan contoh B = [5,1,4,1,3], I = [5,0,3], V = [0,0,7]dari OP.

                    implicit: Q = input()
      PQ            all elements but last of Q   => [[5,1,4,1,3], [5,0,3]]
    cF              split B it the indices in I  => [[], [5,1,4], [1,3], []]

              tQ    all elements but first of Q  => [[5,0,3], [0,0,7]]
             C      zip                          => [(5,0), (0,0), (3,7)]
            S       sort                         => [(0,0), (3,7), (5,0)]
         med        extract the end of each pair => [0,7,0]
        a       ]   append an empty list         => [0,7,0,[]]

   ,                create a pair => ([[], [5,1,4], [1,3], []], [0,7,0,[]])
  C                 zip           => [([],0), ([5,1,4],7), ([1,3],0), ([],[])]
 s                  sum           => ([],0,[5,1,4],7,[1,3],0,[],[])
s                   sum           => [0,5,1,4,7,1,3,0]

4

JavaScript (ES6), 75

Fungsi dengan 3 parameter array, mengembalikan array. Anehnya, fungsi ini mengubah iparameternya (sebagaimana diizinkan oleh OP)

Tes menjalankan cuplikan, Firefox hanya seperti biasa.

f=(b,v,i,j=0)=>b.concat(v).map(p=>(p=i.indexOf(j))<0?b[j++]:(i[p]=-1,v[p]))

// TEST
out=x=>O.innerHTML+=x+'\n'

test=[
{ b:[], v:[], i:[], k:[] },
{ b:[], v:[1], i:[0], k:[1] },
{ b:[1,2], v:[], i:[], k:[1,2] },
{ b:[1,2], v:[3], i:[0], k:[3,1,2] },
{ b:[1,2], v:[3], i:[1], k:[1,3,2] },
{ b:[1,2], v:[3], i:[2], k:[1,2,3] },
{ b:[0,0,0], v:[1,1,1,1], i:[0,1,2,3], k:[1,0,1,0,1,0,1] },
{ b:[5,1,4,1,3], v:[0,0,7], i:[5,0,3], k:[0,5,1,4,7,1,3,0] },
{ b:[1,2,3,4], v:[4,3,2,1], i:[4,0,3,1], k:[3,1,1,2,3,2,4,4] }
];

test.forEach(x=>{
  r = f(x.b,x.v,x.i.slice(0)) // pass a copy of i, as the function will alter it
  ok = ''+r==''+x.k
  s='Test ' + (ok?'OK':'FAIL')
  +'\n B ['+x.b
  +']\n V ['+x.v
  +']\n I ['+x.i
  +']\n Result ['+r
  +']\n Check  ['+x.k
  +']\n'
  out(s)
  
})
<pre id=O></pre>


Karena penasaran, bagaimana dengan kode yang membuatnya khusus untuk Firefox? Apakah karena ES6?
Alex A.

@ AlexA.it karena ES6, ya. Khususnya fat arrow functionitu tidak diterapkan bahkan dalam versi pengembang Chrome (AFAIK)
edc65

Memang, bahkan Chrome Canary build tidak mendukungnya.
DocMax

4

Mathematica, 52 51 byte

Last/@(Tr@#2->#&~MapIndexed~#⋃Thread[#3+.5->#2])&

Contoh:

In[1]:= f = Last/@(Tr@#2->#&~MapIndexed~#⋃Thread[#3+.5->#2])&;

In[2]:= f[{5, 1, 4, 1, 3}, {0, 0, 7}, {5, 0, 3}]

Out[2]= {0, 5, 1, 4, 7, 1, 3, 0}

Penjelasan:

Menggunakan contoh di atas.

  • Tr@#2->#&~MapIndexed~# => {1 -> 5, 2 -> 1, 3 -> 4, 4 -> 1, 5 -> 3}
  • Thread[#3+.5->#2] => {5.5 -> 0, 0.5 -> 0, 3.5 -> 7}
  • Kemudian ambil gabungan (diurutkan) dari dua daftar ini. (=> {0.5 -> 0, 1 -> 5, 2 -> 1, 3 -> 4, 3.5 -> 7, 4 -> 1, 5 -> 3, 5.5 -> 0})
  • Dan kemudian ambil elemen terakhir dari setiap pasangan. (=> {0, 5, 1, 4, 7, 1, 3, 0})


3

R, 75 byte

function(b,v,i){n=b;j=0;for(g in v)n=append(n,g,i[j<-j+1]+sum(i<i[j])-1);n}

Ini menciptakan fungsi yang tidak disebutkan namanya. Untuk menyebutnya, berikan nama, mis f=function.... Perhatikan bahwa array harus diindeks 1 karena hanya itulah R rolls.

Penjelasan + tidak dikumpulkan:

f <- function(b, v, i) {
    # Initialize the output vector to b
    n <- b

    # Initialize an index over the indices
    j <- 0

    # Loop over the values to insert
    for(g in v) {
        # Get the index of the next given insertion index
        j <- j + 1

        # Insert g into n.
        # The position at which to insert the value is determined by
        # adding the number of indices less than the current one and
        # subtracting 1. The subtraction is because we're using the
        # `after` argument in the `append` function.

        n <- append(n, g, i[j] + sum(i < i[j]) - 1)
    }

    # Return n
    n
}

Contoh:

> f(c(), c(), c())
[1] NULL

> f(c(0, 0, 0), c(1, 1, 1, 1), c(1, 2, 3, 4))
[1] 1 0 1 0 1 0 1

> f(c(5, 1, 4, 1, 3), c(0, 0, 7), c(6, 1, 4))
[1] 0 5 1 4 7 1 3 0

Saran diterima seperti biasa!


2

CJam, 19 byte

l~_,)N*q~.{t}~.\N-p

Ini adalah program lengkap yang membaca array B , I dan V (satu per baris, dalam urutan itu) dari STDIN.

Cobalah online di juru bahasa CJam .

Bagaimana itu bekerja

l~    e# Evaluate the first line of input.
_,)   e# Compute the array length and add 1.
N*    e# Push a string of that many linefeeds.
q~    e# Evaluate the remaining input.
.{t}~ e# Vectorized array set: for each index in the array from line 2, replace the
      e# LF at that index by the corresponding element of the array from line 3.
.\    e# Interleave the two arrays on the stack.
N-    e# Remove the linefeeds.
p     e# Print.

CJam, 20 byte

{Qa+@@.{a2$2$=+t}e_}

Ini adalah fungsi anonim yang muncul B , V dan I (atas ke bawah) dari tumpukan dan meninggalkan satu array pada tumpukan sebagai balasannya.

Cobalah online di juru bahasa CJam .

Bagaimana itu bekerja

Qa+      e# Append [[]] to B.
@@       e# Rotate V and I on top of B.
.{       e# For each v in V and the corresponding i in I:
   a     e#     Push [v].
   2$2$= e#     Retrieve b := B[i].
   +     e#     Append to push [v b].
         e#     The stack now consists of: B i [v b]
   t     e#     Set B[i] := [v b].
}        e#
e_       e# Flatten B.

1

Ruby, 48 byte

Saya pikir ini sesuai dengan aturan, tapi tolong periksa.

->b,v,i{l=-1;i.map{|j|b[j]=[v[l+=1],b[j]]};b*?:}

Fungsi yang tidak disebutkan namanya mengambil tiga array sebagai input. Menghasilkan string yang dapat diuraikan secara jelas ke dalam array angka dengan ekspresi ruby x.split(/:+/).map(&:to_i).

Uji kasus pada ideone .

Saya bisa menyimpan 3 byte lebih banyak, tetapi format outputnya [1,2,[nil,5]]terlalu ketat dengan aturan myo imo, meskipun tidak ambigu.


Saya pikir format saat ini baik-baik saja. Array bersarang dengan nilnilai interleaving sedikit meregang. Namun dalam kedua kasus ini tidak memenangkan kontes, jadi saya tidak terlalu khawatir tentang hal itu.
Martin Ender

1

R, 60

Sebagai fungsi tanpa nama yang mengambil b, v dan i

function(b,v,i){e=c(NA,rbind(b,NA));e[i*2+1]=v;e[!is.na(e)]}

Perluas b dengan NAs. Mengisi celah yang diperlukan dengan v Mengembalikan vektor tanpa NAS

> f=function(b,v,i){e=c(NA,rbind(b,NA));e[i*2+1]=v;e[!is.na(e)]}
> f(c(), c(), c())
logical(0)
> f(c(0, 0, 0), c(1, 1, 1, 1), c(0, 1, 2, 3))
[1] 1 0 1 0 1 0 1
> f(c(5, 1, 4, 1, 3), c(0, 0, 7), c(5, 0, 3))
[1] 0 5 1 4 7 1 3 0

1

Jawa, 253, 226, 219, 209

bukan pemenang, tapi oh well.

Dengan asumsi bahwa B, V, dan saya bukan nol. v (huruf kecil v) adalah panjang dari array Nilai / Kebijakan. R adalah array yang dikembalikan. r adalah panjang array yang dikembalikan. x, y, dan saya semua ints sementara.

int[]f(int[]B,int[]V,int[]I){int v=V.length,r=B.length+v,x,y,i;int[]R=java.utils.Arrays.copyOf(B,r);for(x=0;x<v;x++){i=I[x];for(y=0;y<x;y++)if(I[x]>I[y])i++;for(y=r-2;y>=i;y--)R[y+1]=R[y];R[i]=V[x];}return R;}

diperluas:

int[]f( int[] B, int[] V, int[] I ) {
    int v = V.length, //length of Values
        r = B.length + v, //length of the result
        x, y, i; //temps
        int[] R = java.utils.Arrays.copyOf( B, r );       
        for( x = 0; x < v; x++ ) {
        i = I[x];
        for( y = 0; y < x; y++ )
            if( I[x] > I[y] )
                i++;
        for( y = r - 2; y >= i; y-- )
            R[y+1] = R[y];
        R[i] = V[x];
    }
    return R;
}

1

APL, 22 byte

{(∊⌽2↑⍵)[⍋(2⊃⍵),⍳≢⊃⍵]}

Dalam ⎕IO ← 0 untuk mencocokkan kasus uji.

Ini adalah algoritma standar: vektor indeks dari argumen pertama ditambahkan ke indeks yang diberikan (argumen ke-3). menghitung permutasi yang akan mengurutkan indeks dalam urutan menaik. Karena algoritme pengurutan APL stabil menurut definisi, permutasi yang dihitung menempatkan elemen katenasi argumen kedua dan pertama di tempat yang tepat.

Misalnya :

    {(∊⌽2↑⍵)[⍋(2⊃⍵),⍳≢⊃⍵]}(5 1 4 1 3)(0 0 7)(5 0 3)
0 5 1 4 7 1 3 0
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.