106 lines
3.0 KiB
PHP
106 lines
3.0 KiB
PHP
|
<?php
|
||
|
defined('BASEPATH') OR exit('No direct script access allowed');
|
||
|
|
||
|
class NicknameModel extends CI_Model {
|
||
|
|
||
|
public function __construct() {
|
||
|
parent::__construct();
|
||
|
}
|
||
|
|
||
|
function generateMarkovTable($names = [])
|
||
|
{
|
||
|
$table = [];
|
||
|
foreach ($names as $name) {
|
||
|
$letters = str_split($name);
|
||
|
foreach ($letters as $key => $letter) {
|
||
|
$letter = strtolower($letter);
|
||
|
if (!array_key_exists($key + 1, $letters)) {
|
||
|
continue;
|
||
|
}
|
||
|
$nextLetter = strtolower($letters[$key + 1]);
|
||
|
if (!(array_key_exists($letter, $table) && array_key_exists($nextLetter, $table[$letter]))) {
|
||
|
$table[$letter][$nextLetter] = 1;
|
||
|
continue;
|
||
|
}
|
||
|
$table[$letter][$nextLetter] = $table[$letter][$nextLetter] + 1;
|
||
|
}
|
||
|
}
|
||
|
return $table;
|
||
|
}
|
||
|
|
||
|
function generateMarkovName($table, $minLength = 3, $maxLength = 10)
|
||
|
{
|
||
|
$currentLetter = array_rand($table);
|
||
|
$text = [$currentLetter];
|
||
|
$length = mt_rand($minLength, $maxLength);
|
||
|
for ($i = 0; $i < $length; $i++) {
|
||
|
$nextLetter = $this->getRandomWeightedElement($currentLetter, $table);
|
||
|
if (count($text) > 1) {
|
||
|
$previousLetter = $text[$i - 1];
|
||
|
while ($previousLetter == $nextLetter) {
|
||
|
$nextLetter = $this->getRandomWeightedElement($currentLetter, $table);
|
||
|
}
|
||
|
}
|
||
|
$text[] = $nextLetter;
|
||
|
$currentLetter = $nextLetter;
|
||
|
}
|
||
|
return ucfirst(implode('', $text));
|
||
|
}
|
||
|
|
||
|
function getRandomWeightedElement($key, array $table)
|
||
|
{
|
||
|
if (array_key_exists($key, $table)) {
|
||
|
$weightedValues = $table[$key];
|
||
|
$rand = mt_rand(1, (int) array_sum($weightedValues));
|
||
|
foreach ($weightedValues as $key => $value) {
|
||
|
$rand -= $value;
|
||
|
if ($rand <= 0) {
|
||
|
return $key;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return array_rand($table);
|
||
|
}
|
||
|
|
||
|
public function generateName() {
|
||
|
$names = [
|
||
|
'Gronkh',
|
||
|
'Currywurst',
|
||
|
'KingOfDog',
|
||
|
'Zeybe',
|
||
|
'unge',
|
||
|
'Dner',
|
||
|
'Arazhul',
|
||
|
'Hopson',
|
||
|
'Carykh',
|
||
|
'Benx',
|
||
|
'Demaster',
|
||
|
'Manucraft',
|
||
|
'Minecraft',
|
||
|
'ProPlayer91',
|
||
|
'Green',
|
||
|
'Blue',
|
||
|
'Red',
|
||
|
'Ultra',
|
||
|
'Pro',
|
||
|
'Racing',
|
||
|
'Shooter',
|
||
|
'King',
|
||
|
'Yellow',
|
||
|
'Gold',
|
||
|
'xXXx',
|
||
|
'iTz_',
|
||
|
'Running',
|
||
|
'YT',
|
||
|
'TV',
|
||
|
'HD',
|
||
|
'Huge',
|
||
|
'Best',
|
||
|
'imFlying',
|
||
|
'Not'
|
||
|
];
|
||
|
$table = $this->generateMarkovTable($names);
|
||
|
echo str_pad($this->generateMarkovName($table, 4, 7), 12);
|
||
|
}
|
||
|
}
|