<?php
class Node {
public $question;
public $trueBranch;
public $falseBranch;
public function __construct($question, $trueBranch, $falseBranch) {
$this->question = $question;
$this->trueBranch = $trueBranch;
$this->falseBranch = $falseBranch;
}
}
class DiagnosisSystem {
private $tree;
public function __construct($tree) {
$this->tree = $tree;
}
public function diagnose() {
return $this->traverse($this->tree);
}
private function traverse($node) {
if ($node instanceof Node) {
$answer = $this->askQuestion($node->question);
if ($answer) {
return $this->traverse($node->trueBranch);
} else {
return $this->traverse($node->falseBranch);
}
} else {
return $node; // Leaf node (diagnosis)
}
}
private function askQuestion($question) {
echo $question . " (yes/no): ";
$handle = fopen ("php://stdin","r"); return trim($line) === 'yes'; }
}
$tree = new Node('Do you have a fever?',
new Node('Do you have a cough?', 'You may have a flu.', 'You may have a fever.'),
new Node('Do you have a cough?', 'You may have a cold.', 'No diagnosis available.')
);
$system = new DiagnosisSystem($tree);
echo $system->diagnose();
PD9waHAKCmNsYXNzIE5vZGUgewogICAgcHVibGljICRxdWVzdGlvbjsKICAgIHB1YmxpYyAkdHJ1ZUJyYW5jaDsKICAgIHB1YmxpYyAkZmFsc2VCcmFuY2g7CgogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRxdWVzdGlvbiwgJHRydWVCcmFuY2gsICRmYWxzZUJyYW5jaCkgewogICAgICAgICR0aGlzLT5xdWVzdGlvbiA9ICRxdWVzdGlvbjsKICAgICAgICAkdGhpcy0+dHJ1ZUJyYW5jaCA9ICR0cnVlQnJhbmNoOwogICAgICAgICR0aGlzLT5mYWxzZUJyYW5jaCA9ICRmYWxzZUJyYW5jaDsKICAgIH0KfQoKY2xhc3MgRGlhZ25vc2lzU3lzdGVtIHsKICAgIHByaXZhdGUgJHRyZWU7CgogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCR0cmVlKSB7CiAgICAgICAgJHRoaXMtPnRyZWUgPSAkdHJlZTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZGlhZ25vc2UoKSB7CiAgICAgICAgcmV0dXJuICR0aGlzLT50cmF2ZXJzZSgkdGhpcy0+dHJlZSk7CiAgICB9CgogICAgcHJpdmF0ZSBmdW5jdGlvbiB0cmF2ZXJzZSgkbm9kZSkgewogICAgICAgIGlmICgkbm9kZSBpbnN0YW5jZW9mIE5vZGUpIHsKICAgICAgICAgICAgJGFuc3dlciA9ICR0aGlzLT5hc2tRdWVzdGlvbigkbm9kZS0+cXVlc3Rpb24pOwogICAgICAgICAgICBpZiAoJGFuc3dlcikgewogICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT50cmF2ZXJzZSgkbm9kZS0+dHJ1ZUJyYW5jaCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnRyYXZlcnNlKCRub2RlLT5mYWxzZUJyYW5jaCk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gJG5vZGU7ICAvLyBMZWFmIG5vZGUgKGRpYWdub3NpcykKICAgICAgICB9CiAgICB9CgogICAgcHJpdmF0ZSBmdW5jdGlvbiBhc2tRdWVzdGlvbigkcXVlc3Rpb24pIHsKICAgICAgICBlY2hvICRxdWVzdGlvbiAuICIgKHllcy9ubyk6ICI7CiAgICAgICAgJGhhbmRsZSA9IGZvcGVuICgicGhwOi8vc3RkaW4iLCJyIik7CiAgICAgICAgJGxpbmUgPSBmZ2V0cygkaGFuZGxlKTsKICAgICAgICByZXR1cm4gdHJpbSgkbGluZSkgPT09ICd5ZXMnOwogICAgfQp9CgokdHJlZSA9IG5ldyBOb2RlKCdEbyB5b3UgaGF2ZSBhIGZldmVyPycsCiAgICBuZXcgTm9kZSgnRG8geW91IGhhdmUgYSBjb3VnaD8nLCAnWW91IG1heSBoYXZlIGEgZmx1LicsICdZb3UgbWF5IGhhdmUgYSBmZXZlci4nKSwKICAgIG5ldyBOb2RlKCdEbyB5b3UgaGF2ZSBhIGNvdWdoPycsICdZb3UgbWF5IGhhdmUgYSBjb2xkLicsICdObyBkaWFnbm9zaXMgYXZhaWxhYmxlLicpCik7Cgokc3lzdGVtID0gbmV3IERpYWdub3Npc1N5c3RlbSgkdHJlZSk7CmVjaG8gJHN5c3RlbS0+ZGlhZ25vc2UoKTsK