Quem é o governante legítimo?


18

Quem governará o reino?

Você recebe uma árvore genealógica que contém: nome, sexo, data de nascimento, data da morte e uma lista de herdeiros, para cada membro da família. Você pode usar qualquer formato de lista conveniente (aninhado) para representar a árvore. Os exemplos a seguir usarão JSON. Determine quem governará o domínio e em qual ordem. As regras de sucessão são as seguintes:

  1. Quando um rei morre, o reino vai para o seu filho mais velho, legítimo.
  2. Se não houver, ele passa para a filha mais velha e legítima.
  3. Caso o rei não tivesse herdeiros, o reino vai para o irmão do rei legítimo mais velho
  4. Se não houver irmãos homens, o reino irá para a irmã do rei legítimo mais velho
  5. Se todos os parentes legítimos estão mortos, o reino vai para o bastardo mais próximo, aplicando as regras acima
  6. Se nenhum parente legítimo ou bastardo estiver vivo imprimir LINE EXTINCT

Definimos um filho legítimo como aquele que tem o mesmo nome de "casa" que seu pai.

Exemplos:

Entrada {}

Resultado LINE EXTINCT

Entrada

{
    "name" : "Maegor",
    "house" : "Targaryen",
    "birth" : 12,
    "death" : 48,
    "sex" : "male",
    "heirs" : []
}

Resultado 12-48: Maegor, LINE EXTINCT

Entrada

{
    "name" : "Jaehaerys",
    "house" : "Targaryen",
    "birth" : 34,
    "death" : 103,
    "sex" : "male",
    "heirs" : [
        {
        "name" : "Viserys",
        "house" : "Targaryen",
        "birth" : 77,
        "death" : 129,
        "sex" : "male",
        "heirs" : []
        }
    ]
}

Resultado 34-103: Jaehaerys, 103-129: Viserys, LINE EXTINCT

Entrada

{
        "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" : []
            }

        ]
    }

Resultado: 263-299: Eddard, 299-300: Robb, 300-315: Brann, 315-319: Rickon, 319-320: Sansa, 320-350: Arya, 350-384: Jon, LINE EXTINCT

Observe que a saída pode ser formatada da maneira que desejar, seus únicos requisitos são que ela contenha o tempo do reinado e o nome do rei reinante durante esses anos. Eu usei reis da ASOIAF como exemplo demonstrativo, no entanto, o código precisa ser válido para todas as entradas.

Você pode assumir que nenhum gêmeo nascerá.

Este é um desafio de código de golfe, portanto o código mais curto em bytes vence

Boa sorte!!!


1
Como os "bastardos" são representados?
ASCIIThenANSI

Por si só, não são indicados como um atributo; seria necessário verificar se o nome da família é diferente do nome do pai.
precisa

@WizardOfMenlo Então, o nome da casa deles é o nome da família?
ASCIIThenANSI

1
@WizardOfMenlo O ponto 3 não é muito claro - In case the king had no sons the realm goes to the oldest legit king's brother. Parece entrar em conflito com o ponto 2 (se nenhum filho legítimo, a filha legítima mais velha é coroada). Você quer dizer em heirsvez de sonsno ponto 3?
Kamehameha

1
@kamehameha sim, eu vou editá-lo agora
WizardOfMenlo

Respostas:


6

PHP, 664 bytes

Não tenho certeza se 664 bytes se encaixam no código de golfe, mas aqui está:

$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";

Ele recebe a entrada da string JSON como o primeiro argumento da linha de comandos.

O algoritmo segue os passos descritos no desafio (parte do rei, depois classifica os herdeiros e depois os irmãos para encontrar o próximo rei).

Demo


Aquilo foi rápido!
precisa

whileloop são proibidos quando jogar golfe em PHP :).
precisa

Acho que há um erro, eu testei aqui e ligar vai corretamente para baixo da linha, porém depois ele não voltar a subir para dar Jon Snow é legítimo trono
WizardOfMenlo

Não é um erro. Na verdade, ele segue as regras definidas no desafio. Como você pode ver, o último rei é Tyrion, que é o filho de Arya. Isso significa que o próximo rei deve estar entre os herdeiros de Tyrion ou um de seus irmãos. Mas ele não tem irmãos, nem herdeiros. Observe que, conforme o JSON do seu exemplo, Jon Snow é o tio de Tyrion.
Razvan

Você está absolutamente certo, meu fanboysm obteve o melhor de mim
WizardOfMenlo
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.