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


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.