Consegna Postino


12

Ho appena trovato un lavoro come postino e ho bisogno del tuo aiuto per mantenerlo. Devo ordinare molte e-mail prima di uscire per consegnarle.

Le strade sono numerate rigorosamente in sequenza, iniziando con 1 all'inizio della strada e proseguendo in ordine saltando nessun numero fino alla fine, con numeri dispari sul lato sinistro e pari sul lato destro. Più case sono state aggiunte in seguito, quindi potremmo anche avere lettere aggiunte al numero civico.

La cassa contiene tutta la posta della città, quindi devo scegliere solo le lettere della mia strada.

Ho bisogno del tuo aiuto per ordinare le mail più velocemente. Quello che ti chiedo è di scrivere una funzione o un programma completo prendendo:
- Un nome di strada.
- Un elenco di numeri civici ordinati seguendo il mio percorso.
- Un elenco di indirizzi (che rappresenta la cassetta postale).

E produce un elenco di indirizzi contenente solo quelli della mia strada, ordinati seguendo l'elenco dei numeri civici.

Un indirizzo ha la forma:

 Person Name/n   
 CivicN Street Name

Dove CivicN è un numero che può essere seguito da una '/' e una LETTERA MAIUSCOLA (10 10 / B). Se preferisci, è accettabile la minuscola.

Se i nomi delle strade si sovrappongono, vengono considerati strade diverse:

Church Road  != Saint Lorenz Church Road 

Omettiamo il resto dell'indirizzo per semplicità (supponendo che sia lo stesso per ogni posta)

Le lettere devono essere consegnate velocemente, quindi vince la risposta più breve.

ESEMPIO:

Disposizione :

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

Input:

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

Produzione :

Ms. Polly
2 Tea Avenue  

Mrs. Pie O. Pinky 
6 Tea Avenue 

Ms. Kita I. Omeeha
6 Tea Avenue 

Ollie E.
11 Tea Avenue

Input:

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

Produzione :

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

Generatore di test: provalo online! Cambia string_wrapper_left / right e separator per modificare la formattazione.

Regole:
- Sono vietate le scappatoie standard.
- Metodi di input / output standard.
- Vince la risposta più breve in byte.


5
Temevo che ci avresti chiesto di risolvere il problema del commesso viaggiatore.
Jitse,

3
@AZTECCO Grazie! Si consiglia vivamente di includere diversi casi di test nei tuoi post, non solo nel codice demo.
Jitse,

2
Non vuoi dire " sì, possono sovrapporsi, sono strade diverse " o " no, non possono sovrapporsi, non otterrai casi di test come questo "? La tua frase si contraddice adesso. ;) Ma non mi dispiace se lo specifichi nella sfida. Se vuoi dire che casi di test del genere sono possibili, modificherò la mia risposta 05AB1E per renderlo conto. E @Jitse dovrebbe cambiare anche la sua risposta Python in quel caso.
Kevin Cruijssen,

2
Oh .. volevo dire "sì, possono sovrapporsi, sono considerati strade diverse"
AZTECCO,

2
Posso confermare Ho lavorato come postino del sabato anche molti anni fa. :) Anche se in quasi tutte le strade dei miei quartieri di consegna, è stato più efficiente parcheggiare la mia bici ai margini della strada, camminare in un modo e consegnare tutti i numeri dispari, quindi tornare indietro dall'altra parte facendo tutti i numeri pari, finendo di nuovo sulla mia bici. Poi di nuovo, con grandi strade, periodi affollati come il Natale o un sacco di cartelle commerciali, di solito dovevo tornare in bicicletta tra un paio di volte perché non potevo trasportare tutti i messaggi dell'intera strada in una volta.> .>
Kevin Cruijssen,

Risposte:


4

Gelatina , 13 byte

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

Un programma completo che accetta tre argomenti: un elenco di numeri civici sulla tua strada nominata, un elenco degli indirizzi nella cassetta postale e il nome della tua strada, che stampa gli indirizzi ai quali devi recapitare nell'ordine dei numeri civici indicati .

Provalo online!

Come?

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

ε²ðýUʒ¶¡Xk]˜

-2 byte eseguendo il porting della risposta Jelly di @JonathanAllan , quindi assicurati di votarlo!
-1 byte grazie a @Grimy .

Gli ingressi sono nell'ordine: [elenco di numeri civici], nome della via, [elenco di indirizzi].

Provalo online.

Spiegazione:

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

In attesa di modifica, grazie mille per l'aiuto!
AZTECCO,

Ho modificato un caso di prova con un caso di sovrapposizione aggiungendo "Billy Ray V. \ n5 Church Roadside East", non dovrebbe apparire nell'output, per favore correggi la tua risposta. Ci scusiamo per l'inconveniente, presterò maggiore attenzione alle mie sfide in futuro.
AZTECCO,

@AZTECCO Ora dovrebbe essere risolto usando il primo suggerimento di golf di Grimy .
Kevin Cruijssen,

Grazie per il tuo tempo!
AZTECCO,

2

JavaScript (Node.js) , 58 byte

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

Provalo online!

Commentate

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

Prima risposta! Mi hai salvato il lavoro! Grazie per il miglioramento tra
AZTECCO


2

Perl 5 , 51 byte

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

Provalo online!


Ho modificato un caso di prova con un caso di sovrapposizione aggiungendo "Billy Ray V. \ n5 Church Roadside East", non dovrebbe apparire nell'output, per favore correggi la tua risposta. Ci scusiamo per l'inconveniente, presterò maggiore attenzione alle mie sfide in futuro.
AZTECCO,

riparato + 1byte, aggiungendo l' $ancoraggio alla fine di regex
Nahuel Fouilleul

Grazie per il tuo tempo
AZTECCO,


1

Python 3, 79 85 byte (grazie a calamari )

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)

vecchio:

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 byte a meno che questo non lo rompa in qualche modo
calamari

bello, non sapevo che avresti potuto usare 'e' per produrre uscite del genere
Legorhin,

1

Python 3 , 65 byte

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

Provalo online!

Funziona anche in Python 2.

Per ogni numero inell'elenco dei numeri civici n, la funzione eseguirà l'iterazione su tutti gli indirizzi anell'elenco dei messaggi me manterrà quelli in cui la combinazione del numero civico ie il nome della strada scorrispondono a. Ciò si traduce in un elenco ordinato e filtrato.


1

Kotlin , 145 byte

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)

Provalo online!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.