Advent Challenge 5: sposta i regali nei moli di trasporto!


9

<< Precedente Successivo >>

Grazie alla comunità PPCG, Babbo Natale è riuscito a rigenerare tutti i suoi regali e dopo la catena di montaggio, i regali sono ora pronti per essere spostati nei moli di trasporto!

Ciascuna delle banchine di trasporto di Babbo Natale contiene solo una gamma di dimensioni attuali perché le slitte di trasporto sono specializzate per una dimensione specifica (qualsiasi più leggera e sarebbe dispendiosa, qualsiasi più pesante e la slitta non sarebbe in grado di gestire il carico). Pertanto, ha bisogno che tu lo aiuti a prendere i suoi regali e ordinarli nei moli di trasporto corretti.

Sfida

Dato un elenco e gli intervalli delle banchine di trasporto, organizzare stabilmente i regali nell'ordine corretto.

Prendiamo ad esempio questo: i regali sono [5, 3, 8, 6, 2, 7]e le gamme di dock sono [[1, 5] and [6, 10]].

I regali 5, 3e 2vanno nella prima dock e i regali 8, 6e 7vanno nella seconda dock. Questo può essere mostrato come [[5, 3, 2], [8, 6, 7]]. Questo elenco sarà più vicino all'ordinamento dell'input, ma stablysignifica che all'interno di ciascun dock, l'ordine dei presenti deve essere uguale all'ordine dell'input (altrimenti potresti semplicemente ordinare l'intero elenco).

Il tuo output finale per questo caso sarebbe [5, 3, 2, 8, 6, 7](come una lista piatta).

Specifiche di formattazione

Vi sarà dato ingresso come una semplice lista di numeri interi e un elenco di intervalli in qualsiasi formato ragionevole (per esempio, l'intervallo per il caso di cui sopra potrebbe essere dato come [[1, 5], [6, 10]], [1, 5, 6, 10]o [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]]). L'output dovrebbe essere un elenco semplice di numeri interi in qualsiasi formato ragionevole.

L'input può contenere valori duplicati; in questo caso, è necessario restituire tutte le loro istanze. Tutte le dimensioni attuali saranno esattamente in un intervallo di dimensioni e si può presumere che gli intervalli non si sovrapporranno mai. Possono esserci spazi vuoti nelle gamme purché siano coperte tutte le dimensioni attuali.

Regole

  • Si applicano scappatoie standard
  • Questo è , quindi vince la risposta più breve in byte
  • Nessuna risposta sarà accettata
  • Puoi presumere che non ci saranno intervalli vuoti ( [7, 4]sarebbe non valido perché gli intervalli salgono)

Casi test

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

Nota: ho tratto ispirazione per questa serie di sfide da Advent Of Code . Non ho affiliazione con questo sito

Puoi vedere un elenco di tutte le sfide della serie guardando la sezione "Linked" della prima sfida qui .


Sempre solo 2 banchine?
Liefde:

Le gamme possono sovrapporsi?
RamenChef,

@LiefdeWen Vedi il terzo caso di test.
Mr. Xcoder,

Le coppie di dock saranno sempre {small, big}
LiefdeWen

@RamenChef No ..
HyperNeutrino il

Risposte:



4

Gelatina , 4 byte

fЀẎ

Provalo online!

Accetta input come elenco attuale, intervalli completi.


questa è la soluzione gelatina che mi aspettavo: DDD
HyperNeutrino il

@HyperNeutrino Hehe la soluzione prevista risulta non essere la più breve. Trovando il modo in cui funziona il prodotto esterno di 05ab1e, ho capito che fþFfunziona anche in Jelly, per 3 byte . Il merito va ad Adnan .
Mr. Xcoder,

@ Mr.Xcoder O tu o Adnan dovreste pubblicarlo.
Erik the Outgolfer,

@ Mr.Xcoder Aspetterò un po 'e vedrò: P ma sembra molto diverso, se finisco per pubblicarlo, posterò un'altra risposta.
Erik the Outgolfer,

4

Mathematica, 39 byte

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

-22 byte da JungHwan Min
-4 byte da Martin

Provalo online!


Puoi anche sbarazzarti dell'intera Rangecosa prendendo semplicemente gli intervalli espansi come input.
Martin Ender,

3

Pyth , 5 byte

s@Rvz

Provalo qui!

Pyth , 10 byte

s.gx}LkQ1E

Provalo qui!

Come funzionano

s @ Rvz | Programma completo.

  R | Mappa a destra ...
 @ | ... Utilizzando l'intersezione.
   vz | Del primo input con il secondo.
s | Appiattire di un livello.
s.gx} LkQ1E | Programma completo.

 .g E | Raggruppa gli elementi nel secondo input per ...
    } LkQ | Mappa sopra il primo input e controlla se l'elemento corrente è nell'elenco.
   x 1 | Prendi l'indice del primo elemento di verità.
