吸血鬼の互換性


28

吸血鬼に関するほとんど知られていない事実は、彼らが適合ドナー血液型を持っている犠牲者の血液を飲まなければならないということです。吸血鬼の互換性マトリックスは、通常の赤血球ドナー/レシピエントマトリックスと同じです。これは、次のアメリカ赤十字社の表で要約できます

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-

チャレンジ

入力として血液型を受け取り、2つのリストを出力する関数またはプログラムを作成します。

  1. 入力型の寄付を受け取る可能性のある型の順序なしリスト
  2. 入力型に寄付を与える可能性のある型の順序なしリスト

関数を記述する場合は、いくつかの例を使用してその関数を呼び出すテストプログラムも提供してください。そうすれば、簡単にテストできます。この場合、テストプログラムはスコアにカウントされません。

入力

入力は、8つの可能な赤血球タイプの1つを正確に表す文字列でなければなりませんO− O+ A− A+ B− B+ AB− AB+。入力は通常の方法(STDIN、コマンドライン引数、関数引数など)を介して与えることができます。

他の入力が与えられた場合、プログラム/関数は空の出力を返すか、エラーをスローする必要があります。通常、質問では厳密な入力チェックは素晴らしいことではありませんが、血液型を間違えることによる生死の影響を考えると、このルールを追加する必要があると感じました。

出力

出力は、あなたの言語に適した形式の人間が読める2つの血液型のリストになります。出力リストの1つに8つのタイプすべてが含まれる特別な場合、このリストはオプションでを含む単一のアイテムリストに置き換えることができますeveryone

通常の出力は、通常の場所(STDOUT、関数リターンなど)の1つに送られます。

その他の規則

  • 標準的な抜け穴は禁止されています
  • この目的のために明示的に設計されていない限り、必要な既存のサードパーティライブラリを使用できます。

  • 入力のAB-場合、2つの出力リストは次のようになります。{AB+, AB-}, {AB-, A-, B-, O-}
  • 入力のAB+場合、2つの出力リストは次のようになります。{AB+}, {O−, O+, A−, A+, B−, B+, AB−, AB+}または{AB+}, {everyone}

個人的な注意:できれば献血を検討してください。数年前に受け取った輸血なしでは、今日ここにいないかもしれないので、寄付できる人にとても感謝しています!


@MartinBüttner実際、私は両方を受け入れます。ほとんどの場合、2番目の形式はより短いコードを生成しますが、おそらく最初の形式を使用した方が短い可能性がある特別なケースがあります。
デジタル外傷



1
@leftaroundaboutありがとう-少しのフライとローリーはいつも私のお気に入りです!
デジタル外傷

1
うるさい吸血鬼、え?ドラキュラはhisを回しています。また、タイトルは、引退したゴスロックバンドの名前のように聞こえます。
レナエライダー

回答:


9

クリップ、69

