Riffle Array ทั่วไป


22

สนามกอล์ฟที่ง่ายต่อการเริ่มต้นสัปดาห์! คุณกำลังได้รับสามอาร์เรย์ที่: อาร์เรย์ฐาน Bที่ค่าอาร์เรย์ Vและอาร์เรย์ดัชนี Iคุณควรผลิตอาร์เรย์อื่นที่ค่าจากVจะแทรกเข้าไปในดัชนีที่กำหนดโดยB Iนี่คือตัวอย่าง:

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

ดัชนีชี้ไปที่ตำแหน่งต่อไปนี้ในอาร์เรย์ฐาน:

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

ดังนั้นการแทรกองค์ประกอบที่สอดคล้องกันจากอาร์เรย์ค่าผลลัพธ์ควรเป็น:

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

กฎระเบียบ

คุณอาจจะเขียนโปรแกรมหรือฟังก์ชั่นการป้อนข้อมูลผ่านทาง STDIN (หรือทางเลือกที่ใกล้เคียงที่สุด) อาร์กิวเมนต์บรรทัดคำสั่งหรือข้อโต้แย้งฟังก์ชั่นและการส่งออกผลผ่าน STDOUT (หรือทางเลือกที่ใกล้เคียงที่สุด) ส่งคืนค่าฟังก์ชั่นหรือโดยการปรับเปลี่ยนอาร์เรย์ที่กำหนดเป็นBพารามิเตอร์ .

หากการส่งของคุณเป็นฟังก์ชั่นIและVสามารถแก้ไขได้ในทางใดทางหนึ่งเช่นเดียวกับBถ้ามันไม่ได้ใช้สำหรับการส่งออก

คุณอาจทำการสันนิษฐานต่อไปนี้เกี่ยวกับอินพุต:

  • องค์ประกอบทั้งหมดของอาร์เรย์ฐานและค่าจะเป็นจำนวนเต็มไม่เป็นลบ
  • อาร์เรย์ที่มีค่าจะมีองค์ประกอบได้มากกว่าหนึ่งรายการมากกว่าอาร์เรย์ฐาน
  • อาร์เรย์ค่าและอาร์เรย์ดัชนีจะมีจำนวนองค์ประกอบเท่ากัน
  • อาร์เรย์ดัชนีจะไม่มีดัชนีซ้ำและดัชนีทั้งหมดจะอยู่ในช่วง
  • อาร์เรย์ฐานและค่าอาจมีองค์ประกอบที่ซ้ำกัน
  • อาร์เรย์ใด ๆ หรือทั้งหมดอาจว่างเปล่า
  • คุณต้องไม่คิดว่าจะมีการจัดทำดัชนีตามลำดับใด ๆ
  • คุณอาจได้รับอินพุตและสร้างเอาต์พุตในรูปแบบสตริงหรือรายการที่สะดวกและชัดเจน คุณอาจเลือกที่จะรับสามอาร์เรย์ในลำดับที่แตกต่างกัน
  • คุณสามารถเลือกระหว่างการจัดทำดัชนีแบบ 0 และ 1

นี่คือรหัสกอล์ฟดังนั้นคำตอบที่สั้นที่สุด (เป็นไบต์) ชนะ

กรณีทดสอบ

กำหนดในรูปแบบB V I => Resultสำหรับการจัดทำดัชนีแบบ0 หากคุณกำลังใช้การจัดทำดัชนีแบบ 1 ให้เพิ่มองค์ประกอบของอาร์เรย์ที่สามด้วย 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]

แจ้งให้เราทราบหากคุณเจอกรณีขอบที่น่าสนใจอื่น ๆ และฉันจะเพิ่มพวกเขา

ลีดเดอร์บอร์ด

นี่คือตัวอย่างข้อมูลเพื่อสร้างทั้งกระดานผู้นำปกติและภาพรวมของผู้ชนะตามภาษา

เพื่อให้แน่ใจว่าคำตอบของคุณปรากฏขึ้นโปรดเริ่มคำตอบด้วยหัวข้อโดยใช้เทมเพลต Markdown ต่อไปนี้:

# Language Name, N bytes