s | Appiattire.

Prende prima i dock, con tutti gli interi negli intervalli, quindi i regali su una nuova riga.



3

05AB1E , 3 byte

δØ

Provalo online! (grazie ad Adnan per avermi fatto sapere che δesiste, -1 byte)

Come funziona

δØ | Programma completo.

δ | Doppio vettorializzare il comando successivo (qualcosa come un prodotto esterno).
 Ã | Elenca intersezione. Poiché questa è una diade, il primo input è automaticamente
     | usato per riempire l'argomento mancante (per quanto ne so).
  ˜ | Appiattire.

Beh, €Ã˜non sembra funzionare.
Erik the Outgolfer,

No, non c'è. A proposito, la ragione €Ã˜non riesce perché Ãprende due argomenti e si aspetta una funzione con un argomento, quindi restituisce [[]]invece (penso che sia un bug), quindi ˜si appiattirà, ritornando []. ε, tuttavia, funziona in modo diverso. Per ogni elemento dell'elemento in cima, crea una nuova pila e quindi restituisce la cima di ogni nuova pila, quindi quando non ci sono abbastanza elementi per una funzione, prende invece un input implicito.
Erik the Outgolfer,

Non l'ho ancora testato, ma è δØquello che stai cercando?
Adnan,

@ Mr.Xcoder Non penso che sia esattamente la mappa diadica di Pyth, si comporta più come un prodotto esterno o qualcosa del genere.
Erik the Outgolfer,

3

Retina , 37 36 byte

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

