Golf-me um OOP!
Dois componentes importantes da programação orientada a objetos são herança e composição. Juntos, eles permitem criar hierarquias de classe simples e poderosas para resolver problemas. Sua tarefa é analisar uma série de instruções sobre uma hierarquia de classes e responder a perguntas sobre a hierarquia.
Entrada
Uma série de declarações e perguntas sobre uma hierarquia de classes, lida em um arquivo ou entrada padrão, o que for melhor para o seu idioma. Se você usar a opção de arquivo, o nome do arquivo será passado como o primeiro argumento para o seu código (argumento da função ou argumento da linha de comando, o que você escolher). O formato é o seguinte:
<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 entrada será sempre declarações, depois perguntas. Todos os nomes de turma começarão com uma letra maiúscula em inglês ( A-Z
) e todos os nomes de membros começarão com uma letra minúscula em inglês ( a-z
). Todos os nomes diferenciam maiúsculas de minúsculas - ABC123
não são da mesma classe que Abc123
.
Não haverá herança cíclica - se B
herdar de A
, A
não herdará de B
ou qualquer um dos B
filhos.
Somente nomes de classe farão parte de uma hierarquia - instruções como foo is a bar.
ou document has a name.
não ocorrerão.
Saída
Uma série de valores verdadeiros ou falsos, como respostas às consultas, gravadas na saída padrão ou como o valor de retorno da sua função. Se você não tiver informações suficientes para responder a uma pergunta (por exemplo, perguntas que envolvam nomes que você não viu nas declarações), responda com um valor falsey.
Casos de teste
Caso 1:
Entrada:
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?
Saída:
True
True
False
Caso 2:
Entrada:
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?
Saída:
True
True
False
False
True
Regras
- Você pode responder com uma função ou um programa
- As brechas padrão são proibidas
- Isso é código-golfe , então a resposta correta mais curta em bytes ganha
- A resposta vencedora será escolhida em uma semana
Boa sorte, e que o OOP esteja com você!
Entre os melhores
O snippet de pilha na parte inferior desta postagem gera o cabeçalho das respostas a) como uma lista da solução mais curta por idioma eb) como um cabeçalho geral.
Para garantir que sua resposta seja exibida, inicie-a com um título, usando o seguinte modelo de remarcação:
## Language Name, N bytes
onde N
está o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Se você quiser incluir vários números no cabeçalho (por exemplo, porque sua pontuação é a soma de dois arquivos ou você deseja listar as penalidades do sinalizador de intérpretes separadamente), verifique se a pontuação real é o último número no cabeçalho:
## Perl, 43 + 2 (-p flag) = 45 bytes
Você também pode transformar o nome do idioma em um link que será exibido no snippet:
## [><>](http://esolangs.org/wiki/Fish), 121 bytes
Criminal is a Person
. Person has a name
.
Does Criminal have a name?
igual aTrue
? Todos os objetos têm um nome?