บัฟเฟอร์กันน้ำล้น


23

พื้นหลัง

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

ภาพรวม

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

  • เพื่อแทรกรายการที่ดัชนีฉันหมายถึงการคำนวณเจ , j = i % buffer.length()และแทรกรายการใหม่หลังจากที่jthรายการในรายการ

กรณีพิเศษเท่านั้นคือถ้าบัฟเฟอร์ว่างเปล่าเนื่องจากเลขศูนย์ modulo ไม่ทำงาน ดังนั้นหากบัฟเฟอร์ปัจจุบันว่างรายการใหม่จะเป็นดัชนี0

หากบัฟเฟอร์มีเพียงหนึ่งไอเท็มคุณจะแทรกหลังจากไอเท็ม0เสมอ นี่เป็นเพียงตัวอย่างเดียวของกรณีทั่วไป

หากบัฟเฟอร์มี 6 รายการ: [4, 9, 14, 8, 5, 2]และคุณได้รับคำสั่งให้แทรกรายการใหม่10ที่ดัชนี15คุณจะพบว่า15 % 6 == 3จากนั้นแทรกรายการใหม่10หลังจาก8ที่ดัชนี3ซึ่งให้บัฟเฟอร์ที่เป็นผลลัพธ์ของ [4, 9, 14, 8, 10, 5, 2]

ปัญหา

เขียนฟังก์ชั่นหรือโปรแกรมที่ใช้ในรายการสั่งซื้อจำนวนเต็มบวกและดัชนีจำนวนเต็มบวกที่จะแทรก

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

เอาต์พุตรายการลำดับของจำนวนเต็มที่อยู่ในบัฟเฟอร์หลังจากทำการแทรกที่ระบุทั้งหมดแล้ว

นี่คือความท้าทายของรหัส - กอล์ฟดังนั้นรหัสที่สั้นที่สุดชนะ

แนวทางการป้อนข้อมูล

คุณสามารถรับรายการอินพุตได้ตามต้องการ ตัวอย่าง:

  • รายการคู่: [ [1,1], [2,4], [3,9], [4,16], [5,25]...]
  • รายการสินค้าและรายการดัชนี: [1, 2, 3, 4, 5...], [1, 4, 9, 16, 25]
  • บี้: [1, 1, 2, 4, 3, 9, 4, 16, 5, 25 ...]
  • เป็นต้น

คุณอาจสันนิษฐานว่าการป้อนข้อมูลมีอย่างน้อยหนึ่งรายการและดัชนีที่เกี่ยวข้อง

กรณีทดสอบ

กรณีสี่เหลี่ยมจากด้านบน:

[(1, 1), (2, 4), (3, 9), (4, 16), (5, 25), (6, 36), (7, 49), (8, 64)] -> [1, 2, 8, 7, 6, 5, 4, 3]

ฉันสร้างสิ่งเหล่านี้แบบสุ่ม:

[(11, 9), (13, 14)] -> [11, 13]
[(1, 18), (11, 7), (3, 35), (16, 22)] -> [1, 11, 16, 3]
[(3, 16), (16, 37), (0, 28), (18, 24)] -> [3, 18, 0, 16]
[(7, 26), (8, 20), (11, 39), (1, 23), (17, 27)] -> [7, 8, 11, 1, 17]
[(15, 35), (17, 7), (16, 15), (1, 13), (2, 6), (11, 34)] -> [15, 17, 1, 2, 16, 11]
[(2, 13), (1, 20), (16, 25), (8, 21), (5, 2), (16, 37), (3, 0)] -> [2, 3, 8, 1, 16, 5, 16]
[(6, 20), (15, 15), (12, 26), (10, 27), (17, 13), (7, 18), (4, 16)] -> [6, 10, 17, 12, 7, 4, 15]
[(18, 9), (5, 34), (15, 4), (12, 29), (2, 5), (7, 0), (7, 10), (16, 38)] -> [18, 7, 15, 2, 16, 5, 7, 12]
[(0, 12), (12, 0), (4, 16), (15, 12), (6, 28), (8, 10), (11, 24), (0, 25)] -> [0, 11, 8, 6, 15, 0, 4, 12]
[(6, 12), (14, 13), (10, 33), (11, 35), (1, 3), (0, 28), (15, 27), (8, 10), (1, 2)] -> [6, 14, 10, 1, 11, 8, 15, 0, 1]
[(2, 29), (19, 30), (18, 17), (13, 3), (0, 21), (19, 19), (11, 13), (12, 31), (3, 25)] -> [2, 13, 3, 11, 0, 12, 19, 18, 19]

