#Тестовое задание
SQL: Важность учёта
Задачка: Важность учёта
Дана таблица поступлений товаров на склады компании следующего формата:
create table incoming ( storage_id integer not null, category_id integer not null, quantity integer not null, time datetime not null );
Напишите запрос, который выведет список последнего поступившего количества для каждого склада и категории товара. Таблица должна быть отсортирована по номеру склада (по возрастанию) и категории товара (по возрастанию). Например, для следующей таблицы:
storage_id | category_id | quantity | time ----------------------------------------------------- 1 | 32 | 3 | 2015-03-17 13:55:32 1 | 32 | 8 | 2015-03-17 13:15:22 3 | 32 | 23 | 2015-03-17 14:45:57 1 | 7 | 13 | 2015-03-17 15:56:12 1 | 32 | 7 | 2015-03-17 17:05:37 2 | 17 | 1 | 2015-03-18 13:13:22 1 | 7 | 13 | 2015-03-19 21:53:17
запрос должен возвращать
storage_id | category_id | quantity ---------------------------------------------- 1 | 7 | 13 1 | 32 | 7 2 | 17 | 1 3 | 32 | 23
Решение
select storage_id,category_id,quantity from (select *, DATE_FORMAT(`time`,'%Y%m%d%H') as sortOnTime, CONCAT(DATE_FORMAT(`time`,'%Y%m%d'), storage_id ) as days from incoming ORDER BY sortOnTime DESC )s GROUP BY days ORDER BY storage_id , category_id
в запросах для production запросы вида select *,.. лучше не использовать а перечислять жёстко все необходимые поля
Задание: Рекурсия
Дано
Нужно написать код, который из массива выведет то что приведено ниже в комментарии.
$x = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h');
/* print_r($x) - должен выводить это: Array ( [h] => Array ( [g] => Array ( [f] => Array ( [e] => Array ( [d] => Array ( [c] => Array ( [b] => Array ( [a] => ) ) ) ) ) ) ) );*/
Решение
$x = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'); function d($arg){ echo '<pre>'; print_r($arg); echo '</pre>'; } class Recurse{ public static function get($x){ $y = array_pop($x); if (!empty($x)){ return array( $y=>self::get($x)); } else { return array($y=>false); } } } d(Recurse::get($x));
Вывод

Задание: Анаграмма
Дано:
Число 128574 примечательно тем, что, будучи удвоенным, образует число 257148, которое состоит из тех же цифр, только в другом порядке.
Напишите программу, которая находит и выводит минимальное натуральное число, которое, будучи умноженным на 2, 3, 4, 5 и 6, образует числа, состоящие из тех же цифр, что и исходное.
Решение:
<?php set_time_limit(0); function dr($arg){ echo '<pre>'; echo var_dump($arg); echo '</pre>'; } /** * Class Anagramm * класс поиска "анаграмм" */ class Anagramm { const MIN_LIMIT = 999; const MAX_LIMIT = 99999; /** * основной метод поиска анаграмм * @return возвращает наименьшую анаграмму из найденных */ public static function search(){ $arOperands = array(2,3,4,5,6); $arResult = array(); for ($in = self::MIN_LIMIT; $in <= self::MAX_LIMIT;$in++){ foreach($arOperands as $operand) { $result = self::get($in,$operand); if (self::isCorrect($in,$result)){ $arResult[] = $in; } } } return min($arResult); } protected static function get($in,$operand){ return ($in*$operand); } /** * метод проверки анаграммы на корректность * @param $in * @param $out * @return bool */ protected static function isCorrect($in, $out){ $arIn = str_split($in); $arOut = str_split($out); sort($arIn); sort($arOut); $resultIn = implode($arIn); $resultOut = implode($arOut); if (strcasecmp($resultIn,$resultOut)==0) return true; else return false; } } dr(Anagramm::search()); // выводим найденную анаграмму