Bir Çarpışmayı Tahmin Et: Soyguncu kaçacak mı?


20

Bir yolu, 0sınırsız bir şekilde başlayıp devam eden bir sayı satırı olarak düşünün :

.................................................................

Yolda iki araba var: Cve R. Cyakalamaya çalışan polis R, soyguncu. C-dan başlıyor0 ve Ryolda bir yerde başlar:

C.............................R..................................

Polis zaten hareket ediyor - soyguncuyu kovalıyor. Sabit bir hızı var. Soyguncu arabasına atladı. Hızlanıyor. Her kene, soyguncunun hızı ivmesiyle artar.

Diyelim ki polisin hızı 7ve soyguncunun ivmesi 1. Soyguncu başlarsa 30, yol her bir kene gibi görünecektir:

C.............................R..................................
.......C.......................R.................................
..............C..................R...............................
.....................C..............R............................
............................C...........R........................
...................................C.........R...................
..........................................C........R.............
.................................................C........R......

Yukarıdaki son işaretten sonra, soyguncunun hızı polisin hızına eşit ve hala önde. Polis sabit bir hızda hareket ettiğinden ve hırsız hala hızlandığından, hırsız kaçar, böylece doğru bir değer çıkarırsınız. Ancak, polisin hızı olsaydı 9...

C.............................R..................................
.........C.....................R.................................
..................C..............R...............................
...........................C........R............................
....................................C...R........................
.............................................X...................

... daha sonra polis, soyguncu kaçmadan önce soyguncuyu yakalar ( X ), böylece bir falsey değeri çıkarırsınız.

Senin görevin

Üç giriş verildiğinde - polisin hızı, soyguncunun konumu ve soyguncunun ivmesi - soyguncunun kaçıp kaçmayacağını belirler.

kurallar

  • Polis her zaman şu saatte başlar: 0 .
  • Tüm girdiler pozitif tamsayılar olacaktır.
  • Polis, herhangi bir onay işaretinden sonra, polisin pozisyonu soyguncu pozisyonundan büyük veya ona eşitse soyguncuyu yakalar.
  • Soyguncu henüz yakalanmadığında kaçar ve hızı polislerden daha büyüktür.
  • Programınız çıktıdan sonra sona ermelidir.
  • Soyguncu her kene hareket etmeden önce hızlanır.

Test Durumları

Cop Speed, Robber Position, Robber Acceleration -> Output

7, 30, 1 -> truthy
9, 30, 1 -> falsey
2, 1, 3 -> truthy
100, 100, 50 -> truthy
60, 60, 20 -> falsey
10, 1, 1 -> falsey
10, 50, 2 -> truthy
11, 50, 2 -> truthy
12, 50, 2 -> truthy
13, 50, 2 -> truthy
14, 50, 2 -> truthy
15, 50, 2 -> truthy
16, 50, 2 -> falsey
17, 50, 2 -> falsey
18, 50, 2 -> falsey
100, 451, 10 -> truthy

Bir görsel oluşturan referans Python 3 uygulaması: Çevrimiçi deneyin!

Bu , bayt en kısa cevap kazanır.



8
Ohhhh ... Bu bir polis ve soyguncu mücadelesi değil; Bu daha mantıklı.
Sihirli Ahtapot Urn

Girdinin belirtilen biçimde olması garanti ediliyor mu yoksa girdiyi istediğimiz biçimde alabilir miyiz ( robber acceleration, cop speed, robber positionbunun yerine)?
TehPers

@TehPers ne istersen (her seferinde tutarlı), ama farklı bir şey yapıyorsan cevabında böyle söyle
Stephen

2
Test senaryosu talebi: 100, 451, 10. (Cevapların hepsi sonuç üzerinde aynı fikirde değil).
Neil

Yanıtlar:



16

Python 3 , 29 bayt

lambda s,p,a:(a-2*s)**2<8*a*p

Çevrimiçi deneyin!

açıklama

Zamanda polisin pozisyonu tolduğunu st.

Zamanda Soyguncunun pozisyon tolduğunu a(t)(t+1)/2 + p.

Polisle soyguncunun işaretli mesafesi (a/2)t^2 + (a/2-s)t + p .

Ayrımcı negatifse, (a/2 - s)^2 - 4(a/2)(p) = [(a-2s)^2-8ap]/4aynı işarete sahip olan ayrımcı varlık asla sıfıra ulaşmaz (a-2s)^2-8ap.


Çevrimiçi deneyin! - 9 bayt için 05AB1E'ye utanmaz liman (Fizik ile kötüyüm ve muhtemelen sadece bir açıklama yapamadığınız için alabilirsin).
Sihirli Ahtapot Urn

