Entrega de cartero

12

Acabo de conseguir un trabajo como cartero y necesito tu ayuda para mantenerlo. Tengo que pedir muchos correos antes de salir a entregarlos.

Las calles están numeradas estrictamente secuencialmente, comenzando con 1 al comienzo de la calle, y continuando en orden sin omitir ningún número hasta el final, con números impares en el lado izquierdo y pares en el lado derecho. Más casas se agregaron más tarde, por lo que también podemos tener letras agregadas al número cívico.

El cofre contiene todo el correo de la ciudad, así que tengo que elegir solo los correos de mi calle.

Necesito tu ayuda para ordenar los correos más rápido. Lo que le pido es que escriba una función o un programa completo tomando:
- Un nombre de calle.
- Una lista de números cívicos ordenados siguiendo mi camino.
- Una lista de direcciones (que representa el cofre de correo).

Y generar una lista de direcciones que contiene solo las de mi calle, ordenadas siguiendo la lista de números cívicos.

Una dirección tiene la forma:

 Person Name/n   
 CivicN Street Name

Donde CivicN es un número que puede ser seguido por un '/' y una LETRA MAYÚSCULA (10 10 / B). Si lo prefiere, se aceptan minúsculas.

Si los nombres de calles se superponen, se consideran calles diferentes:

Church Road  != Saint Lorenz Church Road 

Omitimos el resto de la dirección por simplicidad (suponiendo que sea la misma para cada correo)

Las cartas deben entregarse rápidamente para que gane la respuesta más corta.

EJEMPLO:

Diseño :

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

Salida:

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

Salida:

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

Generador de prueba: ¡ Pruébelo en línea! Cambie string_wrapper_left / right y separator para modificar el formato.

Reglas:
- Las lagunas estándar están prohibidas.
- Métodos de entrada / salida estándar.
- La respuesta más corta en bytes gana.

AZTECCO
fuente
55
Tenía miedo de que nos pidiera que resolvamos el problema del vendedor ambulante.
Jitse
3
@AZTECCO ¡Gracias! Se recomienda encarecidamente tener varios casos de prueba incrustados en su publicación, no solo en el código de demostración.
Jitse
2
¿No quiere decir " sí, pueden superponerse, son calles diferentes " o " no, no pueden superponerse, no obtendrá casos de prueba como este "? Tu oración se contradice en este momento. ;) Pero no me importa si lo especificas en el desafío. Si quiere decir que son posibles casos de prueba como ese, editaré mi respuesta 05AB1E para tenerlo en cuenta. Y @Jitse también tendría que cambiar su respuesta de Python en ese caso.
Kevin Cruijssen
2
Oh ... quise decir "sí, pueden superponerse, se consideran calles diferentes"
AZTECCO
2
Puede confirmar. También solía trabajar como cartero los sábados hace muchos años. :) Aunque en casi todas las calles de mis distritos de reparto fue más eficiente el tiempo simplemente estacionar mi bicicleta en el borde de la calle, caminar en una dirección y entregar todos los números impares, y luego caminar hacia el otro lado haciendo todos los números pares, terminando arriba en mi bicicleta otra vez. Por otra parte, con grandes calles, períodos de mucha actividad, como Navidad, o un montón de carpetas comerciales, por lo general tuve que caminar de regreso a mi bicicleta entre varias veces porque no podía llevar todo el correo de la calle de una sola vez ..> .>
Kevin Cruijssen

Respuestas:

4

Jalea , 13 bytes

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

Un programa completo que acepta tres argumentos: una lista de números cívicos en su calle nombrada, una lista de las direcciones en el buzón de correo y el nombre de su calle, que imprime las direcciones a las que debe entregar en el orden de los números cívicos dados .

Pruébalo en línea!

¿Cómo?

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

05AB1E , 15 13 12 bytes

ε²ðýUʒ¶¡Xk]˜

-2 bytes portando la respuesta Jelly de @JonathanAllan , ¡así que asegúrate de votarlo!
-1 byte gracias a @Grimy .

Las entradas están en el orden: [lista de números cívicos], nombre de la calle, [lista de direcciones].

Pruébalo en línea.

Explicación:

ε       # 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
fuente
Esperando edición, muchas gracias por la ayuda!
AZTECCO
He editado un caso de prueba con el caso de prueba de superposición agregando "Billy Ray V. \ n5 Church Roadside East", no debería aparecer en la salida, por favor arregle su respuesta. Disculpe las molestias, prestaré más atención a mis desafíos en el futuro.
AZTECCO
@AZTECCO Debería arreglarse ahora usando la primera sugerencia de golf de Grimy .
Kevin Cruijssen
¡Gracias por tu tiempo!
AZTECCO
2

JavaScript (Node.js) , 58 bytes

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

Pruébalo en línea!

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
fuente
Primera respuesta! ¡Salvaste mi trabajo! Gracias por mejorar por cierto
AZTECCO 01 de
2

Perl 5 , 51 bytes

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

Pruébalo en línea!

Nahuel Fouilleul
fuente
He editado un caso de prueba con el caso de prueba de superposición agregando "Billy Ray V. \ n5 Church Roadside East", no debería aparecer en la salida, por favor arregle su respuesta. Disculpe las molestias, prestaré más atención a mis desafíos en el futuro.
AZTECCO
fijo + 1byte, agregando $ancla al final de la expresión regular
Nahuel Fouilleul
Gracias por su tiempo
AZTECCO
1

Python 3, 79 85 bytes (gracias a calamar )

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)

antiguo:

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
fuente
1
79 bytes a menos que esto lo rompa de alguna manera
calamar
genial, no sabía que podías usar 'y' para producir resultados como ese
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)]

Pruébalo en línea!

También funciona en Python 2.

Para cada número ien la lista de números cívicos n, la función iterará sobre todas las direcciones aen la lista de correo my mantendrá aquellas donde coincida la combinación del número cívico iy el nombre de la calle . Esto da como resultado una lista ordenada y filtrada.sa

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

Pruébalo en línea!

JohnWells
fuente