Thử thách Mùa Vọng 5: Di chuyển những món quà đến bến cảng vận chuyển!


9

<< Trước đó tiếp theo >>

Nhờ cộng đồng PPCG, Santa đã quản lý để tái sản xuất tất cả các món quà của mình và sau dây chuyền lắp ráp, các món quà đã sẵn sàng để được chuyển vào bến cảng vận chuyển!

Mỗi bến cảng vận chuyển của ông già Noel chỉ giữ một loạt các kích cỡ hiện tại vì xe trượt vận chuyển chuyên dùng cho một kích thước cụ thể (bất kỳ chiếc bật lửa nào cũng sẽ lãng phí, bất kỳ chiếc xe trượt tuyết nào nặng hơn và không thể chịu được tải trọng). Vì vậy, anh ta cần bạn giúp anh ta lấy quà và sắp xếp chúng vào bến tàu vận chuyển chính xác.

Thử thách

Đưa ra một danh sách và các phạm vi bến vận chuyển, sắp xếp ổn định các món quà theo đúng thứ tự.

Hãy lấy ví dụ này: quà là [5, 3, 8, 6, 2, 7]và phạm vi dock là [[1, 5] and [6, 10]].

Những món quà 5, 32đi vào bến tàu đầu tiên và những món quà 8, 67đi vào bến tàu thứ hai. Điều này có thể được hiển thị như [[5, 3, 2], [8, 6, 7]]. Danh sách này sẽ gần với việc được sắp xếp hơn đầu vào, nhưng stablycó nghĩa là trong mỗi dock, thứ tự của các món quà phải giống với thứ tự của đầu vào (nếu không bạn chỉ có thể sắp xếp toàn bộ danh sách).

Đầu ra cuối cùng của bạn cho trường hợp này sẽ là [5, 3, 2, 8, 6, 7](dưới dạng một danh sách phẳng).

Định dạng thông số kỹ thuật

Bạn sẽ được cung cấp đầu vào như một danh sách phẳng của số nguyên và một danh sách các dãy trong bất kỳ định dạng hợp lý (ví dụ, phạm vi đối với trường hợp trên có thể được đưa ra là [[1, 5], [6, 10]], [1, 5, 6, 10]hoặc [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]]). Đầu ra của bạn phải là một danh sách phẳng các số nguyên ở bất kỳ định dạng hợp lý nào.

Đầu vào có thể chứa các giá trị trùng lặp; trong trường hợp này, bạn cần trả về tất cả các phiên bản của chúng. Tất cả các kích thước hiện tại sẽ ở chính xác một phạm vi kích thước và bạn có thể giả định rằng các phạm vi sẽ không bao giờ trùng nhau. Có thể có những khoảng trống trong phạm vi miễn là tất cả các kích thước hiện tại được bảo hiểm.

Quy tắc

  • Áp dụng sơ hở tiêu chuẩn
  • Đây là , vì vậy câu trả lời ngắn nhất bằng byte sẽ thắng
  • Không có câu trả lời sẽ được chấp nhận
  • Bạn có thể cho rằng sẽ không có phạm vi trống ( [7, 4]sẽ không hợp lệ vì phạm vi tăng lên)

Các trường hợp thử nghiệm

[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]

Lưu ý: Tôi đã lấy cảm hứng cho loạt thử thách này từ Advent Of Code . Tôi không có liên kết với trang web này

Bạn có thể xem danh sách tất cả các thử thách trong chuỗi bằng cách xem phần 'Liên kết' của thử thách đầu tiên tại đây .


Luôn luôn chỉ có 2 bến cảng?
LiefdeWen

Các phạm vi có thể chồng lấp?
RamenChef

@LiefdeWen Xem trường hợp thử nghiệm thứ 3.
Ông Xcoder

Các cặp bến sẽ luôn là {nhỏ, lớn}
LiefdeWen

@RamenChef Không ..
HyperNeutrino

Câu trả lời:



4

Thạch , 4 byte

fЀẎ

Hãy thử trực tuyến!

Đưa đầu vào như danh sách hiện tại, phạm vi đầy đủ.


yaay đó là giải pháp thạch tôi mong đợi: DDD
HyperNeutrino

