Livraison du facteur

12

Je viens de décrocher un emploi de facteur et j'ai besoin de votre aide pour le garder. Je dois commander beaucoup de mails avant de sortir pour les livrer.

Les rues sont numérotées de façon strictement séquentielle, en commençant par 1 au début de la rue, et en continuant dans l'ordre pour ne sauter aucun numéro jusqu'à la fin, avec des nombres impairs sur le côté gauche et les mêmes sur le côté droit. De plus, des maisons ont été ajoutées plus tard afin que nous puissions également ajouter des lettres au numéro civique.

Le coffre contient tout le courrier de la ville donc je dois choisir uniquement les mails de ma rue.

J'ai besoin de votre aide pour commander les courriers plus rapidement. Ce que je vous demande, c'est d'écrire une fonction ou un programme complet en prenant:
- Un nom de rue.
- Une liste de numéros civiques commandés suivant mon chemin.
- Une liste d'adresses (représentant le coffre de courrier).

Et sortir une liste d'adresses ne contenant que celles de ma rue, ordonnées suivant la liste des numéros civiques.

Une adresse a la forme:

 Person Name/n   
 CivicN Street Name

CivicN est un nombre qui peut être suivi d'un '/' et d'une LETTRE MAJUSCULE (10 10 / B). Si vous préférez, les minuscules sont acceptables.

Si les noms de rues se chevauchent, ils sont considérés comme des rues différentes:

Church Road  != Saint Lorenz Church Road 

Nous omettons le reste de l'adresse pour plus de simplicité (en supposant que c'est la même chose pour chaque mail)

Les lettres doivent être livrées rapidement pour que la réponse la plus courte l'emporte.

EXEMPLE:

Disposition :

 1 1/B     3 5 7      9 11 13     
 ==============================    
       2 4       4/B 6           

Contribution :

"Tea Avenue"
["1","1/B","2","4","3","5","7","4/B","6","9","11","13"]
["Mrs. Pie O. Pinky\n6 Tea Avenue","Ms. Kita I. Omeeha\n6 Tea Avenue","Mr. Raile A. Lee\n26 Uea Grove","Odd O. Nic\n76 Mira Road","Mrs. Fuel Tee\n78 Uea Grove","Ny O. Ondip\n55 Uea Grove","Mrs. Black\n67 Uea Grove","Ollie E.\n11 Tea Avenue","Mr. Urna Li\n75 Mira Road","Ms. Polly\n2 Tea Avenue"]

Production :

Ms. Polly
2 Tea Avenue  

Mrs. Pie O. Pinky 
6 Tea Avenue 

Ms. Kita I. Omeeha
6 Tea Avenue 

Ollie E.
11 Tea Avenue

Contribution :

"Church Road"
["1","3","5","5/B","2","4","7","7/B","6","9","9/B","11","11/B"]
["Billy Ray V.\n5 Church Roadside East","Ms. Mia\n5 Church Road","Mrs. Dadeos\n9/B Church Road","Dr. Ymin U.\n3 Church Road","Atty. Nerou\n3 Church Road","Ollie A. Chaim\n6 Saint Lorenz Church Road","Ms. Rose\n5 Church Road","Alf Taohy\n79 Berry Road","Ms. Ootr E.\n5 Saint Lorenz Church Road","Lol E.\n21 Berry Road","Ms. Norton\n2 Church Road"]

Production :

Dr. Ymin U.
3 Church Road

Atty. Nerou
3 Church Road

Ms. Mia
5 Church Road

Ms. Rose
5 Church Road

Ms. Norton 
2 Church Road" 

Mrs. Dadeos
9/B Church Road

Générateur de test: essayez-le en ligne! Changez string_wrapper_left / right et séparateur pour modifier la mise en forme.

Règles:
- Les failles standard sont interdites.
- Méthodes d'entrée / sortie standard.
- La réponse la plus courte en octets gagne.

AZTECCO
la source
5
J'avais peur que vous alliez nous demander de résoudre le problème des vendeurs ambulants.
Jitse
3
@AZTECCO Merci! Il est fortement recommandé d'avoir plusieurs cas de test intégrés dans votre message, pas seulement dans le code de démonstration.
Jitse
2
Ne voulez-vous pas dire " oui, ils peuvent se chevaucher, ce sont des rues différentes " ou " non, ils ne peuvent pas se chevaucher, vous n'obtiendrez pas de cas de test comme celui-ci "? Votre phrase se contredit en ce moment. ;) Mais cela ne me dérange pas si vous le spécifiez dans le défi. Si vous voulez dire que des cas de test comme celui-ci sont possibles, je vais modifier ma réponse 05AB1E pour en tenir compte. Et @Jitse devrait également changer sa réponse Python dans ce cas.
Kevin Cruijssen du
2
Oh .. Je voulais dire "oui, ils peuvent se chevaucher, ils sont considérés comme des rues différentes"
AZTECCO
2
Peut confirmer. J'ai aussi travaillé comme facteur le samedi il y a de nombreuses années. :) Bien que dans presque toutes les rues de mes quartiers de livraison, il était plus efficace de garer mon vélo au bord de la rue, de marcher dans un sens et de livrer tous les nombres impairs, puis de revenir de l'autre côté en faisant tous les nombres pairs, en terminant à nouveau à mon vélo. Là encore, avec les grandes rues, les périodes chargées comme Noël ou les charges de dossiers commerciaux, je devais généralement retourner à mon vélo entre plusieurs fois parce que je ne pouvais pas transporter tous les messages de la rue en une seule fois ..> .>
Kevin Cruijssen

Réponses:

4

Gelée , 13 octets

,⁵KỴṪ⁼ɗƇ@ɗ€ẎY

