Mało znanym faktem na temat wampirów jest to, że muszą pić krew ofiary, która ma zgodną grupę krwi dawcy. Matryca zgodności dla wampirów jest taka sama jak zwykła matryca dawcy / biorcy krwinek czerwonych . Można to podsumować poniższą tabelą Amerykańskiego Czerwonego Krzyża
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-
Wyzwanie
Napisz funkcję lub program, który pobiera grupę krwi jako dane wejściowe i wyświetla dwie listy:
- nieuporządkowana lista typów, które mogą otrzymać darowiznę typu wejściowego
- nieuporządkowana lista typów, które mogą dawać darowiznę na typ wejściowy
Jeśli piszesz funkcję, podaj również program testowy, aby wywołać tę funkcję z kilkoma przykładami, dzięki czemu mogę ją łatwo przetestować. W takim przypadku program testowy nie wlicza się do wyniku.
Wkład
Dane wejściowe muszą być ciągiem reprezentującym dokładnie jeden z 8 możliwych rodzajów krwinek czerwonych O−
O+
A−
A+
B−
B+
AB−
AB+
. Dane wejściowe można podawać zwykłymi metodami (STDIN, argumenty wiersza poleceń, argumenty funkcji itp.).
Jeśli podano inne dane, program / funkcja musi zwrócić puste wyjście lub zgłosić błąd. Zwykle ścisłe sprawdzanie danych wejściowych nie jest świetne w przypadku pytań do golfa , ale czułem, że biorąc pod uwagę konsekwencje śmierci w wyniku pomyłki grup krwi, powinienem dodać tę zasadę.
Wydajność
Wynikiem będą dwie czytelne dla człowieka listy grup krwi w dowolnym formacie odpowiednim dla twojego języka. W szczególnych przypadkach, gdy jedna z list wyników zawiera wszystkie 8 typów, tę listę można opcjonalnie zastąpić pojedynczą listą pozycji zawierającą everyone
.
Normalne wyjście trafi do jednego z normalnych miejsc (STDOUT, powrót funkcji itp.).
Inne zasady
- Standardowe luki są zabronione
- Możesz korzystać z wszelkich istniejących bibliotek stron trzecich, których potrzebujesz, o ile nie są one specjalnie zaprojektowane do tego celu.
Przykłady
- W przypadku danych wejściowych
AB-
dwie listy wyjściowe będą następujące:{AB+, AB-}, {AB-, A-, B-, O-}
- W przypadku danych wejściowych
AB+
dwie listy wyjściowe to:{AB+}, {O−, O+, A−, A+, B−, B+, AB−, AB+}
lub{AB+}, {everyone}
Notatka osobista: Jeśli to możliwe, rozważ oddanie krwi. Bez transfuzji, którą otrzymałem kilka lat temu, być może nie byłoby mnie dzisiaj, więc jestem bardzo wdzięczny tym, którzy są w stanie przekazać darowiznę!
źródło
Odpowiedzi:
Klip , 69
Wkład:
AB-
Wydajność:
{{"AB+", "AB-"}, {"A-", "B-", "AB-", "O-"}}
Wyjaśnienie
Grupa krwi
x
może dać,y
jeśli wszystkiex
antygeny są zawarte wy
. Program definiuje funkcjęF
jako, czyx
może dawaćy
iT
jako listę typów.źródło
Java 8, 373
Wyjaśnienie
Uruchom tutaj: http://repl.it/e98/1
Zauważ, że
static
trzeba było dodać do każdej metody, aby wywołać je z metody głównej.źródło
Pyth,
615950Uruchom tutaj.
Wyjaśnienie:
źródło
CJam, 64 bajty
m*:s
Część pochodzi od Marcina CJam odpowiedź . (Nie przeczytałem jeszcze innych części).Nadal będą występować poważne problemy, ponieważ nigdy nie będą pewni kolejności dwóch list. I
Block ArrayList &
może być zaimplementowany w późniejszych wersjach CJam.Wyjaśnienie
źródło
JavaScript, 167
bez golfa:
funkcja testowania:
Kodowanie grupy krwi w postaci binarnej ma tę zaletę, że inny antygen (np. Antygen Kell ) można łatwo włączyć do kodu, po prostu dodając kolejny bit.
Oddaj krew w Zurychu, CH: Blutspende Zürich
źródło
"O-O+B-B+A-A+AB-AB+".match(/\w+\W/g)
zamiast"O- O+ B- B+ A- A+ AB- AB+".split(" ")
zapisać 2 znaki."O-1O+1B-1B+1A-1A+1AB-1AB+".split(1)
a użycie=>
funkcji również powinno zaoszczędzić./\w+./g
n=2;while(n--)
=>for(n=2;n--;)
http://jsfiddle.net/j2hep8e8/2/
CJam, 94 bajty
Wow, to jest długie ... chociaż myślę, że prawdopodobnie mógłbym grać w golfa przy podejściu poniżej 80, myślę, że lepiej by było, najpierw obliczając matrycę, a następnie wybierając właściwy wiersz i kolumnę. W każdym razie tutaj jest:
Sprawdź to tutaj.
Dodam wyjaśnienie, kiedy skończę grać w golfa.
źródło
Groovy, 115
Chodzi o to, aby zakodować współczynnik A, B i Rhesus po jednym bicie. Możemy następnie odwrócić bity, aby uzyskać wszystkie antygeny po stronie otrzymującej i użyć go do sprawdzenia, czy po stronie dawcy nie ma odpowiadających przeciwciał. Jest to mniej więcej to samo, co istniejące rozwiązanie JavaScript.
Przykładowe wykonanie
źródło
Prolog,
119110 bajtówUwagi :
Grupy krwi mają następujące właściwości: za każdym razem, gdy masz
-
(np.a-
), Możesz dawać tym samym osobom, co ten, który ma dodatni ekwiwalent twojej grupy (np.a
), A także ich negatywnemu odpowiednikowi (np.a
Dajeab
, więca-
dajeab
iab-
). Opierając się na tej właściwości i nieco nadużywając notacji, aby skorzystać z operatorów minus i plus, możemy uwzględnić wiele przypadków. Poinformuj mnie, jeśli uznasz to za dopuszczalne . Jeśli wolisz oryginalną składnię (postfiks), oto wersja bez gry w golfa:To jest Prolog, więc środowisko interaktywne pozwala zapytać o wszystko zgodnie z żądaniem (patrz przykład poniżej). To prawda, że nie mamy list wyłącznie jako danych wyjściowych, ale jest to równoważne. W konsekwencji naturalnie zajmujemy się także przypadkami błędów.
Przykład
Następnie wykonujemy
test
:... która bez odpowiedniego formatowania jest taką samą matrycą jak ta podana w pytaniu.
Detale
Orzeczenie
g/2
to dać związki:g(X,Y)
Środki ludzi krwi typu X mogą dać krwi ludzi krwi typu Y .Znajdź odbiorniki dla grupy
a
:Znajdź odbiorniki dla
orange_juice
(powinien zawieść):Znajdź dawców dla
O-
:Kto może dać? :
Nie wchodzimy w nieskończoną pętlę rekurencyjną (tak było w testach wstępnych).
źródło
Python, 187 bajtów
Odmienne podejście:
Prawdopodobnie można go trochę pograć w golfa.
Test:
Wydajność:
źródło
Rubinowy,
237232223221210207 bajtówNaprawiono niektóre obce ukośniki odwrotne w wyrażeniach regularnych i sprawiło, że drukuje listy w przeciwieństwie do przechowywania ich w zmiennych, a następnie drukowania. Czasami brakuje ci oczywistych rzeczy podczas gry w golfa!
Nie golfowany:
Zasadniczo tworzę niestandardowe wyrażenie regularne dla wprowadzonej grupy krwi, aby sprawdzić, czy możesz przekazać darowiznę na inną grupę krwi. Następnie iteruję grupy krwi i stosuję wobec nich ten sam regex i sprawdzam, czy mogą przekazać darowiznę na rzecz określonego.
Prawdopodobnie można to jeszcze pograć w golfa. To jest moja pierwsza próba golfa kodowego, heh.
źródło
Python 2, 168 bajtów
Jest to ta sama metoda, co odpowiedź Blackhole. Wychodzi z błędem, jeśli parametru nie ma na liście typów.
Mniej golfa:
Uruchom tutaj: http://repl.it/eaB
Próbowałem też kilku innych drobnych zmian, ale nie mogłem tego skrócić ...
źródło
PHP (287 bajtów):
Tak, to jest dość długie, ale działa zgodnie z oczekiwaniami.
Może być możliwe znaczne skrócenie:
Nie jest to łatwe do odczytania i nie było łatwe do napisania.
Działa zgodnie z przeznaczeniem, generując te, które możesz dać i te, które możesz otrzymać w innej linii.
Wymaga to parametru adresu URL
T=
z typem.źródło
CJam, 80 bajtów
To wciąż za długo. Prawdopodobnie mogę ogolić jeszcze 4 do 5 bajtów.
W przypadku każdego nieprawidłowego wejścia drukuje pustą tablicę lub zgłasza błąd.
Wypróbuj online tutaj lub uruchom cały pakiet testowy
źródło
APL, 66
Wypróbuj tutaj.
źródło
C 224
Gra w golfa pokazuje:
źródło
PHP -
215212206 bajtówOto wersja bez golfa:
Dzięki manatwork do zapisywania 4 bajty.
źródło
explode(1,'A+1O+1B+1AB+1A-1O-1B-1AB-')
. A ponieważ niekoniecznie nadążamy za przyjemnymi nawykami kodowania, czasami używamy przestarzałych funkcji, takich jaksplit()
funkcja.Perl, 107
112Ostatecznie kodowanie nazw typów w liczbach dało krótszy kod.
Starsza wersja
źródło
Pyth, 58
Częściowo to samo, co rozwiązanie Orlp , ale nieco inne i całkowicie samodzielnie zaprojektowane.
Wyjaśnienie
źródło
J, 120 bajtów
Funkcja zawodzi przy nieprawidłowych wejściach. Duża liczba dziesiętna to kodowanie macierzy pełnej zgodności.
(Bardzo długie rozwiązanie z wielu powodów.)
Wypróbuj online tutaj.
źródło
05AB1E , 29 bajtów
Wypróbuj online!
źródło