Prevedere una collisione: il ladro scapperà?


20

Pensa a una strada come una linea numerica, a partire da 0e continuando indefinitamente:

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

Ci sono due macchine sulla strada: Ce R. Cè il poliziotto che sta cercando di catturare R, il ladro. Cinizia alle 0e Rinizia da qualche parte sulla strada:

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

Il poliziotto si sta già muovendo, sta inseguendo il ladro. Ha una velocità costante. Il ladro è appena salito in macchina. Sta accelerando. Ad ogni tick, la velocità del ladro aumenta con la sua accelerazione.

Di 'che la velocità del poliziotto è 7e l'accelerazione del ladro è 1. Se il ladro inizia 30, ecco come apparirebbe la strada per ogni segno di spunta:

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

Dopo l'ultimo segno di spunta sopra, la velocità del ladro è pari a quella del poliziotto, ed è ancora avanti. Poiché il poliziotto si sta muovendo a una velocità costante e il ladro sta ancora accelerando, il ladro scappa, quindi si genera un valore veritiero. Tuttavia, se la velocità del poliziotto fosse stata 9...

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

... quindi il poliziotto raggiunge il ladro prima che il ladro possa fuggire (contrassegnato dal Xsimbolo), in modo da emettere un valore falso.

Il tuo compito

Dati tre input - la velocità del poliziotto, la posizione del ladro e l'accelerazione del ladro - determinano se il ladro scapperà o meno.

Regole

  • Il poliziotto inizia sempre alle 0.
  • Tutti gli input saranno numeri interi positivi.
  • Il poliziotto cattura il ladro se, dopo ogni segno di spunta, la posizione del poliziotto è maggiore o uguale alla posizione del ladro.
  • Il ladro si allontana quando non è ancora stato catturato e la sua velocità è maggiore di quella del poliziotto.
  • Il programma deve terminare dopo l'output.
  • Il ladro accelera prima di spostare ogni segno di spunta.

Casi test

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

Implementazione di riferimento di Python 3 che crea anche un elemento visivo: provalo online!

Questo è , quindi vince la risposta più breve in byte.


Sandbox (cancellato)
Stephen

8
Ohhhh ... questa non è una sfida per poliziotti e ladri; ha più senso.
Magic Octopus Urn l'

L'input è garantito nel formato specificato o possiamo prendere l'input nel formato che vogliamo (come robber acceleration, cop speed, robber positioninvece)?
TehPers,

@TehPers quello che vuoi (coerente ogni volta), ma se stai facendo qualcosa di diverso, dillo nella tua risposta
Stephen

2
Richiesta del test case: 100, 451, 10. (Le risposte non sono tutte d'accordo sul risultato).
Neil,

Risposte:



16

Python 3 , 29 byte

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

Provalo online!

Spiegazione

La posizione del poliziotto al momento tè st.

La posizione del ladro al momento tè a(t)(t+1)/2 + p.

La distanza indicata dal poliziotto al ladro è (a/2)t^2 + (a/2-s)t + p .

Non arriva mai a zero se il discriminante è negativo, l'essere discriminante (a/2 - s)^2 - 4(a/2)(p) = [(a-2s)^2-8ap]/4, che ha lo stesso segno di (a-2s)^2-8ap.


Provalo online! - Porta spudorato a 05AB1E per 9 byte (potresti prenderlo, dato che sto male con la Fisica e probabilmente non potrei fare una spiegazione giusta).
Magic Octopus Urn l'

1
Questo non fallisce nel caso di test "100, 451, 10 -> verità"?
Mark S.

Mi manca qualcosa o dovremmo anche verificare se esiste un numero intero tra le soluzioni dell'equazione quadratica (a/2)t^2 + (a/2-s)t + p = 0 -> 10t^2 - 50t + 61 = 0? Ad esempio, per 60, 61, 20 il ladro si allontana facilmente (le soluzioni di equazione: 2.1 e 2.9 sono entrambe tra 2 e 3).
mackoo13

5

Japt , 13 byte

²/W-V-U<o0W x

Provalo online!

Spiegazione

U, Ve Wsono gli input impliciti. Innanzitutto, Uo0Wcreiamo l'intervallo [0, W, 2 * W, ...] fino a raggiungere U. xquindi somma questo, che indica quanto lontano il ladro viaggia prima di raggiungere la velocità del poliziotto. Chiameremo questo r .

Ora, quanto viaggia il poliziotto in questo periodo? Possiamo calcolare questo usando U * (U // W - 1) , che possono essere disposti (U * U) // W - U . Chiameremo questo c .

Ora per l'ultimo passaggio: il ladro se ne va? Tutto ciò che dobbiamo fare qui è verificare se c <r + V , o riorganizzato, c - V <r .


5

Cubicamente , 61 byte

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

Provalo online! Affinché ciò funzioni in TIO, potrebbe essere necessario sostituirlo &con a &1causa di un bug nell'interprete.

Questa è una porta spudorata della risposta di Leaky Nun . L'input è nella forma a s p, dove si atrova l'accelerazione del ladro, sla velocità del poliziotto e pla posizione del ladro.

Se l'accelerazione è troppo alta, questo fallirà. Non so quanta accelerazione supporterà questo programma, ma so che non è superiore a 1260 . Il fattore limitante è che memorizza l'accelerazione nel cubo e controlla se il cubo è risolto controllando solo se la somma della faccia superiore è 0 (un controllo incompleto). Sembra funzionare per l'accelerazione = 50, ma non ho testato per vedere quanto può arrivare.

Come funziona

$: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
L' 6in %6e *6può essere rimosso come ora possono essere chiamati in modo implicito.
MD XF,


4

Pyke , 14 byte

La risposta di Port of totalmente umana Python . Ritorna 1per la verità e 0per la falsità.

hQee-XQ1@Qe*}<

Provalo qui!


Spiegazione

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 byte

La mia primissima risposta Pyke! La soluzione Port of my Pyth , che si ispira alla presentazione Python di Leaky . Ritorna 1per la verità e 0per la falsità.

eQh}-XQe8*Q1@*<

