Хто є правильним правителем?


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
Пункт 3 @WizardOfMenlo трохи незрозумілий - 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.