Advent Challenge 5: Bringe die Geschenke zu den Transportdocks!


9

<< Zurück Weiter >>

Dank der PPCG-Community ist es dem Weihnachtsmann gelungen, alle seine Geschenke wiederaufzubauen. Nach dem Fließband können die Geschenke nun in die Transportdocks gebracht werden!

Jedes Transportdock des Weihnachtsmanns hat nur eine Reihe von aktuellen Größen, da die Transportschlitten auf eine bestimmte Größe spezialisiert sind (jedes Feuerzeug und es wäre verschwenderisch, jedes schwerer und der Schlitten wäre nicht in der Lage, die Ladung zu tragen). Daher müssen Sie ihm helfen, seine Geschenke zu nehmen und sie in die richtigen Transportdocks zu sortieren.

Herausforderung

Ordnen Sie die Geschenke anhand einer Liste und der Transportdockbereiche stabil in der richtigen Reihenfolge an.

Nehmen wir zum Beispiel Folgendes: Die Geschenke sind [5, 3, 8, 6, 2, 7]und die Dockbereiche sind [[1, 5] and [6, 10]].

Die Geschenke 5, 3und 2gehen in das erste Dock und die Geschenke 8, 6und 7in das zweite Dock gehen. Dies kann als gezeigt werden [[5, 3, 2], [8, 6, 7]]. Diese Liste ist näher an der Sortierung als die Eingabe, stablybedeutet jedoch , dass in jedem Dock die Reihenfolge der Geschenke mit der Reihenfolge der Eingabe übereinstimmen muss (andernfalls können Sie einfach die gesamte Liste sortieren).

Ihre endgültige Ausgabe für diesen Fall wäre [5, 3, 2, 8, 6, 7](als flache Liste).

Formatierungsspezifikationen

Sie werden Eingang als flache Liste von ganzen Zahlen und einer Liste der Bereiche in jedem vernünftigen Format angegeben werden (beispielsweise der Bereich für den obigen Fall als gegeben werden könnte [[1, 5], [6, 10]], [1, 5, 6, 10]oder [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]]). Ihre Ausgabe sollte eine flache Liste von Ganzzahlen in einem vernünftigen Format sein.

Die Eingabe kann doppelte Werte enthalten. In diesem Fall müssen Sie alle Instanzen von ihnen zurückgeben. Alle vorhandenen Größen liegen in genau einem Größenbereich, und Sie können davon ausgehen, dass sich die Bereiche niemals überlappen. Es kann Lücken in den Bereichen geben, solange alle vorhandenen Größen abgedeckt sind.

Regeln

  • Standardschlupflöcher gelten
  • Dies ist , daher gewinnt die kürzeste Antwort in Bytes
  • Es wird keine Antwort akzeptiert
  • Sie können davon ausgehen, dass keine leeren Bereiche vorhanden sind ( [7, 4]wäre ungültig, da die Bereiche steigen).

Testfälle

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

Hinweis: Ich habe mich für diese Herausforderungsserie von Advent Of Code inspirieren lassen . Ich habe keine Verbindung zu dieser Site

Eine Liste aller Herausforderungen in der Serie finden Sie im Abschnitt "Verknüpft" der ersten Herausforderung hier .


Immer nur 2 Docks?
LiefdeWen

Können sich die Bereiche überschneiden?
RamenChef

@LiefdeWen Siehe den 3. Testfall.
Mr. Xcoder

Werden die
Hafenpaare

@ RamenChef No ..
HyperNeutrino

Antworten:



4

Gelee , 4 Bytes

fЀẎ

Probieren Sie es online aus!

Nimmt die Eingabe als aktuelle Liste mit allen Bereichen auf.


Ja, das ist die Gelee-Lösung, die ich erwartet hatte: DDD
HyperNeutrino

@HyperNeutrino Hehe die erwartete Lösung stellt sich als nicht die kürzeste heraus. Als ich herausfand, wie das äußere Produkt von 05ab1e funktioniert, stellte ich fest, dass dies auch fþFin Jelly für 3 Bytes funktioniert . Der Kredit geht an Adnan .
Mr. Xcoder