ที่Nมีขนาดของส่งของคุณ หากคุณปรับปรุงคะแนนของคุณคุณสามารถเก็บคะแนนเก่าไว้ในพาดหัวโดยการตีพวกเขาผ่าน ตัวอย่างเช่น

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


4
คุณรู้สึกอย่างไรเกี่ยวกับNULLอาเรย์ที่ว่างเปล่าสำหรับภาษาที่อาเรย์ที่ว่างอยู่คือNULLอะไร?
Alex A.

@AlexA ถ้ามันเป็นเรื่องธรรมดา / การเป็นตัวแทนของอาเรย์ที่ว่างเปล่าในภาษาที่พูดฉันไม่เป็นไร
Martin Ender

3
กอล์ฟง่าย ? นั่นเป็นสิ่งที่ยากที่สุดที่ฉันทำใน CJam ตลอดทั้งสัปดาห์ : P
Dennis

คำตอบ:


13

Pyth, 14 ไบต์

s.icFPQmedSCtQ

สาธิต.

โปรแกรมนี้รับอินพุตเป็น 3-tuple ของรายการใน Base order, Indices, Values

คำอธิบายในตัวอย่าง[5, 1, 4, 1, 3], [5, 0, 3], [0, 0, 7]:

  1. รับอินพุต: implicit, Q คืออินพุต

  2. ทำดัชนีคู่ค่า: CtQ=[(5, 0), (0, 0), (3, 7)]

  3. จัดเรียงคู่ในลำดับดัชนีที่เพิ่มขึ้น: SCtQ=[(0, 0), (3, 7), (5, 0)]

  4. นำค่าออกจากแต่ละคู่: medSCtQ=[0, 7, 0]

  5. แยกรายชื่อฐานที่ตำแหน่งของตัวบ่งชี้: cFPQ=[[], [5, 1, 4], [1, 3], []]

  6. แทรก 3 และ 4: .icFPQmedSCtQ=[[], 0, [5, 1, 4], 7, [1, 3], 0, []]

  7. รวมเป็นหนึ่งรายการ: s.icFPQmedSCtQ=[0, 5, 1, 4, 7, 1, 3, 0]


ประณาม. ตั้งแต่เมื่อไหร่ที่เรามีวิธีการสอดแทรก ssC,cFPQamedSCtQ]แค่อยากจะโพสต์
Jakube

5
@Jakube isaac sneakily มุ่งมั่นใน 6 วันที่ผ่านมา
orlp

@Jakube ตั้งแต่github.com/isaacg1/pyth/commit/…
isaacg

3
@ Jakube เนื่องจาก Pyth สามารถเติบโตเพื่อแก้ปัญหาใด ๆ นั่นเป็นปัญหาของภาษากอล์ฟ ภาษาลึกลับมีอยู่เพื่อประโยชน์ของภาษาลึกลับ; ตามที่ได้รับการออกแบบ * หลังจากนั้น
sentiao

@sentiao เพื่อให้เป็นธรรมภาษาโฮสต์ (Python) มีการสอดแทรกภายใต้ชื่อที่แตกต่างกันชั่วครู่หนึ่ง
Mego

16

Python 2, 54

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

B,I,Vจะเข้าเป็น แก้ไขอินพุตBเมื่อถูกเรียก (ขอบคุณ Martin Büttnerสำหรับเตือนฉันว่านี่เป็นไปได้)

ใช้mapในการเรียกB.insertแต่ละคู่ดัชนี / องค์ประกอบ เพื่อหลีกเลี่ยงปัญหาของดัชนีรายการขยับขณะที่มีการแทรกองค์ประกอบเรียงลำดับคู่ในการลดลำดับของดัชนีโดยน่าเกลียด zip / sort / unzip map(B.insert,*X)ถ้าไม่ได้สำหรับปัญหาการขยับเราก็จะทำ

วิธีเก่า (65):

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

5

Haskell, 62 ไบต์

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

ตัวอย่างการใช้งาน: ->f [5,1,4,1,3] [0,0,7] [5,0,3][0,5,1,4,7,1,3,0]

มันทำงานอย่างไร: เพิ่มรายการฐานด้วยดัชนี "และครึ่ง" เริ่มต้นที่0.5(เช่น[(0.5,5),(1.5,1),(2.5,4),(3.5,1),(4.5,3)]) และเชื่อมต่อกับคู่ดัชนี - ค่า จัดเรียงและทิ้งดัชนี