Provalo online! Accetta input come un elenco di regali sulla prima riga e un elenco di intervalli sulla seconda riga; il collegamento include un'intestazione per dividere i casi di test nel formato desiderato. Modifica: salvato 1 byte grazie a @MartinEnder. Spiegazione: Il primo stadio corrisponde ai regali e trova il dock corrispondente. I regali sono ordinati in base alla sottostringa dall'inizio della linea a [, raggruppando così i regali per dock. Il secondo stadio quindi elimina i dock.


2

Enlist , 3 byte

f₱Ẏ

Provalo online!

Come funziona

f ₹ Ẏ | Programma completo.

 ₱ | Mappa su argomento corretto.
f | Utilizzo dell'intersezione dell'elenco, conteggio delle molteplicità.
  Ẏ | Stringere (appiattire di 1 livello).

1
: D Enlist non è stato dimenticato: D In realtà è stato un po ', non solo dalla comunità ma piuttosto da me :(: P
HyperNeutrino il

2

APL + WIN, 29 byte

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

Richiede l'immissione dello schermo sia per gli interi che per gli intervalli. I numeri interi come elenco piatto e gli intervalli come vettore nidificato, ad esempio il caso 3:

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

Spiegazione:

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

Prendi l'input come due matrici rappresentate da coppie di puntatori [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];});}

Provalo online!


Bene, C ++ ha un built-in per tutto ... o lo fa? / Dato che gli intervalli di input non contengono 0, è possibile scorrere alcuni byte usando l'array B con terminazione null, sebbene possa essere considerato un imbroglio. / Sfortunatamente [&](int a)->int{a=a>=invece di [&](int a){return a>=non salva alcun byte. / #import<algorithm>può essere #import<regex>, almeno su TIO. Ho scoperto che dopo una ricerca esaustiva ("ricerca binaria manuale") tutte le intestazioni elencate in questa pagina e questa è la più breve. / Inoltre, +1 da me.
user202729

2

J, 15 byte

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

Prende l'input come argomento sinistro e gli intervalli come argomento destro . Gli intervalli sono elenchi in box degli intervalli completi.

ad es. per la prima gamma:

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

Provalo online!

Spiegazione

[/:[: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 grazie a Cole

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

Come funziona:

L'argomento sinistro contiene gli intervalli.

-&1 0"1@[ riduce il limite inferiore di ciascun intervallo di 1

I."1] controlla in quale intervallo si adatta a ciascun regalo

1= è nell'intervallo corretto

]<@#~ copia e confeziona i regali che si trovano nell'intervallo corrente

; - raze (unboxing)

Provalo online!


1
Sono abbastanza sicuro che non è possibile rimuovere gli zero poiché l'ingresso è integrale (ad es. Non riesce questo caso di test (0 4,:_3 _1) f _2 _1 0 1 2)
Cole

@cole Hm, avevo completamente ignorato questi casi. Dovrò pensarci.
Galen Ivanov il

1
Sì, penso che il modo più semplice sarebbe probabilmente quello di inscatolare e poi razziare. 24 byte in quel modo.
Cole

@cole Grazie! Non è solo più breve, ma risolve facilmente il problema con 0.
Galen Ivanov il

2

R , 113 48 55 41 byte

Una versione precedente non ordinava correttamente gli oggetti quando i dock non erano in ordine crescente.

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

Provalo online!

Prende Dcome un elenco di vettori di intervalli, vale a dire, list(4:7,1:3)sarebbe [[4, 7], [1, 3]].

Probabilmente la risposta ingenua avrei dovuto arrivare a secoli fa; stampa su stdout.


2

Japt , 6 byte

ñ@VbøX

Provalo


Spiegazione

Input implicito di array U(presenta) e 2d-array V(intervalli completi). Ordina ( ñ) i regali passandoli attraverso una funzione ( @) che ottiene l'indice del primo elemento ( b) in Vcui contiene ( ø) il presente presente ( 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 dagli ovs

-1 byte da Mr. Xcoder

Provalo online!

Ordina l'elenco usando una lambda ricorsiva come chiave. Spiegazione in arrivo ™ di seguito.

Spiegazione:

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

Provalo online!

Prende $acome una matrice letterale dei presenti e $bcome una matrice di array, ciascuno dei quali rappresenta l'intera gamma (ad esempio, @(1,2,3,4,5)anziché @(1,5)). Quindi eseguiamo il ciclo su ogni elemento in $bcon |%{...}. All'interno, dobbiamo impostare un helper $iin modo che sia l'elemento corrente, quindi usare una Where-Objectclausola contro $aper estrarre solo quegli elementi che sono -inl' $barray corrente .

Questi vengono lasciati in cantiere e l'output è implicito. Poiché il comportamento predefinito Write-Outputinserisce una nuova riga tra gli elementi dell'array, ecco cosa otteniamo. Ecco una versione leggermente ottimizzata che viene -joinedita insieme tramite virgole anziché una nuova riga, solo per mostrare le differenze.




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

Utilizza il formato di fine riga LF. Ogni carattere di fine riga può essere conteggiato come 1 byte.

Nessun TIO (perché TIO utilizza Linux)

Prendi l'elenco dagli argomenti della riga di comando e va da stdin.

Ad esempio, se il programma viene eseguito (supponiamo che il file sia denominato r1.cmd)

r1 7 3 5 4 6 1 2

e con stdininput

1
3
4
5
6
7

, il programma verrà emesso stderrcon il formato

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

(corrisponde alla sequenza di output 3 1 2 5 4 7 6)


Spiegazione:

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

Codice non golfato (con interazione abilitata se trueviene passato come argomento 1; richiesta di elenco da stdin, utilizzare gotoper evitare lo overflow dello stack - in realtà ho appena provato a eseguire uno script che si chiama da solo oltre 70000 volte senza vedere alcun problema, quindi immagino dovrebbe essere abbastanza sicuro):

@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

È possibile salvare più byte richiedendo che i presenti siano argomenti e comandi da riga di comando (%*). Fatto ciò, è quindi possibile utilizzare %0 %*per riavviare lo script dopo aver elaborato ciascun intervallo. (In realtà ho finito con un numero di byte più grande perché ho usato la versione interattiva con i tocchi &&, exit/be echocome il mio punto di partenza.)
Neil

@Neil Nice, grazie! Inizialmente ho provato a usare, %1ma le virgolette "rendono lo spazio non funzionante come separatori, quindi ho finito per usare set /p.
user202729

Oh wow, c'è persino $~1...
user202729


1

Wolfram Language (Mathematica) , 34 byte

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

Provalo online!

è l' Functionoperatore.

Questa è una funzione curry senza nome che dovrebbe essere chiamata prima con l'elenco di intervalli di dock (espansi) e poi con l'elenco dei regali. Ad esempio, se si assegna la funzione a f:

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

L'elenco dei regali è semplicemente ordinato in base alla posizione di primo livello del valore nell'elenco degli intervalli di dock. Dobbiamo racchiudere la SortByfunzione in un elenco per rendere stabile l'ordinamento.


1

Julia 0.6 , 31 30 byte

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

Provalo online!

Ridefinisce l' %operatore e mappa l'intersezione impostata ∩()sui dock dmantenendo l'ordine e la molteplicità del primo imput, l'elenco dei regali p. vcatcon l'input espanso in più argomenti tramite ...appiattisce l'array nidificato risultante.

Modifica, -1Byte: comprensione della lista anziché map().

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.