*cTx\{fFx`Tf[tFtx}T`[Fx[y!VVx"O-"Vy"O-"}[TC"A+ B+ AB+ O+ A- B- AB- O-

入力: AB-

出力: {{"AB+", "AB-"}, {"A-", "B-", "AB-", "O-"}}

説明

血液型xyすべてxの抗原がに含まれる場合に与えることができますy。プログラムは、に与えることができるFかどうか、および型のリストとして関数を定義します。xyT

*cTx                 .- If T contains x (the input)         -.
    \                .- Print                               -.
     {             ` .- a list of                           -.
      fFx`T          .- filter each t in T with F(x,t)      -.
           f[tFtx}T  .- filter each t in T with F(t,x)      -.

[Fx[y              } .- F is a function of x and y          -.
     !V              .- all letters of ... are included in ...   -.
       Vx"O-"        .- x, with O and - removed             -.
             Vy"O-"  .- y, with O and - removed             -. 

[TC"A+ B+ AB+ O+ A- B- AB- O-   .- T is the list of types -.

6

Java 8、373

import java.util.*;void f(String s){List<String>l=new ArrayList(Arrays.asList("A+,B+,AB+,O+,A-,B-,AB-,O-".split(","))),m=new ArrayList(l);int i=l.contains(s)?1:0/0;l.removeIf(x->g(s,x)<1);m.removeIf(x->g(x,s)<1);System.out.print(l+","+m);}int g(String s,String t){for(char c:s.replaceAll("O|-","").toCharArray())if(!t.replaceAll("O|-","").contains(""+c))return 0;return 1;}

説明

void f(String s) {
    List<String> l = new ArrayList(Arrays.asList("A+,B+,AB+,O+,A-,B-,AB-,O-".split(","))),
                 m = new ArrayList(l);
    int i = l.contains(s) ? 1 : 0 / 0;
    l.removeIf(x -> g(s, x) < 1);
    m.removeIf(x -> g(x, s) < 1);
    System.out.print(l + "," + m);
}

int g(String s, String t) {
    for (char c : s.replaceAll("O|-", "").toCharArray()) {
        if (!t.replaceAll("O|-", "").contains("" + c)) {
            return 0;
        }
    }
    return 1;
}

ここで実行します:http : //repl.it/e98/1

staticメインメソッドから呼び出すには、各メソッドに追加する必要があることに注意してください。


2
簡単に実行できるプログラムへのリンクを追加しました。mainメソッドの関数呼び出し内の文字列パラメーターを編集して、他の入力の出力を確認します。
mbomb007

5

ピス、61 59 50

L-{b"O-"M!-yGyHJmsd*c"A O B AB"d"+-"I}zJfgzTJfgYzJ

ここで実行します。

説明:

L-{b"O-"                         Create function y(b) that makes a set from b's 
                                 characters minus O and -.
M!-yGyH                          Create function g(G,H) that checks if y(G) is 
                                 a subset of y(H).
J                                Assign to J...
 msd                             The concatenation of every element in...
    *c"A O B AB"d"+-"            The Cartesian product of A O B AB and + -.
I}zJ                             If input in J then...
    fgzTJ                        Print all elements e in J if g(input, e).
    fgYzJ                        Print all elements e in J if g(e, input).

@ user23013編集ありがとうございます。それは間違いなくデカルトであるべきです:)
orlp

4

CJam、64バイト

"AB"_a+'O+"+-"m*:s:TT{}+Tqa#=a+T4=f&_)f{\-!}\)f-:!]{T]z::*La-p}/

m*:s一部はから来ているマーティンのCJamの答え。(他の部分はまだ読んでいません。)

2つのリストの順序がわからないため、まだ深刻な問題がいくつかあります。またBlock ArrayList &、CJamの以降のバージョンで実装される可能性があります。

説明

"AB"_a+'O+         " Generate ['A 'B \"AB\" 'O]. ";
"+-"m*:s:T         " Generate the list of blood types and store in T. ";
T{}+
    Tqa#           " Find the input in T. ";
=                  " Find the blood type by the index.
                     If not found, return a block to cause an error. ";
a+                 " Append the verified input to T. ";
T4=                " AB+. ";
f&                 " Intersect each blood type with AB+. ";
_)f{\-!}           " Check emptiness of input - each item. ";
\)f-:!             " Check emptiness of each item - input. ";
]{                 " For both lists: ";
    T]z::*         " Replace items in T where there is a 0 with empty strings. ";
    La-            " Remove empty strings. ";
    p              " Print. ";
}/

3

Javascript、167

p=function(t){o="";if((x=(l="O- O+ B- B+ A- A+ AB- AB+".split(" ")).indexOf(t))<0)return;n=2;while(n--){y=8;while(y--)if([y,x][n]-(y&x)==0)o+=" "+l[y];o+=";"}return o}

なし:

function p(btype){
    output = "";
    btypeList = "O- O+ B- B+ A- A+ AB- AB+".split(" ");

    btypeInt = btypeList.indexOf(btype);
    // thus we have the scheme
    // btypeInt = 0b(has A antigen)(has B antigen)(has rhesus antigen)

    if(btypeInt < 0) // i.e. broken blood type string
        return;

    for(receiving = 7; receiving >= 0; receiving--)
        if(giving - (receiving & btypeInt) == 0)
            // i.e. the receiving person has at least all the antigens of our donor
            output += " " + btypeList[receiving];

    output += ";";

    for(giving = 7; giving >= 0; giving--)
        if(btypeInt - (receiving & btypeInt) == 0)
            // i.e. the giving person has no antigens that our patient doesn't have
            output += " " + btypeList[receiving];

    return output;
}

テスト機能:

function tester(){
    btypeList = "O- O+ B- B+ A- A+ AB- AB+".split(" ");
    for(i=0; i<8; i++){
        console.log("Patient is " + btypeList[i])
        console.log(p(btypeList[i]))
    }
    console.log("Erroneous blood type => returns void:")
    console.log(p("asdf"))
}

血液型をバイナリでエンコードすることには、別のビットを追加するだけで、別の抗原(たとえばKell抗原)をコードに簡単に組み込むことができるという利点があります。


