Advent Challenge 5: Déplacez les cadeaux sur les quais de transport!

9

<< Précédent Suivant >>

Grâce à la communauté PPCG, le Père Noël a réussi à reconditionner tous ses cadeaux et après la chaîne de montage, les cadeaux sont maintenant prêts à être déplacés sur les quais de transport!

Chacun des quais de transport du Père Noël ne contient qu'une gamme de tailles actuelles parce que les traîneaux de transport sont spécialisés pour une taille spécifique (tout plus léger et ce serait du gaspillage, plus lourd et le traîneau ne serait pas en mesure de gérer la charge). Ainsi, il a besoin de vous pour l'aider à prendre ses cadeaux et à les trier dans les bons quais de transport.

Défi

Compte tenu d'une liste et des gammes de quais de transport, organisez de manière stable les cadeaux dans le bon ordre.

Prenons ceci par exemple: les cadeaux sont [5, 3, 8, 6, 2, 7]et les gammes de dock sont [[1, 5] and [6, 10]].

Les présents 5, 3et 2vont dans le premier quai et les cadeaux 8, 6et 7vont dans le deuxième quai. Cela peut être montré comme [[5, 3, 2], [8, 6, 7]]. Cette liste sera plus proche d'être triée que l'entrée, mais stablysignifie que dans chaque dock, l'ordre des cadeaux doit être le même que l'ordre de l'entrée (sinon vous pouvez simplement trier la liste entière).

Votre sortie finale pour ce cas serait [5, 3, 2, 8, 6, 7](sous forme de liste plate).

Spécifications de formatage

Vous recevrez entrée comme une liste plate des entiers et une liste des plages dans un format raisonnable (par exemple, la plage pour le cas ci - dessus pourrait être donnée [[1, 5], [6, 10]], [1, 5, 6, 10]ou [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]]). Votre sortie doit être une liste plate d'entiers dans n'importe quel format raisonnable.

L'entrée peut contenir des valeurs en double; dans ce cas, vous devez en renvoyer toutes les instances. Toutes les tailles actuelles seront dans une seule plage de tailles, et vous pouvez supposer que les plages ne se chevaucheront jamais. Il peut y avoir des écarts dans les plages tant que toutes les tailles actuelles sont couvertes.

Règles

  • Les échappatoires standard s'appliquent
  • Il s'agit de , donc la réponse la plus courte en octets l'emporte
  • Aucune réponse ne sera acceptée
  • Vous pouvez supposer qu'il n'y aura pas de plages vides ( [7, 4]serait invalide car les plages augmentent)

Cas de 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]

Remarque: je me suis inspiré de cette série de défis d' Advent Of Code . Je n'ai aucune affiliation avec ce site

Vous pouvez voir une liste de tous les défis de la série en consultant la section 'Linked' du premier défi ici .

HyperNeutrino
la source
Toujours seulement 2 quais?
LiefdeWen
Les plages peuvent-elles se chevaucher?
RamenChef
@LiefdeWen Voir le 3ème cas de test.
M. Xcoder
Les paires de quais seront-elles toujours {petites, grandes}
LiefdeWen
@RamenChef No ..
HyperNeutrino

Réponses:

4

Gelée , 4 octets

fЀẎ

Essayez-le en ligne!

Prend l'entrée comme liste actuelle, plages complètes.

Erik le Outgolfer
la source
yaay c'est la solution de gelée que j'attendais: DDD
HyperNeutrino
@HyperNeutrino Hehe la solution attendue n'est pas la plus courte. En trouvant le fonctionnement du produit extérieur de 05ab1e, je me suis dit que cela fþFfonctionne aussi dans Jelly, pour 3 octets . Le mérite revient à Adnan .
M. Xcoder
@ Mr.Xcoder Vous ou Adnan devriez publier cela.
Erik the Outgolfer
@ Mr.Xcoder J'attendrai un peu et je verrai: P mais ça a l'air très différent, si je finis par le poster, je posterai une autre réponse.
Erik the Outgolfer
4

