정당한 통치자는 누구입니까?


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 17 년

@WizardOfMenlo 그들의 집 이름은 가족 이름입니까?
ASCIIThenANSI

1
@WizardOfMenlo Point 3은 약간 불분명 In case the king had no sons the realm goes to the oldest legit king's brother합니다. 포인트 2와 충돌하는 것 같습니다 (적법한 아들이 없으면 가장 오래된 합법적 인 딸이 선정됩니다). 포인트 3 heirs대신에 의미 sons합니까?
Kamehameha

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

whilePHP에서 골프를 할 때 루프는 금지됩니다 :).
Blackhole

나는 실수가 있다고 생각합니다. 여기에서 테스트했으며 링크 가 올바르게 내려갑니다. 그러나 Jon Snow에게 정당한 왕좌를 제공하기 위해 다시 올라가지 않으면
WizardOfMenlo

실수가 아닙니다. 실제로 challange에 정의 된 규칙을 따릅니다. 보시다시피, 마지막 왕은 아리아의 아들 티리온입니다. 이것은 다음 왕이 티리온의 후계자 또는 그의 형제 중 한 사람이어야 함을 의미합니다. 그러나 그는 형제도없고 상속인도 없습니다. 예제의 JSON에 따라 Jon Snow는 Tyrion의 삼촌입니다.
Razvan

당신은 절대적으로 맞아, 내 fanboysm은 나의 최고를 얻었다
WizardOfMenlo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.