Advent Challenge 5: ย้ายของขวัญไปยังท่าเรือขนส่ง!


9

<< ก่อนหน้า ถัดไป >>

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

ท่าเทียบเรือขนส่งของซานต้าแต่ละแห่งมีขนาดต่าง ๆ กันเพียงเพราะเลื่อนเลื่อนสำหรับขนย้ายนั้นมีความพิเศษสำหรับขนาดเฉพาะ (เบากว่าและจะสิ้นเปลืองหนักกว่าและเลื่อนไม่สามารถรับน้ำหนักได้) ดังนั้นเขาต้องการให้คุณช่วยเขานำของขวัญของเขามาจัดเรียงไว้ในท่าขนส่งที่ถูกต้อง

ท้าทาย

กำหนดรายการและช่วงท่าเรือขนส่งจัดระเบียบของขวัญให้ถูกต้องตามลำดับที่ถูกต้อง

ลองมานี้ตัวอย่างเช่น: ของขวัญที่มีและช่วงที่มีท่าเรือ[5, 3, 8, 6, 2, 7][[1, 5] and [6, 10]]

ของขวัญ5, 3และ2ไปลงท่าเรือแรกและของขวัญ8, 6และ7เข้าไปในท่าเรือที่สอง [[5, 3, 2], [8, 6, 7]]นี้สามารถแสดงให้เห็นว่า รายการนี้จะใกล้เคียงกับการเรียงลำดับมากกว่าอินพุต แต่stablyหมายความว่าภายในแต่ละ Dock ลำดับของของขวัญจะต้องเหมือนกับลำดับของอินพุต (มิฉะนั้นคุณสามารถเรียงลำดับรายการทั้งหมดได้)

ผลลัพธ์สุดท้ายของคุณสำหรับกรณีนี้คือ[5, 3, 2, 8, 6, 7](เป็นรายการแบบเรียบ)

การจัดรูปแบบข้อมูลจำเพาะ

คุณจะได้รับการป้อนข้อมูลเป็นรายการแบนของจำนวนเต็มและรายชื่อของช่วงที่อยู่ในรูปแบบที่เหมาะสมใด ๆ (เช่นช่วงสำหรับกรณีดังกล่าวข้างต้นจะได้รับเป็น[[1, 5], [6, 10]], [1, 5, 6, 10]หรือ[[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]]) ผลลัพธ์ของคุณควรเป็นรายการจำนวนเต็มในรูปแบบที่สมเหตุสมผล

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

กฎระเบียบ

  • ช่องโหว่มาตรฐานใช้
  • นี่คือ ดังนั้นคำตอบที่สั้นที่สุดเป็นไบต์ชนะ
  • จะไม่ยอมรับคำตอบ
  • คุณสามารถสันนิษฐานได้ว่าจะไม่มีช่วงว่าง ( [7, 4]จะไม่ถูกต้องเนื่องจากช่วงขึ้นไป)

กรณีทดสอบ

[1, 2, 3, 4, 5, 6, 7] ; [[1, 3], [4, 7]] => [1, 2, 3, 4, 5, 6, 7]
[1, 2, 3, 4, 5, 6, 7] ; [[4, 7], [1, 3]] => [4, 5, 6, 7, 1, 2, 3]
[7, 3, 5, 4, 6, 1, 2] ; [[1, 3], [4, 5], [6, 7]] => [3, 1, 2, 5, 4, 7, 6]
[4, 7, 6, 3, 5, 2, 1] ; [[1, 4], [5, 7]] => [4, 3, 2, 1, 7, 6, 5]
[1, 1, 3, 3, 6, 4, 7] ; [[1, 4], [6, 7]] => [1, 1, 3, 3, 4, 6, 7]

หมายเหตุ: ผมดึงแรงบันดาลใจสำหรับชุดความท้าทายนี้จากการจุติของรหัส ฉันไม่มีส่วนเกี่ยวข้องกับเว็บไซต์นี้