การดำเนินการอ้างอิง Python3

def f(inputs):
    # `inputs` is a list of pairs
    buff = []
    for item, index in inputs:
        if len(buff) == 0:
            buff.insert(0, item)
        else:
            insert_after = index % len(buff)
            buff.insert(insert_after+1, item)
    return buff

อินพุตสามารถย้อนกลับได้หรือไม่?
FlipTack

ใช่ฉันคิดว่าอินพุตสามารถยืดหยุ่นได้มากหรือน้อยตามที่คุณต้องการ
turbulencetoo

คำตอบ:


4

MATL , 24 22 ไบต์

"N?@2)yn\Q:&)@1)wv}@1)

อินพุตเป็นเมทริกซ์ (ที่มี;ตัวคั่นแถว) ที่มีค่าในแถวแรกและดัชนีในวินาที

เอาต์พุตเป็นอาร์เรย์คอลัมน์ซึ่งแสดงเป็นตัวเลขคั่นด้วยบรรทัดใหม่

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมดโดยแสดงผลลัพธ์ในบรรทัดเดียว

คำอธิบาย

"          % Input matrix (implicit). For each column 
  N        %   Number of elements in the stack
  ?        %   If nonzero (true for all iterations but the first)
    @2)    %     Push second element of current column: new index
    yn     %     Duplicate current buffer; push its number of elements
    \      %     Modulo
    Q      %     Add 1
    :&)    %     Split buffer at that point. This gives two pieces, one
           %     of which may be empty
    @1)    %     Push first element of current column: new value
    wv     %     Swap; concatenate all stack. This places the new value
           %     between the two pieces of the buffer
  }        %   Else (this is executed only in the first iteration)
    @1)    %     Push first element of current column: new value
           %   End (implicit)
           % End (implicit)
           % Display (implicit)

8

Perl, 37 ไบต์

รหัส 35 ไบต์ + 2 ไบต์สำหรับ-lpแฟล็ก

splice@F,1+<>%(@F||1),0,$_}{$_="@F"

ลองออนไลน์!

การดำเนินการค่อนข้างตรงไปข้างหน้าspliceแทรกในอาร์เรย์@Fที่ดัชนี1+<>%(@F||1)(โปรดทราบว่า@F||1จัดการกรณีของอาร์เรย์ว่างเปล่า)

เพียงไม่กี่คำเกี่ยวกับวงเล็บปีกกาที่ดูเหมือนไม่ตรงกัน}{(เพราะฉันมีความคิดเห็นเกี่ยวกับมันและฉันคิดว่ามันค่อนข้างแปลกสำหรับคนที่ไม่รู้จัก Perl) และมันเป็นเคล็ดลับที่พบบ่อยใน Perl golfings:
-pธงล้อมรอบรหัส ด้วย (ประมาณ) while(<>){ CODE } continue { print }, ( continueจะถูกดำเนินการหลังจากการทำซ้ำแต่ละครั้ง) ดังนั้นกับผู้ที่ไม่ตรงกัน ผมเปลี่ยนรหัสของฉันไป}{ while(<>) { CODE}{ } continue { print }ดังนั้นมันจะสร้างบล็อกว่างเปล่าหลังจากรหัสของฉัน (แต่นั่นไม่ใช่ปัญหา) และcontinueจะถูกดำเนินการเพียงครั้งเดียวหลังจากwhile((เมื่อมีการอ่านอินพุตทั้งหมด)


3
นั่น}{คือการขับรถฉันถั่ว ...
ETHproductions

@ ETHproductions ฉันคุ้นเคยกับมัน แต่ฉันชอบที่จะแสดงให้คนอื่น ๆ พวกเขาคิดเสมอว่ามีบางอย่างผิดปกติ! :) (ข้อเสียคือยุ่งกับการเยื้อง emacs ของฉัน .. )
Dada

1
นั่น}{ทำให้ฉันนึกถึงภาพลวงตานี้
หลุยส์เมนโด

ใช่ฉันทำ. :-)
Dennis

5

ES6 (Javascript) 58,57,53, 50 ไบต์

แข็งแรงเล่นกอล์ฟ

a=>a.map((e,i)=>b.splice(1+e[1]%i,0,e[0]),b=[])&&b

ใช้อาร์เรย์ของคู่ดัชนี - ค่าเป็นอินพุต

