Postbotenzustellung

12

Ich habe gerade einen Job als Postbote bekommen und ich brauche deine Hilfe, um ihn zu behalten. Ich muss viele Mails bestellen, bevor ich sie ausliefern kann.

Die Straßen sind streng fortlaufend nummeriert, beginnend mit 1 am Anfang der Straße und weiter, um bis zum Ende keine Zahlen zu überspringen, mit ungeraden Zahlen auf der linken Seite und sogar auf der rechten Seite. Außerdem wurden später Häuser hinzugefügt, sodass möglicherweise auch Buchstaben an die Bürgennummer angehängt werden.

Die Truhe enthält alle Post der Stadt, so dass ich nur Mails meiner Straße auswählen muss.

Ich brauche deine Hilfe, um die Mails schneller zu bestellen. Ich bitte Sie, eine Funktion oder ein vollständiges Programm zu schreiben, das Folgendes enthält:
- Einen Straßennamen.
- Eine Liste von Bürgernummern, die nach meinem Weg bestellt wurden.
- Eine Liste von Adressen (die die Postkiste darstellen).

Und geben Sie eine Liste von Adressen aus, die nur die meiner Straße enthält, geordnet nach der Liste der Bürgernummern.

Eine Adresse hat die Form:

 Person Name/n   
 CivicN Street Name

Wobei CivicN eine Zahl ist, auf die ein '/' und ein Großbuchstabe (10 10 / B) folgen können. Wenn Sie es vorziehen, ist Kleinbuchstaben akzeptabel.

Wenn sich Straßennamen überschneiden, werden sie als unterschiedliche Straßen betrachtet:

Church Road  != Saint Lorenz Church Road 

Der Einfachheit halber wird der Rest der Adresse weggelassen (vorausgesetzt, er ist für jede Mail gleich).

Briefe müssen schnell zugestellt werden, damit die kürzeste Antwort gewinnt.

BEISPIEL:

Layout :

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

Eingabe:

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

Ausgabe :

Ms. Polly
2 Tea Avenue  

Mrs. Pie O. Pinky 
6 Tea Avenue 

Ms. Kita I. Omeeha
6 Tea Avenue 

Ollie E.
11 Tea Avenue

Eingabe:

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

Ausgabe :

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

Testgenerator: Probieren Sie es online aus! Ändern Sie string_wrapper_left / right und das Trennzeichen, um die Formatierung zu ändern.

Regeln:
- Standardlücken sind verboten.
- Standardeingabe- / Ausgabemethoden.
- Die kürzeste Antwort in Bytes gewinnt.

AZTECCO
quelle
5
Ich hatte Angst, Sie würden uns bitten, das Problem der reisenden Verkäufer zu lösen.
Jitse
3
@AZTECCO Danke! Es wird dringend empfohlen, mehrere Testfälle in Ihren Beitrag einzubetten, nicht nur im Demo-Code.
Jitse
2
Meinen Sie nicht " Ja, sie können sich überlappen, sie sind verschiedene Straßen " oder " Nein, sie können sich nicht überlappen, Sie werden solche Testfälle nicht bekommen "? Ihr Satz widerspricht sich gerade. ;) Aber es macht mir nichts aus, wenn du es in der Herausforderung spezifizierst. Wenn Sie meinen, dass solche Testfälle möglich sind, werde ich meine 05AB1E-Antwort bearbeiten, um dies zu berücksichtigen. Und @Jitse müsste auch in diesem Fall seine Python-Antwort ändern.
Kevin Cruijssen
2
Oh .. ich meinte "Ja, sie können sich überschneiden, sie gelten als unterschiedliche Straßen"
AZTECCO
2
Kann bestätigen. Ich habe vor vielen Jahren auch als Postbote am Samstag gearbeitet. :) Obwohl es in fast allen Straßen meiner Lieferbezirke zeiteffizienter war, mein Fahrrad einfach am Straßenrand zu parken, in eine Richtung zu gehen und alle ungeraden Zahlen zu liefern, und dann auf der anderen Seite alle geraden Zahlen zurückzugehen und zu enden wieder an meinem Fahrrad. Andererseits musste ich bei großen Straßen, geschäftigen Zeiten wie Weihnachten oder vielen kommerziellen Ordnern normalerweise zwischendurch ein paar Mal zu meinem Fahrrad zurückgehen, weil ich nicht alle Post der gesamten Straße auf einmal tragen konnte.> .>
Kevin Cruijssen

