Обратите внимание, что этот вопрос в первую очередь касается структур данных.
Введение
Bacefook хочет, чтобы люди были дружелюбнее! Таким образом, они внедряют новую систему, чтобы предложить друзьям! Ваша задача - помочь Bacefook внедрить их новую систему предложений.
Характеристики:
Ваша программа должна быть REPL (цикл чтения Eval-печати) поддерживает 3 типа команд: FRIEND
, SUGGEST
и KNOW
.
FRIEND X Y
- Указывает, что X
и Y
есть друзья в социальной сети.
Если X дружит с Y, то Y дружит с X
Может, но не должен иметь выход
Х всегда дружит с Х
KNOW X Y
- Выведите истинное значение, если X и Y - друзья, иначе - ложь
KNOW X X
всегда будет выводить истинное значение
SUGGEST X Y
- Выведите истинное значение, если X и Y должны быть друзьями, иначе ложно. X и Y должны быть друзьями, если:
X и Y не друзья
У X и Y есть как минимум 1 общий друг
Вы имеете право на замену FRIEND
, SUGGEST
и KNOW
с вашими собственными строками, но вы должны отметить , что строка , которую вы заменили каждую команду с.
Ваша программа может принимать ввод-вывод любым желаемым способом, при условии, что это довольно легко понять, как она работает.
Число людей в социальной сети N
составляет от 1 до 100 000, но может быть любое количество «дружеских ссылок» (ребер).
Если вы еще не заметили, это проблема поиска графика. (Вероятно) самая простая (и, возможно, самая быстрая) структура данных для реализации этого - матрица смежности.
Контрольные примеры
FRIEND A B
FRIEND A C
FRIEND B D
SUGGEST A B -> Falsy, as they are friends
SUGGEST A D -> Truthy, as they share B as a common friend
SUGGEST C D -> Falsy, they do not share a common friend
KNOW D B -> Truthy, they are friends
KNOW B C -> Falsy, not friends
=============
FRIEND Tom Tim
KNOW Tom Tim -> Truthy
KNOW Tim Tom -> Truthy
KNOW Tom Kit -> Falsy
=============
KNOW Tim Kit -> Falsy
FRIEND Tim Tom
KNOW Tim Kit -> Falsy
FRIEND Tom Kit
SUGGEST Tim Kit -> Truthy
=============
FRIEND X Y
SUGGEST X Y -> Falsy since X is friends with X
Вот еще несколько тестов в форме изображения
Условие выигрыша
Это код-гольф , самый короткий код выигрывает!
{A, B, C, D}
?SUGGEST UK EU
,Ответы:
SWI-Пролог,
624741 байтПролог не слишком полезен, но когда это просто, это красиво. Мы будем использовать ,
a+b
чтобы фиксировать , чтоa
дружит сb
,a*b
чтоa
знает ,b
иa?b
чтоb
должно быть предложеноa
или нет. Первая строка просто говорит, чтоX*Y
это правда, если либоX+Y
,Y+X
либоX == Y
это правда. Это реализует симметрию знания друг друга. Спрашивать, должно ли быть предложение, невероятно просто. Мы просто спрашиваем, есть лиZ
такое, чтоX*Y
является ложнымX*Z
иY*Z
является ли это правдой. Точно так же, как описано в задаче.Если вы сохраните это как файл (например
friends.pl
) и откроете SWI-Prolog с этим файлом (prolog -l friends.pl
), вы попадете в REPL.Вы можете утверждать дружбу, как это:
Вы можете проверить, знают ли люди друг друга, или следует сделать предложение:
источник
k(X,Y)
сX*Y
и то же самое сf
иs
использованием различных операндов. 21 байт, если я посчитал правильно.f
.PHP,
138 133129 байтPHP побеждает Mathematica - редкий случай.
печатает
1
для правдивых, пустая строка для ложных. Запустите-nr
или протестируйте его онлайн .нужен PHP 7.1 для назначения списка; Имена пользователей чувствительны к регистру и должны исключать
a
,b
,s
.сломать
$s
должен быть обрезан, потому что он включает символ новой строки.array_intersect_key
должен быть отключен, иначе он выдаст предупреждения для пустых$$a
или$$b
.+18+15 байт для всех имен пользователей: заменить$$a
на$f[$a]
и$$b
на$f[$b]
.источник
CMD (пакетная обработка), 50 + 20 + 135 = 205 байт
FRIEND.CMD
KNOW.CMD
Принты
1
для друзей, пустая строка для незнакомцев.SUGGEST.CMD
Отпечатки
1
или пустая строка. Я думаю, что шесть последовательных%
сек могут быть новым личным лучшим.источник
Python 3,
122118 + 2 = 120 байтИспользование в точности соответствует ответу ovs.
источник
Python 3
163149143 + 2 = 145 байт-6 байт благодаря @FelipeNardiBatista
Сохраните его в файл и запустите его как
python3 -i file.py
Использовать
-
f("a", "b")
вместоFRIENDS a b
-
k("a", "b")
вместоKNOW a b
-
s("a", "b")
вместоSUGGEST a b
Вывод Falsey: 0, set (),
вывод False Truthy: непустой набор, True
Попробуйте онлайн
164 байта, когда не используется интерпретатор Python в качестве REPL:
Использует
-
f
дляFRIEND
-
s
дляSUGGEST
- что-нибудь еще для
KNOW
Попробуйте онлайн
источник
l.extend([(a,b),(b,a)])
ты не можешь просто сделать этоl+=[(a,b),(b,a)]
? (Я еще не проверял это)UnboundLocalError
. Хороший ответ, кстати!bool()
изs
функции и используете0
,{}
иFalse
как Falsey, иTrue
не пустойset
как Truthy, вы можете сохранить 6 байтовMathematica, 164 байта
Определяет три основные функции
F
,S
иK
с желаемым поведением. Например, последовательность командпоследний контрольный пример из изображения, связанного с OP; то
F
команды дают никакого вывода (единая точка с запятой , кажется небольшой плату за это), в то время как шестьS
иK
команды выходапо желанию.
В любой момент,
f
это список упорядоченных пар формы,{A, B}
гдеA
знаетB
, в то времяp
как список людей, появляющихся в некотором элементеf
. ВызовF@{A, B}
добавляет четыре упорядоченные пары{A, B}
,{B, A}
,{A, A}
и{B, B}
кf
.Кроме того, в любой момент,
m
это матрица смежности базового графа (человек соседствует с собой и со всеми своимиF
обитателями); строки и столбцы индексируютсяp
иi
преобразует человека в соответствующий номер строки / столбца. Вспомогательная функцияa
принимает матрицу и двух человек в качестве входных данных и ищет запись матрицы, чьи «координаты» - это два человека, возвращая,True
если число положительное иFalse
если оно равно нулю. (Также возможно позвонить,a
когда один из людей ввода еще не распознан, например, сделать запрос KNOW или SUGGEST перед объявлениями FRIEND или спросить о каком-то бедном человеке, у которого нет друзей; это вызывает ошибки, но правило/._@__->0
вынуждает вывод быть вFalse
любом случае.)Вызов
K[A, B]
поэтому ищет,m[A, B]
является ли положительным, который реализуетK
глагол now. Продукт матрицыm.m
- это матрица длины-2-пути, содержащая количество путей перехода от одного человека к другому по пути длины 2; это позволяетS[A, B]
реализоватьS
глагол uggest, при условии, что мы дополнительно проверяем вручную (&&!K@##
), что входящие люди еще не знают друг друга.Забавный факт: бесплатно, эта реализация позволяет объявить кликами друзей-команда
F@{A, B, C, D}
эквивалентна всеF@{A, B}
,F@{A, C}
,F@{A, D}
,F@{B, C}
,F@{B, D}
, и вF@{C, D}
сочетании.источник
Python 2 , 118 байт
Попробуйте онлайн!
Поскольку я не смог найти онлайн-инструмент repl для python 2, я добавил TIO Nexus (в формате REPL).
Запрос на опцию и ее возможный вывод
0 для известного - нет
1 для друзей - правда или ложь
2 для Предложить - верно или неверно
Пример использования и пример вывода в интерпретаторе repl python.
источник
GNU sed , 158 + 2 (флаги rn) = 160 байт
Поскольку sed - это язык на основе регулярных выражений, примитивных типов не существует, не говоря уже об абстрактных структурах данных. Сетевые данные хранятся в виде текста в произвольном формате, в данном случае в виде избыточных ссылок друзей, таких как
A-B;B-A;
и т. Д., Которые затем сопоставляются с различными шаблонами регулярных выражений.Попробуйте онлайн!
По сути, sed запускает весь скрипт для каждой строки ввода. Я рекомендую тестировать в интерактивном режиме, чтобы увидеть вывод команды сразу после ввода.
Использование: в sed нет значений true / false, поэтому я использую выходное соглашение, заимствованное из bash, при этом непустая строка считается истинной, а пустая - ложной.
F X Y
дляFRIEND X Y
. У него нет выхода.K X Y
дляKNOW X Y
. Выводит 'K' как правдивую, и ничего, кроме фальши.S X Y
дляSUGGEST X Y
. Вывод 'S' как правдивый, и ничего, как ложь.Объяснение:
источник