Um fato pouco conhecido sobre os vampiros é que eles devem beber o sangue da vítima que possui um tipo de sangue compatível de doador. A matriz de compatibilidade para vampiros é a mesma que a matriz doadora / receptora regular de glóbulos vermelhos . Isso pode ser resumido na seguinte tabela da Cruz Vermelha Americana
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-
Desafio
Escreva uma função ou programa que use um tipo de sangue como entrada e produz duas listas:
- a lista não ordenada de tipos que podem receber doação do tipo de entrada
- a lista não ordenada de tipos que podem doar para o tipo de entrada
Se você escrever uma função, forneça também um programa de teste para chamar essa função com alguns exemplos, para que eu possa testá-la facilmente. Nesse caso, o programa de teste não conta para a sua pontuação.
Entrada
A entrada deve ser uma sequência que represente exatamente um dos 8 tipos possíveis de glóbulos vermelhos O−
O+
A−
A+
B−
B+
AB−
AB+
. A entrada pode ser fornecida pelos métodos normais (STDIN, argumentos da linha de comando, argumentos da função, etc.).
Se qualquer outra entrada for fornecida, o programa / função deve retornar uma saída vazia ou gerar um erro. Normalmente, a verificação estrita de entradas não é boa em questões de código-golfe , mas, considerando as implicações de morte ou morte por erro no tipo sanguíneo, devo adicionar essa regra.
Saída
A saída será duas listas de tipos sanguíneos legíveis por humanos, em qualquer formato adequado ao seu idioma. Nos casos especiais em que uma das listas de saída contém todos os 8 tipos, essa lista pode opcionalmente ser substituída por uma única lista de itens everyone
.
A saída normal irá para um dos locais normais (STDOUT, retorno de função, etc.).
Outras regras
- As brechas padrão são proibidas
- Você pode usar as bibliotecas de terceiros pré-existentes necessárias, desde que elas não sejam projetadas explicitamente para esse fim.
Exemplos
- Para entrada
AB-
, as duas listas de saída seriam:{AB+, AB-}, {AB-, A-, B-, O-}
- Para entrada
AB+
, as duas listas de saída seriam:{AB+}, {O−, O+, A−, A+, B−, B+, AB−, AB+}
ou{AB+}, {everyone}
Nota pessoal: considere doar sangue, se puder. Sem a transfusão que recebi há alguns anos, talvez eu não esteja aqui hoje, então sinto-me muito grata por aqueles que podem doar!
fonte
Respostas:
Clipe , 69
Entrada:
AB-
Saída:
{{"AB+", "AB-"}, {"A-", "B-", "AB-", "O-"}}
Explicação
Um tipo de sangue
x
pode dary
se todosx
os antígenos estiverem incluídosy
. O programa define a funçãoF
como sex
pode dary
eT
como a lista de tipos.fonte
Java 8, 373
Explicação
Execute-o aqui: http://repl.it/e98/1
Observe que
static
foi necessário adicionar a cada método para chamá-los do método principal.fonte
Pyth,
615950Execute-o aqui.
Explicação:
fonte
CJam, 64 bytes
A
m*:s
parte vem da resposta de Martin, CJam . (Ainda não li as outras partes.)Ainda haverá alguns problemas sérios, porque eles nunca terão certeza sobre a ordem das duas listas. E
Block ArrayList &
pode ser implementado em versões posteriores do CJam.Explicação
fonte
Javascript, 167
ungolfed:
função de teste:
A codificação do tipo sanguíneo no binário tem a vantagem de que outro antígeno (por exemplo, o antígeno Kell ) é facilmente incorporado ao código, apenas adicionando outro bit.
Doe sangue em Zurique, CH: Blutspende Zürich
fonte
"O-O+B-B+A-A+AB-AB+".match(/\w+\W/g)
vez de"O- O+ B- B+ A- A+ AB- AB+".split(" ")
salvar 2 caracteres."O-1O+1B-1B+1A-1A+1AB-1AB+".split(1)
e usar a=>
função também deve economizar alguns./\w+./g
n=2;while(n--)
=>for(n=2;n--;)
http://jsfiddle.net/j2hep8e8/2/
CJam, 94 bytes
Uau, isso é longo ... enquanto eu acho que provavelmente poderia usar essa abordagem abaixo de 80, acho que poderia ter me saído melhor primeiro computando a matriz e depois escolhendo a linha e coluna corretas. Enfim, aqui está:
Teste aqui.
Vou adicionar uma explicação quando terminar o golfe.
fonte
Groovy, 115
A idéia é codificar A, B e fator de rhesus como um bit cada. Podemos então inverter os bits para obter todos os antígenos do lado receptor e usá-lo para verificar se não há anticorpos correspondentes no lado doador. É mais ou menos o mesmo que a solução JavaScript existente.
Execução de amostra
fonte
Prolog,
119110 bytesObservações :
Os tipos sanguíneos têm as seguintes propriedades: toda vez que você tem um
-
(por exemploa-
), você pode doar para as mesmas pessoas que têm um equivalente positivo do seu grupo (por exemploa
), bem como o equivalente negativo (por exemplo,a
dá paraab
,a-
dá paraab
eab-
) Com base nessa propriedade, e abusando um pouco das notações para fazer uso dos operadores de menos e mais, podemos fatorar muitos casos. Por favor me diga se você acha aceitável . Se você preferir ter a sintaxe original (postfix), aqui está uma versão sem golfe:Como é o Prolog, o ambiente interativo permite consultar tudo conforme solicitado (veja o exemplo abaixo). É verdade que não temos listas estritamente como saída, mas isso é equivalente. Também lidamos naturalmente com casos de erro como conseqüência.
Exemplo
Então, executamos
test
:... que, sem formatação adequada, é a mesma matriz que a dada na pergunta.
Detalhes
O predicado
g/2
é o relacionamento doar :g(X,Y)
significa que pessoas do tipo sanguíneo X podem dar sangue a pessoas do tipo Y sanguíneo .Encontre receptores para o grupo
a
:Encontre receptores para
orange_juice
(deve falhar):Encontre doadores para
O-
:Quem pode dar o que? :
Não entramos em um loop de recursão infinito (foi o caso em testes preliminares).
fonte
Python, 187 bytes
Abordagem diferente:
Provavelmente pode ser jogado um pouco mais.
Teste:
Saída:
fonte
Ruby,
237232223221210207 bytesCorrigimos algumas barras invertidas estranhas nas expressões regulares e o fizemos imprimir apenas as listas, em vez de armazená-las em variáveis e depois imprimi-las. Às vezes você sente falta das coisas óbvias ao tentar jogar golfe!
Ungolfed:
Basicamente, construo uma expressão regular personalizada para o tipo de sangue inserido para verificar se você pode doar para outro tipo de sangue. Eu, então, percorro os tipos sanguíneos, aplico a mesma regex a eles e verifico se eles podem doar para o especificado.
Provavelmente isso pode ser ainda mais diminuído. Esta é a minha primeira vez tentando código de golfe, heh.
fonte
Python 2, 168 bytes
Este é o mesmo método da resposta de Blackhole. Sai com um erro se o parâmetro não for encontrado na lista de tipos.
Menos golfe:
Execute-o aqui: http://repl.it/eaB
Eu também tentei algumas outras pequenas alterações, mas não consegui mais ...
fonte
PHP (287 bytes):
Sim, isso é bastante longo, mas funciona como esperado.
Pode ser possível reduzir muito:
Isso não é fácil de ler e não foi fácil de escrever.
Funciona como pretendido, produzindo os que você pode fornecer e os que pode receber em outra linha.
Isso requer um parâmetro de URL
T=
com o tipofonte
CJam, 80 bytes
Isso ainda é muito longo. Provavelmente posso cortar de 4 a 5 bytes a mais.
Para qualquer entrada inválida, imprime uma matriz vazia ou gera um erro.
Experimente on-line aqui ou execute todo o conjunto de testes
fonte
APL, 66
Experimente aqui.
fonte
C, 224
De-golfed mostra:
fonte
PHP -
215212206 bytesAqui está a versão não destruída:
Obrigado ao manatwork por economizar 4 bytes.
fonte
explode(1,'A+1O+1B+1AB+1A-1O-1B-1AB-')
. E como não mantemos necessariamente bons hábitos de codificação, às vezes usamos recursos obsoletos, como asplit()
função.Perl, 107
112Finalmente, a codificação dos nomes dos tipos em números deu o código mais curto.
Versão mais antiga
fonte
Pyth, 58
Parcialmente o mesmo que a solução da orlp , mas um pouco diferente e completamente auto-projetada.
Explicação
fonte
J, 120 bytes
A função falha em entradas inválidas. O grande número decimal é a codificação da matriz de compatibilidade completa.
(Solução muito longa por vários motivos.)
Experimente online aqui.
fonte
05AB1E , 29 bytes
Experimente online!
fonte