Advent Challenge 5: Hediyeleri nakliye limanlarına taşıyın!


9

<< Önceki Sonraki >>

PPCG topluluğu sayesinde, Santa tüm hediyelerini yeniden üretmeyi başardı ve montaj hattından sonra, hediyeler artık nakliye rıhtımlarına taşınmaya hazır!

Santa'nın nakliye rıhtımlarının her biri sadece bir dizi mevcut boyutu barındırır, çünkü nakliye kızakları belirli bir boyut için uzmanlaşmıştır (daha hafif ve daha israflı, daha ağır ve kızak yükü kaldıramayacaktır). Böylece, hediyelerini almasına ve onları doğru nakliye limanlarına ayırmasına yardım etmen için sana ihtiyacı var.

Meydan okuma

Bir liste ve taşıma iskelesi aralıkları verildiğinde, hediyeleri doğru sırayla düzenleyin.

Örneğin bunu ele alalım: hediyeler [5, 3, 8, 6, 2, 7]ve rıhtım aralıkları [[1, 5] and [6, 10]].

Hediyeler 5, 3ve 2ilk rıhtım ve hediyeler gitmek 8, 6ve 7ikinci dok gider. Bu olarak gösterilebilir [[5, 3, 2], [8, 6, 7]]. Bu liste girişe göre sıralamaya daha yakın olacaktır, ancak stablyher yuvada, hediye sıralamasının giriş sırasıyla aynı olması gerektiği anlamına gelir (aksi takdirde tüm listeyi sıralayabilirsiniz).

Bu vaka için son çıktınız [5, 3, 2, 8, 6, 7](düz liste olarak) olacaktır.

Biçimlendirme Spesifikasyonları

Eğer bir tamsayı düz bir liste ve makul biçimde aralıkları bir listesi olarak giriş verilecektir (örneğin, yukarıdaki durum için aralık olarak verilebilir [[1, 5], [6, 10]], [1, 5, 6, 10]ya da [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]]). Çıktınız makul bir biçimde tamsayıların düz bir listesi olmalıdır.

Giriş yinelenen değerler içerebilir; bu durumda, bunların tüm örneklerini döndürmeniz gerekir. Mevcut tüm boyutlar tam olarak bir boyut aralığında olacaktır ve aralıkların asla örtüşmeyeceğini varsayabilirsiniz. Mevcut tüm boyutlar kapsandığı sürece aralıklarda boşluklar olabilir.

kurallar

  • Standart Loopholes Uygula
  • Bu , bayt cinsinden en kısa cevap kazanır
  • Hiçbir cevap kabul edilmeyecek
  • Boş aralık olmayacağını varsayabilirsiniz ( [7, 4]aralıklar yükseldiği için geçersiz olur)

Test Durumları

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

Not: Advent Of Code'dan bu meydan okuma serisi için ilham aldım . Bu siteyle hiçbir bağlantım yok

Buradaki ilk zorluğun 'Bağlantılı' bölümüne bakarak dizideki tüm zorlukların bir listesini görebilirsiniz .


Her zaman sadece 2 rıhtım?
LiefdeWen

Aralıklar üst üste gelebilir mi?
RamenChef

@LiefdeWen 3. test senaryosuna bakın.
Bay Xcoder

Rıhtım çiftleri her zaman {küçük, büyük} olacak
LiefdeWen

@RamenChef No ..
HyperNeutrino

Yanıtlar:



4

Jöle , 4 bayt

fЀẎ

Çevrimiçi deneyin!

Mevcut liste, tam aralıklar olarak girdi alır.


Tamam bu beklediğim jöle çözüm: DDD
HyperNeutrino

@HyperNeutrino Hehe beklenen çözüm en kısa değil ortaya çıkıyor. 05ab1e'nin dış ürününün işleyiş yolunu bularak, Jelly'de fþFde 3 bayt için de çalıştığını anladım . Kredi Adnan'a gidiyor .
Bay Xcoder

@ Mr.Xcoder Ya siz ya da Adnan bunu göndermelisiniz.
Outgolfer Erik

@ Mr.Xcoder Biraz bekleyip göreceğim: P ama oldukça farklı görünüyor, eğer gönderirsem, başka bir cevap göndereceğim.
Outgolfer Erik

4

Mathematica, 39 bayt

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

JungHwan Min'den -22 bayt Martin'den
-4 bayt

Çevrimiçi deneyin!


Ayrıca Range, genişletilmiş aralıkları girdi olarak alarak her şeyden kurtulabilirsiniz .
Martin Ender

3

Pyth , 5 bayt

s@Rvz

Burada deneyin!

Pyth , 10 bayt

s.gx}LkQ1E

Burada deneyin!

Onlar nasıl çalışır

s @ Rvz | Tam program.

  R | Doğru harita ...
 @ | ... Kavşağı kullanmak.
   vz | İkincisi ile ilk girdi.
s | Bir seviye düzleştirin.
s.gx} LkQ1E | Tam program.

 .g E | İkinci girişteki öğeleri ...
    } LkQ | İlk girişin üzerine gidin ve geçerli öğenin listede olup olmadığını kontrol edin.
   x 1 | İlk gerçek öğenin dizinini alın.
