<?php
function split_hash($hash, $sizes) {
$cnt = count($sizes); // количество словарей $partSize = floor(128/4/$cnt); // размер части хэша в тетрадах foreach($sizes as $size) {
$tmp = substr($hash, 0, $partSize); // разбиваем хэш по тетрадам на равные части $hash = substr($hash, $partSize); // на размер словаря
}
return $result;
}
function R($hash, $dicts) {
$sizes = array_map(function($val){return count($val);}, $dicts); // получаем размеры каждого словаря $indices = split_hash($hash, $sizes);
$result = '';
foreach($indices as $dictNumber=>$index) {
$result .= $dicts[$dictNumber][$index]; // сцепляем слово из частей
}
return $result;
}
function make_chain($start, $length, $dicts) {
for($i = 0; $i < $length; ++$i) {
echo $hash . ' : ' . $start . PHP_EOL;
$start = R($hash, $dicts);
}
}
make_chain
('свинособака', 10, array( array('свино', 'овце', 'тигро', 'косатко', 'зубро', 'волко', 'кото'), array('собака', 'бык', 'лев', 'дельфин', 'бизон') ));
PD9waHAKCmZ1bmN0aW9uIHNwbGl0X2hhc2goJGhhc2gsICRzaXplcykgewogICAgJGNudCA9IGNvdW50KCRzaXplcyk7ICAgICAgICAgICAgICAgICAgIC8vINC60L7Qu9C40YfQtdGB0YLQstC+INGB0LvQvtCy0LDRgNC10LkKICAgICRwYXJ0U2l6ZSA9IGZsb29yKDEyOC80LyRjbnQpOyAgICAgICAgICAvLyDRgNCw0LfQvNC10YAg0YfQsNGB0YLQuCDRhdGN0YjQsCDQsiDRgtC10YLRgNCw0LTQsNGFCiAgICAkcmVzdWx0ID0gYXJyYXkoKTsKICAgIGZvcmVhY2goJHNpemVzIGFzICRzaXplKSB7CiAgICAgICAgJHRtcCA9IHN1YnN0cigkaGFzaCwgMCwgJHBhcnRTaXplKTsgLy8g0YDQsNC30LHQuNCy0LDQtdC8INGF0Y3RiCDQv9C+INGC0LXRgtGA0LDQtNCw0Lwg0L3QsCDRgNCw0LLQvdGL0LUg0YfQsNGB0YLQuAogICAgICAgICRoYXNoID0gc3Vic3RyKCRoYXNoLCAkcGFydFNpemUpOyAgIAogICAgICAgICRyZXN1bHRbXSA9IGdtcF9pbnR2YWwoZ21wX21vZChnbXBfaW5pdCgkdG1wLCAxNiksICRzaXplKSk7IC8vINCy0L7Qt9Cy0YDQsNGJ0LDQtdC8INC+0YHRgtCw0YLQvtC6INC+0YIg0LTQtdC70LXQvdC40Y8g0YTRgNCw0LPQvNC10L3RgtCwINGF0Y3RiNCwIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vINC90LAg0YDQsNC30LzQtdGAINGB0LvQvtCy0LDRgNGPCiAgICB9CiAgICByZXR1cm4gJHJlc3VsdDsKfQoKZnVuY3Rpb24gUigkaGFzaCwgJGRpY3RzKSB7CiAgICAkc2l6ZXMgPSBhcnJheV9tYXAoZnVuY3Rpb24oJHZhbCl7cmV0dXJuIGNvdW50KCR2YWwpO30sICRkaWN0cyk7IC8vINC/0L7Qu9GD0YfQsNC10Lwg0YDQsNC30LzQtdGA0Ysg0LrQsNC20LTQvtCz0L4g0YHQu9C+0LLQsNGA0Y8KICAgICRpbmRpY2VzID0gc3BsaXRfaGFzaCgkaGFzaCwgJHNpemVzKTsKICAgICRyZXN1bHQgPSAnJzsKICAgIGZvcmVhY2goJGluZGljZXMgYXMgJGRpY3ROdW1iZXI9PiRpbmRleCkgewogICAgICAgICRyZXN1bHQgLj0gJGRpY3RzWyRkaWN0TnVtYmVyXVskaW5kZXhdOyAvLyDRgdGG0LXQv9C70Y/QtdC8INGB0LvQvtCy0L4g0LjQtyDRh9Cw0YHRgtC10LkKICAgIH0KICAgIHJldHVybiAkcmVzdWx0Owp9CgpmdW5jdGlvbiBtYWtlX2NoYWluKCRzdGFydCwgJGxlbmd0aCwgJGRpY3RzKSB7CiAgICBmb3IoJGkgPSAwOyAkaSA8ICRsZW5ndGg7ICsrJGkpIHsKICAgICAgICAkaGFzaCA9IG1kNSgkc3RhcnQpOwogICAgICAgIGVjaG8gJGhhc2ggLiAnIDogJyAuICRzdGFydCAuIFBIUF9FT0w7CiAgICAgICAgJHN0YXJ0ID0gUigkaGFzaCwgJGRpY3RzKTsKICAgIH0KfQoKbWFrZV9jaGFpbign0YHQstC40L3QvtGB0L7QsdCw0LrQsCcsIDEwLCBhcnJheSgKICAgICAgYXJyYXkoJ9GB0LLQuNC90L4nLCAgJ9C+0LLRhtC1JywgJ9GC0LjQs9GA0L4nLCAn0LrQvtGB0LDRgtC60L4nLCAn0LfRg9Cx0YDQvicsICfQstC+0LvQutC+JywgJ9C60L7RgtC+JyksCiAgICAgIGFycmF5KCfRgdC+0LHQsNC60LAnLCAn0LHRi9C6JywgICfQu9C10LInLCAgICfQtNC10LvRjNGE0LjQvScsICfQsdC40LfQvtC9JykKKSk7Cg==