หมายเหตุ : ไม่ทราบว่าฉันกำลังโกงที่นี่ จากมุมมองทางคณิตศาสตร์มันเป็นเรื่องปกติ แต่โปรแกรมเมอร์อาจยืนยันว่ารายการดัชนี[5,0,3]ไม่ได้เป็นรายการIntegersตามที่ร้องขอ แต่รายการFractionals(ต้องแน่นอนประเภทคือ polymorphic แต่ต้องอยู่ในFractionalชั้นเรียนเช่นFloatหรือDouble)


5

Ruby, 60 59 53 ไบต์

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

และเวอร์ชั่นที่ไม่ดี

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

2
คุณสามารถย่อให้สั้นลงได้โดยทำให้เป็นฟังก์ชันที่ไม่มีชื่อแทน: ->a,b,c{...}. โอกาสinsertก็ไม่จำเป็นต้องใช้วงเล็บ
Martin Ender

@ MartinBüttnerฉันรู้เกี่ยวกับฟังก์ชั่นที่ไม่มีชื่อกับแลมบ์ดา แต่ฉันไม่รู้สึกว่ามันอยู่ในจิตวิญญาณของความท้าทาย (ซึ่งมักจะขอฟังก์ชั่นที่มีชื่อ) ขอบคุณสำหรับการตรวจสอบ parens แม้ว่า
Dylan Frese

เว้นแต่ความท้าทายโดยเฉพาะขอให้ฟังก์ชั่นที่มีชื่อฟังก์ชั่นที่ไม่มีชื่ออยู่เสมอได้รับการยอมรับ และฉันไม่ได้ขอฟังก์ชั่นที่มีชื่อ (ฉันไม่เคยทำ;))
Martin Ender

5

CJam, 34 23 18 ไบต์

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

การส่ง CJam ครั้งแรกของฉัน ยินดีให้คำปรึกษาฉันแน่ใจว่ามีสนามกอล์ฟเยอะ

บันทึก 16 ไบต์ด้วยความช่วยเหลือของ @ MartinBüttnerและ @Dennis

ฟังก์ชันคาดหวังอินพุตในสแต็กตามลำดับB V I(ฉันเป็นระดับสูงสุด)

ตัวอย่างการใช้งาน:

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

วิธี:

  • จับคู่iองค์ประกอบ th ของอาร์เรย์กับi+0.5
  • คู่แทรกค่ากับตำแหน่งแทรก
  • ผสานสองอาร์เรย์ที่เกิดขึ้น
  • เรียงลำดับตามองค์ประกอบของตำแหน่ง
  • เก็บองค์ประกอบค่า

จุดลอยตัวนั้นเป็นวิธีที่ฉลาดและดีกว่าของฉัน คุณจะได้รับลงไป 19 ไบต์ด้วยq~.5fm.\2/\ee+$1f=pและ 18 ไบต์โดยใช้ฟังก์ชั่นที่ไม่ระบุชื่อ:{.5fm.\2/\ee+$1f=}
เดนนิส

ความคิดเดียวกันโดยไม่ต้องเคล็ดลับจุดลอยตัว: {.\2/\ee+{0=}$1f=}(ยังคง 18 bytes)
เดนนิส

@Dennis ขอบคุณฉันไม่สามารถหาผู้ประกอบการสำหรับget array element 1f=ฉันจะปล่อยให้มันเป็นโปรแกรมแบบเต็มแม้ว่า
randomra

การโทรของคุณ คุณคิดว่าฉันถามว่าทำไมคุณถึงต่อต้านการโพสต์ฟังก์ชั่น?
เดนนิส

@Dennis ฉันเพิ่งเริ่มต้น CJam และไม่แน่ใจว่าจะใช้ฟังก์ชั่นนี้ได้อย่างไร ตอนนี้ฉันหาคำตอบแล้วฉันจึงเปลี่ยนคำตอบเป็นอย่างนั้น
randomra

5

K, 22 21 ไบต์

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

