Доставка почтальона

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 и разделитель, чтобы изменить форматирование.

Правила:
- Стандартные лазейки запрещены.
- Стандартные методы ввода / вывода.
- Кратчайший ответ в байтах побеждает.

AZTECCO
источник
5
Я боялся, что вы попросите нас решить проблему с коммивояжером.
Джитс
3
@AZTECCO Спасибо! Настоятельно рекомендуется включить в ваш пост несколько тестовых примеров, а не только в демонстрационный код.
Джитс
2
Разве вы не имеете в виду « да, они могут пересекаться, это разные улицы » или « нет, они не могут пересекаться, у вас не будет таких тестов »? Ваше предложение противоречит самому себе прямо сейчас. ;) Но я не против, если вы укажете это в вызове. Если вы имеете в виду, что подобные тесты возможны, я отредактирую свой ответ 05AB1E, чтобы учесть это. И @Jitse должен был бы изменить свой ответ на Python в этом случае.
Кевин Круйссен
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 байта, портируя ответ Jelly @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
Я отредактировал контрольный пример с перекрывающимся контрольным примером, добавив «Билли Рэй В. \ n5 Church Roadside East», он не должен появляться в выходных данных, пожалуйста, исправьте свой ответ. Извините за неудобства, я буду уделять больше внимания своим задачам в будущем.
AZTECCO
@AZTECCO Должно быть исправлено, используя первое предложение Грими по игре в гольф.
Кевин Круйссен
Спасибо за ваше время!
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)
Arnauld
источник
Первый ответ! Вы сохранили мою работу! Спасибо за улучшение, кстати
AZTECCO
2

Perl 5 , 51 байт

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

Попробуйте онлайн!

Науэль Фуйе
источник
Я отредактировал контрольный пример с перекрывающимся контрольным примером, добавив «Билли Рэй В. \ n5 Church Roadside East», он не должен появляться в выходных данных, пожалуйста, исправьте свой ответ. Извините за неудобства, я буду уделять больше внимания своим задачам в будущем.
AZTECCO
исправлено + 1 байт, добавление $якоря в конце регулярного выражения
Nahuel Fouilleul
Спасибо за ваше время
AZTECCO
1

Python 3, 79 85 байт (благодаря 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)

старый:

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
источник
1
79 байт, если это как-то не сломается
squid
круто, я не знал, что вы могли бы использовать 'и' для создания таких выводов
Легорхин
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и сохранять те, где комбинация гражданского числаis совпадает и названия улицы a. Это приводит к сортировке и фильтрации списка.

Jitse
источник