В этой задаче ваша задача состоит в том, чтобы построить неориентированный граф из последовательности директив. Существует одна директива для каждого неотрицательного целого числа, и каждая преобразует данный граф в новый.
- Директива
0
: Добавить новый отключенный узел. - Директива
1
: Добавьте новый узел и подключите его к каждому существующему узлу. - Директива
m > 1
: Удалите все узлы, чья степень (количество соседей) делится наm
. Обратите внимание, что0
это делится на всеm
, поэтому отключенные узлы всегда удаляются.
Директивы применяются одна за другой слева направо, начиная с пустого графа. Например, последовательность [0,1,0,1,0,1,3]
обрабатывается следующим образом, объясненный с использованием удивительной ASCII-графики. Мы начинаем с пустого графа и добавляем одну вершину в соответствии с 0
:
a
Затем добавьте еще одну вершину и соедините ее с первой, как указано 1
:
a--b
Мы добавляем другую несвязанную вершину, а затем соединенную, как указано 0
и 1
:
a--b c
\ \ /
`--d
Мы повторяем это еще раз, как указано 0
и 1
:
,--f--e
/ /|\
a--b | c
\ \|/
`--d
Наконец, мы удаляем вершины степени 3 a
и b
, как указано 3
:
f--e
|\
| c
|/
d
Это график, определенный последовательностью [0,1,0,1,0,1,3]
.
вход
Список неотрицательных целых чисел, представляющих последовательность директив.
Выход
Количество узлов в графе определяется последовательностью.
Контрольные примеры
[] -> 0
[5] -> 0
[0,0,0,11] -> 0
[0,1,0,1,0,1,3] -> 4
[0,0,0,1,1,1] -> 6
[0,0,1,1,0,0,1,1,2,5,7,0,1] -> 6
[0,0,1,1,1,1,5,1,4,3,1,0,0,0,1,2] -> 6
[0,0,1,1,0,0,1,1,5,2,3,0,0,1,1,0,0,1,1,3,4,0,0,1,1,2,1,1] -> 8
[0,0,1,1,0,0,1,1,2,5,7,0,1,1,1,1,1,0,1,1,1,1,1,1,1,1,8] -> 14
Подробные правила
Вы можете написать функцию или полную программу. Победит самый короткий счетчик байтов. Стандартные лазейки запрещены. Пожалуйста, объясните свой алгоритм в вашем ответе.
Прошла неделя, поэтому я принял кратчайший ответ. Если позже появится еще более короткий вариант, я обновлю свой выбор. Похвальное упоминание относится к ответу Питера Тейлора , на котором основывалось несколько других, включая победителя.
источник
Ответы:
Пиф ,
3731В этом решении используется функция lower (
u
) для создания списка, где каждая запись соответствует узлу, остающемуся в списке, а значение записи соответствует тому, был ли узел первоначально добавлен в соответствии с директивой 0 или 1.G
является переменной-накопителем в функции Reduce и содержит вышеупомянутый список. Инициализируется в пустой список,Y
.H
принимает значение каждого членаQ
, вход, один за другим. Результат выражения присваиваетсяG
каждому разу, а следующая записьQ
присваиваетсяH
, и выражение перезапускается.Обновлять
G
правильного есть две возможности: одна для директивы 0 или 1, а другая для других директив. Эти дела отличают троичные? ... <H2 ...
Если
H
это 0 или 1, то все , что нам нужно сделать , это AppendH
кG
.+GH
выполняет это.В противном случае, первое, что нужно, это определить для каждого узла в графе, сколько у него соседей. Это выполняется в два этапа:
Сначала
s>GT
подсчитывается количество узлов в или после входного узла, равное 1 с. Все они связаны с входным узлом, за исключением того, что мы будем считать более 1, если входным узлом является 1.Во-вторых, нам нужно количество узлов, которые раньше, чем входной узел, который подключен к нему. Это 0, если входной узел равен 0, и индекс входного узла
T
, если входной узел равен 1. Это значение будет задано как*@GTT
. Тем не менее, в первом разделе все еще есть перерасчет, который необходимо исправить. Таким образом,*@GTtT
вместо этого мы вычисляем , что на 1 меньше, если входной узел равен 1. Эти значения суммируются, чтобы получить количество узлов, подключенных к входному узлу.% ... H
даст 0, если число делится наH
, и поэтому должно быть удалено, и не даст 0 в противном случае.f ... UG
будет, таким образом, давать индексы входных данных, которые не должны быть удалены, посколькуf
это фильтр, а 0 - ложь.m@Gd
преобразует эти индексы в 0 и 1 соответствующих узлов.Наконец, как только найден результирующий список узлов с метками 0 и 1, его длина вычисляется (
l
) и печатается (неявно).Широкая идея благодаря @PeterTaylor.
источник
GolfScript (53 байта)
Онлайн демо
На самом деле я еще не играл в гольф, но обнаружил, что устранить переменные
H
иT
переменные не очень легко, так что это может быть локальным минимумом.Принимает ввод на стандартный ввод в формате
[0 1 2 3]
. Оставляет вывод на стандартный вывод.Ungolfed:
источник
CJam,
129 75 73 68 61 4642 байтаРешение на основе алгоритма Питера:
Расширение кода, чтобы следовать.
Предыдущее решение (61 байт):
Принимает участие от STDIN, как:
Вывод числа на STDOUT:
Алгоритм :
U
которой хранится идентификатор добавляемого узла.0
, добавьте[U]
в список список1
, добавьтеU
к каждому списку в списке список и добавьте еще один список, состоящий из первого элемента каждого списка списка иU
length - 1
делимые на,m
и продолжаю отмечать первый элемент этих списков. После фильтрации я удаляю все удаленные идентификаторы из оставшегося списка идентификаторов.Расширение кода :
Попробуй здесь
источник
Pyth,
888075 символовЯ задолбался. Может быть, у кого-то еще есть советы по игре в гольф.
Y
список смежности графа По причинам, связанным с игрой в гольф, я также сохраняю узел в этом списке, даже после того, как узел был удален (в противном случае мне пришлось бы обновить все индексы). Каждый узел имеет себя в качестве соседа. СписокJ
отслеживает удаленные узлы.Я показываю изменения списка смежности на примере ввода
[0,1,0,1,0,1,3]
:Алгоритм тогда довольно прост: переберите все входные данные, если input == 0: добавьте новый узел с самим собой в качестве соседа, если input == 1: добавьте новый узел со всеми узлами в качестве соседей (также удаленных) и добавьте этот узел к списку смежности всех узлов, если input> 1: определите узлы с помощью # neighbour-1% input == 0 и добавьте их, чтобы
J
в каждом случае обновлять соседей каждого узла, используяJ
. В конце выведите длинуY
минус длина (набор)J
.использование
Просто вызовите скрипт и передайте в качестве входных данных
[0,1,0,1,0,1,3]
или другой тестовый пример.источник
APL,
716555 символов{⍬≡⍺:≢⍵⋄r←1↓⍺⋄1<c←⊃⍺:r∇i⌿⍵/⍨i←0≠c|+/⍵⋄c:r∇∨⌿↑a(⍉a←⍵,1)⋄r∇0,0⍪⍵}∘(0 0⍴0)
{⍺←0 0⍴0⋄⍬≡⍵:≢⍺⋄(⍺{1<⍵:i⌿⍺/⍨i←×⍵|+/⍺⋄⍵:-⌿↑(1,1⍪⍺)1⋄0,0⍪⍺}⊃⍵)∇1↓⍵}
{g←0 0⍴0⋄(≢g)⊣{1<⍵:g⌿⍨←g/⍨←×⍵|+/g⋄(⊃g)-←g⍪⍨←g,⍨←⍵}¨2,⍵}
Граф представлен в виде булевой матрицы смежности. Строки / столбцы добавляются и удаляются по мере необходимости.
источник
Python 2, 296
Каждому узлу присваивается уникальный идентификатор, а идентификаторы соседей каждого узла записываются. Когда директива равна 0, для нового узла добавляется пустой список соседей. Когда директива равна 1, идентификаторы всех существующих узлов становятся списком соседей для нового узла, и все остальные списки соседей обновляются, чтобы включить новый идентификатор узла. При m> 1 узлы со списками соседей, кратными m, удаляются из списка узлов и всех списков соседей. Спасибо @Optimizer за обнаружение ошибки в более ранней версии.
источник
НетЛого, 160
Реализация проста: чтение каждого символа и выполнение соответствующих действий.
Вы можете запустить из командной строки как
f[0 0 1 1 0 0 1 1 2 5 7 0 1]
.источник
Рубин
159157 ( демо )Это определяет функцию, вызываемую
G
с использованием синтаксиса stabby-lambda. ИспользуйтеG[[0, 1]]
для вызова с помощью команд0
и1
.Реализация довольно проста: есть
Node
структура (называемаяN
выше), которая содержит ссылки на все связанные узлы черезl
свойство.G
создает узлы по мере необходимости и манипулирует их ссылками. Читаемая версия доступна здесь .источник
CJam,
9997 байтВ этом еще есть что поиграть в гольф. Алгоритм основан на отслеживании матрицы смежности, но представление пустой матрицы без особого обращения с ней вызывает у меня головную боль.
Проверьте это здесь.
Ввод - это массив в стиле CJam:
Вы можете использовать этот тестовый комплект для запуска всех тестов:
источник
Python 2, 174
Это, вероятно, еще можно много играть в гольф.
Я использовал словарь
g
для представления графика. Узлы помечены номерами, и они отображаются на множество смежных узлов. Это означает, что каждое обновление ребра должно выполняться на обеих его конечных точках.Свежие индексы узлов создаются путем подсчета
n
. Каждый раз я создаю новый пустой узелn
. Для команды0
это просто остается. По команде1
он подключен друг к другу через узелg[i]^={n};g[n]^={i}
; используя xor, сделайте так, чтобы узел не был связан с самим собой. Для команд> 1 он сразу удаляется.Фильтрация узлов, степень которых кратна, выполняется сначала путем нахождения узлов, которые остаются с (
h
), а затемand
со списком узлов и соседей каждого узла.Наконец, количество записей в графическом словаре является ответом.
источник
Mathematica, 223 байта
Вау, это оказалось дольше, чем я ожидал.
Использование:
Вот результаты тестовых случаев:
Меньше гольфа:
Это работает путем представления графа в виде списка «списков соседей».
Для директивы 0 я просто добавляю пустой список.
Для директивы 1 я добавляю список всех предыдущих узлов и добавляю новый узел ко всем предыдущим узлам.
Для директивы > 1 я удалил указанные узлы и обновил остальные.
источник