@ Mr.Xcoder Entweder du oder Adnan sollten das posten.
Erik der Outgolfer

@ Mr.Xcoder Ich werde ein bisschen abwarten und sehen: P, aber es sieht ganz anders aus. Wenn ich es am Ende poste, werde ich eine weitere Antwort posten.
Erik der Outgolfer


3

Pyth , 5 Bytes

s@Rvz

Probieren Sie es hier aus!

Pyth , 10 Bytes

s.gx}LkQ1E

Probieren Sie es hier aus!

Wie sie arbeiten

s @ Rvz | Volles Programm.

  R | Rechte Karte ...
 @ | ... Kreuzung verwenden.
   vz | Von der ersten Eingabe mit der zweiten.
s | Um eine Ebene abflachen.
s.gx} LkQ1E | Volles Programm.

 .g E | Gruppieren Sie die Elemente in der zweiten Eingabe nach ...
    } LkQ | Ordnen Sie die erste Eingabe zu und prüfen Sie, ob das aktuelle Element in der Liste enthalten ist.
   x 1 | Nehmen Sie den Index des ersten wahrheitsgemäßen Elements.
s | Ebnen.

Nimmt zuerst die Docks mit allen ganzen Zahlen in den Bereichen und dann die Geschenke in einer neuen Zeile.



3

05AB1E , 3 Bytes

δØ

Probieren Sie es online aus! (Danke an Adnan für die Mitteilung, dass es δexistiert, -1 Byte)

Wie es funktioniert

δØ | Volles Programm.

δ | Doppelvektorisieren Sie den nächsten Befehl (so etwas wie ein äußeres Produkt).
 Ã | Schnittpunkt auflisten. Da dies eine Dyade ist, erfolgt die erste Eingabe automatisch
     | verwendet, um das fehlende Argument zu füllen (soweit ich weiß).
  ˜ | Ebnen.

Nun, €Ã˜scheint nicht zu funktionieren.
Erik der Outgolfer

Nein, gibt es nicht. Übrigens, der Grund dafür €Ã˜ist, dass Ãzwei Argumente verwendet werden und eine Funktion mit einem Argument erwartet wird. [[]]Stattdessen wird sie zurückgegeben (ich denke, das ist ein Fehler). Dann ˜wird sie abgeflacht und zurückgegeben []. εfunktioniert jedoch anders. Für jedes Element des obersten Elements wird ein neuer Stapel erstellt und anschließend der obere Teil jedes neuen Stapels zurückgegeben. Wenn also nicht genügend Elemente für eine Funktion enthalten sind, wird stattdessen eine implizite Eingabe vorgenommen.
Erik der Outgolfer

Ich habe es noch nicht getestet, aber ist es das, δØwonach Sie suchen?
Adnan

@ Mr.Xcoder Ich glaube nicht, dass das genau die dyadische Karte ist, die Pyth hat, sie verhält sich eher wie ein äußeres Produkt oder so.
Erik der Outgolfer

3

Netzhaut , 37 36 Bytes

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

Probieren Sie es online aus! Nimmt die Eingabe als Liste der Geschenke in der ersten Zeile und als Liste der Bereiche in der zweiten Zeile vor. Der Link enthält eine Kopfzeile, um die Testfälle in das gewünschte Format aufzuteilen. Bearbeiten: 1 Byte dank @MartinEnder gespeichert. Erläuterung: Die erste Stufe stimmt mit den Geschenken überein und findet das passende Dock. Die Geschenke werden vom Anfang der Zeile bis zum nach der Teilzeichenfolge sortiert [, wodurch die Geschenke nach Dock gruppiert werden. Die zweite Stufe löscht dann die Docks.


2

Tragen Sie 3 Bytes ein

f₱Ẏ

Probieren Sie es online aus!

Wie es funktioniert

f ₱ Ẏ | Volles Programm.

 ₱ | Map über rechtes Argument.
f | Verwenden von Listenschnittpunkten, Zählen von Multiplizitäten.
  Ẏ | Festziehen (um 1 Stufe abflachen).

1
: D Enlist wurde nicht vergessen: D Eigentlich war es irgendwie, nur nicht von der Community, sondern von mir :(: P
HyperNeutrino

2

APL + WIN, 29 Bytes

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

Fordert zur Bildschirmeingabe für die Ganzzahlen und Bereiche auf. Die ganzen Zahlen als flache Liste und die Bereiche als verschachtelter Vektor, z. B. Fall 3:

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

Erläuterung:

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

Nehmen Sie die Eingabe als zwei Arrays, die durch Zeigerpaare dargestellt werden [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];});}