チューリッヒ、CHで献血BlutspendeZürich


"O-O+B-B+A-A+AB-AB+".match(/\w+\W/g)代わりに使用"O- O+ B- B+ A- A+ AB- AB+".split(" ")して、2文字を保存できます。
オリオール

または、区切り文字を数値に"O-1O+1B-1B+1A-1A+1AB-1AB+".split(1)して、=>関数を使用することでまったく同じものを保存することもできます。
red-X

A:はい、しかし、@オリオールさんは、さらに1つの文字で正規表現に短縮することができます/\w+./g
manatwork

while()の代わりに常にfor(;;)を使用してください。少なくとも同じ長さですが、短くすることもできます。n=2;while(n--)=>for(n=2;n--;)
edc65

全体として、非常に賢い。標準のゴルフのトリックを使用して147に短縮することができます:http://jsfiddle.net/j2hep8e8/2/
edc65

2

CJam、94バイト

うわー、これは長いです...おそらくこのアプローチを80未満でゴルフできると思いますが、最初にマトリックスを計算し、次に正しい行と列を選択することでより良くできたと思います。とにかく、ここにあります:

'O'A'B"AB"]:A"+-"m*:sq_a@&!!*_)'++_&\"AB"&A{1$\-!},\;\m*::+p)'-+_&\"AB"&A1>{1$-!},'O+\;\m*::+p

ここでテストしてください。

ゴルフが終わったら説明を追加します。


2

グルーヴィー、115

x={i=(l=('O-O+B-B+A-A+AB-AB+'=~/\w+./)[0..7]).indexOf(it);f=(0..7).&findAll;i<0?[]:[l[f{!(~it&i)}],l[f{!(it&~i)}]]}

考え方は、A、B、およびアカゲザルの因子をそれぞれ1ビットとしてエンコードすることです。次に、ビットを反転させて、受信側のすべての抗原を取得し、それを使用して、提供側に対応する抗体がないことを確認します。これは、既存のJavaScriptソリューションとほぼ同じです。

サンプル実行

groovy> println x("AB+") 
groovy> println x("AB-") 
groovy> println x("A+") 
groovy> println x("A-") 
groovy> println x("B+") 
groovy> println x("B-") 
groovy> println x("O+") 
groovy> println x("O-") 
groovy> println x("X") 

[[AB+], [O-, O+, B-, B+, A-, A+, AB-, AB+]]
[[AB-, AB+], [O-, B-, A-, AB-]]
[[A+, AB+], [O-, O+, A-, A+]]
[[A-, A+, AB-, AB+], [O-, A-]]
[[B+, AB+], [O-, O+, B-, B+]]
[[B-, B+, AB-, AB+], [O-, B-]]
[[O+, B+, A+, AB+], [O-, O+]]
[[O-, O+, B-, B+, A-, A+, AB-, AB+], [O-]]
[]

2

プロローグ、119 110バイト

u(A,B):-member(A:B,[a:ab,b:ab,o:a,o:b,o:ab]);A=B,member(A,[a,ab,b,o]).
g(X,Y):-(X= -A;X=A),(Y= -B;Y=B),u(A,B).

備考

  1. 血液型は、次のプロパティがあります。毎回あなたが持っている-(例えばa-)、あなたはあなたのグループの正当量(例えばを持っているのと同じ人々に与えることができますa)、並びにそれらの負の相手(例えばaに与えab、そうa-に与えますabおよびab-)。このプロパティに基づいて、表記を少し乱用してマイナス演算子とプラス演算子を使用することで、多くのケースを考慮することができます。あなたがそれを受け入れられると思うなら私に言ってください。元の(後置)構文を使用する場合は、ゴルフを使用しないバージョンを以下に示します。

    blood(X):-member(R,['a+','o+','b+','ab+','a-','b-','ab-']).
    give('o-',R):-blood(R).
    give(X,X):-blood(X).
    give('a+','ab+').
    give('b+','ab+').
    give('o+','a+').
    give('o+','b+').
    give('o+','ab+').
    give('a-','a+').
    give('a-','ab+').
    give('a-','ab-').
    give('b-','b+').
    give('b-','ab+').
    give('b-','ab-').
    give('ab-','ab+').
    
  2. これはPrologであるため、対話型環境では、要求に応じてすべてを照会できます(以下の例を参照)。確かに、出力としてのリストは厳密にはありませんが、これは同等です。結果としてエラーケースも当然処理します。

