これは主にデータ構造に焦点を当てた質問であることに注意してください
前書き
Bacefookは、人々が友好的であることを望んでいます!そのため、彼らは友達を提案する新しいシステムを実装しています!あなたの仕事は、Bacefookが新しい提案システムを実装するのを支援することです。
仕様:
あなたのプログラムは、コマンドの3種類をサポートしているREPL(read-eval-printループ)でなければなりませんFRIEND、SUGGESTとKNOW。
FRIEND X Y- ソーシャルネットワークの友人であることXを指定しYます。
XがYと友達なら、YはXと友達
可能ですが、出力する必要はありません
Xは常にXと友達です
KNOW X Y -XとYがフレンドの場合は真実の値を出力し、そうでない場合は偽の値を出力する
KNOW X X常に真実の値を出力します
SUGGEST X Y-XとYがフレンドでなければならない場合は真実の値を出力し、そうでない場合は偽の値を出力します。次の場合、XとYは友達になります。
XとYは友達ではありません
XとYには共通の友人が少なくとも1人います
FRIEND、SUGGESTおよびKNOWを独自の文字列に置き換えることができますが、各コマンドを置き換えた文字列に言及する必要があります。
プログラムは、それがどのように機能するかを合理的に簡単に認識できる限り、望ましい方法で入力/出力を取り込むことができます。
ソーシャルネットワーク内の人の数は1〜100,000ですNが、「友人リンク」(エッジ)はいくつあってもかまいません。
まだ気づいていない場合、これはグラフ検索の問題です。これを実装するための(おそらく)最も簡単な(おそらく最速の)データ構造は、隣接行列です。
テストケース
FRIEND A B
FRIEND A C
FRIEND B D
SUGGEST A B -> Falsy, as they are friends
SUGGEST A D -> Truthy, as they share B as a common friend
SUGGEST C D -> Falsy, they do not share a common friend
KNOW D B -> Truthy, they are friends
KNOW B C -> Falsy, not friends
=============
FRIEND Tom Tim
KNOW Tom Tim -> Truthy
KNOW Tim Tom -> Truthy
KNOW Tom Kit -> Falsy
=============
KNOW Tim Kit -> Falsy
FRIEND Tim Tom
KNOW Tim Kit -> Falsy
FRIEND Tom Kit
SUGGEST Tim Kit -> Truthy
=============
FRIEND X Y
SUGGEST X Y -> Falsy since X is friends with X
勝利条件
これはcode-golfで、最短のコードが勝ちます!
SUGGEST UK EU。
{A, B, C, D}ますか?