Przewiduj kolizję: czy złodziej ucieknie?

20

Pomyśl o drodze jako o linii liczbowej, rozpoczynającej się 0i kontynuowanej w nieskończoność:

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

Na drodze są dwa samochody: Ci R. Cto policjant, który próbuje złapać R, rabuś. Czaczyna się o 0i Rzaczyna się gdzieś w drodze:

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

Policjant już się rusza - goni złodzieja. Ma stałą prędkość. Rabuś właśnie wskoczył do swojego samochodu. On przyspiesza. Z każdym przyspieszeniem prędkość złodzieja wzrasta o jego przyspieszenie.

Powiedzmy, że prędkość gliniarza jest przyspieszona 7przez złodzieja 1. Jeśli złodziej zaczyna od 30, tak wyglądałaby droga dla każdego tyknięcia:

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

Po ostatnim tiku powyżej prędkość złodzieja jest równa prędkości gliniarza, a on wciąż jest na czele. Ponieważ glina porusza się ze stałą prędkością, a rabuś wciąż przyspiesza, rabuś ucieka, więc podajesz prawdziwą wartość. Gdyby jednak prędkość gliny była 9...

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

... wtedy gliniarz łapie rabusia, zanim rabuś zdoła uciec (oznaczony przez X), więc wyślesz wartość falsey.

Twoje zadanie

Biorąc pod uwagę trzy dane wejściowe - prędkość policjanta, pozycję złodzieja i przyspieszenie złodzieja - określają, czy złodziej ucieknie.

Zasady

  • Policjant zawsze zaczyna się od 0.
  • Wszystkie dane wejściowe będą dodatnimi liczbami całkowitymi.
  • Policjant łapie rabusia, jeśli po jakimkolwiek kleszczu pozycja policjanta jest większa lub równa pozycji rabusia.
  • Rabuś ucieka, gdy nie został jeszcze złapany, a jego prędkość jest większa niż gliny.
  • Twój program musi zakończyć się po wyjściu.
  • Rabuś przyspiesza, zanim poruszy każdym tyknięciem.

Przypadki testowe

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

Odwołaj się do implementacji języka Python 3, która tworzy również grafikę: Wypróbuj online!

To jest , więc wygrywa najkrótsza odpowiedź w bajtach.

Stephen
źródło
Piaskownica (usunięta)
Stephen
8
Ohhhh ... to nie jest wyzwanie dla gliniarzy i rabusiów; to ma więcej sensu.
Magic Octopus Urn
Czy dane wejściowe mają gwarantowany format, czy możemy pobierać dane w dowolnym formacie (jak robber acceleration, cop speed, robber positionzamiast tego)?
TehPers,
@TehPers cokolwiek chcesz (konsekwentnie za każdym razem), ale jeśli robisz coś innego, powiedz tak w swojej odpowiedzi
Stephen
2
Żądanie przypadku testowego: 100, 451, 10. (Nie wszystkie odpowiedzi są zgodne co do wyniku).
Neil,

Odpowiedzi:

2

Galaretka , 9 bajtów

_⁵Ḥ¤²÷÷8<

Wypróbuj online!

Odpowiedź Portu Dziurawej Zakonnicy w Python 3.

(pełny program) Porządkuje argumenty acceleration, position, speed.

Erik the Outgolfer
źródło
16

Python 3 , 29 bajtów

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

Wypróbuj online!

Wyjaśnienie

Pozycja policjanta w czasie tto st.

Pozycja rabusia w tym momencie tto a(t)(t+1)/2 + p.

Podpisana odległość od policjanta do rabusia to (a/2)t^2 + (a/2-s)t + p.

Nigdy nie osiąga zera, jeśli dyskryminujący jest ujemny, a dyskryminujący jest (a/2 - s)^2 - 4(a/2)(p) = [(a-2s)^2-8ap]/4tym samym znakiem, co (a-2s)^2-8ap.