donors(X,L) :- findall(Y,g(Y,X),L).
receivers(X,L) :- findall(Y,g(X,Y),L).

test :-
    member(X,[a,o,b,ab,-a,-o,-b,-ab]),
    donors(X,D),
    receivers(X,R),
    writeln(X:give_to(R):receive_from(D)),
    fail.
test.

次に、実行しtestます:

a : give_to([ab, a]) : receive_from([o, a])
o : give_to([a, b, ab, o]) : receive_from([o])
b : give_to([ab, b]) : receive_from([o, b])
ab : give_to([ab]) : receive_from([a, b, o, ab])
-(a) : give_to([+(ab), +(a), -(ab), -(a)]) : receive_from([-(o), -(a)])
-(o) : give_to([+(a), +(b), +(ab), +(o), -(a), -(b), -(ab), -(o)]) : receive_from([-(o)])
-(b) : give_to([+(ab), +(b), -(ab), -(b)]) : receive_from([-(o), -(b)])
-(ab) : give_to([+(ab), -(ab)]) : receive_from([-(a), -(b), -(o), -(ab)])

...これは、適切な書式設定なしでは、質問で与えられたものと同じマトリックスです。

詳細

述語g/2は「与える」関係です。g(X,Y)つまり、血液型Xの人々は血液型Yの人々に血液を提供することができます

グループの受信者を検索a

[eclipse]: g(a,R).    

R = ab
Yes (0.00s cpu, solution 1, maybe more) ? ;

R = a
Yes (0.00s cpu, solution 2)

orange_juice(失敗する)の受信者を見つける:

[eclipse] g(orange_juice,L).

No (0.00s cpu)

の寄付者を探すO-

[eclipse] g(X,-o).

X = -(o)
Yes (0.00s cpu)

誰が何を与えることができますか?:

[eclipse] g(X,Y).

.... 27 answers ....

無限再帰ループに入ることはありません(予備テストの場合)。


1

Python、187バイト

別のアプローチ:

def D(a,b):X=lambda c:c in a and 1-(c in b);return(X('A')+X('B')+X('+'))<1
T="O- O+ A- A+ B- B+ AB- AB+".split()
X=lambda t:(0,([u for u in T if D(t,u)],[u for u in T if D(u,t)]))[t in T]

おそらくもう少しゴルフすることができます。

テスト:

for t in T + ["zz"]:
    print t, X(t)

出力:

O- (['O-', 'O+', 'A-', 'A+', 'B-', 'B+', 'AB-', 'AB+'], ['O-'])
O+ (['O+', 'A+', 'B+', 'AB+'], ['O-', 'O+'])
A- (['A-', 'A+', 'AB-', 'AB+'], ['O-', 'A-'])
A+ (['A+', 'AB+'], ['O-', 'O+', 'A-', 'A+'])
B- (['B-', 'B+', 'AB-', 'AB+'], ['O-', 'B-'])
B+ (['B+', 'AB+'], ['O-', 'O+', 'B-', 'B+'])
AB- (['AB-', 'AB+'], ['O-', 'A-', 'B-', 'AB-'])
AB+ (['AB+'], ['O-', 'O+', 'A-', 'A+', 'B-', 'B+', 'AB-', 'AB+'])
zz 0

1

ルビー、237の 232 223 221 210 207バイト

正規表現の余分なバックスラッシュを修正し、変数に保存してから印刷するのではなく、リストを印刷するようにしました。ゴルフをしようとすると、明らかなことを見逃すことがあります!

o=->b{Regexp.new b.gsub(?O,?.).gsub(?+,'.?\\\+').gsub'-','.?(\W)'};b=gets.chop;t=["A+","B+","AB+","O+","A-","B-","AB-","O-"];exit if !t.include? b;p t.reject{|x|!x.match o.(b)};p t.reject{|x|!b.match o.(x)}

ゴルフをしていない:

#!/usr/bin/ruby
b=gets.chomp;
types = ["A+","A-","B+","B-","AB+","AB-","O+","O-"];
exit if !types.include?(b);
regex1 = Regexp.new b.gsub("O",".").gsub('+','.?\\\+').gsub('-','.?(\\\+|\\\-)')
donate = types.reject {|x|!x.match(regex1)};
p donate;
receive = types.reject {|x| regex2 = Regexp.new x.gsub("O",".").gsub('+','.?\\\+').gsub('-','.?(\\\+|\\\-)'); !b.match(regex2)};
p receive;

