<?php
function punyaHuruf($kataPertama, $kataKedua)
{
if ($kataPertama === '') {
return true;
}
if (!isset($himpunanKedua[$huruf])) { return false;
}
}
return true;
}
function punyaHurufMultiset($kataPertama, $kataKedua)
{
if ($kataPertama === '') {
return true;
}
if (empty($frekuensi[$huruf])) { return false;
}
$frekuensi[$huruf]--;
}
return true;
}
/* ===================== PENGUJIAN ===================== */
$lulus = 0;
$total = 0;
function uji($pertama, $kedua, $harapan)
{
global $lulus, $total;
$hasil = punyaHuruf($pertama, $kedua);
$total++;
if ($hasil === $harapan) {
$lulus++;
$status = 'LULUS';
} else {
$status = 'GAGAL';
}
echo str_pad("punyaHuruf('$pertama', '$kedua')", 40) . ' => ' . str_pad($hasil ?
'TRUE' : 'FALSE', 6) . " [$status]" . PHP_EOL;
}
echo "--- Test case dari soal ---" . PHP_EOL;
uji('cat', 'antarctica', true);
uji('cat', 'australia', false);
uji('cat', 'ANTARCTICA', true);
echo PHP_EOL . "--- Edge case ---" . PHP_EOL;
uji('CAT', 'antarctica', true);
uji('', 'apapun', true);
uji('abc', '', false);
uji('', '', true);
uji('aa', 'antarctica', true);
uji('cat', 'cat', true);
uji('cats', 'cat', false);
echo PHP_EOL . "--- Perbandingan himpunan vs multiset ---" . PHP_EOL;
array('cat', 'antarctica'), );
foreach ($pasangan as $p) {
"%-24s himpunan=%-6s multiset=%s" . PHP_EOL,
"('" . $p[0] . "', '" . $p[1] . "')",
punyaHuruf($p[0], $p[1]) ? 'TRUE' : 'FALSE',
punyaHurufMultiset($p[0], $p[1]) ? 'TRUE' : 'FALSE'
);
}
echo PHP_EOL . "==============================" . PHP_EOL;
echo "RINGKASAN: $lulus dari $total pengujian LULUS" . PHP_EOL;
if ($lulus !== $total) {
echo "ADA PENGUJIAN YANG GAGAL" . PHP_EOL;
}
PD9waHAKCmZ1bmN0aW9uIHB1bnlhSHVydWYoJGthdGFQZXJ0YW1hLCAka2F0YUtlZHVhKQp7CiAgICBpZiAoJGthdGFQZXJ0YW1hID09PSAnJykgewogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgICRoaW1wdW5hbktlZHVhID0gYXJyYXlfZmxpcChzdHJfc3BsaXQoc3RydG9sb3dlcigka2F0YUtlZHVhKSkpOwoKICAgIGZvcmVhY2ggKHN0cl9zcGxpdChzdHJ0b2xvd2VyKCRrYXRhUGVydGFtYSkpIGFzICRodXJ1ZikgewogICAgICAgIGlmICghaXNzZXQoJGhpbXB1bmFuS2VkdWFbJGh1cnVmXSkpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gdHJ1ZTsKfQoKZnVuY3Rpb24gcHVueWFIdXJ1Zk11bHRpc2V0KCRrYXRhUGVydGFtYSwgJGthdGFLZWR1YSkKewogICAgaWYgKCRrYXRhUGVydGFtYSA9PT0gJycpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAkZnJla3VlbnNpID0gYXJyYXlfY291bnRfdmFsdWVzKHN0cl9zcGxpdChzdHJ0b2xvd2VyKCRrYXRhS2VkdWEpKSk7CgogICAgZm9yZWFjaCAoc3RyX3NwbGl0KHN0cnRvbG93ZXIoJGthdGFQZXJ0YW1hKSkgYXMgJGh1cnVmKSB7CiAgICAgICAgaWYgKGVtcHR5KCRmcmVrdWVuc2lbJGh1cnVmXSkpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICAkZnJla3VlbnNpWyRodXJ1Zl0tLTsKICAgIH0KCiAgICByZXR1cm4gdHJ1ZTsKfQoKCi8qID09PT09PT09PT09PT09PT09PT09PSBQRU5HVUpJQU4gPT09PT09PT09PT09PT09PT09PT09ICovCgokbHVsdXMgPSAwOwokdG90YWwgPSAwOwoKZnVuY3Rpb24gdWppKCRwZXJ0YW1hLCAka2VkdWEsICRoYXJhcGFuKQp7CiAgICBnbG9iYWwgJGx1bHVzLCAkdG90YWw7CgogICAgJGhhc2lsID0gcHVueWFIdXJ1ZigkcGVydGFtYSwgJGtlZHVhKTsKICAgICR0b3RhbCsrOwogICAgaWYgKCRoYXNpbCA9PT0gJGhhcmFwYW4pIHsKICAgICAgICAkbHVsdXMrKzsKICAgICAgICAkc3RhdHVzID0gJ0xVTFVTJzsKICAgIH0gZWxzZSB7CiAgICAgICAgJHN0YXR1cyA9ICdHQUdBTCc7CiAgICB9CgogICAgZWNobyBzdHJfcGFkKCJwdW55YUh1cnVmKCckcGVydGFtYScsICcka2VkdWEnKSIsIDQwKQogICAgICAgIC4gJyA9PiAnIC4gc3RyX3BhZCgkaGFzaWwgPyAnVFJVRScgOiAnRkFMU0UnLCA2KQogICAgICAgIC4gIiBbJHN0YXR1c10iIC4gUEhQX0VPTDsKfQoKZWNobyAiLS0tIFRlc3QgY2FzZSBkYXJpIHNvYWwgLS0tIiAuIFBIUF9FT0w7CnVqaSgnY2F0JywgJ2FudGFyY3RpY2EnLCB0cnVlKTsKdWppKCdjYXQnLCAnYXVzdHJhbGlhJywgIGZhbHNlKTsKdWppKCdjYXQnLCAnQU5UQVJDVElDQScsIHRydWUpOwoKZWNobyBQSFBfRU9MIC4gIi0tLSBFZGdlIGNhc2UgLS0tIiAuIFBIUF9FT0w7CnVqaSgnQ0FUJywgICdhbnRhcmN0aWNhJywgdHJ1ZSk7CnVqaSgnJywgICAgICdhcGFwdW4nLCAgICAgdHJ1ZSk7CnVqaSgnYWJjJywgICcnLCAgICAgICAgICAgZmFsc2UpOwp1amkoJycsICAgICAnJywgICAgICAgICAgIHRydWUpOwp1amkoJ2FhJywgICAnYW50YXJjdGljYScsIHRydWUpOwp1amkoJ2NhdCcsICAnY2F0JywgICAgICAgIHRydWUpOwp1amkoJ2NhdHMnLCAnY2F0JywgICAgICAgIGZhbHNlKTsKCmVjaG8gUEhQX0VPTCAuICItLS0gUGVyYmFuZGluZ2FuIGhpbXB1bmFuIHZzIG11bHRpc2V0IC0tLSIgLiBQSFBfRU9MOwokcGFzYW5nYW4gPSBhcnJheSgKICAgIGFycmF5KCdhYScsICAnY2F0JyksCiAgICBhcnJheSgnYWFhJywgJ2JhbmFuYScpLAogICAgYXJyYXkoJ2NhdCcsICdhbnRhcmN0aWNhJyksCik7CmZvcmVhY2ggKCRwYXNhbmdhbiBhcyAkcCkgewogICAgcHJpbnRmKAogICAgICAgICIlLTI0cyBoaW1wdW5hbj0lLTZzIG11bHRpc2V0PSVzIiAuIFBIUF9FT0wsCiAgICAgICAgIignIiAuICRwWzBdIC4gIicsICciIC4gJHBbMV0gLiAiJykiLAogICAgICAgIHB1bnlhSHVydWYoJHBbMF0sICRwWzFdKSAgICAgICAgID8gJ1RSVUUnIDogJ0ZBTFNFJywKICAgICAgICBwdW55YUh1cnVmTXVsdGlzZXQoJHBbMF0sICRwWzFdKSA/ICdUUlVFJyA6ICdGQUxTRScKICAgICk7Cn0KCmVjaG8gUEhQX0VPTCAuICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iIC4gUEhQX0VPTDsKZWNobyAiUklOR0tBU0FOOiAkbHVsdXMgZGFyaSAkdG90YWwgcGVuZ3VqaWFuIExVTFVTIiAuIFBIUF9FT0w7CmlmICgkbHVsdXMgIT09ICR0b3RhbCkgewogICAgZWNobyAiQURBIFBFTkdVSklBTiBZQU5HIEdBR0FMIiAuIFBIUF9FT0w7Cn0=