Un hecho poco conocido sobre los vampiros es que deben beber la sangre de la víctima que tiene un tipo de sangre de donante compatible. La matriz de compatibilidad para vampiros es la misma que la matriz regular de donantes / receptores de glóbulos rojos . Esto se puede resumir en la siguiente tabla de la Cruz Roja 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-
Reto
Escriba una función o programa que tome un tipo de sangre como entrada y genere dos listas:
- la lista desordenada de tipos que pueden recibir donación del tipo de entrada
- la lista desordenada de tipos que pueden donar al tipo de entrada
Si escribe una función, proporcione también un programa de prueba para llamar a esa función con algunos ejemplos, para que pueda probarla fácilmente. En este caso, el programa de prueba no contaría para su puntaje.
Entrada
La entrada debe ser una cadena que represente exactamente uno de los 8 posibles tipos de glóbulos rojos O−
O+
A−
A+
B−
B+
AB−
AB+
. La entrada puede darse a través de los métodos normales (STDIN, argumentos de línea de comandos, argumentos de función, etc.).
Si se proporciona cualquier otra entrada, entonces el programa / función debe devolver una salida vacía o arrojar un error. Normalmente, la comprobación estricta de las entradas no es excelente en las preguntas de código de golf , pero me pareció que, dada la implicación de muerte o muerte de los tipos de sangre incorrectos, debería agregar esta regla.
Salida
La salida será dos listas de tipos de sangre legibles por humanos en cualquier formato que sea adecuado para su idioma. En los casos especiales en los que una de las listas de salida contiene los 8 tipos, esta lista puede reemplazarse opcionalmente por una lista de elementos única que contenga everyone
.
La salida normal irá a uno de los lugares normales (STDOUT, retorno de función, etc.).
Otras reglas
- Las lagunas estándar están prohibidas
- Puede usar las bibliotecas de terceros preexistentes que necesite, siempre que no estén diseñadas explícitamente para este propósito.
Ejemplos
- Para la entrada
AB-
, las dos listas de salida serían:{AB+, AB-}, {AB-, A-, B-, O-}
- Para la entrada
AB+
, las dos listas de salida serían:{AB+}, {O−, O+, A−, A+, B−, B+, AB−, AB+}
o{AB+}, {everyone}
Nota personal: considere donar sangre si puede. Sin la transfusión que recibí hace unos años, es posible que no esté aquí hoy, ¡así que me siento muy agradecido con aquellos que pueden donar!
fuente
Respuestas:
Clip , 69
Entrada:
AB-
Salida:
{{"AB+", "AB-"}, {"A-", "B-", "AB-", "O-"}}
Explicación
Un tipo de sangre
x
puede cedery
si todosx
los antígenos están incluidosy
. El programa define la funciónF
como six
puede dar ay
, yT
como la lista de tipos.fuente
Java 8, 373
Explicación
Ejecútelo aquí: http://repl.it/e98/1
Tenga en cuenta que
static
tuvo que agregarse a cada método para llamarlos desde el método principal.fuente
Pyth,
615950Ejecútalo aquí.
Explicación:
fuente
CJam, 64 bytes
La
m*:s
parte viene de la respuesta Martin CJam . (Todavía no leí las otras partes).Todavía habrá algunos problemas serios porque nunca estarán seguros del orden de las dos listas. Y
Block ArrayList &
podría implementarse en versiones posteriores de CJam.Explicación
fuente
Javascript, 167
sin golf:
función de prueba:
La codificación del tipo de sangre en binario tiene la ventaja de que otro antígeno (por ejemplo, el antígeno de Kell ) se incorpora fácilmente al código simplemente agregando otro bit.
Donar sangre en Zurich, CH: Blutspende Zürich
fuente
"O-O+B-B+A-A+AB-AB+".match(/\w+\W/g)
lugar de"O- O+ B- B+ A- A+ AB- AB+".split(" ")
guardar 2 caracteres."O-1O+1B-1B+1A-1A+1AB-1AB+".split(1)
y el uso de la=>
función también debería guardar algunos./\w+./g
n=2;while(n--)
=>for(n=2;n--;)
http://jsfiddle.net/j2hep8e8/2/
CJam, 94 bytes
Wow, esto es largo ... aunque creo que probablemente podría jugar golf este enfoque por debajo de 80, creo que podría haberlo hecho mejor calculando primero la matriz y luego simplemente seleccionando la fila y columna correctas. De todos modos, aquí está:
Pruébalo aquí.
Agregaré una explicación cuando termine de jugar al golf.
fuente
Groovy, 115
La idea es codificar A, B y factor rhesus como un bit cada uno. Luego podemos invertir los bits para obtener todos los antígenos en el lado receptor y usarlo para verificar que no haya anticuerpos correspondientes en el lado donante. Esto es más o menos lo mismo que la solución JavaScript existente.
Ejecución de la muestra
fuente
Prolog,
119110 bytesObservaciones :
Tipos de sangre tienen las siguientes propiedades: cada vez que tiene una
-
(por ejemploa-
), se puede dar a las mismas personas como el que tienen equivalentes positiva de su grupo (por ejemploa
), así como su contrapartida negativa (por ejemplo,a
da aab
, por lo quea-
da aab
yab-
) En base a esta propiedad, y abusando un poco de las notaciones para hacer uso de los operadores menos y más, podemos factorizar muchos casos. Por favor dígame si lo encuentra aceptable . Si prefiere tener la sintaxis original (postfix), aquí hay una versión sin golf:Esto es Prolog, por lo que el entorno interactivo permite consultar todo según lo solicitado (ver ejemplo a continuación). Por supuesto, no tenemos listas estrictamente como salida, pero esto es equivalente. Naturalmente, también manejamos casos de error como consecuencia.
Ejemplo
Luego, ejecutamos
test
:... que, sin el formato adecuado, es la misma matriz que la dada en la pregunta.
Detalles
El predicado
g/2
es el dar relación:g(X,Y)
medios personas de tipo de sangre X pueden dar sangre a las personas de tipo de sangre Y .Encuentra receptores para el grupo
a
:Encuentra receptores para
orange_juice
(debería fallar):Encuentra donantes para
O-
:¿Quién puede dar qué? :
No entramos en un bucle de recursión infinito (fue el caso en las pruebas preliminares).
fuente
Python, 187 bytes
Enfoque diferente:
Probablemente se pueda jugar un poco más al golf.
Prueba:
Salida:
fuente
Rubí,
237232223221210207 bytesSe corrigieron algunas barras diagonales inversas extrañas en las expresiones regulares y se hizo para que solo imprima las listas en lugar de almacenarlas en variables y luego imprimirlas. ¡A veces te pierdes las cosas obvias cuando intentas jugar al golf!
Sin golf:
Básicamente, construyo una expresión regular personalizada para el tipo de sangre ingresado para verificar si puede donar a otro tipo de sangre. Luego repito los tipos de sangre y les aplico la misma expresión regular y verifico si pueden donar a la especificada.
Esto probablemente se pueda jugar aún más. Esta es la primera vez que intento jugar golf en código, je.
fuente
Python 2, 168 bytes
Este es el mismo método que la respuesta de Blackhole. Sale con un error si el parámetro no se encuentra en la lista de tipos.
Menos golfizado:
Ejecútalo aquí: http://repl.it/eaB
También probé otros cambios leves, pero no pude hacerlo más corto ...
fuente
PHP (287 bytes):
Sí, esto es bastante largo, pero funciona como se esperaba.
Es posible acortar mucho:
Esto no es fácil de leer y no fue fácil de escribir.
Funciona según lo previsto, generando los que puede dar y los que puede recibir en otra línea.
Esto requiere un parámetro de URL
T=
con el tipo.fuente
CJam, 80 bytes
Esto todavía es demasiado largo. Probablemente puedo reducir 4 a 5 bytes más.
Para cualquier entrada no válida, imprime una matriz vacía o arroja un error.
Pruébelo en línea aquí o ejecute todo el conjunto de pruebas
fuente
APL, 66
Pruébalo aquí
fuente
C, 224
De golf se muestra:
fuente
PHP -
215212206 bytesAquí está la versión sin golf:
Gracias a manatwork por guardar 4 bytes.
fuente
explode(1,'A+1O+1B+1AB+1A-1O-1B-1AB-')
. Y como no necesariamente mantenemos buenos hábitos de codificación, a veces usamos características obsoletas, como lasplit()
función.Perl, 107
112Finalmente, codificar los nombres de los tipos en números dio el código más corto.
Versión antigua
fuente
Pyth, 58
En parte lo mismo que la solución de orlp , pero algo diferente y completamente auto-diseñado.
Explicación
fuente
J, 120 bytes
La función falla en entradas no válidas. El gran número decimal es la codificación de la matriz de compatibilidad completa.
(Solución muy larga por múltiples razones).
Pruébelo en línea aquí.
fuente
05AB1E , 29 bytes
Pruébalo en línea!
fuente