1
Bu "100, 451, 10 -> doğru" test davasında başarısız olmaz mı?
Mark

Bir şey mi kaçırıyorum, yoksa ikinci dereceden denklemin çözümleri arasında bir tamsayı olup olmadığını da kontrol etmeli miyiz (a/2)t^2 + (a/2-s)t + p = 0 -> 10t^2 - 50t + 61 = 0? Örneğin, 60, 61, 20 için soyguncu kolayca uzaklaşır (denklem çözümleri: 2.1 ve 2.9, her ikisi de 2 ve 3 arasındadır).
mackoo13

5

Japt , 13 bayt

²/W-V-U<o0W x

Çevrimiçi test edin!

açıklama

U,, Vve Wörtülü girdilerdir. İlk olarak, [0, W, 2 * W, ...]Uo0W aralığına ulaşana kadar yaratırız . daha sonra bunu toplar ve bu da soyguncunun polis hızına ulaşmadan önce ne kadar yol aldığını verir. Buna r diyeceğiz .Ux

Şimdi, polis bu zamanda ne kadar ilerliyor? Bunu, (U * U) // W - U olarak yeniden düzenlenebilen U * (U // W - 1) kullanarak hesaplayabiliriz . Buna c diyoruz .

Şimdi son adım için: soyguncu kaçıyor mu? Burada tek yapmamız gereken c <r + V veya yeniden düzenlenmiş olup olmadığını kontrol etmek c - V <r .


5

Kübik , 61 bayt

$:7(U1R3U1F3D2*1-1/1)6+7$-77*6$(-77777777D2F1U3R1U3!0{<0%6&})

Çevrimiçi deneyin! Bu TIO içinde çalışması için, değiştirmek gerekebilir &ile &1bağlı tercüman bir hatadan.

Bu, Leaky Nun'in cevabının utanmaz bir limanı . Girdi, soyguncunun ivmesinin a s polduğu yerde , polisin hızıdır ve soyguncunun pozisyonudur.asp

Hızlanma çok yüksekse, bu başarısız olur. Bu programın ne kadar hızlanacağını bilmiyorum , ama 1260'tan daha yüksek olmadığını biliyorum . Sınırlayıcı faktör, ivmeyi küpte saklaması ve yalnızca üst yüzün toplamı 0 (eksik bir kontrol) olup olmadığını kontrol ederek küpün çözülüp çözülmediğini kontrol etmesidir. Hızlanma = 50 için çalışıyor gibi görünüyor, ancak ne kadar yükselebileceğini görmek için test yapmadım.

Nasıl çalışır

$:7(U1R3U1F3D2*1-1/1)6
$:7                             Store the first number in the notepad
   (                )6          Loop until notepad is 0
    U1R3U1F3D2                  Rotate the cube a certain way
              *1-1/1            Subtract 1 from the notepad

+7$-77*6                
+7                              Add first input to the notepad
  $-77                          Subtract second input from the notepad twice
      *6                        Multiply the notepad by itself (square it)

$(-77777777D2F1U3R1U3!0{<0%6&})
$                               Get next input
 (                            ) Loop indefinitely
  -77777777                     Subtract third input 8 times
           D2F1U3R1U3           "Unrotate" the cube
                     !0{     }  If the top face is 0
                        <0        Check if notepad < 0, store in notepad
                          %6      Output notepad as number
                            &     End the program

1
6İçinde %6ve *6artık örtülü çağrılabilir olarak kaldırılabilir.
MD XF


4

Pyke , 14 bayt

Port totallyhuman Python cevap . İade 1truthy için ve 0falsy için.

hQee-XQ1@Qe*}<

Burada deneyin!


açıklama

hQee-XQ1@Qe*}< - Full program with implicit input added in the beginning (which automatically splits the components)

h              - First input
 Qee           - Last Input halved (through integer division)
    -          - Subtact the above
     X         - Square.
             < - Is smaller than?
      Q1@      - The second input
         Qe*   - Multiplied by the last input
            }  - Doubled

Pyke , 15 bayt

İlk Pyke cevabım! Leaky'nin Python sunumundan esinlenerek Pyth çözümümün limanı . İade 1truthy için ve0 falsy için.

eQh}-XQe8*Q1@*<

Burada deneyin!


açıklama

eQh}-XQe8*Q1@*< - Full program with implicit input added in the beginning (which automatically splits the components)

e               - End; last input in this case
 Qh             - The first input
   }            - Double
    -           - Subtact the above
     X          - Square.
              < - Is less than?
      Qe        - Last Input
        8*      - Times 8 
             *  - Multiplied by
          Q1@   - The second input.


2

Yakut , 29 27 25 bayt

->c,p,a{(a-c-c)**2<8*p*a}

Çevrimiçi deneyin!

