Прогнозуйте зіткнення: чи розбійник піде?


20

Подумайте про дорогу як про рядку, починаючи з 0та продовжуючи нескінченно:

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

На дорозі стоять два автомобілі: Cі R. Cтой поліцейський, який намагається зловити R, розбійник. Cпочинається 0, і Rпочинається десь на дорозі:

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

Коп уже рухається - він переслідує грабіжника. Він має постійну швидкість. Розбійник просто вскочив у свою машину. Він прискорюється. З кожним тиком швидкість розбійника збільшується на його прискорення.

Скажіть, швидкість копа є, 7а розбійник - прискорення 1. Якщо грабіжник починається 30, ось так виглядає дорога кожного кліща:

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

Після останнього галочки вище швидкість грабіжника дорівнює копі, і він все ще попереду. Оскільки поліцейський рухається з постійною швидкістю, а грабіжник все-таки прискорюється, грабіжник тікає, тож ви виказуєте значення тривоги. Однак, якби швидкість копа була 9...

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

... тоді поліцейський підхоплює грабіжника до того, як грабіжник може втекти (позначений символом X), тож ви виводите значення фальси.

Ваше завдання

З огляду на три входи - швидкість поліцейського, положення грабіжника та прискорення розбійника - визначають, чи розбійник піде чи ні.

Правила

  • Коп завжди починається 0.
  • Усі вхідні дані будуть цілими додатними.
  • Поліцейський ловить грабіжника, якщо після будь-якого галочки положення поліцейського більше або рівне становищу грабіжника.
  • Грабіжник тікає, коли його ще не спіймали і швидкість його більша, ніж у поліцейських.
  • Ваша програма повинна закінчитися після виходу.
  • Розбійник прискорюється до того, як перемістить кожного кліща.

Випробування

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

Довідкова реалізація Python 3, яка також створює візуальне: Спробуйте в Інтернеті!

Це , тому найкоротша відповідь у байтах виграє.


Пісочниця (видалено)
Стівен

8
Оххх ... це не виклик для поліцейських та грабіжників; це має більше сенсу.
Чарівний восьминіг Урна

Чи гарантовано, що вхід буде в заданому форматі, чи ми можемо брати вхід у будь-якому форматі, який ми хочемо (як robber acceleration, cop speed, robber positionнатомість)?
TehPers

@TehPers все, що ви хочете (послідовно кожен раз), але якщо ви робите щось інше, скажіть це у своїй відповіді
Стівен

2
Запит на тестовий випадок: 100, 451, 10. (Відповіді не всі згодні на результат).
Ніл

Відповіді:



16

Python 3 , 29 байт

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

Спробуйте в Інтернеті!

Пояснення

Положення поліцейського на час tтаке st.

Позиція грабіжника в той час tє a(t)(t+1)/2 + p.

Підписана відстань від поліцейського до грабіжника (a/2)t^2 + (a/2-s)t + p.

Він ніколи не досягає нуля, якщо дискримінант є негативним, дискримінант є (a/2 - s)^2 - 4(a/2)(p) = [(a-2s)^2-8ap]/4, який має такий самий знак, що і (a-2s)^2-8ap.


Спробуйте в Інтернеті! - Безсоромний порт до 05AB1E на 9 байт (ви можете взяти його, як я поганий з фізикою, і, ймовірно, не міг зробити просто пояснення).
Чарівний восьминіг Урна

1
Невже це не підходить для тестового випадку "100, 451, 10 -> триут"?
Марк С.

Я щось пропускаю, чи ми також повинні перевірити, чи є ціле число між рішеннями квадратичного рівняння (a/2)t^2 + (a/2-s)t + p = 0 -> 10t^2 - 50t + 61 = 0? Наприклад, для 60, 61, 20 грабіжник легко втече (рішення рівнянь: 2.1 і 2.9 - і між 2 і 3).
mackoo13

5

Japt , 13 байт

²/W-V-U<o0W x

Перевірте це в Інтернеті!

Пояснення

U, Vта Wє неявними входами. По-перше, Uo0Wми створюємо діапазон [0, W, 2 * W, ...], поки він не досягне U. xпотім підсумовує це, що дає змогу далеко пробіг грабіжника до досягнення швидкості копа. Ми назвемо це r .

