Advent Challenge 5: Pindahkan hadiah ke dok transportasi!


9

<< Sebelumnya Berikutnya >>

Berkat komunitas PPCG, Santa telah berhasil membuat ulang semua hadiahnya dan setelah jalur perakitan, hadiah kini siap untuk dipindahkan ke dok transportasi!

Masing-masing dermaga pengangkut Santa hanya menampung berbagai ukuran saat ini karena kereta luncur khusus untuk ukuran tertentu (lebih ringan dan akan sia-sia, lebih berat dan kereta tidak akan mampu menangani beban). Karena itu, ia membutuhkan Anda untuk membantunya mengambil hadiah dan mengurutkannya ke dermaga transportasi yang benar.

Tantangan

Diberikan daftar dan kisaran dermaga transportasi, secara teratur mengatur hadiah ke dalam urutan yang benar.

Mari kita ambil contoh ini: hadiahnya [5, 3, 8, 6, 2, 7]dan rentang docknya [[1, 5] and [6, 10]].

Hadiah 5, 3dan 2masuk ke dermaga pertama dan hadiah 8, 6dan 7masuk ke dermaga kedua. Ini dapat ditampilkan sebagai [[5, 3, 2], [8, 6, 7]]. Daftar ini akan lebih dekat untuk diurutkan daripada input, tetapi stablyberarti bahwa di dalam setiap dermaga, urutan hadiah harus sama dengan urutan input (jika tidak, Anda bisa mengurutkan seluruh daftar).

Hasil akhir Anda untuk kasus ini adalah [5, 3, 2, 8, 6, 7](sebagai daftar datar).

Spesifikasi Format

Anda akan diberikan masukan sebagai daftar dari bilangan bulat dan daftar rentang dalam format yang wajar (misalnya, rentang untuk kasus di atas dapat diberikan sebagai [[1, 5], [6, 10]], [1, 5, 6, 10], atau [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]]). Output Anda harus berupa daftar datar bilangan bulat dalam format apa pun yang wajar.

Input dapat berisi nilai duplikat; dalam hal ini, Anda harus mengembalikan semua instance dari mereka. Semua ukuran saat ini akan berada tepat dalam satu rentang ukuran, dan Anda dapat mengasumsikan bahwa rentang tidak akan pernah tumpang tindih. Mungkin ada kesenjangan dalam rentang selama semua ukuran yang ada tercakup.

Aturan

  • Celah Standar Berlaku
  • Ini adalah , jadi jawaban tersingkat dalam byte menang
  • Tidak ada jawaban yang akan diterima
  • Anda dapat mengasumsikan bahwa tidak akan ada rentang kosong ( [7, 4]akan tidak valid karena rentang naik)

Uji Kasus

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

Catatan: Saya mendapat inspirasi untuk seri tantangan ini dari Advent Of Code . Saya tidak memiliki afiliasi dengan situs ini

Anda dapat melihat daftar semua tantangan dalam seri ini dengan melihat bagian 'Tertaut' dari tantangan pertama di sini .


Selalu hanya 2 dermaga?
LiefdeWen

Bisakah rentang tumpang tindih?
RamenChef

@LiefdeWen Lihat test case ke-3.
Tn. Xcoder

Akankah pasangan dok selalu {kecil, besar}
LiefdeWen

@RamenChef No. ..
HyperNeutrino

Jawaban:



4

Jelly , 4 byte

fЀẎ

Cobalah online!

Mengambil input sebagai daftar sekarang, rentang penuh.


yaay itu solusi jelly yang saya harapkan: DDD
HyperNeutrino

@HyperNeutrino Hehe solusi yang diharapkan ternyata bukan yang terpendek. Dengan menemukan cara produk luar 05ab1e bekerja, saya pikir itu juga fþFberfungsi di Jelly, selama 3 byte . Penghargaan untuk Adnan .
Tn. Xcoder

@ Mr.Xcoder Anda atau Adnan harus memposting itu.
Erik the Outgolfer

@ Mr.Xcoder Saya akan menunggu sedikit dan melihat: P tetapi terlihat sangat berbeda, jika saya akhirnya mempostingnya, saya akan memposting jawaban lain.
Erik the Outgolfer

4

Mathematica, 39 byte

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

-22 byte dari JungHwan Min
-4 byte dari Martin

Cobalah online!


Anda juga dapat menyingkirkan Rangesemuanya dengan hanya mengambil rentang yang diperluas sebagai input.
Martin Ender

3

Pyth , 5 byte

s@Rvz

Coba di sini!

Pyth , 10 byte

s.gx}LkQ1E

Coba di sini!

Bagaimana mereka bekerja

s @ Rvz | Program lengkap.

  R | Peta yang benar ...
 @ | ... Menggunakan persimpangan.
   vz | Dari input pertama dengan yang kedua.
s | Ratakan satu tingkat.
s.gx} LkQ1E | Program lengkap.

 .g E | Kelompokkan item dalam input kedua dengan ...
    } LkQ | Peta di atas input pertama, dan periksa apakah item saat ini ada dalam daftar.
   x 1 | Ambil indeks elemen kebenaran pertama.
