Доставка пошти


12

Я щойно влаштувався на роботу листоношею і мені потрібна ваша допомога, щоб її зберегти. Мені доводиться замовляти багато листів, перш ніж я вийду, щоб доставити їх.

Вулиці нумеруються строго послідовно, починаючи з 1 на початку вулиці і продовжуючи, щоб пропускати без кінця цифри до кінця, з непарними номерами з лівого боку і рівними з правого боку. Плюс будинки були додані пізніше, тому ми можемо також додати цивільний номер до листів.

Скриня містить всю пошту міста, тож я вибираю лише пошту своєї вулиці.

Мені потрібна ваша допомога, щоб швидше замовити пошту. Я прошу вас написати функцію або повну програму, яка містить:
- назва вулиці.
- Список цивільних номерів, упорядкованих по моєму шляху.
- Список адрес (що представляють скриньку пошти).

І виведіть список адрес, що містять лише мої вулиці, упорядкований за списком цивільних номерів.

Адреса має форму:

 Person Name/n   
 CivicN Street Name

Де CivicN - це число, за яким можна слідувати «/» та ПІСЛЯ ПОВЕРХНЕННЯ (10 10 / B). Якщо ви віддаєте перевагу, малі літери є прийнятними.

Якщо назви вулиць перекриваються, вони вважаються різними вулицями:

Church Road  != Saint Lorenz Church Road 

Залишаємо решту адреси для простоти (припустимо, що вона однакова для кожної пошти)

Листи повинні бути доставлені швидко, щоб найкоротша відповідь виграла.

ПРИКЛАД:

Макет:

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

Вхід:

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

Вихід:

Ms. Polly
2 Tea Avenue  

Mrs. Pie O. Pinky 
6 Tea Avenue 

Ms. Kita I. Omeeha
6 Tea Avenue 

Ollie E.
11 Tea Avenue

Вхід:

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

Вихід:

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

Тестовий генератор: Спробуйте його онлайн! Змініть string_wrapper_left / right та роздільник, щоб змінити форматування.

Правила:
- Стандартні лазівки заборонені.
- Стандартні методи введення / виводу.
- Найкоротша відповідь у байтах виграє.


5
Я побоювався, що ти будеш просити нас вирішити проблему продавця подорожі.
Jitse

3
@AZTECCO Дякую! Настійно рекомендується, щоб у вашій посаді було вбудовано кілька тестових випадків, а не лише в демо-код.
Jitse

2
Ви не маєте на увазі " так, вони можуть перекриватися, вони різні вулиці " чи " ні, вони не можуть перекриватися, ви не отримаєте тестові випадки "? Ваше речення суперечить самому собі зараз. ;) Але я не проти, якщо ви вкажете це у виклику. Якщо ви маєте на увазі, що подібні тестові випадки можливі, я відредагую свою відповідь 05AB1E, щоб обліковувати її. І в цьому випадку @Jitse повинен був би змінити свою відповідь Python.
Kevin Cruijssen

2
О, я мав на увазі "так, вони можуть перекриватися, їх вважають різними вулицями"
AZTECCO

2
Можна підтвердити. Як і я багато років тому працював суботником. :) Хоча майже на всіх вулицях моїх районів доставки було ефективнішим часом просто припаркувати велосипед на краю вулиці, піти в одну сторону і доставити всі непарні номери, а потім піти іншою стороною назад, роблячи всі парні номери, закінчуючи знову на своєму велосипеді. Потім знову, з великими вулицями, напруженими періодами, як Різдво, або безліччю комерційних папок, мені зазвичай доводилося ходити до свого велосипеда між кількома разів, тому що я не міг за один раз перенести всю пошту всієї вулиці ..> .>
Кевін Круїссен

Відповіді:


4

Желе , 13 байт

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

Повна програма, що приймає три аргументи - список громадянських номерів на названій вами вулиці, список адрес у скриньці пошти та назва вашої вулиці - яка друкує адреси, на які вам потрібно буде доставити в порядку вказаних цивільних номерів .

Спробуйте в Інтернеті!

Як?

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

4

05AB1E , 15 13 12 байт

ε²ðýUʒ¶¡Xk]˜

-2 байти, перенісши відповідь на желе @JonathanAllan , тому обов'язково підтримайте його!
-1 байт завдяки @Grimy .

Введення в порядку: [список цивільних номерів], назва вулиці, [список адрес].

Спробуйте в Інтернеті.

Пояснення:

ε       # 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)

Чекаю редагування, дякую за допомогу!
AZTECCO

Я редагував тестовий випадок із тестовим випадком, що перекривався, додавши "Біллі Рей В. Вибачте за незручності, я буду приділяти більше уваги моїм проблемам у майбутньому.
AZTECCO

@AZTECCO Виправити це слід за допомогою першої пропозиції Гримі з гольфу.
Kevin Cruijssen

Дякую за ваш час!
AZTECCO

2

JavaScript (Node.js) , 58 байт

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

Спробуйте в Інтернеті!

Прокоментував

(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)

Перша відповідь! Ти врятував мою роботу! Дякуємо за вдосконалення btw
AZTECCO


2

Perl 5 , 51 байт

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

Спробуйте в Інтернеті!


Я редагував тестовий випадок із тестовим випадком, що перекривався, додавши "Біллі Рей В. Вибачте за незручності, я буду приділяти більше уваги моїм проблемам у майбутньому.
AZTECCO

фіксований + 1 байт, додавши $якір в кінці регулярного
виразка

Дякуємо за Ваш час
AZTECCO


1

Python 3, 79 85 байт (завдяки кальмарам )

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)

старий:

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

1
79 байт, якщо це не зламає її якось
кальмар

здорово, я не знав, що ти можеш використовувати "та" для отримання таких результатів
Легорхін,

1

Python 3 , 65 байт

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

Спробуйте в Інтернеті!

Також працює в Python 2.

Для кожного номера iв списку цивільних чисел n, функція буде перебирати всі адреси aв списку пошти mі зберегти ті , де поєднання громадянського кількості iі назва вулиці sматчі з a. Це призводить до відсортованого та відфільтрованого списку.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.