<?php
$str = "23456789ABCDEGHJKMNPQRSTUVXYZabcdeghjkmnpqrstuvxyz";
$excludes = ['cp','cb','ck','c6','c9','rn','rm','mm','co','do','cl','db','qp','qb','dp','ww'];
$length = 5;
function fastCaptcha
(array $dictionary, array $excludedSyllables, int
$length): string
{
$captcha = '';
$previousCharacter = '';
$generatedLength = 0;
while ($generatedLength < $length) {
$randomCharacter = $dictionary[array_rand($dictionary)];
if(array_key_exists($previousCharacter . $randomCharacter, $excludedSyllables)) { continue;
}
$captcha .= $randomCharacter;
$previousCharacter = $randomCharacter;
$generatedLength++;
}
return $captcha;
}
$excludesRegex = '/' . implode('|', $excludes) . '/';
function fuckedCaptcha(string $dictionary, string $excludedSyllables, int $length): string
{
do {
return $code;
}
function fastFuckedCaptcha
(array $dictionary, string
$excludedSyllables, int
$length): string
{
$captcha = '';
$previousCharacter = '';
$generatedLength = 0;
while ($generatedLength < $length) {
$randomCharacter = $dictionary[array_rand($dictionary)];
if(preg_match($excludedSyllables, $previousCharacter . $randomCharacter)) continue;
$captcha .= $randomCharacter;
$previousCharacter = $randomCharacter;
$generatedLength++;
}
return $captcha;
}
for ($i = 0; $i < 100000; $i++)
fuckedCaptcha($str, $excludesRegex, $length);
for ($i = 0; $i < 100000; $i++)
fastCaptcha($dictionaryArray, $indexedExcludes, $length);
for ($i = 0; $i < 100000; $i++)
fastFuckedCaptcha($dictionaryArray, $excludesRegex, $length);
echo "regexp : " . ($t1 - $t0) . "\n";
echo "array index: " . ($t2 - $t1) . "\n";
echo "regexp again: " . ($t3 - $t2) . "\n";
PD9waHAKCiRzdHIgPSAiMjM0NTY3ODlBQkNERUdISktNTlBRUlNUVVZYWVphYmNkZWdoamttbnBxcnN0dXZ4eXoiOwokZXhjbHVkZXMgPSBbJ2NwJywnY2InLCdjaycsJ2M2JywnYzknLCdybicsJ3JtJywnbW0nLCdjbycsJ2RvJywnY2wnLCdkYicsJ3FwJywncWInLCdkcCcsJ3d3J107CiRsZW5ndGggPSA1OwoKJGluZGV4ZWRFeGNsdWRlcyA9IGFycmF5X2NvbWJpbmUoJGV4Y2x1ZGVzLCAkZXhjbHVkZXMpOwokZGljdGlvbmFyeUFycmF5ID0gc3RyX3NwbGl0KCRzdHIpOwoKZnVuY3Rpb24gZmFzdENhcHRjaGEoYXJyYXkgJGRpY3Rpb25hcnksIGFycmF5ICRleGNsdWRlZFN5bGxhYmxlcywgaW50ICRsZW5ndGgpOiBzdHJpbmcKewogICAgJGNhcHRjaGEgPSAnJzsKICAgICRwcmV2aW91c0NoYXJhY3RlciA9ICcnOwogICAgJGdlbmVyYXRlZExlbmd0aCA9IDA7CgogICAgd2hpbGUgKCRnZW5lcmF0ZWRMZW5ndGggPCAkbGVuZ3RoKSB7CiAgICAgICAgJHJhbmRvbUNoYXJhY3RlciA9ICRkaWN0aW9uYXJ5W2FycmF5X3JhbmQoJGRpY3Rpb25hcnkpXTsKCiAgICAgICAgaWYoYXJyYXlfa2V5X2V4aXN0cygkcHJldmlvdXNDaGFyYWN0ZXIgLiAkcmFuZG9tQ2hhcmFjdGVyLCAkZXhjbHVkZWRTeWxsYWJsZXMpKSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KCiAgICAgICAgJGNhcHRjaGEgLj0gJHJhbmRvbUNoYXJhY3RlcjsKICAgICAgICAkcHJldmlvdXNDaGFyYWN0ZXIgPSAkcmFuZG9tQ2hhcmFjdGVyOwogICAgICAgICRnZW5lcmF0ZWRMZW5ndGgrKzsKICAgIH0KCiAgICByZXR1cm4gJGNhcHRjaGE7Cn0KCiRleGNsdWRlc1JlZ2V4ID0gJy8nIC4gaW1wbG9kZSgnfCcsICRleGNsdWRlcykgLiAnLyc7CgpmdW5jdGlvbiBmdWNrZWRDYXB0Y2hhKHN0cmluZyAkZGljdGlvbmFyeSwgc3RyaW5nICRleGNsdWRlZFN5bGxhYmxlcywgaW50ICRsZW5ndGgpOiBzdHJpbmcKewogICAgZG8gewogICAgICAgICRjb2RlID0gc3Vic3RyKHN0cl9zaHVmZmxlKHN0cl9yZXBlYXQoJGRpY3Rpb25hcnksIDMpKSwgMCwgJGxlbmd0aCk7CiAgICB9IHdoaWxlIChwcmVnX21hdGNoKCRleGNsdWRlZFN5bGxhYmxlcywgJGNvZGUpKTsKCiAgICByZXR1cm4gJGNvZGU7Cn0KCmZ1bmN0aW9uIGZhc3RGdWNrZWRDYXB0Y2hhKGFycmF5ICRkaWN0aW9uYXJ5LCBzdHJpbmcgJGV4Y2x1ZGVkU3lsbGFibGVzLCBpbnQgJGxlbmd0aCk6IHN0cmluZwp7CiAgICAkY2FwdGNoYSA9ICcnOwogICAgJHByZXZpb3VzQ2hhcmFjdGVyID0gJyc7CiAgICAkZ2VuZXJhdGVkTGVuZ3RoID0gMDsKICAgIAogICAgd2hpbGUgKCRnZW5lcmF0ZWRMZW5ndGggPCAkbGVuZ3RoKSB7CiAgICAgICAgJHJhbmRvbUNoYXJhY3RlciA9ICRkaWN0aW9uYXJ5W2FycmF5X3JhbmQoJGRpY3Rpb25hcnkpXTsKCiAgICAgICAgaWYocHJlZ19tYXRjaCgkZXhjbHVkZWRTeWxsYWJsZXMsICRwcmV2aW91c0NoYXJhY3RlciAuICRyYW5kb21DaGFyYWN0ZXIpKQogICAgICAgIAljb250aW51ZTsKCiAgICAgICAgJGNhcHRjaGEgLj0gJHJhbmRvbUNoYXJhY3RlcjsKICAgICAgICAkcHJldmlvdXNDaGFyYWN0ZXIgPSAkcmFuZG9tQ2hhcmFjdGVyOwogICAgICAgICRnZW5lcmF0ZWRMZW5ndGgrKzsKICAgIH0KCiAgICByZXR1cm4gJGNhcHRjaGE7Cn0KCgokdDAgPSBtaWNyb3RpbWUodHJ1ZSk7Cgpmb3IgKCRpID0gMDsgJGkgPCAxMDAwMDA7ICRpKyspCiAgICBmdWNrZWRDYXB0Y2hhKCRzdHIsICRleGNsdWRlc1JlZ2V4LCAkbGVuZ3RoKTsKCiR0MSA9IG1pY3JvdGltZSh0cnVlKTsKCmZvciAoJGkgPSAwOyAkaSA8IDEwMDAwMDsgJGkrKykKICAgIGZhc3RDYXB0Y2hhKCRkaWN0aW9uYXJ5QXJyYXksICRpbmRleGVkRXhjbHVkZXMsICRsZW5ndGgpOwoKJHQyID0gbWljcm90aW1lKHRydWUpOwoKZm9yICgkaSA9IDA7ICRpIDwgMTAwMDAwOyAkaSsrKQogICAgZmFzdEZ1Y2tlZENhcHRjaGEoJGRpY3Rpb25hcnlBcnJheSwgJGV4Y2x1ZGVzUmVnZXgsICRsZW5ndGgpOwoKJHQzID0gbWljcm90aW1lKHRydWUpOwoKZWNobyAicmVnZXhwICAgICA6ICIgLiAoJHQxIC0gJHQwKSAuICJcbiI7CmVjaG8gImFycmF5IGluZGV4OiAiIC4gKCR0MiAtICR0MSkgLiAiXG4iOwplY2hvICJyZWdleHAgYWdhaW46ICIgLiAoJHQzIC0gJHQyKSAuICJcbiI7