Advent Challenge 5: ¡Mueve los regalos a los muelles de transporte!


9

<< Anterior Siguiente >>

Gracias a la comunidad PPCG, Santa ha logrado refabricar todos sus regalos y, después de la línea de montaje, ¡los regalos ya están listos para ser trasladados a los muelles de transporte!

Cada uno de los muelles de transporte de Santa solo tiene una gama de tamaños actuales porque los trineos de transporte están especializados para un tamaño específico (cualquier encendedor y sería un desperdicio, más pesado y el trineo no podría manejar la carga). Por lo tanto, necesita que lo ayudes a tomar sus regalos y ordenarlos en los muelles de transporte correctos.

Desafío

Dada una lista y los rangos del muelle de transporte, organice los regalos de manera estable en el orden correcto.

Tomemos esto por ejemplo: los regalos son [5, 3, 8, 6, 2, 7]y los rangos de acoplamiento son [[1, 5] and [6, 10]].

Los regalos 5, 3y 2entran en el primer muelle y los regalos 8, 6y 7entran en el segundo muelle. Esto se puede mostrar como [[5, 3, 2], [8, 6, 7]]. Esta lista estará más cerca de ser ordenada que la entrada, pero stablysignifica que dentro de cada muelle, el orden de los regalos debe ser el mismo que el orden de la entrada (de lo contrario, podría ordenar toda la lista).

Su salida final para este caso sería [5, 3, 2, 8, 6, 7](como una lista plana).

Especificaciones de formato

Se le dará entrada como una lista plana de números enteros y una lista de rangos en cualquier formato razonable (por ejemplo, el rango para el caso anterior podría ser dado como [[1, 5], [6, 10]], [1, 5, 6, 10], o [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]]). Su salida debe ser una lista plana de enteros en cualquier formato razonable.

La entrada puede contener valores duplicados; en este caso, debe devolver todas las instancias de ellos. Todos los tamaños actuales estarán exactamente en un rango de tamaño, y puede suponer que los rangos nunca se superpondrán. Puede haber huecos en los rangos siempre que se cubran todos los tamaños actuales.

Reglas

  • Se aplican lagunas estándar
  • Este es el , por lo que gana la respuesta más corta en bytes
  • No se aceptarán respuestas.
  • Puede suponer que no habrá rangos vacíos ( [7, 4]no sería válido porque los rangos aumentan)

Casos de prueba

[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: Me inspiré para esta serie de desafíos de Advent Of Code . No estoy afiliado a este sitio

Puede ver una lista de todos los desafíos de la serie mirando la sección 'Vinculados' del primer desafío aquí .


¿Siempre solo 2 muelles?
LiefdeWen

¿Se pueden superponer los rangos?
RamenChef

@LiefdeWen Vea el tercer caso de prueba.
Sr. Xcoder

¿Los pares de muelles siempre serán {pequeños, grandes}
LiefdeWen

@RamenChef No ..
HyperNeutrino

Respuestas:



4

Jalea , 4 bytes

fЀẎ

Pruébalo en línea!

Toma la entrada como lista actual, rangos completos.


sí, esa es la solución de gelatina que esperaba: DDD
HyperNeutrino

@HyperNeutrino Jeje, la solución esperada resulta no ser la más corta. Al encontrar la forma en que funciona el producto externo 05ab1e, supuse que también fþFfunciona en Jelly, por 3 bytes . El crédito va a Adnan .
Sr. Xcoder

@ Mr.Xcoder O usted o Adnan deberían publicar eso.
Erik the Outgolfer

@ Mr.Xcoder Esperaré un poco y veré: P pero se ve considerablemente diferente, si termino publicando, publicaré otra respuesta.
Erik the Outgolfer

4

Mathematica, 39 bytes

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

-22 bytes de JungHwan Min
-4 bytes de Martin

Pruébalo en línea!


También puede deshacerse de todo Rangesimplemente tomando los rangos expandidos como entrada.
Martin Ender

3

Pyth , 5 bytes

s@Rvz

Pruébalo aquí!

Pyth , 10 bytes

s.gx}LkQ1E

Pruébalo aquí!

Cómo trabajan ellos

s @ Rvz | Programa completo

  R | Mapa de la derecha ...
 @ | ... Usando la intersección.
   vz | De la primera entrada con la segunda.
