Qui est le souverain légitime?

18

Qui dirigera le royaume?

On vous donne un arbre généalogique qui contient: nom, sexe, date de naissance, date de décès et une liste des héritiers, pour chaque membre de la famille. Vous pouvez utiliser n'importe quel format de liste (imbriqué) pour représenter l'arbre. Les exemples suivants utiliseront JSON. Déterminez qui dirigera le royaume et dans quel ordre. Les règles de succession sont les suivantes:

  1. Lorsqu'un roi meurt, le royaume revient à son plus ancien enfant mâle légitime.
  2. S'il n'y en a pas, il passe à la plus vieille fille légitime.
  3. Au cas où le roi n'aurait pas d'héritiers, le royaume reviendra au frère aîné du roi légitime
  4. S'il n'y a pas de frères mâles, le royaume ira à la sœur aînée du roi légitime
  5. Si tous les parents légitimes sont morts, le royaume va au salaud le plus proche, en appliquant les règles ci-dessus
  6. Si aucun parent légitime ou bâtard n'est vivant LINE EXTINCT

Nous définissons un fils légitime comme celui qui a le même nom de «maison» que son père.

Exemples:

Contribution {}

Production LINE EXTINCT

Contribution

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

Production 12-48: Maegor, LINE EXTINCT

Contribution

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

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

Contribution

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

        ]
    }

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

Notez que la sortie peut être formatée comme vous le souhaitez, sa seule condition est qu'elle contienne le temps du règne et le nom du roi régnant pendant ces années. J'ai utilisé des rois de l'ASOIAF comme exemple démonstratif, mais le code doit être valide pour toutes les entrées.

Vous pouvez supposer qu'aucun jumeau ne naîtra.

Ceci est un défi de golf de code, donc le code le plus court en octets gagne

Bonne chance!!!

WizardOfMenlo
la source
1
Comment les "salauds" sont-ils représentés?
ASCIIThenANSI
En soi, ils ne sont pas indiqués comme un attribut, il faudrait vérifier si leur nom de famille est différent de celui du père.
WizardOfMenlo
@WizardOfMenlo Alors leur nom de maison est-il leur nom de famille?
ASCIIThenANSI
1
@WizardOfMenlo Point 3 n'est pas clair - In case the king had no sons the realm goes to the oldest legit king's brother. Il semble entrer en conflit avec le point 2 (s'il n'y a pas de fils légitime, alors la fille légitime la plus âgée est couronnée). Voulez-vous dire heirsau lieu du sonspoint 3?
Kamehameha
1
@kamehameha oui, je vais le modifier maintenant
WizardOfMenlo

Réponses:

6

PHP, 664 octets

Je ne sais pas si 664 octets conviennent au golf de code, mais voici:

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

Il reçoit l'entrée de chaîne JSON comme premier argument de ligne de commande.

L'algorithme suit les étapes décrites dans le défi (commence par le roi, puis trie les héritiers puis les frères et sœurs pour trouver le prochain roi).

Démo

Razvan
la source
C'était rapide!
WizardOfMenlo
whileles boucles sont interdites lors du golf en PHP :).
Blackhole
Je pense qu'il y a une erreur, je l'ai testée ici et le lien va correctement sur toute la ligne, mais après qu'il ne remonte pas pour donner à Jon Snow le trône qui lui revient
WizardOfMenlo
Ce n'est pas une erreur. Il suit en fait les règles qui ont été définies dans le défi. Comme vous pouvez le voir, le dernier roi est Tyrion qui est le fils d'Arya. Cela signifie que le prochain roi devrait être parmi les héritiers de Tyrion ou l'un de ses frères. Mais il n'a ni frère, ni héritier. Veuillez noter que, selon le JSON dans votre exemple, Jon Snow est l'oncle de Tyrion.
Razvan
Vous avez absolument raison, mon fanboysm a pris le dessus sur moi
WizardOfMenlo