รวบรวมและวางรายการ


13

เป้าหมายของความท้าทายนี้คือการรวบรวมรายการที่เลือกในรายการและย้ายไปยังตำแหน่งที่แน่นอนในรายการ

เป็นตัวอย่างที่มองเห็นได้นำค่าอินพุต (แสดงโดยจำนวนเต็มกล่องดำ) และรายการที่สอดคล้องกันของค่าความจริงที่จริงหมายถึงรายการที่เลือก (แสดงโดยกล่องสีฟ้าที่Tเป็นความจริงและFเป็นเท็จ):

ป้อนคำอธิบายรูปภาพที่นี่

ขั้นตอนตรรกะแรกคือการแยกรายการที่ทำเครื่องหมายความจริงและไม่จริงในรายการที่สอดคล้องกัน โปรดทราบว่าลำดับที่สัมพันธ์กันในแต่ละรายการจะต้องได้รับการปรับปรุง (เช่นลำดับของรายการที่เลือกจะต้องเป็น1,4,5และลำดับของรายการที่ไม่ได้เลือกจะต้องเป็น2,3,6,7)!

ป้อนคำอธิบายรูปภาพที่นี่

ขั้นตอนตรรกะที่สองจะได้รับดัชนีในรายการที่เหลือของรายการที่ไม่ได้เลือกแทรกรายการที่เลือกทั้งหมดก่อนรายการที่ดัชนีที่กำหนด สมมติว่าการจัดทำดัชนีเริ่มต้นที่ 0 สมมติว่าคุณต้องการที่จะแทรกตัวเลือกที่ดัชนี 3. สอดคล้องกับจุดก่อนนี้กล่องเพื่อให้รายการที่เลือกควรแทรกก่อน77

ป้อนคำอธิบายรูปภาพที่นี่

2,3,6,1,4,5,7วิธีการแก้ปัญหาสุดท้ายคือแล้ว

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

อินพุต

โปรแกรมของคุณมี 3 อินพุต:

  1. รายการจำนวนเต็มแทนรายการ นี่อาจเป็นรายการที่ว่างเปล่า รายการนี้จะประกอบด้วยจำนวนเต็มบวกเฉพาะเสมอไม่จำเป็นต้องเรียงตามลำดับ (เช่น 5 จะไม่อยู่ในรายการสองครั้ง)
  2. รายการค่าความจริง / เท็จที่มีความยาวเท่ากันกับรายการที่มีค่าความจริงแสดงว่ารายการที่ดัชนีเดียวกันได้ถูกเลือก
  3. จำนวนเต็มที่แทนตำแหน่งที่จะแทรกการเลือก คุณสามารถเลือกสิ่งที่ดัชนีของรายการแรกของรายการนั้นตราบใดที่ค่าคงที่ในการรันโปรแกรมของคุณทุกครั้ง (เช่นรายการแรกอาจเป็นดัชนี 0 หรือดัชนี 1) โปรดระบุระเบียบปฏิบัติที่โปรแกรมของคุณปฏิบัติตาม ดัชนีนี้ควรอยู่ในช่วง[starting_idx, ending_idx+1]กล่าวคือมันจะเป็นดัชนีที่ถูกต้องเสมอ สำหรับดัชนีกรณีคือending_idx+1การเลือกควรแทรกที่ส่วนท้ายของรายการ คุณอาจคิดว่าจำนวนเต็มนี้จะพอดีกับประเภทจำนวนเต็มของภาษาของคุณ

อินพุตอาจมาจากแหล่งใดก็ได้ที่ต้องการ (stdio, function function, ฯลฯ )

เอาท์พุต

ผลลัพธ์คือรายการที่แสดงถึงลำดับสุดท้ายของรายการ สามารถใช้กับแหล่งใดก็ได้ที่ต้องการ (stdio, ค่าส่งคืน, พารามิเตอร์เอาต์พุตของฟังก์ชัน ฯลฯ ) คุณได้รับอนุญาตให้แก้ไขอินพุตใด ๆ ในสถานที่ (ตัวอย่างเช่นกำหนดรายการที่สามารถแก้ไขได้เป็นพารามิเตอร์ฟังก์ชันและให้ฟังก์ชันของคุณทำงานในตำแหน่งนั้นในรายการนั้น)

กรณีทดสอบ

