Mermiler Çarpıştığında


16

Bu meydan okuma, bir süre önce burada tekrar bulduğum bir kitapta okuduğum bir bilmece üzerine kurulu . Sonsuza kadar düz bir çizgide ilerleyen değişen hızlarda bir silahtan saniyede bir kez ateşlenen mermilerle ilgilidir. Bir mermi diğerine çarptığında, her ikisi de tamamen yok edilir. ("Mermi" nin tüm örneklerini "füze" ile değiştirmekten çekinmeyin.)

Görev

Mermi hızlarının ateşlendikleri sırayla bir listesi verildiğinde, tüm mermilerin yok edilip edilmediğini belirleyin.

Kurallar

  • Girdi, herhangi bir sınırlayıcı ile ayrılmış ve önce ve sonra isteğe bağlı bir karakterle negatif olmayan tam sayıların bir listesidir. Bunlar geçerli girişlerdir: 1 2 3 4 5 6ve [1,2,3,4,5,6]. Programcı seçim yapar.
  • En az bir mermi sonsuza dek hayatta kalırsa gerçek bir değer ve aksi takdirde bir sahte değer verin.
  • Mermi hızları saniyede birim olarak verilmiştir.
  • Mermiler aynı anda ve sürekli hareket eder.
  • Madde işaretleri kesirli uzaklıklarda çarpışabilir.
  • İster başlangıçtan itibaren integral veya fraksiyonel bir ofsette olsun, aynı pozisyona aynı anda ulaşan çoklu mermiler, hepsi birbiriyle çarpışır.

Örnekler

Bu şemalarda, Gsilahı, >mermileri temsil eder ve *mermilerin çarpıştığı ve patladığı zamanlardır.

Doğru

Giriş: 0

        0123456789
Time 0 G>
     1 G>
     2 G>
   ...

Çıktı: 1


Giriş: 0 0 0

        0123456789
Time 0 G>
     1 G*
     2 G>
     3 G>
     4 G>
   ...

Çıktı: 1


Giriş: 1

        0123456789
Time 0 G>
     1 G >
     2 G  >
     3 G   >
   ...

Çıktı: 1


Giriş: 2 1

        0123456789
Time 0 G>
     1 G> >
     2 G >  >
     3 G  >   >
     4 G   >    >
   ...

Çıktı: 1


Giriş: 2 3 1

        0123456789
Time 0 G>
     1 G> >
     2 G>  >>
     3 G >    *
     4 G  >
     5 G   >
   ...

Çıktı: 1


Falsy

Giriş: 1 2 3 4 5 6

        Unit      1111111111
        01234567890123456789
Time 0 G>
     1 G>>
     2 G> *
     3 G>  >
     4 G>   > >
     5 G>    >  >>
     6 G      >   > *
     7 G            >  >
     8 G                  > >
     9 G                        >>
    10 G                              *
                  111111111122222222223
        0123456789012345678901234567890

Çıktı: 0


Giriş: 1 0 0 3

        Unit
        0123456789
Time 0 G>
     1 G>>
     2 G* >
     3 G>  >
     4 G   >>
     5 G     *