Тепер, як далеко в цей час подорожує поліцейський? Ми можемо обчислити це з допомогою U * (U // W - 1) , який може бути змінений на (U * U) // W - U . Ми назвемо це c .

Тепер для останнього кроку: розбійник втікає? Все, що нам потрібно зробити, це перевірити, чи c <r + V , або переставлені, c - V <r .


5

Кубічно , 61 байт

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

Спробуйте в Інтернеті! Для цього , щоб працювати в TIO, вам , можливо , доведеться замінити &з &1з - за помилки в інтерпретаторі.

Це безсоромний портрет відповіді Лікі Нун . Введення знаходиться у формі a s p, де aвідбувається прискорення грабіжника, швидкість sполіцейського та pпозиція грабіжника.

Якщо прискорення буде занадто великим, це вийде з ладу. Я не знаю, яку високу швидкість буде підтримувати ця програма, але я знаю, що вона не вище 1260 . Обмежуючим фактором є те, що він зберігає прискорення в кубі і перевіряє, чи вирішено куб, перевіряючи лише, якщо сума верхньої сторони дорівнює 0 (неповна перевірка). Здається, це працює для прискорення = 50, але я не перевіряв, наскільки це може досягти.

Як це працює

$: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В %6і *6можуть бути видалені , оскільки вони в даний час можна назвати неявно.
MD XF


4

Пайк , 14 байт

Порт абсолютно нелюдської відповіді Python . Повертається 1до правди і 0для помилки .

hQee-XQ1@Qe*}<

Спробуйте тут!


Пояснення

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

Пайк , 15 байт

Моя найперша відповідь Пайка! Порт мого рішення Pyth , який надихається поданням Літі Python . Повертається 1до правди і 0для помилки .

eQh}-XQe8*Q1@*<

Спробуйте тут!


Пояснення

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

Рубі , 29 27 25 байт

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

Спробуйте в Інтернеті!

Отримав від 29 до 27, вкравши ідею множення обох сторін на 4. (відповідь питона Leaky Nun)

Отримав від 27 до 25, видаливши паролі навколо лямбда-параметрів (завдяки абсолютно нелюдському)


2
Ласкаво просимо до PPCG! Ви можете трохи пограти у відповідь, перейменувавши свою функцію hitна hабо подібну. Ви також можете зберегти деякі байти, перейшовши з методу на процедуру, наприклад:->c,p,a{(c-a*0.5)**2<2*p*a}
Конор О'Брайен

1
Вам також потрібно замінити collisionу вашому посиланні TIO правильну назву методу.
Leaky Nun

Pssst, подивіться на їх ім’я користувача. : P
повністюлюдський

1
Я впевнений, що вам не потрібні круглі дужки навколо c,p,a.
повністюлюдсько

2

C # (.NET Core) , 33 байти

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

Спробуйте в Інтернеті!

Я відчуваю, що це десь вимкнене, але це проходить для всіх тестових випадків, тому можливо, що просто немає жодних тестових випадків, коли поліцейський наздогнав грабіжника за одну галочку, або це може просто спрацювати, незважаючи на мої застереження.


1

Пітон 2 , 31 30 29 байт

-1 байт завдяки спадару Xcoder.

Розпочався як порт відповіді Рубі .

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

Спробуйте в Інтернеті!


1
.5замість 0.5> _>
Містер Xcoder

Ха-ха, я думав, що це буде так багато, щоб портувати. XD Спасибі!
повністюлюдський

a/2використовує ціле ділення, чи може це піти не так?
itdoesntwork

Він використовує ціле ділення. Хоча я не працював з математикою (якщо чесно, я не впевнений, що міг би), це працює для всіх тестових випадків.
повністюлюдсько

1

Швидкий 3 , 55 байт

Зауважте, що я оголосив змінну, tтому що вираз буде занадто складним, щоб вирішити його в розумний час інакше (помилка Свіфта!).

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

Тестовий сюїт.

або 55 байт , точний еквівалент закриття (мені потрібна остання частина, тому що це складна конструкція):

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

Тестовий сюїт.

Швидкий 3 , 57 байт

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

Тестовий сюїт.


1

Python 2 , 30 байт

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

Спробуйте в Інтернеті! У поліцейських є c/aкліщі, в яких можна спіймати грабіжника, після чого він вискочив копа. При першій галочці коп набирається c-aна грабіжника, тоді як на останньому тику він тільки набирає c%a. Таким чином, загальна сума, яку може отримати коп, є добуванням кількості кліщів і середньої відстані на одного кліща. Це просто порівняно з початковим результатом розбійника.


1

TI BASIC (серія TI-83/84), 18 байт

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

Ще один порт впливового рішення Ruby на itdoeswork .

Виконання

Порядок введення - швидкість копа, положення грабіжника, прискорення розбійника.

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

1

Сітківка , 79 байт

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

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

Спробуйте в Інтернеті! Пояснення:

\d+
$*

Перетворити вхід в одинаковий.

$
;

Зробіть місце для швидкості грабіжника.

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

Прискорюйте розбійника на кожному проході.

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

Відсуньте грабіжника від копа.

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

Перемістіть поліцейського у бік грабіжника.

.*,,.*

Чи поліцейський зловив грабіжника?

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

Чи грабіжник випереджає копа?


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.