กรณีทดสอบต่อไปนี้ทั้งหมดใช้การทำดัชนีแบบอิง 0 ฉันใช้ 0 และ 1 เพื่อระบุค่าเท็จ / จริงตามลำดับสำหรับมาสก์ที่เลือก

กรณีทดสอบเกิดขึ้นที่มีรายการที่จัดรูปแบบเป็น[a,b,c]แต่ตราบใดที่รายการอินพุตของคุณแสดงถึงลำดับที่มีการเรียงลำดับที่แน่นอน

การป้อนข้อมูล:

[]
[]
0

เอาท์พุท:

[]

การป้อนข้อมูล:

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

เอาท์พุท:

[2,3,6,1,4,5,7]

การป้อนข้อมูล:

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

เอาท์พุท:

[1,4,5,2,3,6,7]

การป้อนข้อมูล:

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

เอาท์พุท:

[2,3,6,7,1,4,5]

การป้อนข้อมูล:

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

เอาท์พุท:

[1,2,3,4,5,6,7]

การป้อนข้อมูล:

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

เอาท์พุท:

[1,2,3,4,5,6,7]

การป้อนข้อมูล:

[1,3,2,5,4,6]
[1,0,0,1,1,0]
3

เอาท์พุท:

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

เกณฑ์การให้คะแนน

นี่คือรหัสกอล์ฟ คำตอบที่สั้นที่สุดในการชนะไบต์ ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม คุณได้รับอนุญาตให้ใช้บิวด์อินที่ต้องการ


อินพุตและเอาต์พุตสามารถเป็นเช่น "" 1 2 3 "," 1 0 0 ", 1 'ได้หรือไม่?
betseg

ใช่อะไรก็ตามที่แสดงถึงลำดับเลขจำนวนเต็มสองชุดที่ จำกัด และดัชนีจำนวนเต็มนั้นใช้ได้
helloworld922

อาร์เรย์แรกจะมีรายการเชิงลบหรือศูนย์หรือไม่
Leun Nun

ฉันอยากจะบอกว่าไม่ แต่ฉันก็รู้สึกทึ่งในสิ่งที่คุณมีวิธีการแก้ปัญหาที่ต้องใช้สิ่งนี้ ใช่คุณอาจคิดว่ารายการแรกมีจำนวนเต็มบวกเท่านั้น
helloworld922

@PeterTaylor เลขที่ ฉันแก้ไขให้อ่าน "รายการค่าความจริง / เท็จ ... " มีชื่อที่ดีที่จะอธิบาย "ประเภท" ของค่าความจริง / เท็จ? บูลีนเหมือน?
helloworld922

คำตอบ:


10

MATL, 9 ไบต์

&)i:&)bwv

วิธีการแก้ปัญหานี้ยอมรับอาร์เรย์ของค่าT(จริง) และF(เท็จ) เป็นอินพุตที่สอง นอกจากนี้สำหรับกรณีทดสอบครั้งแรกที่มีอาร์เรย์ว่างเปล่าจะไม่มีการสร้างเอาต์พุต

ลองออนไลน์! และรุ่นแก้ไขเล็กน้อยสำหรับกรณีทดสอบทั้งหมด

คำอธิบาย

    % Implicitly grab the first two inputs
&)  % Index into the first array using the boolean, places two items on the stack:
    % 1) The values where the boolean is TRUE and 2) the values where it is FALSE.
i   % Explicitly grab the third input (N)
:   % Create an array from 1...N
&)  % Index into the FALSE group using this array as an index. Puts two items on the stack:
    % 1) The first N elements of the FALSE group and 2) other members of the FALSE group
b   % Bubble the TRUE members up to the top of the stack
w   % Flip the top two stack elements to get things in the right order
v   % Vertically concatenate all arrays on the stack
    % Implicitly display the result

5

Mathematica, 66 62 ไบต์

ที่บันทึกไว้ 4 ไบต์จาก@MartinEnder

a=#2~Extract~Position[#3,#4>0]&;##&@@@Insert[##~a~0,##~a~1,#]&

ฟังก์ชั่นไม่ระบุชื่อ รับดัชนีแบบอิงรายการและเครื่องหมายเป็นอินพุตและส่งคืนรายการที่เรียงลำดับใหม่เป็นเอาต์พุต


3

Haskell, 70 ไบต์

