就像路径段;第一次感动


14

给定2个或更多2D笛卡尔点的有序列表,如果路径接触自身或自相交,则输出真实值;否则,如果它不接触自身或不自相交,则输出虚假值。

您可以假定列表中的连续点是不同的。

例子:

(0,0), (1,0) -> falsey
(0,0), (1,0), (0,0) -> truthy
(0,0), (1,0), (1,1), (0,0) -> truthy
(0,0), (2,0), (1,1), (1,-1) -> truthy
(0,0), (10,0), (0,1), (10,1), (0,2), (10,2) -> falsey

请注意,我在此处给出的所有坐标都是整数。您可以支持{整数,小数,有理数,浮点数,...}之外的任意坐标输入。但是您的实现计算必须为给定的任何输入给出正确的答案。


4
好标题A +
地下

初始场景落水狗,任何人吗?
路易斯·门多

如果我有误会,请原谅我,但是最后一个测试用例如何不相交?i.imgur.com/wiNMByd.png
完全

2
@icrieverytim这不是封闭的步行路程。最后一点没有连接到第一点。
HyperNeutrino

Answers:


5

Python 2中315个 309 298 382 380 372字节

s=sorted
w=lambda(x,y),(X,Y),(z,w):(X-x)*(w-y)-(z-x)*(Y-y)
def I(a,b):p,q=s(a);P,Q=s(b);n,N,m,M=w(p,q,P),w(p,q,Q),w(P,Q,p),w(P,Q,q);return(q>=P)*(Q>=p)if{n,N,m,M}=={0}else(b[1]!=a[0])*(n*N<=0>=m*M)
def f(l):
 i=0
 while i<len(l)-2:
	x=l[i:i+3];i+=1
	if w(*x)==0and s(x)==x:l.pop(i);i-=1
 L=zip(l,l[1:]);return any(I(*l)for l in[(k,x)for i,k in enumerate(L)for x in L[:i]])

在线尝试!

使用此处的算法,并将此SO答案与共线段组合在一起。

编辑:修复了(0,0),(1,0),(2,0)通过移除中间点(导致(0,0),(2,0))沿相同方向(例如)连续的线段的问题。


您可以通过使用单个制表符替换两个空格的所有两个出现来节省两个字节。
乔纳森·弗雷奇

*((n*N>0)+(m*M>0)<1)-> *(n*N<=0>=m*M)
乔纳森·弗雷希

3

Eukleides154个 148字节的

number i (set p)
g=card(p);h=g;n=0;e=p[0];q=e.e
for d in p
if h<g-1 
q=q.e
n=card(intersection(d.e,q))>1or d on q?1|n
end
e=d;h=h-1
end;return n;end

名为函数的函数i传递了一组点,返回0或1。分号和换行符可以互换以结束命令,我只是将一些东西放在一起,以使代码看起来很短,因为我们不习惯于易读反正这里的代码。

Eukleides是一种平面几何语言,主要用于图形输出,但也具有不错的编程能力。我认为这对完成这项任务非常有用,但是有些事情使我感到沮丧。首先,值得注意的是,Eukleides中的集合本质上是点的数组,并且在适用时呈现为由连接的线段组成的路径。Eukleides支持通过基因座迭代生成集合,类似于在过程中创建集合的for循环。如果我能够使用一个基因座,它将节省掉字节,但显然Eukleides不喜欢从自身内部引用部分形成的基因座。

另一个主要的挫败感是,如果看似两个相同的线段彼此intersection重叠,则只会返回一个违规点(我想这是有道理的,可能会有无限的交点)。我的方法本质上是在后一步建立路径,然后测试下一条线段是否与路径相交。由于上述相交行为,我将单独检查该点是否路径上。

编辑:通过重新排序or语句以允许在空格之前删除空格来删除1个字节or;通过将该if块更改为三元操作,可以再增加5个字节。

测试用例:

ta=point(0,0).point(1,0)
tb=point(0,0).point(1,0).point(0,0)
tc=point(0,0).point(1,0).point(1,1).point(0,0)
td=point(0,0).point(2,0).point(1,1).point(1,-1)
te=point(0,0).point(10,0).point(0,1).point(10,1).point(0,2).point(10,2)
print i(ta);print i(tb);print i(tc);print i(td);print i(te)

0
1
1
1
0
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.