s | Düzleştirmek.

İlk önce rıhtımları alır, aralıklardaki tüm tamsayıları, sonra da yeni bir satırdaki hediyeleri alır.



3

05AB1E , 3 bayt

δØ

Çevrimiçi deneyin! ( Adnan'a varlığımı bildirdiği için teşekkürler δ, -1 bayt)

Nasıl çalışır

δØ | Tam program.

δ | Sonraki komutu (dış ürün gibi bir şey) iki kez vektörleştirin.
 Ã | Kavşak listesi. Bu bir ikili olduğundan, ilk giriş otomatik olarak
     | eksik argümanı doldururdum (bildiğim kadarıyla).
  ˜ | Düzleştirmek.

Eh, €Ã˜işe görünmüyor.
Outgolfer Erik

Hayır, yok. BTW nedeni €Ã˜başarısız olur, çünkü Ãiki argüman alır ve bir argüman ile bir işlev bekliyor, bu yüzden bunun [[]]yerine geri döner (bence bu bir hata), bu yüzden sonra ˜düzleştirecek, geri dönecek []. εyine de farklı çalışır. Üst öğenin her öğesi için yeni bir yığın oluşturur ve ardından her yeni yığının üstünü döndürür, bu nedenle bir işlev için yeterli öğe olmadığında, bunun yerine örtük bir girdi alır.
Outgolfer Erik

Henüz test etmedim, ama δØne arıyorsun?
Adnan

@ Mr.Xcoder Bunun tam olarak Pyth'in sahip olduğu ikili harita olduğunu düşünmüyorum, daha çok dış ürün gibi davranıyor.
Outgolfer Erik

3

Retina , 37 36 bayt

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

Çevrimiçi deneyin! Girdiyi ilk satırdaki hediye listesi ve ikinci satırdaki aralık listesi olarak alır; bağlantı, test senaryolarını istenen formata bölmek için bir başlık içerir. Düzenleme: @MartinEnder sayesinde 1 bayt kaydedildi. Açıklama: İlk aşama hediyelerle eşleşir ve eşleşen iskeleyi bulur. Hediyeler, satırın başlangıcından alt dizeye göre sıralanır [, böylece hediyeleri yuvaya göre gruplandırılır. İkinci aşama daha sonra rıhtımları siler.


2

Enlist , 3 bayt

f₱Ẏ

Çevrimiçi deneyin!

Nasıl çalışır

f ₱ Ẏ | Tam program.

 ₱ | Harita üzerinde doğru argüman.
f | Liste kesişimini kullanma, çoklukları sayma.
  Ẏ | Sıkın (1 seviye düzleştirin).

1
: D Enlist unutulmadı: D Aslında, sadece topluluk tarafından değil, benim tarafımdan oldu :(: P
HyperNeutrino

2

APL + WIN, 29 bayt

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

Hem tamsayılar hem de aralıklar için ekran girişi istemleri. Düz liste olarak tamsayılar ve iç içe vektör olarak aralıklar, örneğin durum 3:

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

Açıklama:

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

Girdi çift işaretçiler tarafından temsil edilen iki dizi olarak alın [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];});}

Çevrimiçi deneyin!