Leaky Nun
źródło
Wypróbuj online! - Bezwstydny port do 05AB1E na 9 bajtów (możesz to wziąć, ponieważ jestem kiepski z fizyki i prawdopodobnie nie mógłbym zrobić sprawiedliwego wyjaśnienia).
Magic Octopus Urn
1
Czy to nie zawiedzie w przypadku testowym „100, 451, 10 -> prawda”?
Mark S.,
Czy coś pomijam, czy też powinniśmy sprawdzić, czy między rozwiązaniami równania kwadratowego jest liczba całkowita(a/2)t^2 + (a/2-s)t + p = 0 -> 10t^2 - 50t + 61 = 0 ? Na przykład dla 60, 61, 20 złodziej łatwo ucieka (rozwiązania równań: 2.1 i 2.9 są zarówno między 2 a 3).
mackoo13,
5

Japt , 13 bajtów

²/W-V-U<o0W x

Przetestuj online!

Wyjaśnienie

U, Vi Wsą niejawnymi danymi wejściowymi. Najpierw Uo0Wtworzymy zakres [0, W, 2 * W, ...], aż osiągnie U. xnastępnie sumuje to, co określa, jak daleko rabuś przebywa przed osiągnięciem prędkości policjanta. Nazwiemy to r .

Jak daleko podróżuje policjant w tym czasie? Można obliczyć tego za pomocą U * (U // W - 1) , który można przekształcić do (U * U) W // - u . Nazwiemy to c .

Teraz ostatni krok: czy złodziej ucieka? Wszystko, co musimy tutaj zrobić, to sprawdzić, czy c <r + V lub przestawione, c - V <r .

ETHprodukcje
źródło
5

Sześciennie , 61 bajtów

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

Wypróbuj online! Aby działało to w TIO, może być konieczne zastąpienie go &z &1powodu błędu w tłumaczu.

To bezwstydny port odpowiedzi Dziurawej Zakonnicy . Wejście jest w formie a s p, gdzie ajest przyspieszenie rabuś za, sjest szybkość policjanta, a pto za pozycja rabuś.

Jeśli przyspieszenie jest zbyt duże, to się nie powiedzie. Nie wiem, jak wysokie jest przyspieszenie tego programu, ale wiem, że nie jest wyższe niż 1260 . Czynnikiem ograniczającym jest to, że przechowuje przyspieszenie w kostce i sprawdza, czy kostka jest rozwiązana, sprawdzając tylko, czy suma górnej powierzchni wynosi 0 (kontrola niekompletna). Wydaje się, że działa na przyspieszenie = 50, ale nie testowałem, aby zobaczyć, jak wysoko może wzrosnąć.

Jak to działa

$: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
TehPers
źródło
1
6W %6i *6mogą być usunięte, ponieważ teraz można nazwać w sposób dorozumiany.
MD XF,
4

Pyth , 11 bajtów

To bierze je w następującej kolejności: Robber Acceleration, Cop Speed, Robber Positionoddzielone znakiem nowej linii (jak pokazano w pakiecie testowym).

<^-QyE2*8*E

Przetestuj pakiet lub wypróbuj online!

Pan Xcoder
źródło
4

Pyke , 14 bajtów

Port odpowiedzi Pythona całkowicie ludzki . Zwraca 1za prawdę i 0za fałsz.

hQee-XQ1@Qe*}<

Wypróbuj tutaj!


Wyjaśnienie

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 bajtów

Moja pierwsza odpowiedź Pyke! Port mojego rozwiązania Pyth , zainspirowanego zgłoszeniem Leaky's Python . Zwraca 1za prawdę i 0za fałsz.

eQh}-XQe8*Q1@*<

Wypróbuj tutaj!


Wyjaśnienie

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.
Pan Xcoder
źródło
2

Ruby , 29 27 25 bajtów

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

Wypróbuj online!

Dostałem od 29 do 27, kradnąc pomysł pomnożenia obu stron przez 4. (odpowiedź python Leaky Nun)