s | Meratakan.

Mengambil dermaga pertama, dengan semua bilangan bulat dalam rentang, dan kemudian hadiah di baris baru.


3

Python 2 , 49 46 byte

terima kasih kepada @HyperNeutrino untuk -3 byte

lambda p,b:[x for l in b for x in p if x in l]

Cobalah online!


Tidak disatukan

def f(presents, groups):
  result = []
  for group in groups:
    for present in presents:
      if present in group:
        result.append(present)
  return result

Cobalah online!


3

05AB1E , 3 byte

δØ

Cobalah online! (terima kasih kepada Adnan karena memberi tahu saya δada, -1 byte)

Bagaimana itu bekerja

δØ | Program lengkap.

δ | Dobelkan vektor perintah berikutnya (sesuatu seperti produk luar).
 Ã | Daftar persimpangan. Karena ini adalah angka dua, input pertama secara otomatis
     | digunakan untuk mengisi argumen yang hilang (sejauh yang saya tahu).
  ˜ | Meratakan.

Nah, €Ã˜tampaknya tidak bekerja.
Erik the Outgolfer

Tidak, tidak ada. BTW alasan €Ã˜gagal adalah karena Ãmengambil dua argumen, dan mengharapkan fungsi dengan satu argumen, jadi ia mengembalikannya [[]](saya pikir itu bug), jadi kemudian ˜akan rata, kembali []. εNamun, bekerja secara berbeda. Untuk setiap elemen dari item teratas, ia membuat stack baru dan kemudian mengembalikan bagian atas dari setiap stack baru, jadi ketika tidak ada cukup item di dalamnya untuk suatu fungsi, dibutuhkan input implisit sebagai gantinya.
Erik the Outgolfer

Saya belum mengujinya, tetapi apakah δØyang Anda cari?
Adnan

@ Mr.Xcoder Saya tidak berpikir itu persis seperti yang dimiliki oleh peta Pyth, ia lebih berperilaku seperti produk luar atau sesuatu.
Erik the Outgolfer

3

Retina , 37 36 byte

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

Cobalah online! Mengambil input sebagai daftar hadiah di baris pertama dan daftar rentang di baris kedua; tautan menyertakan header untuk membagi kasus uji menjadi format yang diinginkan. Sunting: Disimpan 1 byte berkat @MartinEnder. Penjelasan: Tahap pertama cocok dengan hadiah dan menemukan dermaga yang cocok. Hadiah diurutkan berdasarkan substring dari awal baris ke [, sehingga mengelompokkan hadiah berdasarkan dock. Tahap kedua kemudian menghapus dok.


2

Mintalah , 3 byte

f₱Ẏ

Cobalah online!

Bagaimana itu bekerja

f د Ẏ | Program lengkap.

 ₱ | Peta di atas argumen yang benar.
f | Menggunakan persimpangan daftar, menghitung multiplisitas.
  Ẏ | Kencangkan (ratakan 1 level).

1
: D Daftar tidak dilupakan: D Sebenarnya itu agak, tidak hanya oleh komunitas tetapi oleh saya :(: P
HyperNeutrino

2

APL + WIN, 29 byte

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

Meminta input layar untuk bilangan bulat dan rentang. Bilangan bulat sebagai daftar datar dan rentang sebagai vektor bersarang, misalnya kasus 3:

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

Penjelasan:

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

Ambil input sebagai dua array yang diwakili oleh pasangan pointer [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];});}

Cobalah online!