Probieren Sie es online aus!


Nun, C ++ hat für alles eine integrierte Funktion ... oder doch? / Da der Eingabebereich keine 0 enthält, ist es möglich, einige Bytes mit nullterminiertem Array B herunterzuspielen, obwohl dies als Betrug angesehen werden kann. / Leider werden [&](int a)->int{a=a>=stattdessen [&](int a){return a>=keine Bytes gespeichert. Ich #import<algorithm>kann #import<regex>zumindest auf TIO sein. Ich fand, dass nach der Suche erschöpfend ("manuelle binäre Suche") alle auf dieser Seite aufgelisteten Header und dieser ist der kürzeste. / Auch +1 von mir.
user202729

2

J, 15 Bytes

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

Nimmt die Eingabe als linkes Argument und die Bereiche als rechtes Argument. Die Bereiche sind Boxlisten der vollständigen Bereiche.

zB für den ersten Bereich:

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

Probieren Sie es online aus!

Erläuterung

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

2 Bytes dank Cole

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

Wie es funktioniert:

Das linke Argument enthält die Bereiche.

-&1 0"1@[ verringert die untere Grenze jedes Bereichs um 1

I."1] prüft, in welchen Bereich jedes Geschenk passt

1= liegt es im richtigen Bereich

]<@#~ kopiert und verpackt die Geschenke, die im aktuellen Bereich liegen

; - raze (Unboxing)

Probieren Sie es online aus!


1
Ich bin mir ziemlich sicher, dass Sie keine Nullen entfernen können, da die Eingabe ganzzahlig ist (z. B. schlägt dieser Testfall fehl (0 4,:_3 _1) f _2 _1 0 1 2)
Cole

@ Cole Hm, ich hatte diese Fälle völlig vernachlässigt. Ich muss über sie nachdenken.
Galen Ivanov

1
Ja, ich denke, der einfachste Weg wäre wahrscheinlich, zu boxen und dann zu rauchen. 24 Bytes auf diese Weise.
Cole

@ Cole Danke! Es ist nicht nur kürzer, sondern löst das Problem leicht mit 0.
Galen Ivanov

2

R , 113 48 55 41 Bytes

In einer früheren Version wurden Objekte nicht korrekt sortiert, wenn die Docks nicht in aufsteigender Reihenfolge waren.

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

Probieren Sie es online aus!

Nimmt Dals Liste von Vektoren von Bereichen, dh list(4:7,1:3)wäre [[4, 7], [1, 3]].

Wahrscheinlich die naive Antwort, zu der ich vor Ewigkeiten hätte kommen sollen; druckt nach stdout.


2

Japt , 6 Bytes

ñ@VbøX

Versuch es


Erläuterung

Implizite Eingabe von Array U(präsentiert) und 2d-Array V(volle Bereiche). Sortieren ( ñ) der Geschenke, indem Sie sie durch eine Funktion ( @) übergeben, die den Index des ersten Elements ( b) erhält V, das ( ø) das aktuelle Geschenk enthält ( X).


1

Python 2, 97 85 Bytes

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 Bytes von Ovs

-1 Byte von Mr. Xcoder

Probieren Sie es online aus!

Sortiert die Liste mit einem rekursiven Lambda als Schlüssel. Erklärung folgt in Kürze ™ unten.

Erläuterung:

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

Probieren Sie es online aus!

Nimmt $aals wörtliches Array der Geschenke und $bals Array von Arrays, von denen jedes den gesamten Bereich darstellt (z. B. @(1,2,3,4,5)anstelle von @(1,5)). Wir durchlaufen dann jedes Element $bmit |%{...}. Im Inneren müssen wir einen Helfer $ials aktuelles Element festlegen und dann eine Where-ObjectKlausel gegen verwenden $a, um nur die Elemente abzurufen, die -indas aktuelle $bArray sind.

Diese verbleiben in der Pipeline und die Ausgabe ist implizit. Da das Standardverhalten von Write-OutputEinfügen einer neuen Zeile zwischen Array-Elementen ist, erhalten wir dies. Hier ist eine leicht optimierte Version, die -joinanstelle eines Zeilenumbruchs über Kommas zusammengesetzt wird, um Unterschiede aufzuzeigen.




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

Verwenden Sie das LF-Zeilenendeformat. Jedes Zeilenendezeichen kann als 1 Byte gezählt werden.

Kein TIO (da TIO Linux verwendet)

Nehmen Sie die Liste aus den Befehlszeilenargumenten und reichen von stdin.

Zum Beispiel, wenn das Programm ausgeführt wird (vorausgesetzt, die Datei hat den Namen r1.cmd)

r1 7 3 5 4 6 1 2

und mit stdinEingabe

1
3
4
5
6
7

wird das Programm stderrmit Format ausgegeben

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

(entspricht der Ausgabesequenz 3 1 2 5 4 7 6)


Erläuterung:

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-Code (mit aktivierter Interaktion, wenn er trueals Argument 1 übergeben wird; Eingabeaufforderung für die Liste von stdin, um gotoeinen Stapelüberlauf zu vermeiden - eigentlich habe ich gerade versucht, ein Skript auszuführen, das sich über 70000 Mal selbst aufruft, ohne dass ein Problem auftritt sollte ziemlich sicher sein):

@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

Sie können mehr Bytes sparen, indem Sie verlangen, dass die Geschenke Befehlszeilenargumente sind und verwendet werden (%*). Anschließend können Sie %0 %*das Skript nach der Verarbeitung der einzelnen Bereiche neu starten. (I endete tatsächlich mit einem größeren Byteanzahl, weil ich Ihre interaktive Version mit den netten Details verwendet &&, exit/bund echoals mein Ausgangspunkt.)
Neil

@Neil Schön, danke! Ich habe ursprünglich versucht, zu verwenden, %1aber die Anführungszeichen "sorgen dafür, dass das Leerzeichen nicht als Trennzeichen funktioniert, und so habe ich es letztendlich verwendet set /p.
user202729

Oh wow, es gibt sogar $~1...
user202729


1

Wolfram Language (Mathematica) , 34 Bytes

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

Probieren Sie es online aus!

ist der FunctionBetreiber.

Dies ist eine unbenannte Curry-Funktion, die zuerst mit der Liste der (erweiterten) Dock-Bereiche und dann mit der Liste der Geschenke aufgerufen werden sollte. Wenn Sie die Funktion beispielsweise wie folgt zuweisen f:

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

Die Liste der Geschenke wird einfach nach der Position des Werts in der Liste der Dockbereiche auf der ersten Ebene sortiert. Wir müssen die SortByFunktion in eine Liste einschließen, um die Sortierung stabil zu machen.


1

Julia 0,6 , 31 30 Bytes

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

Probieren Sie es online aus!

Definiert den %Operator neu und ordnet den festgelegten Schnittpunkt ∩()über den Docks zu, wobei ddie Reihenfolge und die Vielzahl des ersten Eingangs, der Liste der Geschenke, beibehalten werden p. vcatWenn die Eingabe auf mehrere Argumente erweitert wird, wird ...das resultierende verschachtelte Array abgeflacht.

Bearbeiten, -1Byte: Listenverständnis statt map().

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.