Un fait peu connu sur les vampires est qu'ils doivent boire le sang de la victime qui a un groupe sanguin de donneur compatible. La matrice de compatibilité pour les vampires est la même que la matrice régulière donneur / receveur de globules rouges . Cela peut être résumé par le tableau suivant de la Croix-Rouge américaine
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-
Défi
Écrivez une fonction ou un programme qui prend un groupe sanguin en entrée et génère deux listes:
- la liste non ordonnée des types qui peuvent recevoir un don du type d'entrée
- la liste non ordonnée des types qui peuvent faire un don au type d'entrée
Si vous écrivez une fonction, veuillez également fournir un programme de test pour appeler cette fonction avec quelques exemples, afin que je puisse facilement la tester. Dans ce cas, le programme de test ne comptera pas dans votre score.
Contribution
L'entrée doit être une chaîne représentant exactement l'un des 8 types de globules rouges possibles O−
O+
A−
A+
B−
B+
AB−
AB+
. L'entrée peut être donnée via les méthodes normales (STDIN, arguments de ligne de commande, arguments de fonction, etc.).
Si une autre entrée est donnée, le programme / la fonction doit retourner une sortie vide ou renvoyer une erreur. Normalement, une vérification stricte des entrées n'est pas excellente dans les questions de code-golf , mais je me sentais, étant donné les implications pour la mort de se tromper sur les groupes sanguins, que je devrais ajouter cette règle.
Sortie
Le résultat sera deux listes lisibles par l'homme de groupes sanguins dans n'importe quel format adapté à votre langue. Dans les cas particuliers où l'une des listes de sortie contient les 8 types, cette liste peut éventuellement être remplacée par une seule liste d'articles contenant everyone
.
La sortie normale ira à l'un des endroits normaux (STDOUT, retour de fonction, etc.).
Autres règles
- Les failles standard sont interdites
- Vous pouvez utiliser toutes les bibliothèques tierces préexistantes dont vous avez besoin, tant qu'elles ne sont pas conçues expressément à cette fin.
Exemples
- Pour l'entrée
AB-
, les deux listes de sortie seraient:{AB+, AB-}, {AB-, A-, B-, O-}
- Pour l'entrée
AB+
, les deux listes de sortie seraient:{AB+}, {O−, O+, A−, A+, B−, B+, AB−, AB+}
ou{AB+}, {everyone}
Note personnelle: veuillez envisager de donner du sang si vous le pouvez. Sans la transfusion que j'ai reçue il y a quelques années, je ne serais peut-être pas ici aujourd'hui, donc je suis très reconnaissant envers ceux qui peuvent faire un don!
la source
Réponses:
Clip , 69
Contribution:
AB-
Sortie:
{{"AB+", "AB-"}, {"A-", "B-", "AB-", "O-"}}
Explication
Un groupe sanguin
x
peut donnery
si tousx
les antigènes sont inclus dansy
. Le programme définit la fonctionF
comme si ellex
peut donnery
etT
comme la liste des types.la source
Java 8, 373
Explication
Exécutez-le ici: http://repl.it/e98/1
Notez qu'il
static
fallait ajouter à chaque méthode pour les appeler à partir de la méthode principale.la source
Pyth,
615950Exécutez-le ici.
Explication:
la source
CJam, 64 octets
La
m*:s
partie vient de la réponse CJam de Martin . (Je n'ai pas encore lu les autres parties.)Il y aura encore de sérieux problèmes car ils ne seront jamais sûrs de l'ordre des deux listes. Et
Block ArrayList &
pourrait être implémenté dans les versions ultérieures de CJam.Explication
la source
Javascript, 167
non golfé:
fonction de test:
Le codage du type sanguin en binaire a l'avantage qu'un autre antigène (par exemple l' antigène Kell ) est facilement incorporé dans le code en ajoutant simplement un autre bit.
Faire un don de sang à Zurich, CH: Blutspende Zürich
la source
"O-O+B-B+A-A+AB-AB+".match(/\w+\W/g)
au lieu de"O- O+ B- B+ A- A+ AB- AB+".split(" ")
pour enregistrer 2 caractères."O-1O+1B-1B+1A-1A+1AB-1AB+".split(1)
et en utilisant la=>
fonction devrait en enregistrer aussi./\w+./g
n=2;while(n--)
=>for(n=2;n--;)
http://jsfiddle.net/j2hep8e8/2/
CJam, 94 octets
Wow, c'est long ... alors que je pense que je pourrais probablement jouer cette approche en dessous de 80, je pense que j'aurais pu faire mieux en calculant d'abord la matrice et en choisissant simplement la bonne ligne et la bonne colonne. Bref, le voici:
Testez-le ici.
J'ajouterai une explication quand j'aurai fini de jouer au golf.
la source
Groovy, 115
L'idée est de coder A, B et le facteur rhésus comme un bit chacun. Nous pouvons ensuite inverser les bits pour obtenir tous les antigènes du côté récepteur et l'utiliser pour vérifier qu'il n'y a pas d'anticorps correspondants du côté donneur. C'est plus ou moins la même chose que la solution JavaScript existante.
Exemple d'exécution
la source
Prolog,
119110 octetsRemarques :
Les groupes sanguins ont les propriétés suivantes: chaque fois que vous en avez
-
(par exemplea-
), vous pouvez donner aux mêmes personnes que celles qui ont un équivalent positif de votre groupe (par exemplea
), ainsi que leur contrepartie négative (par exemple,a
donneab
, donca-
donne àab
etab-
). Sur la base de cette propriété, et en abusant un peu des notations pour utiliser les opérateurs moins et plus, nous pouvons prendre en compte de nombreux cas. Veuillez me dire si vous le trouvez acceptable . Si vous préférez avoir la syntaxe d'origine (postfix), voici une version non-golfée:Il s'agit de Prolog, donc l'environnement interactif permet de tout interroger comme demandé (voir l'exemple ci-dessous). Certes, nous n'avons pas de listes strictement en sortie, mais c'est équivalent. Nous gérons également naturellement les cas d'erreur.
Exemple
Ensuite, nous exécutons
test
:... qui, sans mise en forme appropriée, est la même matrice que celle donnée dans la question.
Détails
Le prédicat
g/2
est le donner relation:g(X,Y)
moyens les gens de type sanguin X peut donner du sang aux personnes de type sanguin Y .Trouver des récepteurs pour le groupe
a
:Rechercher des récepteurs pour
orange_juice
(devrait échouer):Trouver des donateurs pour
O-
:Qui peut donner quoi? :
On n'entre pas dans une boucle de récursion infinie (c'était le cas dans les tests préliminaires).
la source
Python, 187 octets
Une approche différente:
Peut probablement être joué un peu plus.
Tester:
Sortie:
la source
Rubis,
237232223221210207 octetsCorrection de quelques barres obliques inverses superflues dans les expressions régulières et fait en sorte qu'il imprime simplement les listes au lieu de les stocker dans des variables puis de les imprimer. Parfois, vous manquez les choses évidentes lorsque vous essayez de jouer au golf!
Non golfé:
Fondamentalement, je construis une expression régulière personnalisée pour le groupe sanguin entré pour vérifier si vous pouvez faire un don à un autre groupe sanguin. J'itère ensuite les groupes sanguins et leur applique la même expression régulière et vérifie s'ils peuvent faire un don à celui spécifié.
Cela peut probablement être joué encore plus. C'est ma première fois que j'essaye le golf de code, heh.
la source
Python 2, 168 octets
C'est la même méthode que la réponse de Blackhole. Quitte avec une erreur si le paramètre n'est pas trouvé dans la liste des types.
Moins golfé:
Exécutez-le ici: http://repl.it/eaB
J'ai également essayé quelques autres changements légers, mais je n'ai pas pu le raccourcir ...
la source
PHP (287 octets):
Oui, c'est assez long, mais ça fonctionne comme prévu.
Il peut être possible de raccourcir beaucoup:
Ce n'est pas facile à lire et ce n'était pas facile à écrire.
Il fonctionne comme prévu, produisant ceux que vous pouvez donner et ceux que vous pouvez recevoir sur une autre ligne.
Cela nécessite un paramètre d'URL
T=
avec le type.la source
CJam, 80 octets
C'est encore trop long. Je peux probablement raser 4 à 5 octets de plus.
Pour toute entrée non valide, imprime un tableau vide ou renvoie une erreur.
Essayez-le en ligne ici ou exécutez toute la suite de tests
la source
APL, 66
Essayez-le ici.
la source
C, 224
De-golfed cela montre:
la source
PHP -
215212206 octetsVoici la version non golfée:
Merci à manatwork pour avoir économisé 4 octets.
la source
explode(1,'A+1O+1B+1AB+1A-1O-1B-1AB-')
. Et comme nous ne suivons pas nécessairement de bonnes habitudes de codage, nous utilisons parfois des fonctionnalités obsolètes, comme lasplit()
fonction.Perl, 107
112Enfin, l'encodage des noms de type en chiffres a donné le code le plus court.
Ancienne version
la source
Pyth, 58
En partie la même que la solution orlp , mais quelque peu différente et complètement conçue par soi-même.
Explication
la source
J, 120 octets
La fonction échoue sur des entrées invalides. Le grand nombre décimal est l'encodage de la matrice de compatibilité complète.
(Solution très longue pour plusieurs raisons.)
Essayez-le en ligne ici.
la source
05AB1E , 29 octets
Essayez-le en ligne!
la source