Antworten:

4

Gelee , 13 Bytes

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

Ein vollständiges Programm, das drei Argumente akzeptiert - eine Liste der Bürgernummern in Ihrer benannten Straße, eine Liste der Adressen in der Postkiste und Ihren Straßennamen -, die die Adressen druckt, an die Sie in der Reihenfolge der angegebenen Bürgernummern liefern müssen .

Probieren Sie es online aus!

Wie?

,⁵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
quelle
4

05AB1E , 15 13 12 Bytes

ε²ðýUʒ¶¡Xk]˜

-2 Bytes durch Portieren von @JonathanAllans Jelly-Antwort , also stellen Sie sicher, dass Sie ihn positiv bewerten!
-1 Byte dank @Grimy .

Die Eingaben erfolgen in der Reihenfolge: [Liste der Bürgernummern], Straßenname, [Liste der Adressen].

Probieren Sie es online aus.

Erläuterung:

ε       # 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
quelle
Warten auf Bearbeitung, vielen Dank für die Hilfe!
AZTECCO
Ich habe einen Testfall mit Überlappungstestfall bearbeitet und "Billy Ray V. \ n5 Church Roadside East" hinzugefügt. Er sollte nicht in der Ausgabe erscheinen. Bitte korrigieren Sie Ihre Antwort. Entschuldigen Sie die Unannehmlichkeiten, ich werde in Zukunft mehr auf meine Herausforderungen achten.
AZTECCO
@AZTECCO Sollte jetzt mit Grimys erstem Golfvorschlag behoben werden .
Kevin Cruijssen
Vielen Dank für Ihre Zeit!
AZTECCO
2

JavaScript (Node.js) , 58 Byte

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

Probieren Sie es online aus!

Kommentiert

(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
quelle
Erste Antwort! Du hast meinen Job gerettet! Vielen Dank für die Verbesserung übrigens
AZTECCO
2

Perl 5 , 51 Bytes

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

Probieren Sie es online aus!

Nahuel Fouilleul
quelle
Ich habe einen Testfall mit Überlappungstestfall bearbeitet und "Billy Ray V. \ n5 Church Roadside East" hinzugefügt. Er sollte nicht in der Ausgabe erscheinen. Bitte korrigieren Sie Ihre Antwort. Entschuldigen Sie die Unannehmlichkeiten, ich werde in Zukunft mehr auf meine Herausforderungen achten.
AZTECCO
behoben + 1byte, $Anker am Ende der Regex hinzufügen
Nahuel Fouilleul
Vielen Dank für Ihre Zeit
AZTECCO
1

Python 3, 79 85 Bytes (dank Tintenfisch )

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)

alt:

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
quelle
1
79 Bytes, es sei denn, dies bricht es irgendwie
Setzen Sie Monica
cool, ich wusste nicht, dass du 'und' verwenden kannst, um
solche
1

Python 3 , 65 Bytes

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

Probieren Sie es online aus!

Funktioniert auch in Python 2.

Für jede Nummer iin der Liste der nBürgernummern durchläuft die Funktion alle Adressen ain der Mail-Liste mund behält diejenigen bei, mit denen die Kombination aus Bürgernummer iund Straßenname sübereinstimmt a. Dies führt zu einer sortierten und gefilterten Liste.

Jitse
quelle
1

Kotlin , 145 Bytes

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)

Probieren Sie es online aus!

JohnWells
quelle