Peki, C ++ her şey için yerleşiktir ... ya da öyle mi? / Girdi aralıklarının 0 içermediği düşünüldüğünde, hile olarak kabul edilebilse de, boş sonlandırılmış B dizisi kullanılarak bazı baytların aşağıya indirilmesi mümkündür. / Ne yazık ki [&](int a)->int{a=a>=bunun yerine [&](int a){return a>=bayt kaydetmez. / #import<algorithm>Olabilir #import<regex>, en az TIO ile. Kapsamlı bir şekilde arama yaptıktan sonra ("manuel ikili arama") bu sayfada listelenen tüm üstbilgilerin en kısa olduğunu tespit ettim . / Ayrıca, benden +1.
user202729

2

J, 15 bayt

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

Girdiyi sol argüman ve aralıkları doğru argüman olarak alır. Aralıklar, tüm aralıkların kutulu listeleridir.

ilk aralık için:

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

Çevrimiçi deneyin!

açıklama

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

Cole sayesinde 2 bayt

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

Nasıl çalışır:

Sol argüman aralıkları içerir.

-&1 0"1@[ her aralığın alt sınırını 1 azaltır

I."1] her bir aralığın hangi aralıkta olduğunu kontrol eder

1= doğru aralıkta mı

]<@#~ geçerli aralıktaki hediyeleri kopyalar ve kutulara koyar

; - iri (kutudan çıkarılmış)

Çevrimiçi deneyin!


1
Giriş ayrılmaz olduğu için sıfırları kaldıramayacağınızdan eminim (örneğin, bu test (0 4,:_3 _1) f _2 _1 0 1 2
senaryosunda

@cole Hm, bu davaları tamamen ihmal etmiştim. Onları düşünmem gerekecek.
Galen Ivanov

1
Evet, bence en kolay yol muhtemelen boks yapmak ve daha sonra yıkmak olacaktır. 24 bayt bu şekilde.
cole

@cole Teşekkürler! Bu sadece daha kısa değil, aynı zamanda problemi 0 ile kolayca çözer.
Galen Ivanov

2

R , 113 48 55 41 bayt

Önceki sürüm, rıhtımlar artan sırada olmadığında nesneleri doğru şekilde sıralamıyordu.

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

Çevrimiçi deneyin!

Alır Daralıkların vektörlerinin bir listesi olarak, diğer bir deyişle list(4:7,1:3)olacaktır [[4, 7], [1, 3]].

Muhtemelen, çağlar öncesinden geldiğim naif cevap; stdout'a yazdırır.


2

Japt , 6 bayt

ñ@VbøX

Dene


açıklama

Dizi U(hediyeler) ve 2d dizisinin V(tam aralıklar) örtülü girişi . Mevcut hediyeyi ( ) içeren ( ) ilk öğenin ( ) dizinini alan ñbir işlevden ( @) geçirerek hediyeleri sıralayın ( ).bVøX


1

Python 2, 97 85 bayt

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)

Ovs'tan -11 bayt

Bay Xcoder'dan -1 bayt

Çevrimiçi deneyin!

Anahtar olarak özyinelemeli lambda kullanarak listeyi sıralar. Açıklama çok yakında ™ aşağıda.

Açıklama:

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 bayt

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

Çevrimiçi deneyin!

Alır $asunar değişmez bir dizi olarak ve $btüm yelpazesi (mesela, her biri, bu diziler bir dizi olarak @(1,2,3,4,5)yerine @(1,5)). Sonra $bile her öğenin üzerine döngü |%{...}. İçimizde yardımcı ayarlamanız gerekir $isonra, geçerli öğe olması için bir kullanma Where-Objectkarşı maddesini$a yalnızca -ingeçerli $bdizi olan öğeleri çıkarmak .

Bunlar boru hattında bırakılır ve çıktı örtüktür. Write-OutputDizi öğelerinin varsayılan davranışı dizi öğeleri arasına yeni satır eklediğinden, elde ettiğimiz budur. Burada-join , sadece farklılıkları göstermek için, bir satırsonu yerine virgülle bir araya getirilen hafifçe düzeltilmiş bir sürüm var .




1

Windows Toplu İş (CMD), 90 79 bayt

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

LF satır sonu biçimini kullanın. Her satır sonu karakteri 1 bayt olarak sayılabilir.

TIO yok (çünkü TIO Linux kullanıyor)

Listeyi komut satırı bağımsız değişkenlerinden alın ve aralıkları stdin .

Örneğin, program çalıştırılırsa (dosyanın adını varsayalım r1.cmd)

r1 7 3 5 4 6 1 2

ve stdingirişle

1
3
4
5
6
7

, program stderrformatta çıktı verir

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

(çıkış sırasına karşılık gelir 3 1 2 5 4 7 6)


Açıklama:

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

Kod çözülmemiş kod ( trueargüman 1 olarak geçildiyse etkileşim etkin ; listeden bilgi istemi stdin, gotoyığın taşmasını önlemek için kullanın - aslında herhangi bir sorun görmeden 70000'den fazla kez kendisini çağıran bir komut dosyası çalıştırmayı denedim, bu yüzden sanırım oldukça güvenli olmalı):

@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

Hediyelerin komut satırı bağımsız değişkenleri olmasını ve kullanılmasını zorunlu kılarak daha fazla bayt kaydedebilirsiniz (%*). Bunu yaptıktan sonra %0 %*, her aralığı işledikten sonra komut dosyasını yeniden başlatmak için kullanabilirsiniz . (Aslında ben güzel dokunur ile etkileşimli bir sürümünü kullanıldığından daha büyük bir bayt sayısı ile sona erdi &&, exit/bve echobenim başlangıç noktası olarak.)
Neil

@Neil Nice, teşekkürler! Başlangıçta kullanmayı denedim %1ama tırnak "ayırıcı olarak çalışma alanı yapmak, bu yüzden kullanarak sona erdi set /p.
user202729

Oh vay, hatta var $~1...
user202729


1

Wolfram Dili (Mathematica) , 34 bayt

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

Çevrimiçi deneyin!

olduğunu Functionoperatörü.

Bu, adının (genişletilmiş) rıhtım aralıkları listesiyle ve sonra hediye listesiyle çağrılması gereken adlandırılmamış bir curried işlevidir. Örneğin, işlevi şu konuma atarsanız f:

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

Hediye listesi, rıhtım aralıkları listesindeki değerin birinci düzey konumuna göre sıralanır. SortBySıralamayı kararlı hale getirmek için işlevi bir listeye sarmamız gerekir .


1

Julia 0.6 , 31 30 bayt

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

Çevrimiçi deneyin!

%Operatörü yeniden tanımlar ve ayarlanan kavşağı ∩()rıhtımın üzerinde dve ilk imputun, hediye listesinin çokluğunu koruyarak eşler p. vcatgiriş, üzerinden birden çok bağımsız değişkene genişletildi... , elde edilen iç içe diziyi düzleştirerek .

Düzenle, -1Byte: Bunun yerine liste anlama map().

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.