Еклеїди , 154 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 підтримує ітераційне генерування наборів за допомогою локусів, схожих на цикл for, який створює набір у процесі. Якби я міг використати локус, він би відголив байти, але, мабуть, Еклеїди не люблять посилатися на частково сформований локус всередині себе.
Інша велика розчарування полягала в тому, що якщо, здавалося б, два однакових відрізка ліній розташовуються один над одним, intersection
повертається лише одна точка образи (що, мабуть, має сенс, було б нескінченне перехрестя). Мій метод полягає в тому, щоб побудувати шлях на один крок позаду і протестувати наступний відрізок рядка на перетини шляху. Через вищезгадану поведінку перехрестя я окремо перевіряю, чи є точка на шляху.
Редагувати : відріжте 1 байт, упорядкувавши or
оператор, щоб дозволити вилучення пробілу раніше or
; Ще 5 байт, змінивши цей if
блок на потрійну операцію.
Тестові приклади:
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