คุณสามารถดูรายการของความท้าทายทั้งหมดในซีรีส์โดยดูที่ส่วน 'เชื่อมโยง' ของความท้าทายแรกที่นี่


แค่ 2 ท่าเสมอ?
LiefdeWen

ช่วงสามารถทับซ้อนกันได้หรือไม่
RamenChef

@LiefdeWen ดูกรณีทดสอบครั้งที่ 3
Mr. Xcoder

คู่ท่าเรือจะเป็น {เล็กใหญ่หรือไม่)
LiefdeWen

@RamenChef No ..
HyperNeutrino

คำตอบ:



4

เยลลี่ขนาด 4 ไบต์

fЀẎ

ลองออนไลน์!

ใช้อินพุตเป็นรายการปัจจุบันช่วงเต็ม


ยานั่นเป็นวิธีแก้ปัญหาเจลลี่ที่ฉันคาดไว้: DDD
HyperNeutrino

@HyperNeutrino Hehe วิธีแก้ปัญหาที่คาดหวังกลับกลายเป็นว่าไม่สั้นที่สุด โดยการหาวิธีการที่ 05ab1e ผลงานสินค้านอกฉันคิดว่าfþFผลงานใน Jelly เกินไปสำหรับ3 ไบต์ เครดิตไปAdnan
Mr. Xcoder

@ Mr.Xcoder ไม่ว่าคุณหรือ Adnan ควรโพสต์สิ่งนั้น
Erik the Outgolfer

@ Mr.Xcoder ฉันจะรอสักครู่และดู: P แต่มันดูแตกต่างกันมากถ้าฉันลงรายการบัญชีฉันจะโพสต์คำตอบอื่น
Erik the Outgolfer


3

Pyth , 5 ไบต์

s@Rvz

ลองที่นี่!

Pyth , 10 ไบต์

s.gx}LkQ1E

ลองที่นี่!

พวกเขาทำงานอย่างไร

s @ Rvz | โปรแกรมเต็มรูปแบบ

  R | แผนที่ที่ถูกต้อง ...
 @ | ... ใช้สี่แยก
   vz | ของอินพุตแรกด้วยวินาที
s | แผ่แบนหนึ่งระดับ
s.gx} LkQ1E | โปรแกรมเต็มรูปแบบ

 .g E | จัดกลุ่มรายการในอินพุตที่สองโดย ...
    } LkQ | แมปผ่านอินพุตแรกและตรวจสอบว่ารายการปัจจุบันอยู่ในรายการหรือไม่
   x 1 | รับดัชนีขององค์ประกอบความจริงข้อแรก
s | เรียบ.

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



3

05AB1E , 3 ไบต์

δØ

ลองออนไลน์! (ขอบคุณAdnan ที่แจ้งให้ฉันทราบว่าδมีอยู่ -1 ไบต์)

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

δØ | โปรแกรมเต็มรูปแบบ

δ | ปรับคำสั่งต่อไปให้เป็นสองเท่า (เช่นผลิตภัณฑ์ด้านนอก)
 Ã | รายการแยก เนื่องจากนี่คือ dyad อินพุตแรกจึงเป็นแบบอัตโนมัติ
     | ใช้เพื่อเติมอาร์กิวเมนต์ที่หายไป (เท่าที่ฉันรู้)
  ˜ | เรียบ.

ดี€Ã˜ดูเหมือนจะไม่ทำงาน
Erik the Outgolfer

ไม่ไม่มี BTW เหตุผลที่€Ã˜ล้มเหลวเป็นเพราะÃเวลาสองขัดแย้งและคาดว่าฟังก์ชั่นที่มีอาร์กิวเมนต์หนึ่งเพื่อให้มันกลับ[[]]แทน (ผมคิดว่าเป็นข้อผิดพลาด) ดังนั้นแล้วจะแผ่กลับ˜ แม้ว่าการทำงานแตกต่างกัน สำหรับแต่ละองค์ประกอบของไอเท็มด้านบนมันจะสร้างสแต็กใหม่แล้วส่งกลับด้านบนของแต่ละสแต็กใหม่ดังนั้นเมื่อมีไอเท็มไม่เพียงพอสำหรับฟังก์ชั่นมันจะรับอินพุตโดยปริยายแทน []ε
Erik the Outgolfer