@HyperNeutrino Hehe giải pháp dự kiến ​​hóa ra không phải là ngắn nhất. Bằng cách tìm ra cách hoạt động của sản phẩm bên ngoài của 05ab1e, tôi đã tìm ra rằng nó cũng fþFhoạt động trong Jelly, với 3 byte . Tín dụng đến Adnan .
Ông Xcoder

@ Mr.Xcoder Hoặc bạn hoặc Adnan nên đăng nó.
Erik the Outgolfer

@ Mr.Xcoder Tôi sẽ đợi một chút và xem: P nhưng nó có vẻ khác biệt đáng kể, nếu tôi kết thúc việc đăng nó, tôi sẽ đăng một câu trả lời khác.
Erik the Outgolfer

4

Toán học, 39 byte

x##&@@Cases[x,#|##&@@Range@##]&@@@#&

-22 byte từ JungHwan Min
-4 byte từ Martin

Hãy thử trực tuyến!


Bạn cũng có thể loại bỏ toàn bộ Rangemọi thứ bằng cách chỉ lấy phạm vi mở rộng làm đầu vào.
Martin Ender

3

Bình thường , 5 byte

s@Rvz

Hãy thử nó ở đây!

Bình thường , 10 byte

s.gx}LkQ1E

Hãy thử nó ở đây!

Chúng hoạt động như thế nào

s @ Rvz | Chương trình đầy đủ.

  R | Bản đồ bên phải ...
 @ | ... Sử dụng giao lộ.
   vz | Đầu vào đầu tiên với đầu vào thứ hai.
s | Làm phẳng bởi một cấp độ.
s.gx} LkQ1E | Chương trình đầy đủ.

 .g E | Nhóm các mục trong đầu vào thứ hai bằng ...
    } LkQ | Ánh xạ qua đầu vào đầu tiên và kiểm tra xem mục hiện tại có trong danh sách không.
   x 1 | Lấy chỉ số của yếu tố trung thực đầu tiên.
s | Làm phẳng.

Đưa các bến trước tiên, với tất cả các số nguyên trong phạm vi, và sau đó là các phần quà trên một dòng mới.



3

05AB1E , 3 byte

δØ

Hãy thử trực tuyến! (cảm ơn Adnan đã cho tôi biết δtồn tại, -1 byte)

Làm thế nào nó hoạt động

| | Chương trình đầy đủ.

δ | Double-vectorize lệnh tiếp theo (một cái gì đó giống như một sản phẩm bên ngoài).
 Ã | Liệt kê giao lộ. Vì đây là dyad, đầu vào đầu tiên sẽ tự động
     | được sử dụng để điền vào đối số còn thiếu (theo như tôi biết).
  ˜ | Làm phẳng.

Chà, €Ã˜dường như không hoạt động.
Erik the Outgolfer

Không, không có. Lý do €Ã˜thất bại là vì Ãcó hai đối số và mong đợi một hàm có một đối số, vì vậy nó sẽ trả về [[]](tôi nghĩ đó là một lỗi), vì vậy sau đó ˜sẽ làm phẳng, trả về []. εmặc dù, hoạt động khác nhau. Đối với mỗi phần tử của mục trên cùng, nó tạo một ngăn xếp mới và sau đó trả về đỉnh của mỗi ngăn xếp mới, vì vậy khi không có đủ các mục trong đó cho một hàm, thay vào đó, nó sẽ đưa một đầu vào ẩn.
Erik the Outgolfer

Tôi chưa thử nó, nhưng đó là δØnhững gì bạn đang tìm kiếm?
Ad Nam

@ Mr.Xcoder Tôi không nghĩ đó chính xác là bản đồ nhuộm mà Pyth có, nó hoạt động giống như sản phẩm bên ngoài hoặc thứ gì đó.
Erik the Outgolfer

3

Võng mạc , 37 36 byte

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