基本的に、入力した血液型のカスタム正規表現を作成して、別の血液型に寄付できるかどうかを確認します。次に、血液型を反復処理し、同じ正規表現を血液型に適用して、指定された血液型に寄付できるかどうかを確認します。

これはおそらくさらにゴルフダウンすることができます。コードゴルフを試みるのは初めてです。


1

Python 2、168バイト

これは、Blackholeの答えと同じ方法です。パラメータが型のリストに見つからない場合、エラーで終了します。

def f(t):l='A+ O+ B+ AB+ A- O- B- AB-'.split();c=[9,15,12,8,153,255,204,136];i=l.index(t);print[s for s in l if c[i]&1<<l.index(s)],[s for s in l if c[l.index(s)]&1<<i]

少ないゴルフ:

def f(t):
    l = 'A+ O+ B+ AB+ A- O- B- AB-'.split()
    c = [9, 15, 12, 8, 153, 255, 204, 136]
    i = l.index(t)
    x = [s for s in l if c[i] & 1 << l.index(s)]
    y = [s for s in l if c[l.index(s)] & 1 << i]
    print x, y

ここで実行:http : //repl.it/eaB

私は他にもいくつかのわずかな変更を試みましたが、短くすることができませんでした...

#172 bytes
def f(t):l='A+ O+ B+ AB+ A- O- B- AB-'.split();c=[9,15,12,8,153,255,204,136];a=lambda x:l.index(x);i=a(t);print[s for s in l if c[i]&1<<a(s)],[s for s in l if c[a(s)]&1<<i]

#171 bytes
def f(t):l='A+ O+ B+ AB+ A- O- B- AB-'.split();c=[9,15,12,8,153,255,204,136];a=lambda x:l.index(x);print[s for s in l if c[a(t)]&1<<a(s)],[s for s in l if c[a(s)]&1<<a(t)]

1

PHP(287バイト):

ええ、これはかなり長いですが、期待通りに機能します。

大幅に短縮できる場合があります。

!preg_match('@^(AB?|B|O)[+-]$@',$t=$_GET[T])&&die("$t invalid");$S=array_flip($D=split(0,'O+0A+0B+0AB+0O-0A-0B-0AB-'));$L=[[1230,40],[13,1504],[23,2604],[3,$r=12345670],[$r,4],[1537,54],[2637,64],[37,7564]];for($j=0;$j<2;){foreach(str_split($L[$S[$t]][$j++])as$v)echo$D[$v].' ';echo'
';}

これは読みやすくなく、書くのも簡単ではありませんでした。

意図したとおりに機能し、提供できるものと受信できるものを別の行に出力します。

これにはT=、タイプのURLパラメーターが必要です。


1

CJam、80バイト

これはまだ長すぎます。おそらく4〜5バイトを削ることができます。

U1023_XKC30D]2/La+"AB"a"OAB"1/+:Mr):P;a#=_P"+-":G&+!!{AfbMff=G1/Pf|]z{~m*:s}%}*`

無効な入力については、空の配列を出力するか、エラーをスローします。

ここでオンラインで試す、テストスイート全体を実行してください


物ggingいのXKCDは意図されていますか?
イプニプン

@Ypnypn物ggingい?最初は意図していませんでしたが、そのようになりました。たぶん世界は...私たちに何かを伝えようとしている
オプティマイザ

申し訳ありませんが、私は始めました
イプニプン

1

APL、66

(↓⊃∧/(↓t∘.∊v)(≥,[.5]≤)¨t∊⊃v⌷⍨v⍳⊂⍞)/¨⊂v←,'+-'∘.,⍨('O'∘,,⊂)2↑t←'AB+'

ここで試してみてください。


たぶん66文字ですが、間違いなく66バイトではありません。質問は、何が得点に使用されているかを言っていません。
orlp

1
@orlp code-golfはデフォルトでバイト単位で記録されます(タグwikiを参照)。しかし、1文字が1バイトのAPLコードページがあると言われています。ただし、最近使用されているAPLコードページは正確にはわかりません。
jimmy23013

@orlpは「バイト」ですが、「UTF-8バイト」ではありません。これらのすべての文字を含むコードページ次に示します
マーティンエンダー

1

C、224

#define d(x)for(i=0;i<8;i++)if((i x j)==j)printf("%s%s%s%c ",i&2?"A":"",i&4?"B":"",i&6?"":"0","-+"[i&1]);puts("");
main(i,j){char d[4],*c=&d;scanf("%s",c);j=(c[2]?c++,2:0)+(c[1]-'+'?0:1)+(*c>='A'?2:0)+(*c>'A'?2:0);d(&)d(|)}