การแก้ไข

  • ใช้&&เพื่อส่งคืนค่า -1 ไบต์
  • ลบออก|0(เห็นได้ชัดว่า splice สามารถจัดการ NaN ได้ดี), -2 ไบต์
  • สร้างb=[]"อาร์กิวเมนต์" ตัวที่สองลงในแผนที่ () , -2 ไบต์ (ขอบคุณ @ETHproductions!)
  • แทนที่ b.length ด้วยดัชนี map () (i), -3 bytes (ขอบคุณ @Patrick Roberts!)

ทดสอบ

F=a=>a.map((e,i)=>b.splice(1+e[1]%i,0,e[0]),b=[])&&b

F([[11, 9], [13, 14]])
[ 11, 13 ]

F([[2, 29], [19, 30], [18, 17], [13, 3], [0, 21], [19, 19], [11, 13], [12, 31], [3, 25]])
[ 2, 13, 3, 11, 0, 12, 19, 18, 19 ]

1
ดีฉันควรลองวิธีที่ไม่เกิดซ้ำ ฉันคิดว่าคุณสามารถทำได้a=>a.map(e=>...,b=[])&&b
ETHproductions

2
คุณสามารถลบ 3 ไบต์โดยเปลี่ยนe=>เป็น(e,i)=>และใช้iแทนb.length
Patrick Roberts

@PatrickRoberts เป็นความคิดที่ดี! ขอขอบคุณ !
เรือเหาะ

5

Haskell , 70 69 ไบต์

b!(x,i)|b==[]=[x]|j<-1+i`mod`length b=take j b++x:drop j b
foldl(!)[]

ลองออนไลน์! การใช้งาน: foldl(!)[] [(1,5),(2,4),(3,7)]. บันทึกหนึ่งไบต์ต้องขอบคุณ @nimi!

คำอธิบาย:

b!(x,i)                         -- b!(x,i) inserts x into list b at position i+1
 | b==[] = [x]                  -- if b is empty return the list with element x
 | j <- 1 + i `mod` length b    -- otherwise compute the overflow-save insertion index j
     = take j b ++ x : drop j b -- and return the first j elements of b + x + the rest of b
foldl(!)[]                      -- given a list [(1,2),(3,5),...], insert each element with function ! into the initially empty buffer

โซลูชันที่ไม่มีการคำนวณโมดูลัส: (90 ไบต์)

f h t(x,-1)=h++x:t
f h[]p=f[]h p
f h(c:t)(x,i)=f(h++[c])t(x,i-1)
g((x,_):r)=foldl(f[])[x]r

ลองออนไลน์!


j<-1+i`mod`length bบันทึกเป็นไบต์
nimi

4

Python 2 , 64 62 58 56 ไบต์

x=[]
for n,i in input():x[i%(len(x)or 1)+1:0]=n,
print x

ขอบคุณ @xnor สำหรับการเล่นกอล์ฟ 2 ไบต์!

ลองออนไลน์!


คุณสามารถทำ(len(x)or 1)แทนการกำหนดค่าเริ่มต้นความยาวได้หรือไม่?
xnor

กำลังมองหาวิธีที่สั้นกว่า ทั้งสองlen(x or[0])และ-~len(x[1:])เน็คไท
xnor

4

Python 2 , 62 60 ไบต์

รับอินพุตเป็นรายการคู่พิมพ์ผลลัพธ์ แก้ไข: Outgolfed โดย Dennis

b=[]
for x,y in input():b.insert(1+y%(len(b)or 1),x)
print b

ลองออนไลน์!

นี่ค่อนข้างง่าย - วนผ่านอินพุตใส่รายการลงในตำแหน่งที่ถูกต้องแล้วพิมพ์ผลลัพธ์ 1+y%(len(b)or 1)การตัดสินใจที่ดัชนีเพื่อแทรกลงไปจะทำด้วย นี่เป็นวิธีมาตรฐานในการทำดัชนีแบบแยกส่วนโดยใช้or 1เพื่อจัดการกรณีขอบของรายการว่าง


3

JavaScript (ES6), 60 ไบต์

f=([[q,r],...a],z=[])=>z.splice(r%z.length+1,0,q)+a?f(a,z):z

ตัวอย่างการทดสอบ


2

V , 38 40 35 ไบต์

