Малоизвестный факт о вампирах заключается в том, что они должны пить кровь жертвы, имеющей совместимую группу донорской крови. Матрица совместимости для вампиров такая же, как и матрица обычных доноров / реципиентов эритроцитов . Это можно суммировать с помощью следующей таблицы Американского Красного Креста.
Type You Can Give Blood To You Can Receive Blood From
A+ A+, AB+ A+, A-, O+, O-
O+ O+, A+, B+,AB+ O+, O-
B+ B+, AB+ B+, B-, O+, O-
AB+ AB+ everyone
A- A+, A-, AB+, AB- A-, O-
O- everyone O-
B- B+, B-, AB+, AB- B- O-
AB- AB+, AB- AB-, A-, B-, O-
Вызов
Напишите функцию или программу, которая принимает группу крови в качестве входных данных и выводит два списка:
- неупорядоченный список типов, которые могут получить пожертвование типа ввода
- неупорядоченный список типов, которые могут дать пожертвование типу ввода
Если вы пишете функцию, то, пожалуйста, также предоставьте тестовую программу для вызова этой функции с несколькими примерами, чтобы я мог легко ее протестировать. В этом случае тестовая программа не будет засчитана в ваш счет.
вход
Входными данными должна быть строка, представляющая ровно один из 8 возможных типов эритроцитов O−
O+
A−
A+
B−
B+
AB−
AB+
. Входные данные могут быть переданы с помощью обычных методов (STDIN, аргументы командной строки, аргументы функций и т. Д.).
Если задан какой-либо другой ввод, то программа / функция должна вернуть пустой вывод или выдать ошибку. Обычно строгая проверка ввода не очень хороша в вопросах кода-гольфа , но я чувствовал, что с учетом последствий для жизни и смерти из-за неправильного определения группы крови я должен добавить это правило.
Выход
Результатом будет два читаемых человеком списка групп крови в любом формате, который подходит для вашего языка. В особых случаях, когда один из списка вывода содержит все 8 типов, этот список может быть необязательно заменен одним списком элементов, содержащим everyone
.
Нормальный вывод будет идти в одно из нормальных мест (STDOUT, возврат функции и т. Д.).
Другие правила
- Стандартные лазейки запрещены
- Вы можете использовать любые существующие сторонние библиотеки, которые вам нужны, если они не предназначены для этой цели.
Примеры
- Для ввода
AB-
два списка вывода будут:{AB+, AB-}, {AB-, A-, B-, O-}
- Для ввода
AB+
два списка вывода будут:{AB+}, {O−, O+, A−, A+, B−, B+, AB−, AB+}
или{AB+}, {everyone}
Личное примечание: пожалуйста, рассмотрите возможность сдачи крови, если вы можете. Без переливания, которое я получил несколько лет назад, я мог бы не быть здесь сегодня, поэтому я очень благодарен тем, кто может сделать пожертвование!
источник
Ответы:
Клип , 69
Входные данные:
AB-
Выход:
{{"AB+", "AB-"}, {"A-", "B-", "AB-", "O-"}}
объяснение
Группу крови
x
можно определить,y
если вx
нее включены все антигеныy
. Программа определяет функцию,F
какx
может ли датьy
, иT
как список типов.источник
Ява 8, 373
объяснение
Запустите его здесь: http://repl.it/e98/1
Обратите внимание, что
static
нужно было добавить к каждому методу, чтобы вызвать их из основного метода.источник
Пиф,
615950Запустите это здесь.
Объяснение:
источник
CJam, 64 байта
m*:s
Часть приходит из CJam ответа Мартина . (Я еще не читал другие части.)Будут все еще некоторые серьезные проблемы, потому что они никогда не будут уверены в порядке двух списков. И
Block ArrayList &
может быть реализовано в более поздних версиях CJam.объяснение
источник
Javascript, 167
ungolfed:
функция тестирования:
Кодирование группы крови в двоичном виде имеет то преимущество, что другой антиген (например, антиген Келла ) легко включается в код, просто добавляя еще один бит.
Сдайте кровь в Цюрихе, CH: Blutspende Zürich
источник
"O-O+B-B+A-A+AB-AB+".match(/\w+\W/g)
вместо того,"O- O+ B- B+ A- A+ AB- AB+".split(" ")
чтобы сохранить 2 символа."O-1O+1B-1B+1A-1A+1AB-1AB+".split(1)
и использование=>
функции должно сохранить некоторые тоже./\w+./g
n=2;while(n--)
=>for(n=2;n--;)
http://jsfiddle.net/j2hep8e8/2/
CJam, 94 байта
Ничего себе, это долго ... хотя я думаю, что я мог бы, вероятно, использовать этот подход ниже 80, я думаю, что я мог бы добиться большего, сначала вычислив матрицу, а затем просто выбрав правильную строку и столбец. Во всяком случае, вот оно:
Проверьте это здесь.
Я добавлю объяснение, когда я закончу играть в гольф.
источник
Groovy, 115
Идея состоит в том, чтобы кодировать A, B и резус-фактор в один бит каждый. Затем мы можем инвертировать биты, чтобы получить все антигены на принимающей стороне, и использовать их для проверки отсутствия соответствующих антител на принимающей стороне. Это более или менее аналогично существующему решению JavaScript.
Образец исполнения
источник
Пролог,
119110 байтЗамечания :
Типы крови имеют следующие свойства: каждый раз, когда у вас есть
-
(напримерa-
), вы можете давать тем же людям, что и тот, у кого есть положительный эквивалент вашей группы (напримерa
), а также их отрицательный аналог (например,a
даетab
, то естьa-
даетab
иab-
). Основываясь на этом свойстве и немного злоупотребляя нотациями, чтобы использовать операторы минус и плюс, мы можем учитывать множество случаев. Пожалуйста, скажите мне, если вы считаете это приемлемым . Если вы предпочитаете использовать оригинальный (постфиксный) синтаксис, вот версия без игры в гольф:Это Пролог, поэтому интерактивная среда позволяет запрашивать все, как требуется (см. Пример ниже). Конечно, у нас нет списков строго как вывод, но это эквивалентно. Как следствие, мы также естественным образом обрабатываем ошибки.
пример
Затем мы выполняем
test
:... которая без надлежащего форматирования является той же самой матрицей, что и приведенная в вопросе.
Детали
Предикат
g/2
является отдавание отношения:g(X,Y)
средства людей типа крови X могут дать кровь для людей типа крови Y .Найти приемников для группы
a
:Найти получателей для
orange_juice
(должно произойти сбой):Найти доноров для
O-
:Кто что может дать? :
Мы не идем в бесконечный цикл рекурсии (это было в предварительных тестах).
источник
Python, 187 байт
Другой подход:
Возможно, можно играть в гольф немного больше.
Тест:
Выход:
источник
Рубин,
237232223221210207 байтИсправлены некоторые посторонние обратные слеши в регулярных выражениях и сделано так, что он просто распечатывает списки, а не сохраняет их в переменных, а затем печатает их. Иногда вы упускаете очевидные вещи, пытаясь играть в гольф!
Ungolfed:
По сути, я создаю собственное регулярное выражение для введенной группы крови, чтобы проверить, можете ли вы сделать пожертвование другой группе крови. Затем я перебираю группы крови и применяю к ним то же регулярное выражение и проверяю, могут ли они пожертвовать указанному.
Это, вероятно, может быть в гольфе еще больше. Это моя первая попытка игры в гольф, хе.
источник
Python 2, 168 байт
Это тот же метод, что и ответ Blackhole. Выход с ошибкой, если параметр не найден в списке типов.
Менее гольф:
Запустите это здесь: http://repl.it/eaB
Я также попробовал пару других небольших изменений, но не мог сделать это немного короче ...
источник
PHP (287 байт):
Да, это довольно долго, но работает как положено.
Может быть возможно сократить много:
Это не легко читать и было нелегко написать.
Он работает по назначению, выводя те, которые вы можете дать, и те, которые вы можете получить, на другой строке.
Для этого требуется параметр URL
T=
с типом.источник
CJam, 80 байтов
Это все еще слишком долго. Возможно, я смогу сбрить еще 4-5 байтов.
Для любого неверного ввода либо печатает пустой массив, либо выдает ошибку.
Попробуйте онлайн здесь или запустите весь набор тестов
источник
APL, 66
Попробуй это здесь.
источник
С, 224
Де-гольф это показывает:
источник
PHP -
215212206 байтВот негольфированная версия:
Спасибо manatwork за сохранение 4 байта.
источник
explode(1,'A+1O+1B+1AB+1A-1O-1B-1AB-')
. И поскольку мы не обязательно следим за хорошими привычками кодирования, иногда мы используем устаревшие функции, такие какsplit()
функция.Perl, 107
112Наконец, кодирование имен типов в числах дало более короткий код.
Старая версия
источник
Пиф, 58
Отчасти то же самое, что и решение orlp , но несколько другое и полностью разработанное самим собой.
объяснение
источник
J, 120 байт
Функция не работает на недопустимых входах. Большое десятичное число - это кодирование полной матрицы совместимости.
(Очень длинное решение по нескольким причинам.)
Попробуйте это онлайн здесь.
источник
05AB1E , 29 байт
Попробуйте онлайн!
источник