Гольф мене ООП!
Дві важливі складові об'єктно-орієнтованого програмування - спадкування та склад. Разом вони дозволяють створити прості, але потужні ієрархії класів для вирішення проблем. Ваше завдання - проаналізувати ряд висловлювань про ієрархію класів та відповісти на запитання про ієрархію.
Вхідні дані
Серія висловлювань і запитань про ієрархію класів, прочитану з файлу або стандартного вводу, що залежно від вашої мови. Якщо ви використовуєте опцію файлу, ім'я файлу буде передано як перший аргумент у ваш код (аргумент функції або аргумент командного рядка, що б ви не вибрали). Формат такий:
<statement> : <name> is a <name>. | <name> has a <name>.
<question> : Is <name> a <name>? | Does <name> have a <name>?
<name> : a-z | A-Z | sequence of alphanumerics or underscores, starting with a letter
Вхід завжди будуть висловлюваннями, а потім питаннями. Усі імена класів починатимуться з великої літери англійської мови ( A-Z
), а всі імена членів починаються з малої літери англійської мови ( a-z
). Усі імена залежать від регістру - ABC123
це не той самий клас, як Abc123
.
Не буде ніякого циклічного успадкування - якщо він B
успадковує A
, A
не буде успадковувати B
ні кого-небудь з B
дітей.
Тільки імена класів будуть частиною ієрархії - заяви , такі як foo is a bar.
або document has a name.
не відбуватиметься.
Вихідні дані
Серія правдивих чи фальсийних значень, як відповіді на запити, записані на стандартний вихід або як зворотні значення вашої функції. Якщо у вас недостатньо інформації для відповіді на запитання (наприклад, запитання, які містять імена, яких ви не бачили у висловлюваннях), дайте відповідь із значенням фальси.
Випробування
Випадок 1:
Вхід:
B is a A.
C is a B.
A has a foo.
Does B have a foo?
Is C a A?
Is D a A?
Вихід:
True
True
False
Випадок 2:
Вхід:
Cop is a Person.
Criminal is a Person.
Sheriff is a Cop.
Crooked_Cop is a Cop.
Crooked_Cop is a Criminal.
BankRobber is a Criminal.
Cop has a badge.
Criminal has a criminal_record.
Person has a name.
Is Crooked_Cop a Person?
Does Criminal have a name?
Is Crooked_Cop a BankRobber?
Does Person have a potato?
Is Cop a Cop?
Вихід:
True
True
False
False
True
Правила
- Ви можете відповісти за допомогою функції або програми
- Стандартні лазівки заборонені
- Це код-гольф , тому найкоротша правильна відповідь у байтах виграє
- Виграшну відповідь буде обрано через один тиждень
Удачі, і нехай ООП буде з вами!
Таблиця лідерів
Фрагмент стека внизу цієї публікації генерує таблицю лідерів з відповідей а) як список найкоротших варіантів для кожної мови та б) як загальну таблицю лідерів.
Щоб переконатися, що ваша відповідь відображається, будь ласка, почніть свою відповідь із заголовка, використовуючи наступний шаблон Markdown:
## Language Name, N bytes
де N
розмір вашого подання. Якщо ви покращите свій рахунок, ви можете зберегти старі бали у заголовку, прокресливши їх. Наприклад:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Якщо ви хочете включити у свій заголовок декілька чисел (наприклад, тому що ваш результат становить суму двох файлів або ви хочете окремо вказати штрафні санкції для перекладача), переконайтесь, що фактичний результат - це останнє число у заголовку:
## Perl, 43 + 2 (-p flag) = 45 bytes
Ви також можете зробити ім'я мови посиланням, яке з’явиться у фрагменті:
## [><>](http://esolangs.org/wiki/Fish), 121 bytes
Criminal is a Person
. Person has a name
.
Does Criminal have a name?
дорівнюєTrue
? Чи всі об’єкти мають ім’я?