Dostawa listonosza

12

Właśnie dostałem pracę jako listonosz i potrzebuję twojej pomocy, aby ją utrzymać. Muszę zamówić wiele maili, zanim pójdę je dostarczyć.

Ulice są ponumerowane ściśle sekwencyjnie, zaczynając od 1 na początku ulicy i kontynuując w celu pominięcia żadnych liczb do końca, z nieparzystymi liczbami po lewej stronie i wyrównuje się po prawej stronie. Domy plus zostały dodane później, więc możemy również dołączyć litery do numeru obywatelskiego.

Skrzynia zawiera całą pocztę z miasta, więc muszę wybierać tylko maile z mojej ulicy.

Potrzebuję twojej pomocy, aby szybciej zamówić maile. Proszę o napisanie funkcji lub pełnego programu, biorąc:
- Nazwę ulicy.
- Lista liczb obywatelskich uporządkowanych wzdłuż mojej ścieżki.
- Lista adresów (reprezentujących skrzynkę pocztową).

I wypisz listę adresów zawierającą tylko adresy mojej ulicy, uporządkowane zgodnie z listą numerów obywatelskich.

Adres ma postać:

 Person Name/n   
 CivicN Street Name

Gdzie CivicN to liczba, po której może następować „/” i LITER DUŻYCH (10 10 / B). Jeśli wolisz, małe litery są dopuszczalne.

Jeśli nazwy ulic nakładają się, są uważane za różne ulice:

Church Road  != Saint Lorenz Church Road 

Resztę adresu pomijamy dla uproszczenia (zakładając, że jest taki sam dla każdej poczty)

Listy muszą być dostarczane szybko, aby wygrała najkrótsza odpowiedź.

PRZYKŁAD:

Układ:

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

Wejście :

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

Wynik :

Ms. Polly
2 Tea Avenue  

Mrs. Pie O. Pinky 
6 Tea Avenue 

Ms. Kita I. Omeeha
6 Tea Avenue 

Ollie E.
11 Tea Avenue

Wejście :

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

Wynik :

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

Generator testowy: Wypróbuj online! Zmień string_wrapper_left / right i separator, aby zmodyfikować formatowanie.

Zasady:
- Standardowe luki są zabronione.
- Standardowe metody wejścia / wyjścia.
- Najkrótsza odpowiedź w bajtach wygrywa.

AZTECCO
źródło
5
Bałam się, że poprosisz nas o rozwiązanie problemu sprzedawcy podróżującego.
Jitse,
3
@AZTECCO Dzięki! Zdecydowanie zaleca się osadzenie kilku postów testowych w poście, a nie tylko w kodzie demonstracyjnym.
Jitse,
2
Czy nie masz na myśli „ tak, mogą się nakładać, to są różne ulice ” lub „ nie, nie mogą się pokrywać, nie dostaniesz takich przypadków testowych ”? Twoje zdanie jest teraz sprzeczne. ;) Ale nie mam nic przeciwko, jeśli określisz to w wyzwaniu. Jeśli masz na myśli, że takie przypadki testowe są możliwe, dokonam edycji mojej odpowiedzi 05AB1E, aby to uwzględnić. W tym przypadku @Jitse musiałby również zmienić swoją odpowiedź w języku Python.
Kevin Cruijssen
2
Och .. Miałem na myśli „tak, mogą się nakładać, są uważane za różne ulice”
AZTECCO
2
Potwierdzam Wiele lat temu pracowałem jako sobotni listonosz. :) Chociaż na prawie wszystkich ulicach moich dzielnic dostawczych bardziej efektywny był czas po prostu zaparkować rower na skraju ulicy, przejść się w jedną stronę i dostarczyć wszystkie nieparzyste liczby, a następnie przejść drugą stronę z powrotem, wykonując wszystkie parzyste liczby, kończąc znowu na moim rowerze. Z drugiej strony, z dużymi ulicami, ruchliwymi okresami, takimi jak Święta Bożego Narodzenia lub mnóstwem folderów handlowych, zwykle musiałem wracać do mojego roweru kilka razy, ponieważ nie mogłem znieść całej poczty całej ulicy za jednym razem ..> .>
Kevin Cruijssen

Odpowiedzi:

4

Galaretka , 13 bajtów

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

Pełny program akceptujący trzy argumenty - listę numerów obywatelskich na nazwanej ulicy, listę adresów w skrzynce pocztowej i nazwę ulicy - która drukuje adresy, na które należy podać, w kolejności podanych numerów obywatelskich .

Wypróbuj online!

W jaki sposób?

,⁵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
źródło
4

05AB1E , 15 13 12 bajtów

ε²ðýUʒ¶¡Xk]˜

-2 bajty przez przeniesienie galaretki @JonathanAllan na odpowiedź , więc upewnij się, że go głosujesz!
-1 bajt dzięki @Grimy .

Dane wejściowe są w kolejności: [lista numerów obywatelskich], nazwa ulicy, [lista adresów].

Wypróbuj online.

Wyjaśnienie:

ε       # 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
źródło
Czekam na edycję, wielkie dzięki za pomoc!
AZTECCO
Zredagowałem przypadek testowy z pokrywającym się przypadkiem testowym, dodając „Billy Ray V. \ n5 Church Roadside East”, nie powinien pojawiać się w danych wyjściowych, proszę poprawić swoją odpowiedź. Przepraszam za niedogodności, w przyszłości będę zwracać większą uwagę na moje wyzwania.
AZTECCO
@AZTECCO należy ustalić teraz za pomocą umorusany „s pierwszy golfa sugestię.
Kevin Cruijssen
Dziękuję za Twój czas!
AZTECCO
2

JavaScript (Node.js) , 58 bajtów

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

Wypróbuj online!

Skomentował

(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
źródło
Pierwsza odpowiedź! Uratowałeś moją pracę! Dzięki za poprawę btw
AZTECCO
2

Rubinowy , 65 bajtów

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

Wypróbuj online!

Wartość tuszu
źródło
2

Perl 5 , 51 bajtów

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

Wypróbuj online!

Nahuel Fouilleul
źródło
Zredagowałem przypadek testowy z pokrywającym się przypadkiem testowym, dodając „Billy Ray V. \ n5 Church Roadside East”, nie powinien pojawiać się w danych wyjściowych, proszę poprawić swoją odpowiedź. Przepraszam za niedogodności, w przyszłości będę zwracać większą uwagę na moje wyzwania.
AZTECCO
naprawiono + 1 bajt, dodając $kotwicę na końcu wyrażenia regularnego
Nahuel Fouilleul
Dziękujemy za
poświęcony
1

Python 3, 79 85 bajtów (dzięki kałamarnicy )

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)

stary:

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
źródło
1
79 bajtów, chyba że to jakoś je zepsuje
kałamarnica
fajnie, nie wiedziałem, że można użyć „i” do produkcji takich wyników
Legorhin
1

Python 3 , 65 bajtów

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

Wypróbuj online!

Działa również w Python 2.

Dla każdego numeru ina liście numerów obywatelskich nfunkcja będzie iterować po wszystkich adresach ana liście poczty mi zachowa te, w których kombinacja numeru obywatelskiego ii nazwy ulicy spasuje a. Powoduje to posortowanie i przefiltrowanie listy.

Jitse
źródło
1

Kotlin , 145 bajtów

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)

Wypróbuj online!

JohnWells
źródło