(İkinci çarpışma zamanı 4.5'tir)
Çıktı:0


Giriş: 2 1 2 3 6 5

        Unit      1111111111
        01234567890123456789
Time 0 G>
     1 G> >
     2 G>>  >
     3 G> *   >
     4 G>  >    >
     5 G>     *   >
     6 G     >      >
     7 G          >   >
     8 G               >>
     9 G                *
                  1111111111
        01234567890123456789

Çıktı: 0


Giriş: 2 3 6

        Unit
        0123456789
Time 0 G>
     1 G> >
     2 G>  >>
     3 G      *

Çıktı: 0


girişin sınırlandırılmasını gerektirebilir 1<enter>2<enter>3...miyim?
kedi

@sysreq: Bu zorluyor ama buna izin vereceğim.
El'endia Starman

Qunitopia'ya katılıyorum - bu zorluk çok kötü, ama bir çözüm üzerinde çalışıyorum ...
zmerch

Yanıtlar:


4

Python 2, 388 392 388 346 342 336 331 bayt

z=k=input();l=len(k);v=range;u=v(l)
while l<z:
 r="";o=[r]*l;z=l
 for h in v(l):
    if r:o[h-1]=o[m]=r;m=h;r=""
    for j in v(h+1,l):
     p=k[h];q=k[j];t=u[j];n=(1.0*q*t-p*u[h])/(q-p)if q-p else""if p>0 else t
     if t<=n<r<()>o[j]>=n<=o[h]:r=n;m=j
 i=0;s=o and min(o)
 while i<l:
    if o[i]==s!="":del k[i],o[i],u[i];l-=1
    else:i+=1
print l

Tanrım bu şey çok büyük, ama aslında işe yaradığına inanıyorum. Tüm karmaşıklıklarını gördüğünüzde, bu meydan okuma gülünç derecede zor.

Saatlerce yazmadan nasıl çalıştığını açıklayabileceğimden emin değilim, bu yüzden sadece yönetici özeti vereceğim.

Giriş listesi küçülmeyene kadar büyük ana while döngüsü dönüyor.

(Eğer? Döngü iç içe bir aslında burada kısa olduğuna inanıyoruz olabilir) döngü iç içe her mermi hızı ve üzerinde döngüler kullanımlara numpy.rootshesapla için hesaplar ve hangi mermi sonra gelen her kurşunla çarpışır edeceği sürenin sonunda. Burada, ""sonsuzluk (kesişme yok) anlamına gelir. Durdurulmuş mermilerin sıfır zamanında değil, göründükleri an çarpışıyor olarak işaretlenmesini sağlamak için ekstra bir koşul dahil edilmelidir.

Her bir sayı için varsa, hangi merminin en kısa sürede vuracağını takip eder ve daha sonra oilgili mermiler için minimum çarpışma süreleri ile güncellenir.

Bu çift döngü sona erdikten sonra, giriş listesi üzerinde tekrarlar ve varsa tüm çarpışma sürelerinin en azında çarpışacak mermileri sileriz. Bu, hepsi aynı anda çarpışırsa çok sayıda mermiyi aynı anda silmemizi sağlar.

Sonra tüm süreci kalan mermiler üzerinde tekrarlıyoruz, çünkü şimdiye kadar çarpışacakları mermilerin yok edildiğini anlayabiliyorlar.

Hiçbir madde işareti silinmez (listenin daralmadığı belirtilir), while döngüsünden çıkar ve kalan listenin uzunluğunu yazdırırız. Bu nedenle, bu program sadece mermilerin hayatta kalması durumunda doğruyu basmakla kalmaz, aynı zamanda hayatta kalan mermi sayısını da tam olarak yazdırır.

EDIT: Hata bulmama yardımcı olmak için test senaryoları oluşturmak için feersum özel teşekkürler.

DÜZENLEME 2: Numpy kullanmak yerine doğrusal denklemi elle çözerek ve başlangıç ​​zamanlarını ayrı bir listeye bölerek ve bir koşullu yeniden yapılandırılarak 42 bayt kaydedildi.

EDIT 3: Aralığı yeniden adlandırarak 4 bayt kaydedildi

EDIT 4: Çift boşlukları sekmelerle değiştirerek 6 bayt daha kaydetti. Ayrıca, feersum, karşılaştırma için kesirler ve kümeler kullanarak uygulamasını sağlayacak kadar nazikti. Biraz golf oynadım ve 331 bayta çıkıyor, benim çözümümü bağlıyor.

EDIT 5: Gereksiz başlatmayı kaldırarak ve bir koşullu yeniden yazarak 5 bayt kaydetti


Örnek girişleri tekrar test etmediniz mi? [1, 0, 0, 3] çalışmıyor.
feersum

@feersum test etmediğim tek kişi oldu, dangit. ama düzeltildi. TÜM BU ÇABA İLE DAHA İYİ BİR UPVOTE ALIN. : P
quintopia

Hala çalışmıyor. [1, 16, 18, 20, 30] 1'e dönmelidir.
feersum

Tamam şimdi çalışıyor gibi görünüyor, çoğu zaman.
feersum
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.