ฉันยังไม่ได้ทดสอบมัน แต่δØสิ่งที่คุณกำลังมองหา?
Adnan

@ Mr.Xcoder ฉันไม่คิดว่ามันเป็นแผนที่แบบเพียร์ดิคที่ Pyth มีอยู่มันทำหน้าที่เหมือนผลิตภัณฑ์ด้านนอกหรืออะไรบางอย่าง
Erik the Outgolfer

3

เรติน่า , 37 36 ไบต์

O$`(\d+)(?=.*¶(.*)\[.*\b\1\b)
$2
G1`

ลองออนไลน์! รับอินพุตเป็นรายการของขวัญบนบรรทัดแรกและรายการของช่วงบนบรรทัดที่สอง ลิงก์นี้มีส่วนหัวเพื่อแยกกรณีทดสอบออกเป็นรูปแบบที่ต้องการ แก้ไข: บันทึก 1 ไบต์ขอบคุณ @MartinEnder คำอธิบาย: ด่านแรกตรงกับงานนำเสนอและค้นหาท่าเทียบเรือ ของขวัญถูกเรียงลำดับตามซับสตริงจากจุดเริ่มต้นของบรรทัดไปยัง[ดังนั้นจึงจัดกลุ่มของขวัญตามท่าเรือ ขั้นตอนที่สองจะลบบริเวณท่าเรือ


2

รายการ , 3 ไบต์

f₱Ẏ

ลองออนไลน์!

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

f ₱Ẏ | โปรแกรมเต็มรูปแบบ

 ₱ | แม็พอาร์กิวเมนต์ที่ถูกต้อง
f | ใช้รายการทางแยกการนับหลายหลาก
  Ẏ | กระชับ (แบน 1 ระดับ)

1
: D Enlist ไม่ได้ถูกลืม: D จริงๆแล้วมันเป็นเพียงไม่ได้อยู่ในชุมชน แต่โดยฉัน :(: P
HyperNeutrino

2

APL + WIN, 29 ไบต์

(,⍉<\p←n∘.≤∊¯1↑¨⎕)/(×/⍴p)⍴n←⎕

แสดงพร้อมต์สำหรับอินพุตหน้าจอสำหรับทั้งจำนวนเต็มและช่วง จำนวนเต็มเป็นรายการแบบเรียบและช่วงเป็นเวกเตอร์ซ้อนกันเช่นกรณีที่ 3:

(1 3) (4 5) (6 7)

คำอธิบาย:

(×/⍴p)⍴n←⎕ prompt for screen input of integers and replicate by the number of ranges 

∊¯1↑¨⎕ prompt for screen input of ranges and select the top of each

p←n∘.≤ create a boolean matrix using outer product with less than the top of each range

,⍉<\ identify the first range which each element fits in and ravel into a partition vector

(.....)/.... use the partition vector to select the elements in each range in order

2

C ++, 127 ไบต์

รับอินพุตเป็นสองอาร์เรย์ที่แสดงโดยคู่ของพอย[start, end)น์เตอร์

#import<algorithm>
[](int*A,int*x,int*B,int*y){for(;B!=y;B+=2)A=std::stable_partition(A,x,[&](int a){return a>=*B&&a<=B[1];});}

ลองออนไลน์!


C + + มีตัวสำหรับทุกสิ่ง ... หรือไม่ / ระบุว่าช่วงอินพุตไม่ได้มี 0 จึงมีความเป็นไปได้ที่จะลดจำนวนไบต์โดยใช้อาเรย์ที่สิ้นสุดด้วยค่า null แม้ว่ามันอาจจะถือว่าเป็นการโกง / น่าเสียดายที่[&](int a)->int{a=a>=แทนที่จะ[&](int a){return a>=ไม่บันทึกไบต์ใด ๆ / #import<algorithm>สามารถเป็น#import<regex>อย่างน้อยใน TIO ฉันพบว่าหลังจากการค้นหาอย่างละเอียด ("การค้นหาไบนารีด้วยตนเอง") ส่วนหัวทั้งหมดที่แสดงรายการในหน้านี้และอันนี้สั้นที่สุด / ยัง +1 จากฉัน
user202729

2

J, 15 ไบต์

[/:[:I.e.&>"0 1

รับอินพุตเป็นอาร์กิวเมนต์ซ้ายและช่วงเป็นอาร์กิวเมนต์ที่ถูกต้อง ช่วงเป็นรายการที่บรรจุในกล่องของช่วงสมบูรณ์

เช่นช่วงแรก:

   NB. This produces the range
   (1 2 3 ; 4 5 6 7)
┌─────┬───────┐
│1 2 3│4 5 6 7│
└─────┴───────┘

ลองออนไลน์!

คำอธิบาย

[/:[:I.e.&>”0 1
          >”0 1  Pair each element on the left with each range on the right
       e.        Is the element in the range?
     I.          Indices of ones
[/:              Sort the elements by this array

2

J , 26 24 ไบต์

2 ไบต์ขอบคุณโคล

[:;]<@#~1=-&1 0"1@[I."1]

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

อาร์กิวเมนต์ซ้ายถือช่วง

-&1 0"1@[ ลดขอบเขตล่างของแต่ละช่วงลง 1

I."1] ตรวจสอบในช่วงที่เหมาะกับแต่ละปัจจุบัน

1= มันอยู่ในช่วงที่ถูกต้อง

]<@#~ คัดลอกและกล่องของขวัญที่อยู่ในช่วงปัจจุบัน

; - raze (unboxing)

ลองออนไลน์!


1
ฉันค่อนข้างแน่ใจว่าคุณไม่สามารถลบเลขศูนย์ได้เนื่องจากอินพุทเป็นอินทิกรัล (เช่นกรณีทดสอบล้มเหลว(0 4,:_3 _1) f _2 _1 0 1 2)
โคล

@cole หืมมฉันไม่สนใจกรณีเหล่านี้ทั้งหมด ฉันจะต้องคิดถึงพวกเขา
Galen Ivanov

1
ใช่ฉันคิดว่าวิธีที่ง่ายที่สุดอาจจะเป็นกล่องแล้วทำลาย 24 ไบต์เป็นอย่างนั้น
โคล

@cole ขอบคุณ! มันไม่เพียง แต่สั้นลง แต่ยังแก้ปัญหาได้อย่างง่ายดายด้วย 0
Galen Ivanov

2

R , 113 48 55 41 ไบต์

รุ่นก่อนหน้าไม่ได้จัดเรียงวัตถุอย่างถูกต้องเมื่อท่าไม่ได้เพิ่มขึ้น

function(P,D)for(d in D)cat(P[P%in%d],"")

ลองออนไลน์!

ใช้เวลาDเป็นรายการของเวกเตอร์ของช่วงที่กล่าวคือจะเป็นlist(4:7,1:3)[[4, 7], [1, 3]]

อาจเป็นคำตอบที่ไร้เดียงสาฉันน่าจะมาถึงเมื่อหลายปีก่อน พิมพ์ไปยัง stdout


2

Japt , 6 ไบต์

ñ@VbøX

ลองมัน


คำอธิบาย

อินพุตของอาร์เรย์U(นำเสนอ) และ 2d-array V(เต็มช่วง) โดยนัย จัดเรียง ( ñ) นำเสนอโดยส่งผ่านฟังก์ชัน ( @) ที่รับดัชนีขององค์ประกอบแรก ( b) ในVที่มี ( ø) นำเสนอปัจจุบัน ( X)


1

Python 2, 97 85 ไบต์

l,d=input()
k=lambda i,j=0:-~j*(d[j][0]<=i<=d[j][1])or k(i,j+1)
print sorted(l,key=k)

-11 ไบต์จากovs

-1 ไบต์จากMr. Xcoder

ลองออนไลน์!

เรียงลำดับรายการโดยใช้แลมบ์ดาแบบเรียกซ้ำเป็นกุญแจสำคัญ คำอธิบายมาเร็ว ๆ นี้™ด้านล่าง

คำอธิบาย:

l,d=input()             # l is the lsit of presents, d is the list of ranges
k=lambda i,j=0:-~j*(d[j][0]<=i<=d[j][1])or k(i,j+1)# recursive lambda to sort with
k=lambda i,j=0:                                    # i is the present
                                                   # j is the index in the list of ranges
               -~j*(d[j][0]<=i<=d[j][1])           # return the index of the list of
                                                   # ranges(plus one) if the present is
                                                   # in the range
                                        or k(i,j+1)# if the present is not in the range,
                                                   # try the next range
print sorted(i,key=k)   # print the list of presents sorted by the lambda


1

PowerShellขนาด 37 ไบต์

param($a,$b)$b|%{$i=$_;$a|?{$_-in$i}}

ลองออนไลน์!

ใช้$aเป็นอาร์เรย์ตามตัวอักษรของของขวัญและ$bเป็นอาร์เรย์ของอาร์เรย์ซึ่งแต่ละรายการจะเป็นแบบเต็มรูปแบบ (เช่น@(1,2,3,4,5)แทนที่จะเป็น@(1,5)) จากนั้นเราจะห่วงมากกว่าแต่ละรายการในด้วย$b |%{...}ข้างในเราจำเป็นต้องตั้งผู้ช่วย$iให้เป็นรายการปัจจุบันจากนั้นใช้ส่วนWhere-Objectคำสั่ง$aเพื่อดึงเฉพาะรายการเหล่านั้นที่เป็นอาร์เรย์-inปัจจุบัน$b

สิ่งเหล่านี้จะถูกทิ้งไว้บนไปป์ไลน์และเอาท์พุทก็เป็นนัย เนื่องจากพฤติกรรมเริ่มต้นของการWrite-Outputแทรกขึ้นบรรทัดใหม่ระหว่างองค์ประกอบอาร์เรย์นั่นคือสิ่งที่เราได้รับ นี่คือเวอร์ชันที่ปรับแต่งเล็กน้อยที่-joinรวมเข้าด้วยกันผ่านเครื่องหมายจุลภาคแทนที่จะขึ้นบรรทัดใหม่เพื่อแสดงความแตกต่าง




1

Windows Batch (CMD), 90 79 ไบต์

set/pX=||exit
set/pY=
for %%n in (%*)do if %X% LEQ %%n if %%n LEQ %Y% %%n
%0 %*

ใช้รูปแบบจุดสิ้นสุดของบรรทัด LF อักขระสิ้นสุดบรรทัดแต่ละตัวสามารถนับเป็น 1 ไบต์

ไม่มี TIO (เพราะ TIO ใช้ Linux)

stdinรับรายการจากอาร์กิวเมนต์บรรทัดคำสั่งและช่วงจาก

ตัวอย่างเช่นหากโปรแกรมทำงาน (ถือว่าไฟล์มีชื่อว่าr1.cmd)

r1 7 3 5 4 6 1 2

และด้วยการstdinป้อนข้อมูล

1
3
4
5
6
7

โปรแกรมจะแสดงผลเป็นstderrรูปแบบ

'3' is not recognized as an internal or external command,
operable program or batch file.
'1' is not recognized as an internal or external command,
operable program or batch file.
'2' is not recognized as an internal or external command,
operable program or batch file.
'5' is not recognized as an internal or external command,
operable program or batch file.
'4' is not recognized as an internal or external command,
operable program or batch file.
'7' is not recognized as an internal or external command,
operable program or batch file.
'6' is not recognized as an internal or external command,
operable program or batch file.

(สอดคล้องกับลำดับเอาต์พุต3 1 2 5 4 7 6)


คำอธิบาย:

set /p X=       Prompt for variable X (min range)
   ||exit       If failed (end of file), exit - similar to short-circuit of logical OR
set /p Y=       Prompt for variable Y
for %%n in (%*)do     For each number %%n in all command-line arguments
   if %X% LEQ %%n     If X <= n
      if %%n LEQ %Y%  and n <= Y
         %%n          run command named "n", which lead to an error.

%0 %*           Call itself, process other ranges

รหัส Ungolfed (ด้วยการเปิดใช้งานการโต้ตอบหากtrueถูกส่งเป็นอาร์กิวเมนต์ 1; พร้อมท์สำหรับรายการจากstdin, ใช้gotoเพื่อหลีกเลี่ยงการล้นสแต็ค - จริง ๆ แล้วฉันแค่พยายามเรียกใช้สคริปต์ที่เรียกตัวเองมากกว่า 70000 ครั้งโดยไม่เห็นปัญหาใด ๆ ควรจะค่อนข้างปลอดภัย):

@echo off

set INTERACTIVE=%1

if "%INTERACTIVE%" == "true" (
    set rangeMinPrompt=Enter range min: 
    set rangeMaxPrompt=Enter range max: 
    set listPrompt=Enter list: 
) else (
    set rangeMinPrompt=
    set rangeMaxPrompt=
    set listPrompt=
)


set /p list=%listPrompt%

:loop_label

set /p rangeMin=%rangeMinPrompt%&& set /p rangeMax=%rangeMaxPrompt%|| exit /b

for %%n in (%list%) do (
    if %rangeMin% LEQ %%n (
        if %%n LEQ %rangeMax% (
            echo %%n
        )
    )
)

goto :loop_label

(%*)คุณสามารถบันทึกไบต์มากขึ้นโดยกำหนดให้นำเสนอที่จะเป็นอาร์กิวเมนต์บรรทัดคำสั่งและการใช้งาน เมื่อทำสิ่งนี้แล้วคุณสามารถใช้%0 %*เพื่อรีสตาร์ทสคริปต์หลังจากประมวลผลแต่ละช่วง (ฉันจริงสิ้นสุดลงด้วยการนับไบต์มีขนาดใหญ่เพราะผมใช้รุ่นโต้ตอบของคุณด้วยสัมผัสที่ดี&&, exit/bและechoเป็นจุดเริ่มต้นของฉัน.)
นีล

@ นีลดีขอบคุณ! ฉันเดิมพยายามใช้%1แต่คำพูดทำให้พื้นที่ที่ไม่ได้ทำงานเป็นตัวคั่นดังนั้นฉันสิ้นสุดการใช้" set /p
user202729

โอ้ว้าวมีแม้กระทั่ง$~1...
user202729


1

ภาษา Wolfram (Mathematica) , 34 ไบต์

r#~SortBy~{#&@@@r~Position~#&}&

ลองออนไลน์!

เป็นFunctionผู้ประกอบการ

นี่เป็นฟังก์ชั่น curried ที่ไม่มีชื่อซึ่งควรเรียกใช้ครั้งแรกด้วยรายการของช่วงท่าเรือ (ที่ขยาย) แล้วด้วยรายการของขวัญ ตัวอย่างเช่นหากคุณกำหนดฟังก์ชันให้กับf:

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

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


1

Julia 0.6 , 31 30 ไบต์

p%d=vcat((∩(p,x)for x=d)...)

ลองออนไลน์!

นิยามใหม่ของ%ผู้ประกอบการและแผนที่สี่แยกชุด∩()มากกว่าท่าเทียบเรือรักษาความสงบเรียบร้อยและความหลายหลากของที่นำเข้าครั้งแรกที่รายการนำเสนอd เมื่ออินพุตขยายไปยังหลายอาร์กิวเมนต์ผ่านแฟล็กอาร์เรย์ที่ซ้อนกันผลลัพธ์pvcat...

แก้ไข -1Byte: map()รายชื่อเข้าใจแทน

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