これは主にデータ構造に焦点を当てた質問であることに注意してください
前書き
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}
ますか?