Mathematica, 39 octets

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

-22 octets de JungHwan Min
-4 octets de Martin

Essayez-le en ligne!

J42161217
la source
Vous pouvez également vous débarrasser de tout Rangeen prenant simplement les plages étendues en entrée.
Martin Ender
3

Pyth , 5 octets

s@Rvz

Essayez-le ici!

Pyth , 10 octets

s.gx}LkQ1E

Essayez-le ici!

Comment ils travaillent

s @ Rvz | Programme complet.

  R | Carte de droite ...
 @ | ... en utilisant l'intersection.
   vz | De la première entrée à la seconde.
s | Aplatir d'un niveau.
s.gx} LkQ1E | Programme complet.

 .g E | Regroupez les éléments de la deuxième entrée par ...
    } LkQ | Mappez sur la première entrée et vérifiez si l'élément actuel figure dans la liste.
   x 1 | Prenez l'index du premier élément véridique.
s | Aplatir.

Prend d'abord les quais, avec tous les entiers dans les plages, puis les cadeaux sur une nouvelle ligne.

M. Xcoder
la source
3

05AB1E , 3 octets

δØ

Essayez-le en ligne! (merci à Adnan de m'avoir fait savoir qu'il δexiste, -1 octet)

Comment ça fonctionne

δØ | Programme complet.

δ | Double-vectoriser la commande suivante (quelque chose comme un produit externe).
 Ã | Lister l'intersection. Puisqu'il s'agit d'une dyade, la première entrée est automatiquement
     | utilisé pour remplir l'argument manquant (pour autant que je sache).
  ˜ | Aplatir.
