Predict a Collision: Akankah perampok melarikan diri?


20

Pikirkan jalan sebagai garis bilangan, mulai dari 0dan berlanjut tanpa batas:

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

Ada dua mobil di jalan: Cdan R. Cadalah polisi yang berusaha menangkap R, perampok. Cdimulai pada 0, dan Rmulai di suatu tempat di jalan:

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

Polisi sudah bergerak - dia mengejar perampok. Ia memiliki kecepatan konstan. Perampok itu baru saja melompat ke mobilnya. Dia mempercepat. Setiap centang, kecepatan perampok meningkat dengan akselerasinya.

Katakanlah kecepatan polisi 7dan akselerasi perampok 1. Jika perampok mulai 30, inilah jalan yang akan terlihat seperti setiap centang:

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

Setelah kutu terakhir di atas, kecepatan perampok sama dengan polisi, dan dia masih di depan. Karena polisi bergerak dengan kecepatan konstan dan perampok masih melaju, perampok melarikan diri, sehingga Anda menghasilkan nilai yang benar. Namun, jika kecepatan polisi telah 9...

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

... lalu polisi menangkap perampok sebelum perampok dapat pergi (ditandai oleh X), sehingga Anda menghasilkan nilai falsey.

Tugas Anda

Diberikan tiga input - kecepatan polisi, posisi perampok, dan percepatan perampok - menentukan apakah perampok akan pergi atau tidak.

Aturan

  • Polisi selalu mulai 0.
  • Semua input akan menjadi bilangan bulat positif.
  • Polisi menangkap perampok jika, setelah kutu apa pun, posisi polisi lebih besar atau sama dengan posisi perampok.
  • Perampok itu melarikan diri ketika dia belum ditangkap dan kecepatannya lebih besar dari polisi.
  • Program Anda harus berakhir setelah output.
  • Perampok berakselerasi sebelum dia menggerakkan setiap centang.

Uji Kasus

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

Referensi implementasi Python 3 yang menciptakan visual juga: Coba online!

Ini adalah , jadi jawaban tersingkat dalam byte menang.


Sandbox (dihapus)
Stephen

8
Ohhhh ... ini bukan tantangan polisi dan perampok; itu lebih masuk akal.
Magic Gurita Guci

Apakah input dijamin dalam format yang diberikan, atau bisakah kita mengambil input dalam format apa pun yang kita inginkan (seperti robber acceleration, cop speed, robber positionsebaliknya)?
TehPers

@TehPers apa pun yang Anda inginkan (konsisten setiap kali), tetapi jika Anda melakukan sesuatu yang berbeda katakan demikian dalam jawaban Anda
Stephen

2
Permintaan uji kasus: 100, 451, 10. (Jawabannya tidak semuanya setuju dengan hasilnya).
Neil

Jawaban:



16

Python 3 , 29 byte

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

Cobalah online!

Penjelasan

Posisi polisi saat itu tadalah st.

Posisi perampok pada saat itu tadalah a(t)(t+1)/2 + p.

Jarak yang ditandatangani dari polisi ke perampok adalah (a/2)t^2 + (a/2-s)t + p.

Tidak pernah mencapai nol jika diskriminan negatif, makhluk diskriminan (a/2 - s)^2 - 4(a/2)(p) = [(a-2s)^2-8ap]/4, yang memiliki tanda sama dengan(a-2s)^2-8ap .


Cobalah online! - Port tanpa malu-malu ke 05AB1E selama 9-byte (Anda dapat mengambilnya, karena saya buruk dengan Fisika, dan mungkin tidak bisa melakukan penjelasan yang adil).
Magic Gurita Guci

1
Bukankah ini gagal untuk test case "100, 451, 10 -> truthy"?
Mark S.

Apakah saya kehilangan sesuatu, atau haruskah kita juga memeriksa apakah ada bilangan bulat antara solusi persamaan kuadratik (a/2)t^2 + (a/2-s)t + p = 0 -> 10t^2 - 50t + 61 = 0? Sebagai contoh, untuk 60, 61, 20 perampok dengan mudah lolos (solusi persamaan: 2.1 dan 2.9 keduanya antara 2 dan 3).
mackoo13

5

Japt , 13 byte

²/W-V-U<o0W x

Uji secara online!

Penjelasan

U,, Vdan Wmerupakan input implisit. Pertama, dengan Uo0Wkita membuat kisaran [0, W, 2 * W, ...] hingga mencapai U. xkemudian menjumlahkan ini, yang memberikan seberapa jauh perjalanan perampok sebelum mencapai kecepatan polisi. Kami akan menyebutnya r .

