Postacı Teslimatı


12

Postacı olarak yeni bir iş buldum ve bunu sürdürmek için yardımına ihtiyacım var. Onları teslim etmek için dışarı çıkmadan önce bir sürü posta sipariş etmeliyim.

Sokaklar, sokak başlangıcında 1 ile başlayarak ve sonuna kadar hiçbir sayı atlamamaya devam ederek, sol tarafta tek sayılarla ve sağ tarafta eşitlenerek, sırasıyla sırayla numaralandırılır. Daha sonra evler de eklendi, böylece sivil numaraya mektuplar da eklenebilir.

Sandık şehrin tüm postalarını içeriyor, bu yüzden sadece sokağımın postalarını seçmek zorundayım.

Postaları daha hızlı sipariş etmek için yardımına ihtiyacım var. Size bir fonksiyon veya tam bir program yazmak istiyoruz:
- Bir sokak adı.
- Yolumu takiben sıralanan sivil numaralar listesi.
- Adreslerin listesi (posta sandığını temsil eden).

Ve sivil numaralar listesini izleyerek sıralı, sadece benim sokağın adreslerini içeren bir adres listesi çıktı.

Bir adres şu şekildedir:

 Person Name/n   
 CivicN Street Name

Burada CivicN , '/' ve BÜYÜK HARF (10 10 / B) ile takip edilebilecek bir sayıdır. İsterseniz küçük harf kabul edilebilir.

Sokak Adları çakışıyorsa, bunlar farklı sokaklar olarak kabul edilir:

Church Road  != Saint Lorenz Church Road 

Adresin geri kalanını basitlik için atlıyoruz (her posta için aynı olduğu varsayılarak)

Mektuplar hızlı bir şekilde teslim edilmelidir, böylece en kısa cevap kazanır.

MİSAL:

Yerleşim :

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

Giriş:

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

Çıktı :

Ms. Polly
2 Tea Avenue  

Mrs. Pie O. Pinky 
6 Tea Avenue 

Ms. Kita I. Omeeha
6 Tea Avenue 

Ollie E.
11 Tea Avenue

Giriş:

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

Çıktı :

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

Test jeneratörü: Çevrimiçi deneyin! Biçimlendirmeyi değiştirmek için string_wrapper_left / right ve separator öğelerini değiştirin.

Kurallar:
- Standart boşluklar yasaktır.
- Standart giriş / çıkış yöntemleri.
- Bayt cinsinden en kısa cevap kazanır.


5
Seyahat satıcısı sorununu çözmemizi isteyeceğinizden korktum.
Jitse

3
@AZTECCO Teşekkürler! Yalnızca demo koduna değil, gönderinize gömülü birkaç test senaryosunun olması şiddetle önerilir.
Jitse

2
" Evet üst üste binebilirler, farklı sokaklar " ya da " hayır üst üste binemezler, böyle test senaryoları almayacaksınız " demek istemiyor musunuz ? Cezanız şu anda kendisiyle çelişiyor. ;) Ama meydan okumada belirtirseniz sakıncası yok. Böyle test senaryolarının mümkün olduğu anlamına gelirseniz, 05AB1E cevabımı hesaba katmak için düzenleyeceğim. Ve @Jitse bu durumda Python cevabını da değiştirmek zorunda kalacaktı.
Kevin Cruijssen

2
Oh .. demek istediğim "evet üst üste binebilirler, farklı sokaklar olarak kabul edilirler"
AZTECCO

2
Onaylayabilir. Yıllar önce Cumartesi postacısı olarak çalışıyordum. :) Teslimat bölgelerimin neredeyse tüm sokaklarında, bisikletimi sokağın kenarına park etmek, tek yönlü yürümek ve tüm tek sayıları teslim etmek ve daha sonra diğer çiftleri geri almak, yine bisikletime. Sonra tekrar, büyük sokaklar, Noel gibi yoğun dönemler veya ticari klasörler bir sürü ile, ben genellikle bir kerede tüm sokak tüm posta taşıyamadı çünkü bisiklet arasında birkaç kez geri yürümek zorunda kaldı ..> .>
Kevin Cruijssen

Yanıtlar:


4

Jöle , 13 bayt

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

Verilen argüman numaralarına göre teslim etmeniz gereken adresleri yazdıran üç argümanı (adlandırılmış sokağınızdaki sivil numaraların listesi, posta sandığındaki adreslerin listesi ve sokak adınız) kabul eden tam bir program. .

Çevrimiçi deneyin!

Nasıl?

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

ε²ðýUʒ¶¡Xk]˜

@JonathanAllan'ın Jelly cevabını taşıyarak -2 bayt , bu yüzden onu onayladığınızdan emin olun! @Grimy
sayesinde -1 bayt .

Girdiler şu şekildedir: [şehir numarası listesi], sokak adı, [adres listesi].

Çevrimiçi deneyin.

Açıklama:

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

Düzenlemeyi bekliyorum, yardım için çok teşekkürler!
AZTECCO

"Billy Ray V. \ n5 Church Roadside East" ilaveten örtüşme testi vakası olan bir test vakası düzenledim, çıktıda görünmemelidir, lütfen cevabınızı düzeltin. Rahatsızlık için özür dilerim, gelecekteki zorluklarıma daha fazla dikkat edeceğim.
AZTECCO

@AZTECCO kullanarak artık sabit olmalı Grimy ilk golf öneri.
Kevin Cruijssen

Zaman ayırdığınız için teşekkürler!
AZTECCO

2

JavaScript (Node.js) , 58 bayt

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

Çevrimiçi deneyin!

Yorumlananlar

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

İlk cevap! İşimi sen kurtardın! BTW için teşekkürler
AZTECCO


2

Perl 5 , 51 bayt

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

Çevrimiçi deneyin!


"Billy Ray V. \ n5 Church Roadside East" ilaveten örtüşme testi vakası olan bir test vakası düzenledim, çıktıda görünmemelidir, lütfen cevabınızı düzeltin. Rahatsızlık için özür dilerim, gelecekteki zorluklarıma daha fazla dikkat edeceğim.
AZTECCO

düzeltilmiş + 1bayt, $normal ifadenin sonuna demir ekleyerek
Nahuel Fouilleul



1

Python 3, 79 85 bayt ( kalamar sayesinde )

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)

eski:

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 bayt bu bir şekilde onu kırmazsa
kalamar

Harika, böyle çıktılar üretmek için 've' kullanabileceğinizi bilmiyordum
Legorhin

1

Python 3 , 65 bayt

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

Çevrimiçi deneyin!

Ayrıca Python 2'de çalışır.

iSivil numaralar listesindeki her numara için n, işlev posta listesindeki tüm adresler üzerinde yinelenir ve sivil numara ve sokak adı kombinasyonunun eşleştiği adresleri tutar . Bu, sıralanmış ve filtrelenmiş bir liste ile sonuçlanır.amisa


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.