Кто законный правитель?


18

Кто будет править миром?

Вам предоставляется семейное древо, которое содержит: имя, пол, дату рождения, дату смерти и список наследников для каждого члена семьи. Вы можете использовать любой удобный (вложенный) формат списка для представления дерева. В следующих примерах будет использоваться JSON. Определите, кто будет править миром и в каком порядке. Правила наследования следующие:

  1. Когда король умирает, царство переходит к его старшему законному ребенку мужского пола.
  2. Если его нет, он переходит к самой старой законной женщине.
  3. Если у короля не было наследников, королевство переходит к старшему законному брату короля
  4. Если нет братьев-мужчин, царство перейдет к старшей законной сестре короля
  5. Если все законные родственники мертвы, царство переходит к ближайшему ублюдку, применяя вышеуказанные правила
  6. Если ни законные, ни ублюдочные родственники живы, распечатай 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 Точка 3 немного неясно - In case the king had no sons the realm goes to the oldest legit king's brother. Кажется, это противоречит пункту 2 (если нет законного сына, то старшая законная дочь коронована). Вы имеете в виду heirsвместо sonsпункта 3?
Камехамеха

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

whileЗапрещены петли при игре в гольф на PHP :).
Blackhole

Я думаю , что это ошибка, я проверил его здесь и ссылка идет правильно вниз по линии, однако после того, как он не возвращается, чтобы дать Джону Сноу его законному трон
WizardOfMenlo

Это не ошибка. Это на самом деле следует правилам, которые были определены в вызове. Как видите, последний царь - Тирион, сын Арьи. Это означает, что следующий царь должен быть среди наследников Тириона или одного из его братьев. Но у него нет ни братьев, ни наследников. Обратите внимание, что, согласно JSON в вашем примере, Джон Сноу - дядя Тириона.
Разван

Вы абсолютно правы, мой фанатизм взял верх над мной
WizardOfMenlo
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.