Eine wenig bekannte Tatsache über Vampire ist, dass sie das Blut eines Opfers mit einer kompatiblen Spenderblutgruppe trinken müssen. Die Kompatibilitätsmatrix für Vampire ist die gleiche wie die normale Spender / Empfänger-Matrix für rote Blutkörperchen . Dies kann durch die folgende Tabelle des Amerikanischen Roten Kreuzes zusammengefasst werden
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-
Herausforderung
Schreiben Sie eine Funktion oder ein Programm, das eine Blutgruppe als Eingabe verwendet und zwei Listen ausgibt:
- die ungeordnete Liste der Typen, die eine Spende des Eingabetyps erhalten können
- die ungeordnete Liste der Typen, die dem Eingabetyp eine Spende geben können
Wenn Sie eine Funktion schreiben, stellen Sie bitte auch ein Testprogramm zum Aufrufen dieser Funktion mit einigen Beispielen bereit, damit ich sie problemlos testen kann. In diesem Fall würde das Testprogramm nicht auf Ihre Punktzahl angerechnet.
Eingang
Die Eingabe muss eine Zeichenfolge sein, die genau einen der 8 möglichen roten Blutkörperchentypen darstellt O−
O+
A−
A+
B−
B+
AB−
AB+
. Die Eingabe kann über die normalen Methoden (STDIN, Befehlszeilenargumente, Funktionsargumente usw.) erfolgen.
Wenn eine andere Eingabe erfolgt, muss das Programm / die Funktion eine leere Ausgabe zurückgeben oder einen Fehler auslösen. Normalerweise ist eine strenge Eingabeüberprüfung bei Code-Golf- Fragen nicht besonders wichtig , aber ich hatte das Gefühl, dass ich diese Regel hinzufügen sollte, wenn die Auswirkungen auf Leben und Tod falsch sind.
Ausgabe
Es werden zwei für Menschen lesbare Listen von Blutgruppen in dem für Ihre Sprache geeigneten Format ausgegeben. In besonderen Fällen, in denen eine der Ausgabelisten alle 8 Typen enthält, kann diese Liste optional durch eine einzelne Artikelliste mit ersetzt werden everyone
.
Die normale Ausgabe erfolgt an eine der normalen Stellen (STDOUT, Funktionsrückgabe usw.).
Andere Regeln
- Standardlücken sind verboten
- Sie können vorhandene Bibliotheken von Drittanbietern verwenden, sofern diese nicht ausdrücklich für diesen Zweck entwickelt wurden.
Beispiele
- Für die Eingabe
AB-
wären die beiden Ausgabelisten:{AB+, AB-}, {AB-, A-, B-, O-}
- Für die Eingabe
AB+
wären die beiden Ausgabelisten:{AB+}, {O−, O+, A−, A+, B−, B+, AB−, AB+}
oder{AB+}, {everyone}
Persönliche Notiz: Bitte überlegen Sie, ob Sie Blut spenden können. Ohne die Transfusion, die ich vor ein paar Jahren erhalten habe, könnte ich heute nicht hier sein, deshalb bin ich denen sehr dankbar, die spenden können!
quelle
Antworten:
Clip , 69
Eingang:
AB-
Ausgabe:
{{"AB+", "AB-"}, {"A-", "B-", "AB-", "O-"}}
Erläuterung
Eine Blutgruppe
x
kann geben,y
wenn allex
Antigene in enthalten sindy
. Das Programm definiert die FunktionF
als obx
geben kanny
, undT
als die Liste der Typen.quelle
Java 8, 373
Erläuterung
Führen Sie es hier aus: http://repl.it/e98/1
Beachten Sie, dass
static
zu jeder Methode hinzugefügt werden musste, um sie von der Hauptmethode aufzurufen.quelle
Pyth,
615950Führen Sie es hier aus.
Erläuterung:
quelle
CJam, 64 Bytes
Der
m*:s
Teil stammt aus Martins CJam-Antwort . (Die anderen Teile habe ich noch nicht gelesen.)Es wird immer noch einige ernsthafte Probleme geben, da sie sich über die Reihenfolge der beiden Listen nicht sicher sind. Und
Block ArrayList &
möglicherweise in späteren Versionen von CJam implementiert.Erläuterung
quelle
Javascript, 167
ungolfed:
Testfunktion:
Das Kodieren der Blutgruppe in binärer Form hat den Vorteil, dass ein anderes Antigen (z. B. das Kell-Antigen ) leicht in den Code eingebaut werden kann, indem nur ein weiteres Bit hinzugefügt wird.
Blutspende in Zürich, CH: Blutspende Zürich
quelle
"O-O+B-B+A-A+AB-AB+".match(/\w+\W/g)
anstelle von"O- O+ B- B+ A- A+ AB- AB+".split(" ")
2 Zeichen speichern."O-1O+1B-1B+1A-1A+1AB-1AB+".split(1)
und mit der=>
Funktion auch eine Zahl speichern./\w+./g
n=2;while(n--)
=>for(n=2;n--;)
http://jsfiddle.net/j2hep8e8/2/
CJam, 94 Bytes
Wow, das ist lang ... obwohl ich glaube, dass ich diesen Ansatz unter 80 Golf spielen könnte, hätte ich es vielleicht besser gemacht, wenn ich zuerst die Matrix berechnet und dann einfach die richtige Zeile und Spalte ausgewählt hätte. Wie auch immer, hier ist es:
Teste es hier.
Ich werde eine Erklärung hinzufügen, wenn ich mit dem Golfen fertig bin.
quelle
Groovy, 115
Die Idee ist, A, B und Rhesusfaktor jeweils als ein Bit zu codieren. Wir können dann die Bits invertieren, um alle Antigene auf der Empfängerseite zu erhalten und damit zu überprüfen, ob auf der Geberseite keine entsprechenden Antikörper vorhanden sind. Dies entspricht in etwa der vorhandenen JavaScript-Lösung.
Beispielausführung
quelle
Prolog,
119110 BytesBemerkungen :
Blutgruppen haben die folgenden Eigenschaften: Jedes Mal, wenn Sie eine haben
-
(z. B.a-
), können Sie denselben Personen wie denen, die ein positives Äquivalent zu Ihrer Gruppe haben (z. B.a
), sowie deren negatives Gegenstück geben (z. B.a
gibtab
, alsoa-
gibt)ab
undab-
). Basierend auf dieser Eigenschaft und wenn wir die Notationen ein wenig missbrauchen , um die Minus- und Plus-Operatoren zu verwenden, können wir viele Fälle berücksichtigen. Bitte sagen Sie mir, wenn Sie es akzeptabel finden . Wenn Sie die ursprüngliche (Postfix-) Syntax bevorzugen, finden Sie hier eine nicht-golfende Version:Dies ist Prolog, daher kann in der interaktiven Umgebung alles wie gewünscht abgefragt werden (siehe Beispiel unten). Zugegeben, wir haben keine Listen als Ausgabe, aber das ist äquivalent. Als Folge behandeln wir natürlich auch Fehlerfälle.
Beispiel
Dann führen wir aus
test
:... die ohne richtige Formatierung dieselbe Matrix wie die in der Frage angegebene ist.
Einzelheiten
Das Prädikat
g/2
ist die Give- Beziehung:g(X,Y)
bedeutet, dass Personen der Blutgruppe X Blut an Personen der Blutgruppe Y geben können .Empfänger für Gruppe suchen
a
:Empfänger finden für
orange_juice
(sollte fehlschlagen):Spender finden für
O-
:Wer kann was geben? :
Wir gehen nicht in eine unendliche Rekursionsschleife (das war bei Vorversuchen der Fall).
quelle
Python, 187 Bytes
Anderer Ansatz:
Kann wohl etwas mehr golfen werden.
Prüfung:
Ausgabe:
quelle
Ruby,
237232223221210207 BytesEinige überflüssige Backslashes in den regulären Ausdrücken wurden korrigiert und so angepasst, dass die Listen nur gedruckt und nicht in Variablen gespeichert und dann gedruckt werden. Manchmal vermisst man die offensichtlichen Dinge beim Golfspielen!
Ungolfed:
Grundsätzlich konstruiere ich einen benutzerdefinierten regulären Ausdruck für die eingegebene Blutgruppe, um zu überprüfen, ob Sie für eine andere Blutgruppe spenden können. Ich durchlaufe dann die Blutgruppen und wende denselben regulären Ausdruck auf sie an und überprüfe, ob sie für die angegebene Blutgruppe spenden können.
Damit lässt sich wohl noch mehr Golf spielen. Dies ist mein erster Versuch, Codegolf zu spielen, heh.
quelle
Python 2, 168 Bytes
Dies ist die gleiche Methode wie Blackholes Antwort. Wird mit einem Fehler beendet, wenn der Parameter nicht in der Typenliste gefunden wird.
Weniger golfen:
Führen Sie es hier aus: http://repl.it/eaB
Ich habe auch ein paar andere kleine Änderungen versucht, konnte es aber nicht kürzer machen ...
quelle
PHP (287 Bytes):
Ja, das ist ziemlich lang, aber es funktioniert wie erwartet.
Es kann möglich sein, eine Menge zu verkürzen:
Dies ist nicht leicht zu lesen und zu schreiben.
Es funktioniert wie beabsichtigt und gibt diejenigen aus, die Sie geben und die Sie von einer anderen Leitung empfangen können.
Dies erfordert einen URL-Parameter
T=
mit dem Typ.quelle
CJam, 80 Bytes
Das ist noch zu lang. Wahrscheinlich kann ich 4 bis 5 Bytes mehr abschneiden.
Bei ungültigen Eingaben wird entweder ein leeres Array gedruckt oder ein Fehler ausgegeben.
Probieren Sie es hier online aus oder führen Sie die gesamte Testsuite aus
quelle
APL, 66
Probieren Sie es hier aus.
quelle
C 224
Entgolft zeigt es:
quelle
PHP -
215212206 BytesHier ist die ungolfed Version:
Dank an manatwork für die Einsparung von 4 Bytes.
quelle
explode(1,'A+1O+1B+1AB+1A-1O-1B-1AB-')
. Und da wir nicht unbedingt mit guten Codierungsgewohnheiten Schritt halten müssen, verwenden wir manchmal veraltete Features wie diesplit()
Funktion.Perl 107,
112Das abschließende Codieren der Typnamen in Zahlen ergab den kürzeren Code.
Ältere Version
quelle
Pyth, 58
Teilweise die gleiche Lösung wie bei orlp , aber etwas anders und vollständig selbst gestaltet.
Erläuterung
quelle
J, 120 Bytes
Die Funktion schlägt bei ungültigen Eingaben fehl. Die große Dezimalzahl ist die Kodierung der vollständigen Kompatibilitätsmatrix.
(Sehr lange Lösung aus mehreren Gründen.)
Probieren Sie es hier online aus.
quelle
05AB1E , 29 Bytes
Probieren Sie es online!
quelle