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!!!


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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.