Pengiriman tukang pos

12

Saya baru saja mendapat pekerjaan sebagai tukang pos dan saya butuh bantuan Anda untuk mempertahankannya. Saya harus memesan banyak surat sebelum saya pergi untuk mengirimkannya.

Jalan-jalan diberi nomor ketat secara berurutan, dimulai dengan 1 di awal jalan, dan terus berlanjut agar tidak ada angka sampai akhir, dengan angka ganjil di sisi kiri dan rata di sisi kanan. Ditambah rumah yang ditambahkan kemudian jadi kami mungkin juga menambahkan surat ke nomor sipil.

Peti berisi semua surat kota sehingga saya harus memilih hanya surat jalan saya.

Saya butuh bantuan Anda untuk memesan surat lebih cepat. Apa yang saya minta adalah menulis fungsi atau program lengkap:
- Nama jalan.
- Daftar nomor sipil yang dipesan mengikuti jalur saya.
- Daftar alamat (mewakili kotak surat).

Dan mengeluarkan daftar alamat yang hanya berisi jalan saya, diperintahkan mengikuti daftar nomor sipil.

Alamat memiliki bentuk:

 Person Name/n   
 CivicN Street Name

Di mana CivicN adalah angka yang dapat diikuti oleh '/' dan SURAT UPPERCASE (10 10 / B). Jika Anda suka, huruf kecil dapat diterima.

Jika Nama Jalanan tumpang tindih mereka dianggap jalan yang berbeda:

Church Road  != Saint Lorenz Church Road 

Kami menghilangkan sisa alamat untuk kesederhanaan (dengan asumsi itu sama untuk setiap email)

Surat harus dikirim cepat sehingga jawaban terpendek menang.

CONTOH:

Tata letak:

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

Memasukkan :

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

Keluaran:

Ms. Polly
2 Tea Avenue  

Mrs. Pie O. Pinky 
6 Tea Avenue 

Ms. Kita I. Omeeha
6 Tea Avenue 

Ollie E.
11 Tea Avenue

Memasukkan :

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

Keluaran:

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

Generator tes: Coba online! Ubah string_wrapper_left / kanan dan pemisah untuk memodifikasi pemformatan.

Aturan:
- Celah standar dilarang.
- Metode input / output standar.
- Jawaban terpendek dalam byte menang.

AZTECCO
sumber
5
Saya khawatir Anda akan meminta kami untuk menyelesaikan masalah salesman keliling.
Jitse
3
@AZTECCO Terima kasih! Sangat disarankan untuk memasang beberapa test case di pos Anda, tidak hanya dalam kode demo.
Jitse
2
Bukankah maksud Anda " ya mereka bisa tumpang tindih, mereka jalan yang berbeda " atau " tidak mereka tidak bisa tumpang tindih, Anda tidak akan mendapatkan kasus uji seperti ini "? Kalimat Anda bertentangan dengan dirinya sendiri sekarang. ;) Tapi saya tidak keberatan jika Anda menentukannya dalam tantangan. Jika Anda memang bermaksud bahwa kasus pengujian seperti itu mungkin terjadi, saya akan mengedit jawaban 05AB1E saya untuk menjelaskannya. Dan @Jitse harus mengubah jawaban Python-nya juga dalam kasus itu.
Kevin Cruijssen
2
Oh ..
maksudku
2
Dapat mengkonfirmasi. Saya dulu bekerja sebagai tukang pos pada hari Sabtu juga bertahun-tahun yang lalu. :) Meskipun di hampir semua jalan di daerah pengiriman saya, lebih efisien waktu untuk hanya memarkir sepeda saya di tepi jalan, berjalan satu arah dan memberikan semua angka ganjil, dan kemudian berjalan di sisi lain kembali melakukan semua angka genap, berakhir di sepeda saya lagi. Kemudian lagi, dengan jalan-jalan besar, periode sibuk seperti Natal, atau banyak folder komersial, saya biasanya harus berjalan kembali ke sepeda di antara beberapa kali karena saya tidak dapat membawa semua pos dari seluruh jalan dalam sekali jalan ..> .>
Kevin Cruijssen

Jawaban:

4

Jelly , 13 bytes

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

Program lengkap yang menerima tiga argumen - daftar nomor sipil di jalan bernama Anda, daftar alamat di kotak surat, dan nama jalan Anda - yang mencetak alamat yang harus Anda kirim sesuai urutan nomor sipil yang diberikan .

Cobalah online!

Bagaimana?

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

05AB1E , 15 13 12 byte

ε²ðýUʒ¶¡Xk]˜

-2 bytes dengan memasukkan jawaban Jelly @JonathanAllan , jadi pastikan untuk membatalkannya!
-1 byte terima kasih kepada @Grimy .

Input ada dalam urutan: [daftar nomor sipil], nama jalan, [daftar alamat].

Cobalah online.

Penjelasan:

ε       # 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
sumber
Menunggu hasil edit, terima kasih banyak atas bantuannya!
AZTECCO
Saya telah mengedit kotak uji dengan kotak uji yang tumpang tindih dengan menambahkan "Billy Ray V. \ n5 Church Roadside East", ia seharusnya tidak muncul di output, mohon perbaiki jawaban Anda. Maaf atas ketidaknyamanan ini, saya akan lebih memperhatikan tantangan saya di masa depan.
AZTECCO
@AZTECCO Harus diperbaiki sekarang dengan menggunakan saran golf pertama Grimy .
Kevin Cruijssen
Terima kasih atas waktunya!
AZTECCO
2

JavaScript (Node.js) , 58 byte

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

Cobalah online!

Berkomentar

(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
sumber
Jawaban pertama! Anda menyelamatkan pekerjaan saya! Terima kasih atas peningkatan btw
AZTECCO
2

Ruby , 65 byte

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

Cobalah online!

Nilai Tinta
sumber
2

Perl 5 , 51 byte

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

Cobalah online!

Nahuel Fouilleul
sumber
Saya telah mengedit kotak uji dengan kotak uji yang tumpang tindih dengan menambahkan "Billy Ray V. \ n5 Church Roadside East", ia seharusnya tidak muncul di output, mohon perbaiki jawaban Anda. Maaf atas ketidaknyamanan ini, saya akan lebih memperhatikan tantangan saya di masa depan.
AZTECCO
memperbaiki +1byte, menambahkan $jangkar di akhir regex
Nahuel Fouilleul
Terima kasih atas waktu Anda
AZTECCO
1

Python 3, 79 85 byte (terima kasih kepada 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)

tua:

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
sumber
1
79 byte kecuali jika ini rusak entah bagaimana
cumi
keren, saya tidak tahu Anda bisa menggunakan 'dan' untuk menghasilkan output seperti itu
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)]

Cobalah online!

Juga berfungsi di Python 2.

Untuk setiap nomor idalam daftar nomor sipil n, fungsi akan iterate atas semua alamat adi daftar email mdan menjaga orang-orang di mana kombinasi nomor sipil idan nama jalan spertandingan dengan a. Ini menghasilkan daftar yang diurutkan dan difilter.

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

Cobalah online!

JohnWells
sumber