Sekarang, sejauh apa perjalanan polisi saat ini? Kita dapat menghitung ini menggunakan U * (U // W - 1) , yang dapat disusun kembali ke (U * U) // W - U . Kami akan menyebutnya c .

Sekarang untuk langkah terakhir: apakah perampok itu pergi? Yang perlu kita lakukan di sini adalah memeriksa apakah c <r + V , atau disusun ulang, c - V <r .


5

Secara kubik , 61 byte

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

Cobalah online! Agar ini berfungsi di TIO, Anda mungkin perlu mengganti &dengan &1karena bug pada juru bahasa.

Ini adalah pelabuhan jawaban Leaky Nun yang tak tahu malu . Input dalam bentuk a s p, di mana aakselerasi perampok, sadalah kecepatan polisi, dan pposisi perampok.

Jika akselerasi terlalu tinggi, ini akan gagal. Saya tidak tahu seberapa tinggi akselerasi yang akan didukung oleh program ini, tetapi saya tahu itu tidak lebih tinggi dari 1260 . Faktor pembatas adalah bahwa ia menyimpan akselerasi dalam kubus dan memeriksa apakah kubus diselesaikan dengan memeriksa hanya jika jumlah permukaan atas adalah 0 (cek tidak lengkap). Tampaknya bekerja untuk akselerasi = 50, tapi saya belum menguji untuk melihat seberapa tinggi itu bisa didapat.

Bagaimana itu bekerja

$: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
The 6dalam %6dan *6dapat dihapus karena mereka sekarang bisa disebut secara implisit.
MD XF

4

Pyth , 11 byte

Ini mengambil mereka dalam urutan ini: Robber Acceleration, Cop Speed, Robber Positiondipisahkan oleh baris baru (seperti yang ditunjukkan dalam paket uji).

<^-QyE2*8*E

Test Suite atau Coba online!


4

Pyke , 14 byte

Port jawaban Python yang benar-benar manusiawi . Pengembalian 1untuk kebenaran dan 0kepalsuan.

hQee-XQ1@Qe*}<

Coba di sini!


Penjelasan

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

Jawaban Pyke pertamaku! Solusi Port of Pyth saya , yang terinspirasi oleh pengiriman Python Leaky . Pengembalian 1untuk kebenaran dan 0kepalsuan.

eQh}-XQe8*Q1@*<

Coba di sini!


Penjelasan

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

Ruby , 29 27 25 byte

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

Cobalah online!

Dapatkan dari 29 hingga 27 dengan mencuri ide mengalikan kedua belah pihak dengan 4. (jawaban python Leaky Nun)

Dapatkan dari 27 hingga 25 dengan menghapus parens di sekitar parameter lambda (terima kasih sepenuhnya manusia)


2
Selamat datang di PPCG! Anda dapat sedikit golf jawaban Anda dengan mengubah nama fungsi Anda dari hitke hatau serupa. Anda juga dapat menyimpan beberapa byte dengan mengubah dari metode ke proc, seperti:->c,p,a{(c-a*0.5)**2<2*p*a}
Conor O'Brien

1
Anda juga perlu mengganti collisiontautan TIO Anda dengan nama metode yang benar.
Leaky Nun

Pssst, lihat nama pengguna mereka. : P
totallyhuman

1
Saya cukup yakin Anda tidak perlu tanda kurung di sekitar c,p,a.
totallyhuman

2

C # (.NET Core) , 33 byte

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

Cobalah online!

Saya merasa ini tidak aktif oleh satu orang di suatu tempat, tetapi ini berlaku untuk semua kasus uji sehingga mungkin saja tidak ada kasus uji di mana polisi menyalip perampok untuk satu tik, atau mungkin hanya bekerja meskipun ada reservasi saya.


1

Python 2 , 31 30 29 byte

-1 byte terima kasih kepada Tn. Xcoder.

Dimulai sebagai port jawaban Ruby .

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

Cobalah online!


1
.5bukannya 0.5> _>
Tn. Xcoder

Haha, saya pikir itu akan terlalu banyak untuk port. XD Terima kasih!
totallyhuman

a/2menggunakan pembagian integer, bisakah ini salah?
itdoesntwork

Itu menggunakan divisi integer. Meskipun saya belum mengerjakan matematika apa pun (sejujurnya, saya tidak yakin saya bisa), itu bekerja untuk semua kasus uji.
totallyhuman

1

Swift 3 , 55 byte

Perhatikan bahwa saya mendeklarasikan variabel tkarena ekspresi akan terlalu rumit untuk dipecahkan dalam waktu yang wajar jika tidak (kesalahan Swift!).

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

Test Suite.

atau 55 byte , ekuivalen penutupan persis (saya perlu bagian terakhir karena ini adalah konstruksi yang kompleks):

{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

Cobalah online! Polisi memiliki c/akutu untuk menangkap perampok, setelah itu mempercepat polisi. Pada centang pertama, polisi mendapatkan c-aperampok sementara pada centang terakhir ia hanya mendapatkan c%a. Dengan demikian total yang bisa diperoleh polisi adalah produk dari jumlah kutu dan jarak rata-rata per kutu. Ini hanya dibandingkan dengan petunjuk awal yang dimiliki oleh perampok.


1

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

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

Namun port lain dari solusi Ruby berpengaruh itdoesntwork .

Eksekusi

Urutan input adalah kecepatan polisi, posisi perampok, akselerasi perampok.

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

Cobalah online! Penjelasan:

\d+
$*

Konversikan input ke unary.

$
;

Berikan ruang untuk kecepatan perampok.

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

Percepat perampok di setiap kartu.

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

Jauhkan perampok dari polisi.

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

Pindahkan polisi ke arah perampok.

.*,,.*

Apakah polisi menangkap perampok?

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

Apakah perampok itu mempercepat polisi?


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.