คำตอบนี้โค้งคำจำกัดความของรายการและไม่ใช่ภาษาที่คุณใช้สำหรับการจัดการรายการ แต่โดยทั่วไปแล้วฉันต้องการที่จะใช้[count]/{regex}ซึ่งฉันเพิ่งเพิ่มลงใน V เมื่อไม่นาน[index] [num] [index] [num] ...มา[num] [num] [num]นี้

Í ¨ä«© ½/¯ÜdÜ+òhea ±^
Hdd2xdG@"
X

ลองออนไลน์!

Hexdump สำหรับ 2 ตัวอักษรที่ซ่อนอยู่:

00000000: cd20 a8e4 aba9 20bd 2faf dc64 dc2b f268  . .... ./..d.+.h
00000010: 6561 20b1 161b 5e0a 4864 6432 7864 4740  ea ...^.Hdd2xdG@
00000020: 220a 58                                  ".X

คำอธิบาย

รหัสถึงdG@"รูปแบบทุก\d+ \d+คู่เพื่อให้รายการ 1 2 3 4 5 6 จะสิ้นสุดลงเช่น

a 2^[^3/\d\+
hea 4^[^5/\d\+
hea 6^[^

แล้วdG@"ประมวลผลทั้งหมดนั้นเป็นรหัส V ดังต่อไปนี้:

a 2^[                 | insert " 2" and return to command mode
     ^                | LOOP: go to the first number
      3/\d\+          | find the 3rd number (0 indexed)
h                     | move one character left
 e                    | go to the end of the next word
  a 4^[               | append " 4" and return to command mode
       ^5/\d\+        | basically the same as LOOP on, just with different numbers

เพียงแค่พูดว่าสถานะที่ไม่ใช่การแข่งขันนั้นมีไว้สำหรับภาษาหรือคุณลักษณะภาษาที่ใหม่กว่าความท้าทาย
Kritixi Lithos

อ่าขอบคุณที่ไม่รู้เหมือนกัน ฉันจะทำให้มันเป็นไปตาม
nmjcman101

2

PHP, 72 92 ไบต์

for($b=[];++$i<$argc;)array_splice($b,$b?$argv[$i]%count($b)+1:0,0,$argv[++$i]);print_r($b);

รับอินพุตแบนจากอาร์กิวเมนต์บรรทัดคำสั่ง -nrทำงานด้วย


ฉันค่อนข้างมั่นใจว่าคำตอบนี้ไม่ถูกต้อง: ฉันได้รับFatal error: Uncaught DivisionByZeroError: Modulo by zeroแล้วแก้ไขแล้วลอง1 1 1 2 1 3และได้รับ[1=>null]เป็นผลลัพธ์แทน[1,3,2]
user59178

มันยังคงเขียนทับj+1แทนที่จะแทรกหลังจากjใช่ไหม 18 1 7 11 35 3 22 16=> [1,11,16]มากกว่า[1,11,16,3]
user59178

@ user59178: โอ้ฉันพลาดinsertคำค้นหาไปแล้ว ขอบคุณ; คงที่
ติตัส

2

Java 7, 125 124 bytes

import java.util.*;List z(int[]a){List r=new Stack();for(int i=0,q=a.length/2;i<q;)r.add(i<1?0:a[i+q]%i+1,a[i++]);return r;}

ยอมรับรายการค่าคงที่ตามด้วยดัชนี สำหรับกรณีทดสอบกำลังสองอินพุตจะเป็นnew int[] {1, 2, 3, 4, 5, 6, 7, 8, 1, 4, 9, 16, 25, 36, 49, 64}

ลองออนไลน์!


1

Mathematica, 62 ไบต์

Fold[Insert[#,#2[[1]],Mod[Last@#2,Tr[1^#]]+2/.0/0->-1]&,{},#]&

ฟังก์ชันบริสุทธิ์พร้อมอาร์กิวเมนต์แรกที่#คาดว่าจะเป็นรายการของคู่ เริ่มต้นด้วยรายการที่ว่างเปล่า{}ออกจากFoldรายการที่ป้อนเข้า#กับฟังก์ชั่นต่อไปนี้:

Insert[                                            Insert
       #,                                          into the first argument
         #2[[1]],                                  the first element of the second argument
                 Mod[                              at the position given by the modulus of
                     Last@#2,                      the second element of the second argument
                             Tr[1^#]               with respect to the length of the first argument
                                    ]+2            plus 2 (plus 1 to account for 1-indexing, plus 1 because we are inserting after that position)
                                       /.          then replace
                                         0/0       Indeterminate
                                            ->     with
                                              -1   negative 1
                                                ]& End of function


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.