Carteiro Entrega

12

Acabei de conseguir um emprego como carteiro e preciso da sua ajuda para mantê-lo. Tenho que pedir muitos e-mails antes de entregá-los.

As ruas são numeradas estritamente em sequência, começando com 1 no início da rua e continuando para não pular números até o final, com números ímpares no lado esquerdo e nivelados no lado direito. Mais casas foram adicionadas mais tarde, para que também possamos ter letras anexadas ao número cívico.

O baú contém todas as cartas da cidade, então eu tenho que escolher apenas cartas da minha rua.

Preciso da sua ajuda para encomendar os e-mails mais rapidamente. O que eu peço é que você escreva uma função ou programa completo usando:
- Um nome de rua.
- Uma lista de números cívicos ordenados seguindo meu caminho.
- Uma lista de endereços (representando o baú do correio).

E imprima uma lista de endereços contendo apenas os da minha rua, ordenados após a lista de números cívicos.

Um endereço tem o formato:

 Person Name/n   
 CivicN Street Name

Onde CivicN é um número que pode ser seguido por um '/' e uma LETRA MAIÚSCULAR (10 10 / B). Se preferir, minúsculas é aceitável.

Se os nomes de ruas se sobrepuserem, serão consideradas ruas diferentes:

Church Road  != Saint Lorenz Church Road 

Omitimos o restante do endereço por simplicidade (supondo que seja o mesmo para todos os e-mails)

As cartas devem ser entregues rapidamente, para que as respostas mais curtas sejam vencidas.

EXEMPLO:

Layout:

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

Entrada :

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

Resultado :

Ms. Polly
2 Tea Avenue  

Mrs. Pie O. Pinky 
6 Tea Avenue 

Ms. Kita I. Omeeha
6 Tea Avenue 

Ollie E.
11 Tea Avenue

Entrada :

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

Resultado :

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

Gerador de teste: Experimente online! Altere string_wrapper_left / right e separator para modificar a formatação.

Regras:
- Falhas padrão são proibidas.
- Métodos padrão de entrada / saída.
- Menor resposta em bytes ganha.

AZTECCO
fonte
5
Eu tinha medo que você nos pedisse para resolver o problema do vendedor ambulante.
Jitse 1/10/19
3
@AZTECCO Thanks! É altamente recomendável ter vários casos de teste incorporados em sua postagem, não apenas no código de demonstração.
Jitse
2
Você não quer dizer " sim, eles podem se sobrepor, são ruas diferentes " ou " não, eles não podem se sobrepor, você não terá casos de teste como este "? Sua sentença se contradiz agora. ;) Mas não me importo se você especificar no desafio. Se você quer dizer que casos de teste como esse são possíveis, editarei minha resposta 05AB1E para explicá-la. E o @Jitse também teria que mudar sua resposta em Python nesse caso.
Kevin Cruijssen 1/10/19
2
Oh .. eu quis dizer "sim, eles podem se sobrepor, elas são consideradas diferentes ruas"
AZTECCO
2
Pode confirmar. Eu costumava trabalhar como carteiro no sábado, há muitos anos. :) Embora em quase todas as ruas dos meus distritos de entrega tenha sido mais eficiente estacionar minha bicicleta na beira da rua, andar de um lado e entregar todos os números ímpares e depois andar do outro lado fazendo todos os números pares, terminando na minha bicicleta novamente. Por outro lado, com ruas grandes, períodos movimentados como o Natal ou um monte de pastas comerciais, geralmente eu precisava voltar para a minha bicicleta algumas vezes porque não conseguia carregar todos os postes de toda a rua de uma só vez ..> .>
Kevin Cruijssen 01/10/19

Respostas:

4

Gelatina , 13 bytes

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

Um programa completo que aceita três argumentos - uma lista de números cívicos na sua rua nomeada, uma lista dos endereços no baú do correio e seu nome da rua - que imprime os endereços nos quais você precisa entregar na ordem dos números cívicos especificados .

Experimente online!

Quão?

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

05AB1E , 15 13 12 bytes

ε²ðýUʒ¶¡Xk]˜

-2 bytes, portando a resposta de @JonathanAllan Jelly , por isso não deixe de votar nele!
-1 byte graças a @Grimy .

As entradas estão na ordem: [lista de números cívicos], nome da rua, [lista de endereços].

Experimente online.

Explicação:

ε       # 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
fonte
Aguardando edição, muito obrigado pela ajuda!
AZTECCO 01/10/19
Eu editei um caso de teste com sobreposição, adicionando "Billy Ray V. \ n5 Church Roadside East". Ele não deve aparecer na saída. Corrija sua resposta. Desculpe pelo transtorno, prestarei mais atenção nos meus desafios no futuro.
AZTECCO
@AZTECCO deve ser fixado agora usando Grimy primeira sugestão de golfe 's.
Kevin Cruijssen 3/10/19
Obrigado pelo seu tempo!
AZTECCO
2

JavaScript (Node.js) , 58 bytes

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

Experimente online!

Comentado

(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
fonte
Primeira resposta! Você salvou meu trabalho! Obrigado pela melhoria btw
AZTECCO
2

Ruby , 65 bytes

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

Experimente online!

Value Ink
fonte
2

Perl 5 , 51 bytes

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

Experimente online!

Nahuel Fouilleul
fonte
Eu editei um caso de teste com sobreposição, adicionando "Billy Ray V. \ n5 Church Roadside East". Ele não deve aparecer na saída. Corrija sua resposta. Desculpe pelo transtorno, prestarei mais atenção nos meus desafios no futuro.
AZTECCO
fixo + 1byte, acrescentando $âncora no final da regex
Nahuel FOUILLEUL
Obrigado pelo seu tempo
AZTECCO
1

Python 3, 79 85 bytes (graças ao 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)

velho:

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
fonte
1
79 bytes , a menos Isso quebra de alguma forma
Reintegrar Monica
legal, eu não sabia que você poderia usar 'e' para produzir resultados como esse
Legorhin
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)]

Experimente online!

Também funciona em Python 2.

Para cada número ina lista de números cívicos n, a função irá percorrer todos os endereços ada lista de correspondência me manterá aqueles onde a combinação do número cívico ie o nome da rua scoincidir com a. Isso resulta em uma lista classificada e filtrada.

Jitse
fonte
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)

Experimente online!

JohnWells
fonte