เรากำหนดฟังก์ชั่น 3 โต้แย้ง{…}กับตัวแปรนัยx, yและzเป็นตัวแทนของรายการเริ่มต้นรายการคุณค่าและรายการดัชนีตามลำดับ โอเปอเรเตอร์ "cut" ( _) ใช้เพื่อแยกรายการเริ่มต้นแยกออกจากรายการที่เรียงลำดับของดัชนีที่ระบุ ( (z@<z)) เรา interleave ค่า (หลังจากเรียงลำดับพวกเขาอย่างสอดคล้องกัน) กับชิ้นแยกของอาร์เรย์เดิมโดยการสร้างรายการ ( (a;b)) การรับการโยกย้าย ( +) และแบนผล ( ,//)

ตัวอย่างการใช้งาน:

  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

ช่องว่างรอบขีดล่างเป็นสิ่งจำเป็นเนื่องจาก K อนุญาตขีดล่างในตัวระบุ K5 ลบความกำกวมที่อาจเกิดขึ้นนี้ หากเราสามารถนับจำนวนดัชนีที่เรียงตามลำดับจากน้อยไปหามากและขีดล่างไม่ใช่ตัวระบุที่ถูกต้องเราสามารถใช้โปรแกรมที่ดีกว่า 13 ไบต์มาก:

{,//+(y;z_x)}

(ถอนหายใจ).

แก้ไข:

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

แบ่งสมมาตร แต่เราสามารถบันทึกไบต์โดยใช้ bracket-indexing ( […]) แทน@โอเปอเรเตอร์การทำดัชนีinfix โดยปกติจะทำให้โปรแกรมยาวขึ้น แต่ในกรณีนี้เราต้องการ parens อยู่แล้วเพื่อจัดเรียงzก่อนดำเนินการตัด


4

Pyth, 17 ไบต์

ssC,cFPQamedSCtQ]

@isaacg เอาชนะวิธีแก้ปัญหาของฉันไปแล้ว แต่เมื่อฉันทำเอกสารเสร็จฉันก็จะโพสต์มันต่อไป

B, I, Vนี้จะใช้เวลาการป้อนข้อมูลในรูปแบบ คุณสามารถลองได้ที่นี่: การสาธิตหรือชุดทดสอบ

คำอธิบาย:

ฉันใช้ตัวอย่างB = [5,1,4,1,3], I = [5,0,3], V = [0,0,7]จาก 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

ฟังก์ชั่นที่มี 3 พารามิเตอร์อาร์เรย์ส่งคืนอาร์เรย์ ฟังก์ชั่นนี้แก้ไขiพารามิเตอร์ของมัน(ตามที่อนุญาตโดย OP)

ทดสอบการเรียกใช้ตัวอย่าง Firefox เท่านั้นตามปกติ

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>


จากความอยากรู้สิ่งที่เกี่ยวกับรหัสทำให้มันเฉพาะเจาะจงกับ Firefox? เป็นเพราะ ES6 หรือเปล่า
Alex A.

@ AlexA.it เป็นเพราะมันเป็น ES6 ใช่ โดยเฉพาะอย่างยิ่งfat arrow functionไม่ได้ใช้งานแม้ในเวอร์ชันนักพัฒนาซอฟต์แวร์ของ Chrome (AFAIK)
edc65

ที่จริงแล้วไม่ใช่แม้แต่โครงสร้าง Canary ของ Chrome ที่รองรับ
DocMax

4

Mathematica, 52 51 ไบต์

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

ตัวอย่าง:

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}

คำอธิบาย:

ใช้ตัวอย่างด้านบน

  • 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}
  • จากนั้นใช้สหภาพ (เรียงลำดับ) ของทั้งสองรายการ (=>{0.5 -> 0, 1 -> 5, 2 -> 1, 3 -> 4, 3.5 -> 7, 4 -> 1, 5 -> 3, 5.5 -> 0} )
  • จากนั้นใช้องค์ประกอบสุดท้ายของแต่ละคู่ (=> {0, 5, 1, 4, 7, 1, 3, 0})


3

R, 75 ไบต์

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}

สิ่งนี้จะสร้างฟังก์ชั่นที่ไม่มีชื่อ หากต้องการเรียกใช้ให้ตั้งชื่อเช่นf=function...เรียกว่าให้มันชื่อเช่นโปรดทราบว่าอาร์เรย์จะต้องมีการจัดทำดัชนี 1 เนื่องจากนั่นเป็นเพียงวิธีที่ R ม้วน