m%n=[e|(e,b)<-zip m n,b]
(l#s)p|(h,t)<-splitAt p$l%(not<$>s)=h++l%s++t

ตัวอย่างการใช้งาน: ->([1,2,3,4,5,6,7]#[True,False,False,True,True,False,False]) 3[2,3,6,1,4,5,7]

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

m%n=[e|(e,b)<-zip m n,b]        -- helper function, that extracts the elements of m
                                -- with corresponding True values in n
(l#s)p                          -- l: list of values
                                   s: list of booleans
                                   p: position to insert
  |                   (not<$>s) -- negate the booleans in s
                    l%          -- extract elements of l
          splitAt p             -- split this list at index p
   (h,t)<-                      -- bind h to the part before the split
                                -- t to the part after the split
     = h++l%s++t                -- insert elements at True positions between h and t


1

เยลลี่ 10 ไบต์

¬+\>⁵Ḥ³oỤị

ลองออนไลน์!

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

¬+\>⁵Ḥ³oỤị  Main link.
            Arguments: x (list of Booleans), y (list of inputs), z (index)
¬           Logical NOT; invert all Booleans in x.
 +\         Take the cumulative sum.
            This replaces each entry with the number of zeroes up to that entry.
   >⁵       Compare the results with z.
            This yields 0 for the first z zeroes, 1 for all others. The behavior
            for ones is not important.
    Ḥ       Unhalve; multiply the previous resulting by 2.
     ³o     Take the element-wise logical NOT of x and the previous result.
            This replaces all but the first z zeroes in x with twos.
       Ụ    Grade up; sort the indices of the result according to the corr. values.
        ị   Retrieve the items of y at those indices.

0

C #, 132 ไบต์

int[]r(int[]a,bool[]b,int l){var x=a.Where((i,j)=>!b[j]);return x.Take(l).Concat(a.Where((i,j)=>b[j])).Concat(x.Skip(l)).ToArray();}

ungolfed:

    public static int[] r(int[] a,bool[] b,int l)
    {
        var x = a.Where((i, j) => !b[j]);
        return x.Take(l).Concat(a.Where((i, j) => b[j])).Concat(x.Skip(l)).ToArray();
    }

ความคิดการปรับปรุงชื่นชม


0

Python 3, 91 ไบต์

def f(a,x,i):b=[c for c,z in zip(a,x)if z<1];return b[:i]+[c for c in a if(c in b)<1]+b[i:]

โดยที่aรายการองค์ประกอบ / หมายเลขxเป็นTrue/Falseรายการและiเป็นดัชนี

รุ่น Multiline เพื่อการอ่านที่ดีขึ้น:

def f(a,x,i):
    b=[c for c,z in zip(a,x)if z<1]
    return b[:i]+[c for c in a if(c in b)<1]+b[i:] 

มันทำงานยังไง?

เรียกร้องให้ผลในรายการของสิ่งอันดับที่แต่ละของพวกเขามีข้อมูลที่:zip(a,x) (element,0|1)แล้วเข้าใจในรายชื่อที่มีการใช้ในการกำหนดองค์ประกอบที่มีค่าที่เกี่ยวข้องและเก็บไว้ในตัวแปร0/Falseb

ดังนั้น[c for c,z in zip(a,x)if z<1]สร้างรายการที่มีองค์ประกอบทั้งหมดที่มีค่า0( False) ที่เกี่ยวข้อง

หลังจากที่รายการขององค์ประกอบที่มีการให้True|1ค่าที่เกี่ยวข้อง (ซึ่งถูกกำหนดโดยการตรวจสอบซึ่งองค์ประกอบของaไม่ได้อยู่ในb: [c for c in a if(c in b)<1]) จะแทรกอยู่ในรายการที่มีองค์ประกอบทั้งหมดที่มี0( Falseมูลค่า) ที่เกี่ยวข้อง (รายชื่อb) ที่ดัชนีที่ระบุiและรายการผลลัพธ์จะถูกส่งคืน


0

Python 3, 106 93 ไบต์

def f(x,y,z):
 t,f=[],[]
 for n in range(len(x)):(f,t)[y[n]].append(x[n])
 f[z:z]=t
 return f

รุ่นเก่ากว่า:

def f(x,y,z):
 t,f=[],[]
 for n in range(len(x)):
  if y[n]:t+=[x[n]]
  else:f+=[x[n]]
 f[z:z]=t
 return f
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.