<?php

function punyaHuruf($kataPertama, $kataKedua)
{
    if ($kataPertama === '') {
        return true;
    }

    $himpunanKedua = array_flip(str_split(strtolower($kataKedua)));

    foreach (str_split(strtolower($kataPertama)) as $huruf) {
        if (!isset($himpunanKedua[$huruf])) {
            return false;
        }
    }

    return true;
}

function punyaHurufMultiset($kataPertama, $kataKedua)
{
    if ($kataPertama === '') {
        return true;
    }

    $frekuensi = array_count_values(str_split(strtolower($kataKedua)));

    foreach (str_split(strtolower($kataPertama)) as $huruf) {
        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;
$pasangan = array(
    array('aa',  'cat'),
    array('aaa', 'banana'),
    array('cat', 'antarctica'),
);
foreach ($pasangan as $p) {
    printf(
        "%-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;
}