#lang racket
(require "util/p-list.rkt")
(putprop! 'Harry '(Jane Bill) '#:children)
(putprop! 'Jane '(Joe Diane) '#:children)
(putprop! 'Bill '(Julia Mike) '#:children)
(putprop! 'Julia '(Frank Suzan) '#:children)
(putprop! 'Frank '(Anne) '#:children)
;;; 展開関数
(define (expand person)
(keyword-get person '#:children '()))
(define (expand-path path)
(let loop ((temp (expand (car path))) (result '()))
(if (null? temp)
result
(loop (cdr temp) (cons (cons (car temp) path) result)))))
(define (related person1 person2)
(let loop ((stack `((,person1))) (visited '()))
(if (null? stack)
null
(let ((head (car stack)) (tail (cdr stack)))
(let ((person (car head)))
(if (eq? person person2)
(reverse head)
(loop (if (memq person visited)
tail
(append (expand-path head) tail))
(cons person visited))))))))
I2xhbmcgcmFja2V0CgoocmVxdWlyZSAidXRpbC9wLWxpc3Qucmt0IikKCihwdXRwcm9wISAnSGFycnkgJyhKYW5lIEJpbGwpICcjOmNoaWxkcmVuKQoocHV0cHJvcCEgJ0phbmUgJyhKb2UgRGlhbmUpICcjOmNoaWxkcmVuKQoocHV0cHJvcCEgJ0JpbGwgJyhKdWxpYSBNaWtlKSAnIzpjaGlsZHJlbikKKHB1dHByb3AhICdKdWxpYSAnKEZyYW5rIFN1emFuKSAnIzpjaGlsZHJlbikKKHB1dHByb3AhICdGcmFuayAnKEFubmUpICcjOmNoaWxkcmVuKQoKOzs7IOWxlemWi+mWouaVsAooZGVmaW5lIChleHBhbmQgcGVyc29uKQogIChrZXl3b3JkLWdldCBwZXJzb24gJyM6Y2hpbGRyZW4gJygpKSkKCihkZWZpbmUgKGV4cGFuZC1wYXRoIHBhdGgpCiAgKGxldCBsb29wICgodGVtcCAoZXhwYW5kIChjYXIgcGF0aCkpKSAocmVzdWx0ICcoKSkpCiAgICAoaWYgKG51bGw/IHRlbXApCiAgICAgICAgcmVzdWx0CiAgICAgICAgKGxvb3AgKGNkciB0ZW1wKSAoY29ucyAoY29ucyAoY2FyIHRlbXApIHBhdGgpIHJlc3VsdCkpKSkpCgooZGVmaW5lIChyZWxhdGVkIHBlcnNvbjEgcGVyc29uMikKICAobGV0IGxvb3AgKChzdGFjayBgKCgscGVyc29uMSkpKSAodmlzaXRlZCAnKCkpKQogICAgKGlmIChudWxsPyBzdGFjaykKICAgICAgICBudWxsCiAgICAgICAgKGxldCAoKGhlYWQgKGNhciBzdGFjaykpICh0YWlsIChjZHIgc3RhY2spKSkKICAgICAgICAgIChsZXQgKChwZXJzb24gKGNhciBoZWFkKSkpCiAgICAgICAgICAgIChpZiAoZXE/IHBlcnNvbiBwZXJzb24yKQogICAgICAgICAgICAgICAgKHJldmVyc2UgaGVhZCkKICAgICAgICAgICAgICAgIChsb29wIChpZiAobWVtcSBwZXJzb24gdmlzaXRlZCkKICAgICAgICAgICAgICAgICAgICAgICAgICB0YWlsCiAgICAgICAgICAgICAgICAgICAgICAgICAgKGFwcGVuZCAoZXhwYW5kLXBhdGggaGVhZCkgdGFpbCkpCiAgICAgICAgICAgICAgICAgICAgICAoY29ucyBwZXJzb24gdmlzaXRlZCkpKSkpKSkp