Wer ist der rechtmäßige Herrscher?

18

Wer wird das Reich regieren?

Sie erhalten einen Stammbaum mit Namen, Geschlecht, Geburtsdatum, Sterbedatum und einer Liste der Erben für jedes Familienmitglied. Sie können ein beliebiges (verschachteltes) Listenformat verwenden, um den Baum darzustellen. In den folgenden Beispielen wird JSON verwendet. Bestimmen Sie, wer das Reich regieren wird und in welcher Reihenfolge. Die Nachfolgeregeln sind folgende:

  1. Wenn ein König stirbt, geht das Reich an sein ältestes legitimes männliches Kind.
  2. Wenn es keine gibt, geht es zum ältesten legitimen weiblichen Kind über.
  3. Falls der König keine Erben hatte, geht das Reich an den ältesten legitimen Bruder des Königs
  4. Wenn es keine männlichen Brüder gibt, geht das Reich zur Schwester des ältesten legitimen Königs
  5. Wenn alle legitimen Verwandten tot sind, geht das Reich zum nächsten Bastard und wendet die obigen Regeln an
  6. Wenn keine legitimen oder unehelichen Verwandten am Leben sind, drucken Sie LINE EXTINCT

Wir definieren einen legitimen Sohn als einen, der denselben "Hausnamen" wie sein Vater hat.

Beispiele:

Eingang {}

Ausgabe LINE EXTINCT

Eingang

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

Ausgabe 12-48: Maegor, LINE EXTINCT

Eingang

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

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

Eingang

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

        ]
    }

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

Beachten Sie, dass die Ausgabe beliebig formatiert werden kann. Sie muss lediglich die Regierungszeit und den Namen des regierenden Königs in diesen Jahren enthalten. Ich habe Könige aus der ASOIAF als Demonstrationsbeispiel verwendet, der Code muss jedoch für alle Eingaben gültig sein.

Sie können davon ausgehen, dass keine Zwillinge geboren werden.

Dies ist eine Code-Golf-Herausforderung, daher gewinnt der kürzeste Code in Bytes

Viel Glück!!!

WizardOfMenlo
quelle
1
Wie sind "Bastarde" vertreten?
ASCIIThenANSI
An sich werden sie nicht als Attribut angegeben, man müsste prüfen, ob sich ihr Familienname vom des Vaters unterscheidet.
WizardOfMenlo
@WizardOfMenlo Ist ihr Hausname ihr Familienname?
ASCIIThenANSI
1
@WizardOfMenlo Punkt 3 ist etwas unklar - In case the king had no sons the realm goes to the oldest legit king's brother. Es scheint mit Punkt 2 zu kollidieren (Wenn kein legitimer Sohn, dann wird die älteste legitime Tochter gekrönt). Meinen Sie heirsstatt sonsin Punkt 3?
Kamehameha
1
@ Kamehameha ja, ich werde es jetzt bearbeiten
WizardOfMenlo

Antworten:

6

PHP, 664 Bytes

Ich bin nicht sicher, ob 664 Bytes für das Code-Golfen geeignet sind, aber hier ist es:

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

Es empfängt die JSON-Zeichenfolge als erstes Befehlszeilenargument.

Der Algorithmus folgt den in der Challenge beschriebenen Schritten (beginnt beim König, sortiert dann die Erben und dann die Geschwister, um den nächsten König zu finden).

Demo

Razvan
quelle
Das war schnell!
WizardOfMenlo
whileSchleife sind beim Golfen in PHP verboten :).
Blackhole
Ich denke, es ist ein Fehler, ich habe es hier getestet und es Link geht richtig auf der
ganzen
Das ist kein Fehler. Es folgt tatsächlich den Regeln, die in der Herausforderung definiert wurden. Wie Sie sehen können, ist der letzte König Tyrion, der Sohn von Arya. Dies bedeutet, dass der nächste König unter den Erben von Tyrion oder einem seiner Brüder sein sollte. Aber er hat keine Brüder oder Erben. Bitte beachten Sie, dass Jon Snow gemäß JSON in Ihrem Beispiel der Onkel von Tyrion ist.
Razvan
Du hast absolut recht, mein Fanboysm hat das Beste von mir
WizardOfMenlo