Dostałem od 27 do 25, usuwając pareny wokół parametrów lambda (dzięki całkowicie ludzki)

itdoesntwork
źródło
2
Witamy w PPCG! Możesz trochę pograć w golfa, zmieniając nazwę funkcji hitna hlub podobną. Możesz także być w stanie zaoszczędzić niektóre bajty, zmieniając metodę na proc, na przykład:->c,p,a{(c-a*0.5)**2<2*p*a}
Conor O'Brien
1
Musisz również zastąpić collisionw łączu TIO poprawną nazwę metody.
Leaky Nun
Pssst, spójrz na ich nazwę użytkownika. : P
całkowicie ludzki,
1
Jestem pewien, że nie potrzebujesz nawiasów w pobliżu c,p,a.
całkowicie ludzki,
2

C # (.NET Core) , 33 bajty

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

Wypróbuj online!

Wydaje mi się, że to gdzieś jest wyłączone, ale to pasuje do wszystkich przypadków testowych, więc możliwe jest, że po prostu nie ma żadnych przypadków testowych, w których policjant wyprzedziłby rabusia dla jednego tiku, lub może po prostu zadziałać pomimo moich zastrzeżeń.

Kamil Drakari
źródło
1

Python 2 , 31 30 29 bajtów

-1 bajt dzięki Mr. Xcoder.

Zaczęło się jako port odpowiedzi Ruby .

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

Wypróbuj online!

całkowicie ludzki
źródło
1
.5zamiast 0.5> _>
Mr. Xcoder,
Haha, myślałem, że tyle będzie do przeniesienia. XD Dzięki!
całkowicieludzki
a/2używa podziału na liczby całkowite, czy to może pójść nie tak?
itdoesntwork
Używa podziału na liczby całkowite. Chociaż nie opracowałem żadnej matematyki (szczerze mówiąc, nie jestem pewien, czy mógłbym), działa ona we wszystkich przypadkach testowych.
całkowicie ludzki,
1

Swift 3 , 55 bajtów

Zauważ, że zadeklarowałem zmienną, tponieważ wyrażenie byłoby zbyt złożone, aby w przeciwnym razie można je było rozwiązać w rozsądnym czasie (wina Swift!).

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

Pakiet testowy.

lub 55 bajtów , dokładny odpowiednik zamknięcia (potrzebuję ostatniej części, ponieważ jest to złożona konstrukcja):

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

Pakiet testowy.

Swift 3 , 57 bajtów

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

Pakiet testowy.

Pan Xcoder
źródło
1

Python 2 , 30 bajtów

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

Wypróbuj online! Policjant ma c/atyknięcia, w których można złapać rabusia, po czym przyspieszył policjanta. Przy pierwszym tyknięciu policjant zyskuje c-arabusia, podczas gdy na ostatnim tyka tylko zyskuje c%a. Zatem suma, jaką policjant może zyskać, jest iloczynem liczby tyknięć i średniej odległości na tyknięcie. Jest to po prostu porównywane z początkowym prowadzeniem złodzieja.

Neil
źródło
1

TI BASIC (seria TI-83/84), 18 bajtów

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

Jeszcze inny port itdoesntwork „s wpływowego rozwiązanie Ruby .

Wykonanie

Kolejność wprowadzania to prędkość policjanta, pozycja złodzieja, przyspieszenie złodzieja.

C=?7
R=?30
A=?1
               1
Jakob
źródło
1

Siatkówka , 79 bajtów

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

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

Wypróbuj online! Wyjaśnienie:

\d+
$*

Konwertuj dane wejściowe na jednoargumentowe.

$
;

Zrób miejsce dla prędkości rabusia.

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

Przyspiesz złodzieja przy każdym przejściu.

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

Odsuń złodzieja od gliny.

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

Przesuń policjanta w kierunku rabusia.

.*,,.*

Czy policjant złapał rabusia?

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

Czy złodziej wyprzedza gliniarza?

Neil
źródło