Задачки по PHP

8.08K
.
(\/)____o_O____(\/)

aNNiPAk, в экселе тоже мощный vbscript

.
The Frontend-Warrior
# reaper (24.09.2015 / 23:00)
Тут недавно нормальная такая задачка была, с которой даже я не до конца справился.
Есть строка. Нужно найти все возможные комбинации регистра символов.
Например для строки abc:
abc
Abc
aBc
abC
Я видел её.

Вот мой велосипед через рекурсию

<?php
  
$word = 'a#()dbc';

F($word);

function F($word) {
  $word = strtolower($word);
  reqF($word);
}

function reqF($word, $pos = 0) {
  if( $pos > strlen($word)-1 ){
    echo $word . '<br>';
    return; 
  } 
  if( !is_letter($word[$pos]) ){
    reqF($word, $pos+1);
    return;
  }
  reqF($word, $pos+1);
  $word[$pos] = chr( ord($word[$pos]) - 32 );
  reqF($word, $pos+1);
}

function is_letter($letter) {
  return ('a' <= $letter && $letter <= 'z');
}
.

Мой велосипед, на скорую руку

function strSplit( $string, $key, $length = 1 )
{
    if ( $length <= 0 )
    {
        $length = 1;
    }
    $strSplit = str_split(strtolower($string), $length);
    if ( $key >= 0 && (count($strSplit) - 1) >= $key )
    {
        $strSplit[$key] = '<b>' . strtoupper($strSplit[$key]) . '</b>';
    }

    return $strSplit;
}

$string = md5(time());
$strlen = strlen($string);

$return = array();
foreach (range(1, $strlen) as $length)
{
    foreach (range(0, $strlen) as $key)
    {
        $return[] = implode(strSplit($string, $key, $length));
    }
}

//unset($string, $strlen, $length, $key);
echo implode('<br>' . PHP_EOL, array_unique($return));
//unset($return);
.
(\/)____o_O____(\/)

кстати Макса задача не решена осталась
прикольно делать одно т3 разными способами. надо развивать тему
ещё задачка для раздумья
печать календарика с выходными и днями неделями на текущий месяц

.
# Koenig (26.09.2015 / 13:50)
кстати Макса задача не решена осталась
прикольно делать одно Т3 разными способами. надо развивать тему
Я как раз над ней сейчас и работаю
.
(\/)____o_O____(\/)

ДоХтор, вроде там задачка для детей)

.
# Koenig (26.09.2015 / 23:14)
ДоХтор, вроде там задачка для детей)
Почувствую себя ребёнком
У меня какой-то быдлокод получился... Вроде бы всё просто, но туева хуча циклов, как ни крути, имеет место. И ещё я не реализовал сортировку по дате. И вообще, мне не понравилось моё решение, если найду время, то перепишу заново.
Пример (+/-)
<?php

/**
 * Напиши скрипт, который будет:
 * Собирать юзерагенты и ip пользователей, обращающихся к нему и сохранять в файл.
 * В одном файле хранятся записи за последние 5 минут. Через 5 минут создается новый файл и 
 * последующие 5 минут в него пишутся юзер агенты и так далее.
 * 
 * Файлов может быть не более 10 штук.
 * 
 * После всего этого написать страничку, которая будет выводить юзерагенты из этих файлов 
 * в таблице примерно такого вида:
 * Дата | Юзерагент | IP
 * 
 * При выводе данных из файлов не должно быть повторяющихся связок IP + Юзерагент.
 * Ну и сделать возможность сортировки по дате.
 */
ini_set('display_errors', 1);
error_reporting(E_ALL | E_STRICT);
 
if (!isset($_REQUEST[session_name()])) session_start();

$sid = session_id();
$textfile = time() . '.txt';
$time_is_up = time() - 300;
$numb_files = 10;

$date = date('j.m.Y - H:i:s');
$user_agent = htmlspecialchars($_SERVER['HTTP_USER_AGENT']);
$user_agent = str_replace('|', '', $user_agent);
$ip = $_SERVER['REMOTE_ADDR'];
$filing = $sid . '|' . $date . '|' . $user_agent . '|' . $ip;

$array_names = array();
foreach (glob('*.txt') as $file_name) {
    $array_names[] = $file_name;
}
$all_strings = sizeof($array_names);

if ($all_strings == 0) {
    file_put_contents($textfile, $filing . PHP_EOL, LOCK_EX);
} else {
    $basename = (int)basename($array_names[($all_strings - 1)], '.txt');
    if ($time_is_up > $basename) file_put_contents($textfile, $filing . PHP_EOL, LOCK_EX);
    
    $file = file_get_contents(end($array_names));
    $explode = explode(PHP_EOL, $file);
    
    $temp = array();
    foreach ($explode as $string) {
        $array = explode('|', $string);
        $temp[] = $array[0];
    }
    
    if (!in_array($sid, $temp)) {
        file_put_contents(end($array_names), $filing . PHP_EOL, FILE_APPEND | LOCK_EX);
    }
}

if ($all_strings > $numb_files) {
    $array_names = array_reverse($array_names);
    $arr_fnames = array();
    $arr_contents = array();
    
    for ($i = 0; $i < $numb_files; $i++) {
        $arr_fnames[] = $array_names[$i];
        $arr_contents[] = file_get_contents($array_names[$i]);
    }
    
    foreach (glob('*.txt') as $filename) unlink($filename);
    
    for ($i = 0; $i < $numb_files; $i++) {
        file_put_contents($arr_fnames[$i], $arr_contents[$i]);
    }
}

/** ******************** Вывод в браузер ******************** **/

$array_result = array();

foreach (glob('*.txt') as $file_name) {
    $array_result[] = file_get_contents($file_name);
}

$input = array_reverse($array_result);
$array_result = array_unique($input);

$contents = '<table border="1">';
$contents .= '<tr><td>Дата</td><td>Браузер</td><td>IP</td></tr>';

foreach ($array_result as $result) {
    foreach (explode(PHP_EOL, $result) as $result) {
        $expl_arr = explode('|', $result);
        if (empty($expl_arr[0])) continue;
        $contents .= '<tr><td>'. $expl_arr[1] .'</td><td>'. $expl_arr[2] .
                     '</td><td>'. $expl_arr[3] .'</td></tr>';
    }
}

$contents .= '</table>';

echo $contents;
.
Демо скрипта
.
(\/)____o_O____(\/)

ДоХтор, я бы глянул в сторону spl там не плохие инструменты для работы с фс и файлами

.
# Koenig (27.09.2015 / 14:37)
ДоХтор, я бы глянул в сторону spl там не плохие инструменты для работы с фс и файлами
Спасибо, почитаю. А этот мой код неверно выполняет задачу, я его немного не дописал, потому что понял что логика немного ошибочна.
Всего: 270