Kto jest prawowitym władcą?

18

Kto będzie rządził królestwem?

Dostajesz drzewo genealogiczne, które zawiera: imię, płeć, datę urodzenia, datę śmierci i listę spadkobierców dla każdego członka rodziny. Możesz użyć dowolnego wygodnego (zagnieżdżonego) formatu listy do reprezentowania drzewa. Poniższe przykłady użyją JSON. Ustal, kto będzie rządził królestwem i w jakiej kolejności. Zasady sukcesji są następujące:

  1. Kiedy król umiera, królestwo przechodzi do jego najstarszego legalnego dziecka.
  2. Jeśli nie ma, przechodzi na najstarsze prawnie dziecko.
  3. W przypadku, gdy król nie miał spadkobierców, królestwo przechodzi do najstarszego legalnego brata króla
  4. Jeśli nie będzie męskich braci, królestwo przejdzie do najstarszej prawowitej siostry króla
  5. Jeśli wszyscy prawni krewni nie żyją, królestwo trafia do najbliższego drania, stosując powyższe zasady
  6. Jeśli żaden legalny ani drański krewny nie żyje LINE EXTINCT

Prawowitego syna definiujemy jako takiego, który ma takie samo „domowe” imię jak jego ojciec.

Przykłady:

Wejście {}

Wynik LINE EXTINCT

Wejście

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

Wynik 12-48: Maegor, LINE EXTINCT

Wejście

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

Wynik 34-103: Jaehaerys, 103-129: Viserys, LINE EXTINCT

Wejście

{
        "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" : []
            }

        ]
    }

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

Zauważ, że wyjście można sformatować w dowolny sposób, jego jedynym wymaganiem jest to, aby zawierał czas panowania i imię panującego króla w tych latach. Użyłem królów z ASOIAF jako przykładowego przykładu, jednak kod musi być poprawny dla wszystkich danych wejściowych.

Możesz założyć, że nie rodzą się bliźnięta.

Jest to wyzwanie dla golfistów, więc wygrywa najkrótszy kod w bajtach

Powodzenia!!!

WizardOfMenlo
źródło
1
Jak reprezentowane są „dranie”?
ASCIIThenANSI
Same w sobie nie są wskazane jako atrybuty, należałoby sprawdzić, czy ich nazwisko jest inne niż nazwisko ojca.
WizardOfMenlo
@WizardOfMenlo Więc ich nazwa domu to nazwisko?
ASCIIThenANSI
1
@WizardOfMenlo Point 3 jest nieco niejasny - In case the king had no sons the realm goes to the oldest legit king's brother. Wydaje się, że jest sprzeczny z punktem 2 (jeśli nie ma prawowitego syna, wówczas koronowana jest najstarsza prawna córka). Masz na myśli heirszamiast sonsw punkcie 3?
Kamehameha,
1
@kamehameha tak, zrobię to teraz
WizardOfMenlo

Odpowiedzi:

6

PHP, 664 bajty

Nie jestem pewien, czy 664 bajty pasują do gry w golfa kodowego, ale oto:

$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";

Otrzymuje dane wejściowe ciągu JSON jako pierwszy argument wiersza poleceń.

Algorytm wykonuje kroki opisane w wyzwaniu (zaczyna od króla, następnie sortuje spadkobierców, a następnie rodzeństwo, aby znaleźć następnego króla).

Próbny

Razvan
źródło
To było szybkie!
WizardOfMenlo
whilepętle są zabronione podczas gry w golfa w PHP :).
Blackhole
Wydaje mi się, że jest błąd, przetestowałem go tutaj, a link przechodzi poprawnie w dół linii, jednak po tym, jak nie wróci, aby dać Jona Snowowi prawowity tron
WizardOfMenlo
To nie pomyłka. W rzeczywistości przestrzega reguł określonych w wyzwaniu. Jak widać, ostatnim królem jest Tyrion, który jest synem Aryi. Oznacza to, że następny król powinien należeć do spadkobierców Tyriona lub jednego z jego braci. Ale nie ma braci ani spadkobierców. Pamiętaj, że zgodnie z JSON w twoim przykładzie Jon Snow jest wujem Tyriona.
Razvan
Masz całkowitą rację, mój fanboysm ma najlepsze ze mnie
WizardOfMenlo