Предсказание столкновения: уйдет ли грабитель?


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затем суммирует это, которое показывает, как далеко ходит грабитель до достижения скорости полицейского. Мы будем называть это р .

Теперь, как далеко коп проходит в это время? Мы можем вычислить это с помощью U * (U // W - 1) , который может быть изменен на (U * U) // W - U . Мы назовем это с .

Теперь для последнего шага: грабитель уходит? Все, что нам нужно сделать здесь, это проверить, если 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-решения , навеянный представлением Leaky's 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. (Ответ Питона Нун на Python)

Получил от 27 до 25, удалив символы вокруг параметров лямбда (спасибо, полностью человек)


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

1
Вы также должны заменить collisionв своей ссылке TIO правильное имя метода.
Утренняя монахиня

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

Python 2 , 31 30 29 байт

-1 байт благодаря мистеру Xcoder.

Начал как порт ответ Ruby .

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

Попробуйте онлайн!


1
.5вместо 0.5> _>
г-н Xcoder

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

a/2использует целочисленное деление, это может пойти не так?
itdoesntwork

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

1

Swift 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

Тестирование.

Swift 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 от itdoesntwork .

выполнение

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

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.