国王可以抓卒吗?


26

给定输入四个整数x 1y 1x 2y 2,输出是否象棋中的白国王(坐标为(x 1y 1))可以捕获黑棋子(坐标为(x 2y)2))并捕获,如果典当正在移动以尽快提升为女王。

单板的坐标如下:

       first coordinate (x)
             12345678

           1 .#.#.#.#
           2 #.#.#.#.
           3 .#.#.#.#
  second   4 #.#.#.#.
coordinate 5 .#.#.#.#
    (y)    6 #.#.#.#.
           7 .#.#.#.#
           8 #.#.#.#.

假设移动是白色的(国王的回合),并且两个玩家都发挥了最佳状态(国王将尽可能快地移动以抓住棋子,并且棋子将尽可能快地移动以提升)。输入坐标将始终是不同的,并且棋子将永远不会以y坐标8开头。

国王每转一圈可向任何方向移动一个正方形(它可以对角移动),并且棋子只能向前移动一个空间(减小其y坐标),除非它处于其初始位置(使用我们的坐标系y坐标) 7),在这种情况下,它可以向前移动两个空间。

输入可以以空格/逗号分隔的字符串,字符串/整数的数组或四个函数/命令行/ etc参数的形式给出。可以按照最方便/最容易使用的顺序给出坐标(因此,只要一致,就可以接受[y 2,y 1,x 1,y 1,y 2 ]作为输入)。输出必须是真实值或虚假值

由于这是,因此以字节为单位的最短代码为准。

真实的测试案例

5 3 3 2

6 1 1 7

3 3 3 2

4 1 4 7

7 7 1 7

1 8 1 7

虚假的测试案例

6 4 3 2

8 8 1 7

3 4 3 2


我们可以选择坐标的顺序还是必须选择坐标的顺序x1 y1 x2 y2
丹尼斯,

11
我建议使用测试用例1 8 1 7,国王在棋子可以移动两个空间之前占领它。我认为现在所有的答案都弄错了。这种情况使问题变得更加困难。
xnor

1
@Neil,因为到数字的转换只是无聊的,什么也没添加
-edc65

1
@Neil这里已经有很多涉及代数符号的帖子,我想重点关注实际挑战。
门把手

2
@kaine除非国王不能接受它,否则它不会对国王构成重大威胁。国王不必采取任何行动,因为总是可以采取同样好的行动。
尼尔

Answers:


3

果冻,33 字节

‘»Ɠ_2<®
Ɠ©<7
:5+Ɠ>7$¤<1.4
Ɠ_ƓA2£Ŀ

该程序x2\nx1\ny2\ny1从STDIN 读取坐标。在线尝试!

非竞争版本

不幸的是,发布此问题时,果冻口译员遇到了一个错误。该错误阻止了它接受两个以上的命令行参数。最新版本的Jelly可以用23个字节解决给定的任务。

⁶>7×5
_A+⁵>6$¤+¢’»⁶_2<⁵

在线尝试!


18

蟒蛇2,53 40

lambda x,y,p,q:y-2<q>=abs(x-p)+q/7+y/8*5

国王有座标(x, y)和典当(p, q)

有三种重要情况:

  1. 典当在7级,国王在8级。要捕获典当,国王必须在同一文件中或相邻文件中。

    结果: q = 7 ⋀ y = 8 → |x - p| ≤ 1

  2. 该棋子在等级7上。要捕获该棋子,国王必须在6个文件之内。

    结果: q = 7 → |x - p| ≤ 6

  3. 棋子的等级较低。要捕获棋子,国王必须能够在棋子之后最多一步到达升级广场。

    结果: q < 7 → |x - p| ≤ q ⋀ y - 1 ≤ q

我的解决方案就是解决这些问题。希望这次没有错误。


2
如何削减abswith max(y-1,x-p,p-x)
xnor

不应该f(1,8,1,7)True因为国王立即抓住了棋子?我认为有一个微妙的地方,如果国王立即俘获,典当行7不能被视为行6。
xnor

@xnor我认为它现已修复(以打高尔夫球的方式)。
grc

1
如果颠倒了最后一个条件,你可以删除之间的空间or-2
xsot

@xsot感谢您的提示。我已经改变了方法,现在又多了一点。
grc

2

Prolog,48个 42字节

码:

p(X,Y,P,Q):-Y-2<Q,Q>=abs(X-P)+Q//7+Y//8*5.

例子:

p(1,8,1,7).
true

p(3,4,3,2).
false

与大多数相比,对于Prolog来说,这不是一个坏挑战。

编辑:切换到grc的Python 2 answer中使用的公式,节省了6个字节。
不幸的是,Prolog不能像python那样链接比较,并且整数除法比浮点除法长1个字节。

在这里在线尝试


0

JavaScript(ES6),52

(x,y,u,t,d=x>u?x-u:u-x)=>(d>=y?d:y-1)<=(d<2|t<7?t:6)

我希望不使用Math.abs,Math.min,Math.max保存字节

当且仅当国王不在近列中时,第七行的棋子才能逃脱2个空格,这就是为什么d在将7替换为6之前先进行检查的原因。

要在控制台中运行的测试用例:

;[f(5,3,3,2),f(6,1,1,7),f(3,3,3,2),f(1,8,1,7),f(6,4,3,2),f(8,8,1,7),f(3,4,3,2)]

结果: [true, true, true, true, false, false, false]


0

Ruby,50个字节

def f(a,b,c,d)(a-c).abs<=(d==7?6-b/8*5:d)&&b-d<2;end

参数是(整数x,国王y,典当x,典当y),所有整数。

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.