预测碰撞:强盗会逃脱吗?


20

将一条道路视为一条数字线,从起点开始0并无限期地延伸:

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

路上有两辆车:CRC是试图抓住的警察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
哦,这不是警察和强盗的挑战;这更有意义。
魔术八达通Ur

输入是否保证为给定格式,或者我们可以采用所需的任何格式输入(例如robber acceleration, cop speed, robber position)?
TehPers

@TehPers任何您想要的(每次都一致),但是如果您要执行其他操作,请在答案中说这句话
Stephen

2
测试用例要求:100、451、10。(答案并不完全相同)。
尼尔

Answers:



16

Python 3,29个字节

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

在线尝试!

说明

当时警察的位置tst

强盗当时的位置ta(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


在线尝试!-9AB的05AB1E的无耻端口(您可能会接受,因为我对Physics不满意,可能无法做一个公正的解释)。
魔术章

1
对于“ 100、451、10->真实”测试用例,这是否会失败?
Mark S.

我是否缺少某些东西,还是应该检查二次方程的解之间是否存在整数(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

在线测试!

说明

UVW是隐式输入。首先,Uo0W我们创建范围[0,W,2 * W,...]直到达到Ux然后将其相加,得出强盗在达到警察速度之前要走多远。我们称这个[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由于解释器中的错误,您可能需要用替换为。

这是Leaky Nun的回答的无耻之。输入形式为a s pa是强盗的加速度,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

派克(Pyke),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

派克(Pyke),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

Ruby29 27 25字节

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

在线尝试!

通过窃取将双方都乘以4的想法从29岁上升到27岁。(漏水尼姑的python答案)

通过删除lambda参数周围的括号从27变为25(完全感谢人类)


2
欢迎来到PPCG!您可以通过将功能从重命名hith或类似名称来稍微了解一下答案。您也可以通过从方法更改为proc来节省一些字节,如下所示:->c,p,a{(c-a*0.5)**2<2*p*a}
Conor O'Brien

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

Python 2中31 30 29个字节

-1个字节感谢Xcoder先生。

最初是作为Ruby答案的端口。

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

在线尝试!


1
.5而不是0.5> _>
Xcoder先生17年

哈哈,我想这应该足够多了。XD谢谢!
完全人类

a/2使用整数除法,这会出错吗?
itdoesntwork

它确实使用整数除法。尽管我还没有计算出任何数学(说实话,我不确定我能做到),但它适用于所有测试用例。
完全人类

1

Swift 3,55个字节

请注意,我声明了变量t是因为表达式太复杂而无法在合理的时间内解决(Swift的错!)。

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。因此,警察可获得的总收益是tick的数量与每tick的平均距离的乘积。这可以简单地与强盗最初的领先优势进行比较。


1

TI BASIC(TI-83 / 84系列),18 字节

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

itdoesntwork有影响力的Ruby解决方案的又一个端口。

执行

输入顺序为警察速度,强盗位置,强盗加速度。

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

强盗会比警察快吗?


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.