デゴルフされた:

/* j = 1*(has+) + 2*(hasA) + 4*(hasB) */
#define d(x) for(i=0;i<8;i++) \
                 if((i x j)==j) \
                      printf("%s%s%s%c ",i&2?"A":"",i&4?"B":"",i&6?"":"0","-+"[i&1]); \
             puts("");

main(i,j)
{
    char d[4], *c=&d;
    scanf("%s",c);

    j= (c[2]? (c++,2):0)            /* ABx */
            + (c[1]-'+'?0:1)
            + (c[0]>='A'?2:0)
            + (c[0]>'A'?2:0);

    // print possible receipients, and then donators
    d(&)
    d(|)
}

1

PHP - 215の 212 206バイト

function($t){$c=[9,15,12,8,153,255,204,136];if(($a=array_search($t,$l=split(1,'A+1O+1B+1AB+1A-1O-1B-1AB-')))===!1)die;foreach($l as$k=>$v){if($c[$a]&1<<$k)$x[]=$v;if($c[$k]&1<<$a)$y[]=$v;}var_dump($x,$y);}

以下は、バージョン化されていないバージョンです。

function ($type)
{
    $typesList = ['A+', 'O+', 'B+', 'AB+', 'A-', 'O-', 'B-', 'AB-'];
    $donationCompatibilityList = [
        0b00001001,
        0b00001111,
        0b00001100,
        0b00001000,
        0b10011001,
        0b11111111,
        0b11001100,
        0b10001000,
    ];

    $idType = array_search($type, $typesList);
    if ($idType === false) {
        die;
    }

    $canGiveToList = [];
    $canReceiveFromList = [];
    foreach ($typesList as $currentIdType => $currentType)
    {
        if ($donationCompatibilityList[$idType] & 1 << $currentIdType ) {
            $canGiveToList[] = $currentType;
        }

        if ($donationCompatibilityList[$currentIdType ] & 1 << $idType) {
            $canReceiveFromList[] = $currentType;
        }
    }

    var_dump($canGiveToList, $canReceiveFromList);
}

4バイトを節約してくれたmanatworkに感謝します。


整数による分割のトリックは、PHPでも機能しますexplode(1,'A+1O+1B+1AB+1A-1O-1B-1AB-')。また、必ずしも優れたコーディング習慣に対応していないため、split()関数などの非推奨の機能を使用する場合があります。
マナトワーク

@manatworkよくわかりました!回答を編集しました、ありがとう。
ブラックホール

0

Perl、107 112

最後に、型名を数字でエンコードすると、コードが短くなりました。

#!perl -p
$x=y/AB+/421/r%9;@a=grep{~$x&$_%9||push@b,$_;!($x&~($_%9))}map{("$_-",$_.1)}0,2,4,42;$_="@a
@b";y/421/AB+/

古いバージョン

#!perl -p
$x=y/AB+/421/r%9;@a=grep!($x&~$_),0..7;@b=grep!(~$x&$_),0..7;$_="@a
@b";s/\d/(map{("$_+","$_-")}0,A,B,AB)[$&]/eg

0

ピス、58

一部orlpのソリューションと同じですが、多少異なり、完全に自己設計されています。

M&n+eGeH"+-"!f!}T+H\OPGJsm,+d\++d\-c"O A B AB"dfgzYJfgZzJJ

説明

M                          create a function g(G,H) that returns
  n+eGeH"+-"                 G[-1] + H[-1] is not "+-"
 &                          and
            !f!}T+H\OPG      chars of G[:-1] not in H + "O" is falsy (empty)
J                          J =
 s                          merge
  m                          map
   ,+d\++d\-                  lambda d: (d + "+", d + "-")
            c"O A B AB"d      over ["O", "A", "B", "AB"]
fgzYJ                      print all J's items x where g(input, x)
fgZzJ                      print all J's items x where g(x, input)

0

J、120バイト

   f=.3 :';"1(2 8$,(s-:"*<y,'' '')#8 2 8$#:213472854600871062656691437010712264449x)#s=.<;.2''A+ B+ AB+ O+ A- B- AB- O- '''

   f 'A+'
A+ AB+      
A+ O+ A- O- 

   f 'AB-'
AB+ AB-      
A- B- AB- O- 

関数は無効な入力で失敗します。大きな10進数は、完全な互換性マトリックスのエンコードです。

(複数の理由で非常に長いソリューション。)

こちらからオンラインでお試しください。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.