谁是正确的统治者?


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中的Kings作为演示示例,但是该代码对于所有输入都必须有效。

您可能会假设没有双胞胎会出生。

这是一个代码挑战,因此以字节为单位的最短代码获胜

祝好运!!!


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点?
Kamehameha

1
@kamehameha是的,我现在将对其进行编辑
WizardOfMenlo

Answers:


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,2015年

我认为有一个错误,我已经在这里对其进行了测试,并且链接正确向下,但是在没有返回给乔恩·斯诺之后,它
才是

没错 它实际上遵循挑战中定义的规则。如您所见,最后一位国王是提利昂(Tyrion),这是艾莉亚(Arya)的儿子。这意味着下一位国王应该是提利昂的继承人或他的兄弟之一。但是他没有兄弟,也没有继承人。请注意,根据您示例中的JSON,Jon Snow是Tyrion的叔叔。
拉兹万

您绝对正确,我的追随者们得到了我最好的
WizardOfMenlo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.