s | Aplanar en un nivel.
s.gx} LkQ1E | Programa completo

 .g E | Agrupe los elementos en la segunda entrada por ...
    } LkQ | Asigne la primera entrada y verifique si el elemento actual está en la lista.
   x 1 | Tome el índice del primer elemento de verdad.
s | Aplanar.

Primero toma los muelles, con todos los enteros en los rangos, y luego los regalos en una nueva línea.



3

05AB1E , 3 bytes

δØ

Pruébalo en línea! (gracias a Adnan por informarme que δexiste, -1 byte)

Cómo funciona

δØ | Programa completo

δ | Vectoriza dos veces el siguiente comando (algo así como un producto externo).
 Ã | Lista de intersección. Como se trata de una diada, la primera entrada es automáticamente
     El | solía llenar el argumento faltante (hasta donde yo sé).
  ˜ | Aplanar.

Bueno, €Ã˜no parece funcionar.
Erik the Outgolfer

No, no hay Por cierto, la razón €Ã˜falla porque Ãtoma dos argumentos y espera una función con un argumento, por lo que regresa en su [[]]lugar (creo que es un error), por lo que ˜se aplanará y regresará []. εSin embargo, funciona de manera diferente. Para cada elemento del elemento superior, crea una nueva pila y luego devuelve la parte superior de cada nueva pila, por lo que cuando no hay suficientes elementos para una función, toma una entrada implícita.
Erik the Outgolfer

Todavía no lo he probado, pero δØ¿ es lo que estás buscando?
Adnan

@ Mr.Xcoder No creo que sea exactamente el mapa diádico que tiene Pyth, se comporta más como un producto externo o algo así.
Erik the Outgolfer

3

Retina , 37 36 bytes

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

Pruébalo en línea! Toma información como una lista de regalos en la primera línea y una lista de rangos en la segunda línea; el enlace incluye un encabezado para dividir los casos de prueba en el formato deseado. Editar: Guardado 1 byte gracias a @MartinEnder. Explicación: La primera etapa coincide con los regalos y encuentra el muelle correspondiente. Los regalos se ordenan por la subcadena desde el inicio de la línea hasta el [, agrupando los regalos por muelle. La segunda etapa luego elimina los muelles.


2

Aliste , 3 bytes

f₱Ẏ

Pruébalo en línea!

Cómo funciona

f ₱ Ẏ | Programa completo

 ₱ | Mapa sobre argumento correcto.
f | Usando la intersección de listas, contando multiplicidades.
  Ẏ | Apriete (aplanar en 1 nivel).

1
: D Enlist no fue olvidado: D En realidad lo fue, pero no por la comunidad sino por mí :(: P
HyperNeutrino

2

APL + WIN, 29 bytes

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

Solicita la entrada de pantalla para los enteros y rangos. Los enteros como una lista plana y los rangos como un vector anidado, por ejemplo, el caso 3:

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

Explicación:

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

Tome la entrada como dos matrices representadas por pares de punteros [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];});}

Pruébalo en línea!