คำอธิบาย Ungolfed +:

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
}

ตัวอย่าง:

> 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

ข้อเสนอแนะยินดีต้อนรับเช่นเคย!


2

CJam, 19 ไบต์

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

นี่เป็นโปรแกรมเต็มรูปแบบที่อ่านอาร์เรย์B , IและV (หนึ่งรายการต่อบรรทัดตามลำดับ) จาก STDIN

ลองใช้ออนไลน์ในล่าม CJam

มันทำงานอย่างไร

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 ไบต์

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

นี่คือฟังก์ชั่นไม่ระบุชื่อที่ปรากฏB , Vและ I (บนลงล่าง) จากสแต็กและปล่อยให้อาเรย์เดี่ยวบนสแต็กกลับมา

ลองใช้ออนไลน์ในล่าม CJamล่าม

มันทำงานอย่างไร

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

ทับทิมขนาด 48 ไบต์

ฉันคิดว่านี่เป็นไปตามกฎ แต่โปรดตรวจสอบ

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

ฟังก์ชั่นที่ไม่ได้ตั้งชื่อโดยใช้ทั้งสามอาร์เรย์เป็นอินพุต ส่งออกสตริงที่สามารถแยกวิเคราะห์ได้อย่างไม่น่าสงสัยในอาร์เรย์ของตัวเลขด้วยนิพจน์ทับทิมx.split(/:+/).map(&:to_i)ของตัวเลขที่มีการแสดงออกทับทิมต์

กรณีทดสอบบนideone

ฉันสามารถบันทึกได้อีก 3 ไบต์ แต่รูปแบบผลลัพธ์[1,2,[nil,5]]กำลังขยายขอบเขตของกฎไปเล็กน้อยเช่นกันแม้ว่าจะไม่คลุมเครือก็ตาม


ฉันคิดว่ารูปแบบปัจจุบันไม่เป็นไร อาร์เรย์ที่ซ้อนกันที่มีnilค่าการแทรกสอดเป็นบิตของการยืด แต่ในกรณีนี้มันไม่ชนะการประกวดดังนั้นฉันไม่กังวลเลย
Martin Ender

1

R, 60

เป็นฟังก์ชั่นที่ไม่มีชื่อที่ใช้ b, v และ i

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

ขยาย b ด้วย NAs เติมช่องว่างตามที่ต้องการด้วย v ส่งคืนเวกเตอร์โดยไม่มี NA

> 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

Java, 253, 226, 219, 209

ไม่ใช่ผู้ชนะอย่างแน่นอน แต่ก็ดี

สมมติว่า B, V และฉันไม่เป็นโมฆะ v (ตัวพิมพ์เล็ก v) คือความยาวของอาร์เรย์ค่า / ดัชนี R คืออาร์เรย์ที่ส่งคืน r คือความยาวของอาร์เรย์ที่ส่งคืน x, y และฉันเป็น ints ชั่วคราวทั้งหมด

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

ขยาย:

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 ไบต์

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

ใน⎕IO← 0 เพื่อให้ตรงกับกรณีทดสอบ

มันเป็นอัลกอริทึมมาตรฐาน: เวกเตอร์ดัชนีของอาร์กิวเมนต์แรกถูกผนวกเข้ากับดัชนีที่กำหนด (อาร์กิวเมนต์ที่ 3) คำนวณการเรียงสับเปลี่ยนที่จะเรียงลำดับดัชนีตามลำดับจากน้อยไปหามาก เนื่องจากอัลกอรึทึมการเรียงของ APL มีความเสถียรตามคำจำกัดความการคำนวณการเปลี่ยนแปลงทำให้องค์ประกอบของการ catenation ของอาร์กิวเมนต์ที่สองและครั้งแรกในสถานที่ที่เหมาะสม

ตัวอย่างเช่น :

    {(∊⌽2↑⍵)[⍋(2⊃⍵),⍳≢⊃⍵]}(5 1 4 1 3)(0 0 7)(5 0 3)
0 5 1 4 7 1 3 0
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.