正当な支配者は誰ですか?


18

誰が領域を支配しますか?

各家族の名前、性別、生年月日、死亡日、相続人のリストを含む家系図が与えられます。ツリーを表すのに便利な(ネストされた)リスト形式を使用できます。次の例ではJSONを使用します。誰がレルムを支配するか、どの順序で決定するか。継承ルールは次のとおりです。

  1. 王が死ぬと、その領域はその最も古い合法的な男性の子になります。
  2. 存在しない場合、最も古い合法的な女性の子供に渡されます。
  3. 王に相続人がいない場合、王国は最も古い合法的な王の兄弟に行きます
  4. 男性の兄弟がいない場合、領域は最も古い合法的な王の妹に行きます
  5. すべての正当な親relativeが死んでいる場合、領域は最も近いろくでなしに行き、上記のルールを適用します
  6. 正当な親baもろくでなしの親relativeも生きていない場合 LINE EXTINCT

合法的な息子を、父親と同じ「家」名を持つ人と定義します。

例:

入力 {}

出力 LINE EXTINCT

入力

{
    "name" : "Maegor",
    "house" : "Targaryen",
    "birth" : 12,
    "death" : 48,
    "sex" : "male",
    "heirs" : []
}

出力 12-48: Maegor, LINE EXTINCT

入力

{
    "name" : "Jaehaerys",
    "house" : "Targaryen",
    "birth" : 34,
    "death" : 103,
    "sex" : "male",
    "heirs" : [
        {
        "name" : "Viserys",
        "house" : "Targaryen",
        "birth" : 77,
        "death" : 129,
        "sex" : "male",
        "heirs" : []
        }
    ]
}

出力 34-103: Jaehaerys, 103-129: Viserys, LINE EXTINCT

入力

{
        "name" : "Eddard",
        "house" : "Stark",
        "birth" : 263,
        "death" : 299,
        "sex" : "male",
        "heirs" : [
            {
            "name" : "Robb",
            "house" : "Stark",
            "birth" : 283,
            "death" : 300,
            "sex" : "male",
            "heirs" : []
            },
            {
             "name" : "Jon",
             "house" : "Snow",
             "birth" : 284,
             "death" : 384,
             "sex" : "male",
             "heirs" : []
            },
            {
             "name" : "Sansa",
             "house" : "Stark",
             "birth" : 286,
             "death" : 320,
             "sex" : "female",
             "heirs" : []
            },
            {
             "name" : "Arya",
             "house" : "Stark",
             "birth" : 289,
             "death" : 350,
             "sex" : "female",
             "heirs" : []
            },

            {
             "name" : "Brann",
             "house" : "Stark",
             "birth" : 290,
             "death" : 315,
             "sex" : "male",
             "heirs" : []
            },
            {
             "name" : "Rickon",
             "house" : "Stark",
             "birth" : 295,
             "death" : 319,
             "sex" : "male",
             "heirs" : []
            }

        ]
    }

出力: 263-299: Eddard, 299-300: Robb, 300-315: Brann, 315-319: Rickon, 319-320: Sansa, 320-350: Arya, 350-384: Jon, LINE EXTINCT

出力は任意の方法でフォーマットできることに注意してください。唯一の要件は、その年の統治の時間と統治している王の名前が含まれていることです。私はASOIAFの王を例として使用しましたが、コードはすべての入力に対して有効である必要があります。

あなたは双子が生まれないと仮定するかもしれません。

これはコードゴルフチャレンジなので、バイト単位の最短コードが勝ちます

幸運を!!!


1
「ろくでなし」はどのように表されますか?
ASCIIThenANSI

それ自体は属性として示されていないため、姓が父親と異なるかどうかを確認する必要があります。
WizardOfMenlo

@WizardOfMenlo家の名前は姓ですか?
ASCIIThenANSI

1
@WizardOfMenlo Point 3は少し不明瞭です- In case the king had no sons the realm goes to the oldest legit king's brother。それはポイント2と矛盾するようです(正当な息子がいない場合、最も古い正当な娘がcrown冠します)。ポイント3 heirsではなくということsonsですか?
カメハメハ

1
@kamehamehaはい、今すぐ編集します
WizardOfMenlo

回答:


6

PHP、664バイト

664バイトがコードゴルフに適しているかどうかはわかりませんが、次のとおりです。

$k=json_decode($argv[1]);$s=[];$f='array_shift';$r='heirs';$e='death';$y='year';function s
($k,&$e){uasort($e,function($a,$b)use($k){$c=$a->{$h='house'};$d=$b->$h;$e=$k->$h;if($c==$e
&&$d!=$e)return-1;elseif($c!=$e&&$d==$e)return 1;elseif($a->sex<$b->sex)return 1;elseif($a
->sex>$b->sex)return -1;else return$a->birth-$b->birth;});}function d(&$e,$y){foreach($e 
as$i=>$h)if($h->death<=$y)unset($e[$i]);};($x=(array)$k)&&$k->$y=$k->birth;$l=[];while($x)
{$l[]=$k;$z=$k->$e;s($k,$k->$r);d($k->$r,$k->$e);if($k->$r){$s=$k->$r;$k=$f($s);}else{s($k
,$s);d($s,$k->$e);$k=$f($s);}if(!$k)break;$k->$y=$z;}foreach($l as$k)
echo"{$k->$y}-{$k->$e}: $k->name, ";echo"LINE EXTINCT";

JSON文字列の入力を最初のコマンドライン引数として受け取ります。

アルゴリズムは、チャレンジで説明されている手順に従います(キングから開始し、相続人、兄弟を並べ替えて次のキングを見つけます)。

デモ


早かった!
WizardOfMenlo

whilePHPでゴルフをする場合、ループは禁止されています:)。
ブラックホール

間違いがあると思います。ここでテストしましたが、リンクは正しく機能しますが、Jon Snowに正当な王座を与えるために戻ってこなかった後、
WizardOfMenlo

それは間違いではありません。実際には、チャレンジで定義されたルールに従います。ご覧のとおり、最後の王はアリヤの息子であるティリオンです。これは、次の王がティリオンの相続人または彼の兄弟の一人であるべきであることを意味します。しかし、彼には兄弟も相続人もいません。あなたの例のJSONによると、Jon SnowはTyrionの叔父であることに注意してください。
ラズバン

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