Hãy thử trực tuyến! Lấy đầu vào dưới dạng danh sách các món quà trên dòng đầu tiên và danh sách các phạm vi trên dòng thứ hai; liên kết bao gồm một tiêu đề để phân chia các trường hợp thử nghiệm thành định dạng mong muốn. Chỉnh sửa: Đã lưu 1 byte nhờ @MartinEnder. Giải thích: Giai đoạn đầu tiên phù hợp với các món quà và tìm thấy dock phù hợp. Các món quà được sắp xếp theo chuỗi con từ đầu dòng đến [, do đó nhóm các món quà theo dock. Giai đoạn thứ hai sau đó xóa các bến cảng.


2

Nhập ngũ , 3 byte

f₱Ẏ

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

f £ Ẏ | Chương trình đầy đủ.

 GIÁ | Bản đồ trên đối số đúng.
f | Sử dụng danh sách giao, đếm bội số.
  Ẏ | Thắt chặt (làm phẳng 1 cấp).

1
: D Enlist không bị lãng quên: D Thật ra nó khá là, không chỉ bởi cộng đồng mà là bởi tôi :(: P
HyperNeutrino

2

APL + THẮNG, 29 byte

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

Nhắc nhở đầu vào màn hình cho cả số nguyên và phạm vi. Các số nguyên dưới dạng một danh sách phẳng và các phạm vi dưới dạng một vectơ lồng nhau, ví dụ trường hợp 3:

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

Giải trình:

(×/⍴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 byte

Lấy đầu vào là hai mảng được biểu thị bằng các cặp con trỏ [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];});}

Hãy thử trực tuyến!