Provalo qui!


Spiegazione

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

Rubino , 29 27 25 byte

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

Provalo online!

Ottenuto dal 29 al 27 rubando l'idea di moltiplicare entrambe le parti per 4. (Risposta del pitone di Leaky Nun)

Ottenuto da 27 a 25 rimuovendo le parentesi attorno ai parametri lambda (grazie totalmente umano)


2
Benvenuti in PPCG! Si può golf la risposta un po 'rinominando la funzione da hita ho simili. Potresti anche essere in grado di salvare alcuni byte passando da un metodo a un proc, in questo modo:->c,p,a{(c-a*0.5)**2<2*p*a}
Conor O'Brien,

1
È inoltre necessario sostituire collisionnel collegamento TIO con il nome del metodo corretto.
Leaky Nun,

Pssst, guarda il loro nome utente. : P
totalmente umano,

1
Sono abbastanza sicuro che non hai bisogno delle parentesi in giro c,p,a.
totalmente umano l'

2

C # (.NET Core) , 33 byte

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

Provalo online!

Sento che questo è fuori da uno da qualche parte, ma passa per tutti i casi di test, quindi è possibile che semplicemente non ci siano casi di test in cui il poliziotto sorpassa il ladro per un singolo tick, o potrebbe funzionare nonostante le mie riserve.


1

Python 2 , 31 30 29 byte

-1 byte grazie a Mr. Xcoder.

Iniziato come una porta della risposta di Ruby .

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

Provalo online!


1
.5anziché 0.5> _>
Mr. Xcoder l'

Haha, ho pensato che sarebbe stato così tanto port. XD Grazie!
totalmente umano l'

a/2usa la divisione intera, potrebbe andare storto?
itdoesntwork

Usa la divisione intera. Anche se non ho elaborato alcun calcolo matematico (a dire il vero, non sono sicuro di poterlo fare), funziona per tutti i casi di test.
totalmente umano l'

1

Swift 3 , 55 byte

Si noti che ho dichiarato la variabile tperché l'espressione sarebbe troppo complessa per essere risolta in tempi ragionevoli altrimenti (colpa di Swift!).

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

Test Suite.

o 55 byte , equivalente di chiusura esatta (ho bisogno dell'ultima parte perché è un costrutto complesso):

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

Test Suite.

Swift 3 , 57 byte

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

Test Suite.


1

Python 2 , 30 byte

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

Provalo online! Il poliziotto ha delle c/azecche in cui catturare il ladro, dopo di che ha accelerato il poliziotto. Al primo tick il poliziotto guadagna c-ail ladro mentre all'ultimo tick guadagna solo c%a. Quindi il totale che il poliziotto può ottenere è il prodotto del numero di tick e della distanza media per tick. Questo è semplicemente paragonato al vantaggio iniziale che ha il ladro.


1

TI BASIC (serie TI-83/84), 18 byte

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

Ancora un altro porto della influente soluzione Ruby di itdoesntwork .

Esecuzione

L'ordine di input è la velocità della polizia, la posizione del ladro, l'accelerazione del ladro.

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

1

Retina , 79 byte

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

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

Provalo online! Spiegazione:

\d+
$*

Converti input in unario.

$
;

Fai spazio alla velocità del ladro.

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

Accelera il ladro ad ogni passaggio.

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

Allontana il ladro dal poliziotto.

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

Sposta il poliziotto verso il ladro.

.*,,.*

Il poliziotto ha catturato il ladro?

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

Il ladro supera il poliziotto?


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.