Bueno, C ++ tiene una función incorporada para todo ... ¿o no? / Dado que los rangos de entrada no contienen 0, es posible reducir algunos bytes usando la matriz B terminada en nulo, aunque puede considerarse trampa. / Desafortunadamente en [&](int a)->int{a=a>=lugar de [&](int a){return a>=no guarda ningún byte. / #import<algorithm>puede ser #import<regex>, al menos en TIO. Descubrí que después de buscar exhaustivamente ("búsqueda binaria manual") todos los encabezados enumerados en esta página y esta es la más corta. / Además, +1 de mi parte.
user202729

2

J, 15 bytes

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

Toma la entrada como argumento izquierdo y los rangos como argumento derecho . Los rangos son listas en recuadro de los rangos completos.

Por ejemplo, para el primer rango:

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

Pruébalo en línea!

Explicación

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

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

Cómo funciona:

El argumento izquierdo contiene los rangos.

-&1 0"1@[ disminuye el límite inferior de cada rango en 1

I."1] comprueba en qué rango se ajusta cada presente

1= ¿Está en el rango correcto?

]<@#~ copia y encajona los regalos que están en el rango actual

; - raze (unboxing)

Pruébalo en línea!


1
Estoy bastante seguro de que no se puede quitar ceros ya que la entrada es integral (por ejemplo, falla este caso de prueba (0 4,:_3 _1) f _2 _1 0 1 2)
Cole

@cole Hm, había descuidado totalmente estos casos. Tendré que pensar en ellos.
Galen Ivanov

1
Sí, creo que la forma más fácil probablemente sería boxear y luego arrasar. 24 bytes de esa manera.
cole

@cole ¡Gracias! No solo es más corto, sino que resuelve fácilmente el problema con 0.
Galen Ivanov

2

R , 113 48 55 41 bytes

Una versión anterior no ordenaba correctamente los objetos cuando los muelles no estaban en orden creciente.

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

Pruébalo en línea!

Toma Dcomo una lista de vectores de rangos, es decir, list(4:7,1:3)sería [[4, 7], [1, 3]].

Probablemente la ingenua respuesta a la que debería haber llegado hace años; imprime en stdout.


2

Japt , 6 bytes

ñ@VbøX

Intentalo


Explicación

Entrada implícita de array U(presentes) y 2d-array V(rangos completos). Ordena ( ñ) los regalos pasándolos a través de una función ( @) que obtiene el índice del primer elemento ( b) Vque contiene ( ø) el presente actual ( 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 de ovs

-1 byte del Sr. Xcoder

Pruébalo en línea!

Ordena la lista usando una lambda recursiva como clave. Explicación próximamente ™ a continuación.

Explicación:

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 bytes

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

Pruébalo en línea!

Toma $acomo una matriz literal de los presentes y $bcomo una matriz de matrices, cada una de las cuales es el rango completo (por ejemplo, en @(1,2,3,4,5)lugar de @(1,5)). Luego hacemos un ciclo sobre cada elemento $bcon |%{...}. En el interior, necesitamos establecer un asistente $ipara que sea el elemento actual, luego usar una Where-Objectcláusula en contra $apara extraer solo aquellos elementos que son -inla $bmatriz actual .

Esos quedan en la tubería y la salida es implícita. Dado que el comportamiento predeterminado de Write-Outputinserta una nueva línea entre los elementos de la matriz, eso es lo que obtenemos. Aquí hay una versión ligeramente modificada que se -joinedita mediante comas en lugar de una nueva línea, solo para mostrar las diferencias.




1

Lote de Windows (CMD), 90 79 bytes

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

Utilice el formato de fin de línea LF. Cada carácter de fin de línea se puede contar como 1 byte.

Sin TIO (porque TIO usa Linux)

Tome la lista de los argumentos de la línea de comandos, y los rangos de stdin.

Por ejemplo, si se ejecuta el programa (suponga que el archivo se llama r1.cmd)

r1 7 3 5 4 6 1 2

y con stdinentrada

1
3
4
5
6
7

, el programa saldrá a stderrformato

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

(corresponde a la secuencia de salida 3 1 2 5 4 7 6)


Explicación:

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

Código no protegido (con la interacción habilitada si truese pasa como argumento 1; solicite la lista stdin, use gotopara evitar el desbordamiento de la pila; en realidad, acabo de intentar ejecutar un script que se llama a sí mismo más de 70000 veces sin ver ningún problema, así que supongo que debería ser bastante seguro):

@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

Puede guardar más bytes si requiere que los presentes sean argumentos de línea de comandos y su uso (%*). Una vez hecho esto, puede usarlo %0 %*para reiniciar el script después de procesar cada rango. (En realidad acabé con una cuenta de bytes más grande porque he usado la versión interactiva con los detalles agradables &&, exit/by echocomo punto de partida.)
Neil

@Neil Nice, gracias! Originalmente intenté usar, %1pero las comillas "hacen que el espacio no funcione como separadores, así que terminé usando set /p.
user202729

Oh wow, incluso hay $~1...
user202729


1

Wolfram Language (Mathematica) , 34 bytes

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

Pruébalo en línea!

es el Functionoperador

Esta es una función curry sin nombre que debe llamarse primero con la lista de rangos de acoplamiento (expandidos) y luego con la lista de regalos. Por ejemplo, si asigna la función a f:

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

La lista de regalos simplemente ordenada por la posición de primer nivel del valor en la lista de rangos de acoplamiento. Necesitamos ajustar la SortByfunción en una lista para que el ordenamiento sea estable.


1

Julia 0.6 , 31 30 bytes

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

Pruébalo en línea!

Redefine al %operador y mapea la intersección establecida ∩()sobre los muelles dmanteniendo el orden y la multiplicidad del primer ingreso, la lista de regalos p. vcatcon la entrada expandida a múltiples argumentos a través de ...aplana la matriz anidada resultante.

Editar, -1Byte: Lista de comprensión en lugar de map().

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.