Chà, C ++ có tích hợp sẵn cho mọi thứ ... hay không? / Cho rằng các phạm vi đầu vào không chứa 0, có thể đánh xuống một số byte bằng cách sử dụng mảng B kết thúc null, mặc dù nó có thể được coi là gian lận. / Thật không may [&](int a)->int{a=a>=thay vì [&](int a){return a>=không lưu bất kỳ byte nào. / #import<algorithm>có thể #import<regex>, ít nhất là trên TIO. Tôi thấy rằng sau khi tìm kiếm một cách toàn diện ("tìm kiếm nhị phân thủ công"), tất cả các tiêu đề được liệt kê trong trang này và cái này là ngắn nhất. / Ngoài ra, +1 từ tôi.
dùng202729

2

J, 15 byte

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

Lấy đầu vào là đối số bên trái và phạm vi là đối số bên phải . Các phạm vi là danh sách đóng hộp của các phạm vi hoàn chỉnh.

ví dụ cho phạm vi đầu tiên:

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

Hãy thử trực tuyến!

Giải trình

[/:[: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 byte

2 byte nhờ cole

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

Làm thế nào nó hoạt động:

Đối số bên trái giữ các phạm vi.

-&1 0"1@[ giảm ranh giới dưới của mỗi phạm vi xuống 1

I."1] kiểm tra trong phạm vi phù hợp với từng món quà

1= nó có trong phạm vi chính xác không

]<@#~ bản sao và hộp các món quà trong phạm vi hiện tại

; - raze (bỏ hộp)

Hãy thử trực tuyến!


1
Tôi khá chắc chắn rằng bạn không thể xóa các số 0 vì đầu vào là không thể tách rời (ví dụ: thất bại trong trường hợp kiểm tra này (0 4,:_3 _1) f _2 _1 0 1 2)
cole

@cole Hừm, tôi đã bỏ bê những trường hợp này. Tôi sẽ cần suy nghĩ về họ.
Galen Ivanov

1
Vâng tôi nghĩ rằng cách dễ nhất có lẽ sẽ là đóng hộp và sau đó phá hủy. 24 byte theo cách đó.
cole

@cole Cảm ơn bạn! Nó không chỉ ngắn hơn mà còn dễ dàng giải quyết vấn đề với 0.
Galen Ivanov

2

R , 113 48 55 41 byte

Một phiên bản trước không sắp xếp chính xác các đối tượng khi các bến cảng không theo thứ tự tăng dần.

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

Hãy thử trực tuyến!

Lấy Dnhư một danh sách các vectơ của phạm vi, nghĩa là, list(4:7,1:3)sẽ là [[4, 7], [1, 3]].

Có lẽ câu trả lời ngây thơ mà tôi nên có ở nhiều năm trước; in ra thiết bị xuất chuẩn.


2

Japt , 6 byte

ñ@VbøX

Thử nó


Giải trình

Đầu vào ngầm định của mảng U(quà tặng) và mảng 2d V(phạm vi đầy đủ). Sắp xếp ( ñ) các món quà bằng cách chuyển chúng qua một hàm ( @) lấy chỉ mục của phần tử đầu tiên ( b) trong Vđó chứa ( ø) hiện tại ( X).


1

Python 2, 97 85 byte

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 byte từ các lò nướng

-1 byte từ ông Xcoder

Hãy thử trực tuyến!

Sắp xếp danh sách bằng cách sử dụng lambda đệ quy làm khóa. Giải thích sắp có ™ dưới đây.

Giải trình:

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 byte

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

Hãy thử trực tuyến!

Lấy $anhư một mảng theo nghĩa đen của các món quà và $bnhư một mảng của các mảng, mỗi mảng là phạm vi đầy đủ (ví dụ, @(1,2,3,4,5)thay vì @(1,5)). Chúng tôi sau đó lặp qua từng mục $bvới |%{...}. Bên trong, chúng ta cần đặt một trình trợ giúp $ilàm mục hiện tại, sau đó sử dụng Where-Objectmệnh đề chống lại $ađể chỉ rút ra các mục đó là mảng -inhiện tại $b.

Những cái còn lại trên đường ống và đầu ra là ẩn. Vì hành vi mặc định của việc Write-Outputchèn một dòng mới giữa các thành phần mảng, đó là những gì chúng ta nhận được. Đây là một phiên bản được điều chỉnh một chút, được -joinghép lại với nhau thông qua dấu phẩy thay vì một dòng mới, chỉ để thể hiện sự khác biệt.




1

Windows Batch (CMD), 90 79 byte

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

Sử dụng định dạng cuối dòng của LF. Mỗi ký tự cuối dòng có thể được tính là 1 byte.

Không có TIO (vì TIO sử dụng Linux)

Lấy danh sách từ các đối số dòng lệnh và phạm vi từ stdin.

Ví dụ: nếu chương trình được chạy (giả sử tệp được đặt tên r1.cmd)

r1 7 3 5 4 6 1 2

và với stdinđầu vào

1
3
4
5
6
7

, chương trình sẽ xuất ra stderrvới định dạng

'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.

(tương ứng với chuỗi đầu ra 3 1 2 5 4 7 6)


Giải trình:

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

Mã không được mã hóa (với tính năng tương tác được kích hoạt nếu trueđược chuyển thành đối số 1; nhắc nhở danh sách từ stdin, sử dụng gotođể tránh tràn ngăn xếp - thực sự tôi vừa thử chạy một tập lệnh tự gọi hơn 70000 lần mà không gặp vấn đề gì, vì vậy tôi đoán nó nên khá an toàn):

@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

Bạn có thể lưu nhiều byte hơn bằng cách yêu cầu các phần quà phải là đối số dòng lệnh và sử dụng (%*). Làm xong việc này, sau đó bạn có thể sử dụng %0 %*để khởi động lại tập lệnh sau khi xử lý từng phạm vi. (Tôi thực sự đã kết thúc với một số byte lớn hơn bởi vì tôi đã sử dụng phiên bản tương tác của bạn với chạm đẹp &&, exit/becholà điểm bắt đầu của tôi.)
Neil

@Neil Nice, cảm ơn! Ban đầu tôi đã thử sử dụng %1nhưng dấu ngoặc kép "làm cho không gian không hoạt động như dấu phân cách, vì vậy tôi đã kết thúc bằng cách sử dụng set /p.
dùng202729

Ôi chà, thậm chí còn có $~1...
user202729


1

Ngôn ngữ Wolfram (Mathicala) , 34 byte

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

Hãy thử trực tuyến!

là người Functionđiều hành.

Đây là một hàm curried chưa được đặt tên nên được gọi đầu tiên với danh sách các phạm vi dock (mở rộng) và sau đó với danh sách các món quà. Ví dụ: nếu bạn gán hàm cho f:

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

Danh sách các món quà được sắp xếp đơn giản theo vị trí cấp đầu tiên của giá trị trong danh sách các phạm vi dock. Chúng ta cần phải bọc SortByhàm trong một danh sách để sắp xếp ổn định.


1

Julia 0,6 , 31 30 byte

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

Hãy thử trực tuyến!

Xác định lại %toán tử và ánh xạ giao điểm đã đặt ∩()trên các bến cảng dduy trì trật tự và bội số của lần nhập đầu tiên, danh sách các món quà p. vcatvới đầu vào được mở rộng thành nhiều đối số thông qua ...làm phẳng mảng kết quả lồng nhau.

Chỉnh sửa, -1Byte: Liệt kê danh sách thay vì map().

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.