Un programme complet acceptant trois arguments - une liste de numéros civiques sur votre rue nommée, une liste des adresses dans le coffre de courrier et votre nom de rue - qui imprime les adresses auxquelles vous devez livrer dans l'ordre des numéros civiques donnés .

Essayez-le en ligne!

Comment?

,⁵KỴṪ⁼ɗƇ@ɗ€ẎY - Main link: civic numbers, addresses
          €   - for each (civic number):
         ɗ    -   last three links as a dyad - i.e. f(civic number, addresses):
,⁵            -     pair (the civic number) with 3rd program input (the street name)
  K           -     join (that) with a space -- i.e. X=civic number+' '+street name
        @     -     with swapped arguments i.e. f(addresses, X):
       Ƈ      -       filter (the addresses) keeping those for which:
      ɗ       -         last three links as a dyad - i.e. f(address, X):
   Ỵ          -           split (address) at newlines
    Ṫ         -           tail (get the second line)
     ⁼        -           equals (X)?
           Ẏ  - tighten (the list of lists to a single list)
            Y - join with newlines
Jonathan Allan
la source
4

05AB1E , 15 13 12 octets

ε²ðýUʒ¶¡Xk]˜

-2 octets en portant la réponse Jelly de @JonathanAllan , alors assurez-vous de lui donner un vote positif!
-1 octet grâce à @Grimy .

Les entrées sont dans l'ordre: [liste des numéros civiques], nom de la rue, [liste des adresses].

Essayez-le en ligne.

Explication:

ε       # Map over the (implicit) input-list of civic numbers
 ²      #  Push the second street-input
  ðý    #  And join the two values by a space
    U   #  Pop and store this street + num string in variable `X`
 ʒ      #  Filter the (implicit) input-list of addresses by:
  ¶¡    #   Split on newlines
    Xk  #   Get the index of string `X` (street + num) in this list,
        #   which will be either -1 (not found), 0 (first address-line), or 
        #   1 (second address-line), and only 1 is truthy in 05AB1E
]       # After both the inner filter and outer map:
 ˜      # Flatten the array to remove any empty inner lists
        # (after which the result is output implicitly)
Kevin Cruijssen
la source
En attente de modification, merci beaucoup pour l'aide!
AZTECCO
J'ai édité un cas de test avec un cas de test de chevauchement en ajoutant "Billy Ray V. \ n5 Church Roadside East", il ne devrait pas apparaître dans la sortie, veuillez corriger votre réponse. Désolé pour le dérangement, je ferai plus attention à mes défis à l'avenir.
AZTECCO
@AZTECCO devrait être corrigé maintenant en utilisant la première suggestion de golf de Grimy .
Kevin Cruijssen du
Merci pour votre temps!
AZTECCO
2

JavaScript (Node.js) , 58 octets

(s,n,a)=>n.flatMap(n=>a.filter(x=>x.split`
`[1]==n+' '+s))

Essayez-le en ligne!

Commenté

(s, n, a) =>          // s = street name, n[] = civic numbers, a[] = addresses
  n.flatMap(n =>      // for each civic number n in n[]:
    a.filter(x =>     //   for each address x in a[]:
      x.split`\n`[1]  //     keep it if the 2nd part is equal to
      == n + ' ' + s  //     n + space + expected street name
    )                 //   end of filter()
  )                   // end of flatMap() (empty entries are discarded)
Arnauld
la source
Première réponse! Vous avez sauvé mon travail! Merci pour l'amélioration btw
AZTECCO
2

Ruby , 65 octets

->s,o,n{n.grep(/\d\S* #{s}$/).sort_by{|i|o.index i[/\d+(\/.)?/]}}

Essayez-le en ligne!

Encre de valeur
la source
2

Perl 5 , 51 octets

sub{my($r,$a,@B)=@_;map{$n=$_;grep/
$n $r$/,@B}@$a}

Essayez-le en ligne!

Nahuel Fouilleul
la source
J'ai édité un cas de test avec un cas de test de chevauchement en ajoutant "Billy Ray V. \ n5 Church Roadside East", il ne devrait pas apparaître dans la sortie, veuillez corriger votre réponse. Désolé pour le dérangement, je ferai plus attention à mes défis à l'avenir.
AZTECCO
fixe + 1 octet, ajout d' $ancre à la fin de l'expression régulière
Nahuel Fouilleul
Merci pour votre temps
AZTECCO
1

Python 3, 79 85 octets (grâce à Squid )

d=lambda s,n,a:n and[k for k in a if k.split('\n')[1]==n[0]+' '+s]+d(s,n[1:],a)

vieux:

d=lambda s,n,a:[k for k in a if k.split('\n')[1]==n[0]+' '+s]+d(s,n[1:],a)if n else[]
Legorhin
la source
1
79 octets à moins que cela ne le casse d'une manière ou d'une autre
calmar
cool, je ne savais pas que vous pouviez utiliser 'et' pour produire des sorties comme ça
Legorhin
1

Python 3 , 65 octets

lambda s,n,m:[a for i in n for a in m if a.endswith('\n%s '%i+s)]

Essayez-le en ligne!

Fonctionne également en Python 2.

Pour chaque numéro ide la liste des numéros civiques n, la fonction itérera sur toutes les adresses ade la liste de courrier met conservera celles où la combinaison du numéro civique iet du nom de la rue scorrespond a. Il en résulte une liste triée et filtrée.

Jitse
la source
1

Kotlin , 145 octets

fun p(s:String,o:List<String>,m:List<String>):List<String>
=if(o.size<1)List(0){""}
else
m.filter{it.split("\n")[1]==o[0]+" "+s}+p(s,o.drop(1),m)

Essayez-le en ligne!

JohnWells
la source