Her iki tarafı 4 ile çarpma fikrini çalarak 29'dan 27'ye ulaştım. (Leaky Nun'ün python cevabı)

Lambda parametreleri çevresindeki parensleri kaldırarak 27'den 25'e kadar var (tamamen insanlık sayesinde)


2
PPCG'ye Hoşgeldiniz! İşlevinizi hitiçin hveya benzer bir şekilde yeniden adlandırarak yanıtınızı biraz golf oynayabilirsiniz . Ayrıca, bir yöntemden bir proc'a şu şekilde geçiş yaparak bazı baytları kaydedebilirsiniz:->c,p,a{(c-a*0.5)**2<2*p*a}
Conor O'Brien

1
Ayrıca collisionTIO bağlantınızda doğru yöntem adıyla değiştirmeniz gerekir .
Leaky Nun

Pssst, kullanıcı adlarına bakın. : P
totallyhuman

1
Eminim ki parantezlere ihtiyacınız yok c,p,a.
totallyhuman

2

C # (.NET Core) , 33 bayt

(v,p,a)=>v/a*v<p+v/a*(1+v/a)*.5*a

Çevrimiçi deneyin!

Bunun bir yerde kapalı olduğunu hissediyorum, ancak tüm test senaryoları için geçer, bu yüzden polisin tek bir kene için soyguncuyu geçtiği herhangi bir test vakası olmaması mümkündür veya rezervasyonlarıma rağmen işe yarayabilir.


1

Python 2 , 31 30 29 bayt

Bay Xcoder sayesinde -1 bayt.

Ruby cevabının limanı olarak başladı .

lambda c,p,a:(c-a/2)**2<2*p*a

Çevrimiçi deneyin!


1
.5yerine 0.5> _>
Bay Xcoder

Haha, limana gitmenin o kadar olacağını düşündüm. XD Teşekkürler!
totallyhuman

a/2tamsayı bölme kullanır, bu yanlış gidebilir mi?
itdoesntwork

Tamsayı bölme kullanır. Herhangi bir matematik çalışmamış olsam da (dürüst olmak gerekirse, yapabileceğimden emin değilim), tüm test vakaları için işe yarıyor.
totallyhuman

1

Swift 3 , 55 bayt

Değişkeni bildirdiğime dikkat edin, tçünkü ifade aksi takdirde makul bir zamanda çözülemeyecek kadar karmaşık olacaktır (Swift'in hatası!).

func f(a:Int,b:Int,c:Int){let t=c-2*a;print(t*t<8*c*b)}

Test odası.

veya 55 bayt , tam kapatma eşdeğeri (çünkü karmaşık bir yapı olduğu için son bölüme ihtiyacım var):

{let t=$2-2*$0;return t*t<8*$2*$1}as(Int,Int,Int)->Bool

Test odası.

Swift 3 , 57 bayt

func f(a:[Int]){let t=a[2]-2*a[0];print(t*t<8*a[2]*a[1])}

Test odası.


1

Python 2 , 30 bayt

lambda c,p,a:c/a*(c-a+c%a)/2<p

Çevrimiçi deneyin! Polis, c/asoyguncuyu yakalamak için kenelere sahiptir, bundan sonra polisi hızlandırır. İlk onayda polis c-asoyguncuyu alır, son onayda ise sadece kazanır c%a. Böylece, polisin kazanabileceği toplam, kenelerin sayısının ve kene başına ortalama mesafenin ürünüdür. Bu, soyguncunun sahip olduğu ilk ipucuyla karşılaştırılır.


1

TI BASIC (TI-83/84 serisi), 18 bayt

Prompt C,R,A
(A-2C)²<8RA

Yine bir başka liman itdoesntwork'ün etkili Ruby çözümü .

infaz

Giriş sırası polis hızı, soyguncu konumu, soyguncu hızlandırmasıdır.

C=?7
R=?30
A=?1
               1

1

Retina , 79 bayt

\d+
$*
$
;
{`(1+);
$1;$1
,(1+;(1+))
$2,$1
1`(1+),\1
$1,
.*,,.*

^(1+),.*;\1.*
1

Çevrimiçi deneyin! Açıklama:

\d+
$*

Girişi tekli olarak dönüştür.

$
;

Soyguncunun hızına yer açın.

{`(1+);
$1;$1

Soyguncuyu her geçişte hızlandırın.

,(1+;(1+))
$2,$1

Soyguncuyu polisten uzaklaştırın.

1`(1+),\1
$1,

Polisi soyguncuya doğru hareket ettirin.

.*,,.*

Polis soyguncuyu yakaladı mı?

^(1+),.*;\1.*
1

Soyguncu polisin hızını artırıyor mu?


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.