M. Xcoder
la source
Eh bien, €Ã˜cela ne semble pas fonctionner.
Erik the Outgolfer
Non, il n'y en a pas. BTW la raison de l' €Ã˜échec est parce que Ãprend deux arguments et attend une fonction avec un argument, donc elle retourne à la [[]]place (je pense que c'est un bug), donc ˜elle s'aplatira, revenant []. ε, cependant, fonctionne différemment. Pour chaque élément de l'élément supérieur, il crée une nouvelle pile, puis renvoie le haut de chaque nouvelle pile, donc lorsqu'il n'y a pas suffisamment d'éléments pour une fonction, il prend à la place une entrée implicite.
Erik the Outgolfer
Je ne l'ai pas encore testé, mais δØque recherchez-vous?
Adnan
@ Mr.Xcoder Je ne pense pas que ce soit exactement la carte dyadique de Pyth, elle se comporte plus comme un produit extérieur ou quelque chose.
Erik the Outgolfer
3

Rétine , 37 36 octets

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

Essayez-le en ligne! Prend l'entrée comme une liste de cadeaux sur la première ligne et une liste de plages sur la deuxième ligne; le lien comprend un en-tête pour diviser les cas de test dans le format souhaité. Edit: 1 octet enregistré grâce à @MartinEnder. Explication: La première étape correspond aux cadeaux et trouve le quai correspondant. Les cadeaux sont triés par sous-chaîne du début de la ligne à la [, regroupant ainsi les cadeaux par dock. La deuxième étape supprime ensuite les quais.

Neil
la source
2

Inscrire , 3 octets

f₱Ẏ

Essayez-le en ligne!

Comment ça fonctionne

f ₱ Ẏ | Programme complet.

 ₹ | Carte sur l'argument de droite.
f | En utilisant l'intersection de liste, en comptant les multiplicités.
  Ẏ | Serrer (aplatir d'un niveau).
M. Xcoder
la source
1
: D Enlist n'a pas été oublié: D En fait, c'était un peu, pas par la communauté mais plutôt par moi :(: P
HyperNeutrino
2

APL + WIN, 29 octets

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

Demande une saisie d'écran pour les nombres entiers et les plages. Les entiers sous forme de liste plate et les plages sous forme de vecteur imbriqué, par exemple le cas 3:

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

Explication:

(×/⍴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
Graham
la source
2

C ++, 127 octets

Prenez l'entrée comme deux tableaux représentés par des paires de pointeurs [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];});}

Essayez-le en ligne!

Colera Su
la source
Eh bien, C ++ a une fonction intégrée pour tout ... ou pas? / Étant donné que les plages d'entrée ne contiennent pas 0, il est possible de jouer sur certains octets en utilisant le tableau B terminé par null, bien que cela puisse être considéré comme de la triche. / Malheureusement [&](int a)->int{a=a>=au lieu de [&](int a){return a>=n'enregistre aucun octet. / #import<algorithm>peut être #import<regex>, au moins sur TIO. J'ai trouvé qu'après une recherche exhaustive ("recherche binaire manuelle") tous les en-têtes répertoriés dans cette page et celui-ci est le plus court. / Aussi, +1 de ma part.
user202729
2

J, 15 octets

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

Prend l'entrée comme argument de gauche et les plages comme argument de droite . Les plages sont des listes encadrées des plages complètes.

par exemple pour la première gamme:

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

Essayez-le en ligne!

Explication

[/:[: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
cole
la source
2

J , 26 24 octets

2 octets grâce au cole

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

Comment ça fonctionne:

L'argument de gauche contient les plages.

-&1 0"1@[ diminue la limite inférieure de chaque plage de 1

I."1] vérifie dans quelle gamme s'adapte chaque cadeau

1= est-ce dans la bonne plage

]<@#~ copie et encadre les cadeaux qui se trouvent dans la gamme actuelle

; - raze (déballage)

Essayez-le en ligne!

Galen Ivanov
la source
1
Je suis à peu près sûr que vous ne pouvez pas supprimer les zéros car l'entrée est intégrale (par exemple, échoue ce cas de test (0 4,:_3 _1) f _2 _1 0 1 2)
cole
@cole Hm, j'avais totalement négligé ces cas. Je vais devoir y penser.
Galen Ivanov
1
Oui, je pense que le moyen le plus simple serait probablement de boxer puis de raser. 24 octets de cette façon.
cole
@cole Merci! Il est non seulement plus court mais résout facilement le problème avec 0.
Galen Ivanov
2

R , 113 48 55 41 octets

Une version précédente ne triait pas correctement les objets lorsque les quais n'étaient pas dans l'ordre croissant.

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

Essayez-le en ligne!

Prend Dcomme une liste de vecteurs de plages, c'est-à-dire, list(4:7,1:3)serait [[4, 7], [1, 3]].

Probablement la réponse naïve à laquelle j'aurais dû arriver il y a très longtemps; imprime sur stdout.

Giuseppe
la source
2

Japt , 6 octets

ñ@VbøX

Essayez-le


Explication

Entrée implicite du tableau U(présents) et du tableau 2D V(plages complètes). Trier ( ñ) les cadeaux en les passant par une fonction ( @) qui obtient l'index du premier élément ( b) Vqui contient ( ø) le présent actuel ( X).

Hirsute
la source
1

Python 2, 97 85 octets

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 octets de ovs

-1 octet de M. Xcoder

Essayez-le en ligne!

Trie la liste en utilisant un lambda récursif comme clé. Explication à venir ™ ci-dessous.

Explication:

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
pizzapants184
la source
1

Javascript ES6, 53 47 45 octets

p=>l=>l.map(d=>p.filter(a=>d.includes(a)))+''

Essayez-le en ligne!

RamenChef
la source
45 octets . Vous pouvez prendre l'ensemble des plages en entrée. Une alternative légèrement plus agréable 47 byter
M. Xcoder
1

PowerShell , 37 octets

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

Essayez-le en ligne!

Prend $acomme un tableau littéral des présents et $bcomme un tableau de tableaux, dont chacun est la gamme complète (par exemple, @(1,2,3,4,5)au lieu de @(1,5)). Nous bouclons ensuite chaque élément $bavec |%{...}. À l'intérieur, nous devons définir un assistant $ipour être l'élément actuel, puis utiliser une Where-Objectclause contre $apour extraire uniquement les éléments qui constituent -inle $btableau actuel .

Ceux-ci sont laissés sur le pipeline et la sortie est implicite. Puisque le comportement par défaut de Write-Outputinsère une nouvelle ligne entre les éléments du tableau, c'est ce que nous obtenons. Voici une version légèrement modifiée qui est -joinéditée ensemble via des virgules au lieu d'une nouvelle ligne, juste pour montrer les différences.

AdmBorkBork
la source
1

Rouge , 73 octets

f: func[b r][n: copy[]foreach p r[foreach a b[if find p a[append n a]]]n]

Essayez-le en ligne!

Galen Ivanov
la source
1

C # (.NET Core) , 50 + 18 octets

a=>b=>b.SelectMany(x=>a.Where(y=>y>=x[0]&y<=x[1]))

+18 octets de

using System.Linq;

Il faut une collection de cadeaux et une collection de tableaux pour les quais.

Essayez-le en ligne!

Grzegorz Puławski
la source
1

Windows Batch (CMD), 90 79 octets

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

Utilisez le format de fin de ligne LF. Chaque caractère de fin de ligne peut être compté comme 1 octet.

Pas de TIO (car TIO utilise Linux)

Prenez la liste à partir des arguments de ligne de commande et s'étend de stdin.

Par exemple, si le programme est exécuté (supposez que le fichier est nommé r1.cmd)

r1 7 3 5 4 6 1 2

et avec stdinentrée

1
3
4
5
6
7

, le programme sortira au stderrformat

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

(correspond à la séquence de sortie 3 1 2 5 4 7 6)


Explication:

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

Code non golfé (avec l'interaction activée si trueest passé comme argument 1; demander la liste à partir de stdin, utiliser gotopour éviter le débordement de pile - en fait, j'ai juste essayé d'exécuter un script qui s'appelle plus de 70000 fois sans voir aucun problème, donc je suppose qu'il devrait être assez sûr):

@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
user202729
la source
Vous pouvez économiser plus d'octets en exigeant que les cadeaux soient des arguments de ligne de commande et que vous les utilisiez (%*). Cela fait, vous pouvez ensuite utiliser %0 %*pour redémarrer le script après avoir traité chaque plage. ( En fait , je fini avec un plus grand nombre d'octets , car je votre version interactive avec les gentilles petites attentions &&, exit/bet echocomme point de départ.)
Neil
@Neil Nice, merci! J'ai essayé d'utiliser à l'origine, %1mais les guillemets "font que l'espace ne fonctionne pas comme séparateurs, donc j'ai fini par utiliser set /p.
user202729
Oh wow, il y a même $~1...
user202729
1

Wolfram Language (Mathematica) , 34 octets

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

Essayez-le en ligne!

est l' Functionopérateur.

Il s'agit d'une fonction au curry sans nom qui doit être appelée d'abord avec la liste des plages de dock (étendues), puis avec la liste des cadeaux. Par exemple, si vous affectez la fonction à f:

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

La liste des cadeaux est simplement triée par la position de premier niveau de la valeur dans la liste des plages de quais. Nous devons encapsuler la SortByfonction dans une liste pour rendre le tri stable.

Martin Ender
la source
1

Julia 0,6 , 31 30 octets

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

Essayez-le en ligne!

Redéfinit l' %opérateur et cartographie l'intersection définie ∩()sur les quais en dmaintenant l'ordre et la multiplicité du premier imput, la liste des cadeaux p. vcatavec l'entrée étendue à plusieurs arguments via ...aplatit le tableau imbriqué résultant.

Modifier, -1 octet: liste la compréhension au lieu de map().

LukeS
la source