Nah, C ++ memiliki built-in untuk semuanya ... atau bukan? / Mengingat bahwa rentang input tidak mengandung 0, dimungkinkan untuk menurunkan beberapa byte menggunakan array B yang diakhiri null, meskipun mungkin dianggap curang. / Sayangnya [&](int a)->int{a=a>=bukannya [&](int a){return a>=tidak menyimpan byte. Saya #import<algorithm>bisa #import<regex>, setidaknya di TIO. Saya menemukan bahwa setelah mencari secara menyeluruh ("pencarian biner manual") semua tajuk yang tercantum di halaman ini dan yang ini adalah yang terpendek. / Juga, +1 dari saya.
user202729

2

J, 15 byte

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

Mengambil input sebagai argumen kiri dan rentang sebagai kanan argumen . Rentang tersebut adalah daftar kotak dari rentang lengkap.

mis. untuk rentang pertama:

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

Cobalah online!

Penjelasan

[/:[: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 berkat cole

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

Bagaimana itu bekerja:

Argumen kiri memegang rentang.

-&1 0"1@[ mengurangi batas bawah setiap rentang sebesar 1

I."1] memeriksa rentang mana yang cocok untuk setiap hadiah

1= apakah itu dalam kisaran yang benar

]<@#~ salinan dan kotak hadiah yang berada dalam kisaran saat ini

; - meruntuhkan (unboxing)

Cobalah online!


1
Saya cukup yakin Anda tidak dapat menghapus nol karena inputnya tidak terpisahkan (misal gagal pada test case ini (0 4,:_3 _1) f _2 _1 0 1 2)
cole

@cole Hm, saya benar-benar mengabaikan kasus ini. Saya perlu memikirkan mereka.
Galen Ivanov

1
Ya saya pikir cara termudah mungkin adalah dengan kotak dan kemudian meruntuhkan. 24 byte seperti itu.
cole

@cole Terima kasih! Ini tidak hanya lebih pendek tetapi dengan mudah menyelesaikan masalah dengan 0.
Galen Ivanov

2

R , 113 48 55 41 byte

Versi sebelumnya tidak menyortir objek dengan benar ketika dermaga tidak dalam urutan meningkat.

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

Cobalah online!

Membawa Dsebagai daftar vektor rentang, yaitu, list(4:7,1:3)akan [[4, 7], [1, 3]].

Mungkin jawaban naif yang seharusnya saya sampaikan di masa lalu; mencetak ke stdout.


2

Japt , 6 byte

ñ@VbøX

Cobalah


Penjelasan

Input implisit array U(hadiah) dan 2d-array V(rentang penuh). Sortir ( ñ) hadiah dengan melewatkannya melalui fungsi ( @) yang mendapatkan indeks elemen pertama ( b) di Vyang berisi ( ø) sekarang hadir ( 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 dari Ovs

-1 byte dari Mr. Xcoder

Cobalah online!

Urutkan daftar menggunakan lambda rekursif sebagai kuncinya. Penjelasan segera hadir ™ di bawah.

Penjelasan:

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

Cobalah online!

Dibawa $asebagai array literal dari hadiah dan $bsebagai array array, yang masing-masingnya adalah rentang penuh (misalnya, @(1,2,3,4,5)bukan @(1,5)). Kami kemudian mengulangi setiap item $bdengan |%{...}. Di dalam, kita perlu mengatur helper $imenjadi item saat ini, kemudian menggunakan Where-Objectklausa $auntuk menarik hanya item-item yang ada -insaat ini$b array .

Mereka dibiarkan di jalur pipa dan hasilnya tersirat. Karena perilaku default Write-Outputmenyisipkan baris baru di antara elemen array, itulah yang kami dapatkan. Berikut adalah versi yang sedikit diubah yang -joindiedit bersama-sama melalui koma alih-alih baris baru, hanya untuk menunjukkan perbedaan.




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 %*

Gunakan format end-of-line LF. Setiap karakter end-of-line dapat dihitung sebagai 1 byte.

Tidak ada TIO (karena TIO menggunakan Linux)

Ambil daftar dari argumen baris perintah, dan berkisar dari stdin.

Misalnya, jika program dijalankan (anggap file tersebut bernama r1.cmd)

r1 7 3 5 4 6 1 2

dan dengan stdininput

1
3
4
5
6
7

, program akan menampilkan ke stderrdengan format

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

(sesuai dengan urutan output 3 1 2 5 4 7 6)


Penjelasan:

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

Kode tidak digabungkan (dengan interaksi diaktifkan jika truedilewatkan sebagai argumen 1; meminta daftar dari stdin, gunakan gotountuk menghindari stack overflow - sebenarnya saya baru saja mencoba menjalankan skrip yang menyebut dirinya lebih dari 70000 kali tanpa melihat masalah, jadi saya rasa itu harus cukup aman):

@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

Anda dapat menyimpan lebih banyak byte dengan meminta presentasinya menjadi argumen baris perintah dan digunakan (%*). Setelah melakukan ini, Anda dapat menggunakan %0 %*untuk memulai kembali skrip setelah memproses setiap rentang. (Saya benar-benar berakhir dengan jumlah byte yang lebih besar karena saya menggunakan versi interaktif Anda dengan sentuhan yang bagus &&, exit/bdan echosebagai titik awal saya.)
Neil

@Neil Nice, terima kasih! Saya awalnya mencoba menggunakan %1tetapi tanda kutip "membuat ruang tidak berfungsi sebagai pemisah, jadi saya akhirnya menggunakan set /p.
user202729

Oh wow, bahkan ada $~1...
user202729


1

Bahasa Wolfram (Mathematica) , 34 byte

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

Cobalah online!

adalah Functionoperator.

Ini adalah fungsi kari tanpa nama yang harus disebut pertama dengan daftar rentang dermaga (diperluas) dan kemudian dengan daftar hadiah. Misalnya, jika Anda menetapkan fungsi ke f:

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

Daftar hadiah hanya diurutkan berdasarkan posisi tingkat pertama dari nilai dalam daftar rentang dermaga. Kita perlu membungkus SortByfungsi dalam daftar untuk membuat semacam itu stabil.


1

Julia 0,6 , 31 30 byte

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

Cobalah online!

Mendefinisikan ulang %operator dan memetakan persimpangan yang ditetapkan di ∩()atas dermaga yang dmenjaga ketertiban dan multiplisitas imput pertama, daftar hadiah p. vcatdengan input diperluas ke beberapa argumen via... ratakan array bersarang yang dihasilkan.

Edit, -1Byte: Daftar pemahaman alih-alih map().

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.