Задачка для разработчика


Возвращаясь к теме задачек для ума, решим-ка еще одну, она достаточно простая, но имеет как минимум два три решения.


Необходимо провести реверс-инжениринг простой функции, мы знаем, что функция возвращает true либо false в зависимости от единственного входного параметра.

Мы провели ряд тестов, и теперь знаем, что данная функция возвращает true для следующего набора данных:

09 june
14 JULY
6 march
09 may

И false для следующего:

8 september
1 April
2 january

Подумайте, что должно быть внутри такой функции? Вот вам заготовка для такой функции:

/**
 * @return boolean
 */
function checkDay ($day) {
    /* проверка должны быть тут */
}

29 thoughts on “Задачка для разработчика”

  1. Ну саму функцию я не напишу, но думаю смысл в следущем:
    1. разделяем число и название месяца (число в дальнейшем вообще роли не играет)
    2. если длинна названия больше 5 – вернуть false
    3. если в названии не все буквы принадлежат к одному регистру – вернуть false
    4. иначе вернуть true

      1. Ну если решения со бессмысленной логикой катят, то могу предложить такое:
        1. Привести к нижнему регистру
        2. Разделить число и месяц
        3. В качестве результата вернуть начинается ли название месяца на ‘ju’ или ‘ma’.

      2. То же одной строкой:

        /**
        * @return boolean
        */
        function checkDay ($day) {
        return preg_match(“/\d{1,2} ju|ma/i”, $day);
        }

    1. April – не больше 5, фолзе не вернет. Уже ошибка.

    1. 10 сентября – мимо, хотя мне нравится еще и такое решение – изменю-ка я чуть-чуть условие :)

  2. /**
    * @return boolean
    */
    function checkDay (day) {
    switch(day){
    case “09 june”:
    case “14 JULY”:
    case “6 march”:
    case “09 may”:
    return true;
    case “10 september”:
    case “1 April”:
    case “6 january”:
    return false;
    }
    }

  3. С изменённым вариантом входных параметров могу ещё предложить выдавать false для дней, число которых является степенью 2-ки (хотя всё-таки именно для этих входных данных сработает и мой первый вариант)

  4. 1. Если до конца месяца не более 25 дней – true.
    2. Функция проверяет кол-во рабочих дней без учета праздников в месяце. Если меньше или равно 15, то true. Больше false.
    3. Попытка связать с лунным календарем взорвала мне мозг. Он теперь вытекает на пол, и меня накажут за порчу имущества =(

    Заковырка только в том, что теперь сентябрь выпадает из двух решений, так как Вы сменили 10 число на 8-мое.

    3. При условии ввода именно таких данных 8 september, 1 April, 2 january – обычная проверка на русские символы. e и a – русские = false.

    4. Обычная проверка на регистр, но тут не хватает данных условия. Вводятся ли данные массивом или последовательно. Либо маленькие, либо все большие. Иметь разный регистр нельзя.

    5. Эта функция сильно оторванная от контекста. Выключить логику и включить фантазию, то, к примеру, она может проверять был ли произведен backup данных в такой-то день.

    6. Про return preg_match(“/\d{1,2} ju|ma/i”, $day); Мне тоже пришла такая идея, но поздно =(

  5. Складываем число и месяц
    true:
    6+9=15
    14+7=21
    6+3=9
    5+9=14
    false:
    8+9=17
    1+4=5
    2+1=3
    Вывод: false выдает для простых чисел

    1. Таки да, это задуманное мной условие, осталось только написать тело функции :)

      1. /**
         * @return boolean
         */
        function checkDay ($dayString) {
            $timestamp = strtotime($dayString);
        	if (!$timestamp) throw new Exception('Not valid date');
        	$day = intval(date('j', $timestamp));
        	$month = intval(date('n', $timestamp));
        	$sum = $month + $day;
        	/*Здесь можно было бы нафигачить алгоритм проверки простоты числа, например перебором делителей, но у нас набор вариантов очень ограничен (2-43), поэтому проще взять набор простых чисел для этого диапазона и проверить вхождение*/
        	$simpleNumbers = array(2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43);
        	return !in_array($sum, $simpleNumbers);
        }
        
  6. Повертає truе, коли день року, або високосного року кратний 5 (ділиться без остачі). В іншому випадку – false.

  7. list($length, $string) = explode(' ', $day);
    return $length>strlen($string);
    

    Элементарно

  8. true если количество дней больше номера месяца

  9. if($day == '1 April' || strlen($day) > 7 ) return false;
    return true; 
    

    Нужно больше значений, иначе тут сколько угодно можно вариантов придумать)

  10. /**
     * @return boolean
     */
    function checkDay ($day) {
        /* проверка должны быть тут */
    	$monthName = substr($day,strpos($day, " "));
    	$monthNumber = date("n", strtotime(strtolower($monthName)));
    	$April = 4;
    	$winter = array(12,1,2);
    	$spring = array(3,4,5);
    	$summer = array(6,7,8);
    	$autumn = array(9,10,11);
    	if($monthNumber == $April || in_array($monthNumber, $autumn) || in_array($monthNumber, $winter)){
    		return false;
    	}
    	return true;
    }
    
  11. /**
     * @return boolean
     */
    function checkDay ($day) {
        /* проверка должны быть тут */
    	if($day[0] != "6") {
    		return ($day[1] != " ");
    	} 
    	return true;
    }
    
    /**
     * @return boolean
     */
    function checkDay2 ($day) {
        /* проверка должны быть тут */
    	if(strpos(strtolower($day), "ju") || strpos(strtolower($day), "ma")) {
    		return true;
    	} 
    	return false;
    }
    
  12. /**
     * function checkDay
     * 
     * Возвращает истину, при условии что сумма числовых представлений дня и месяца из строчного аргумента будут не простым числом
     * 
     * @param string $day  		строка с датой в формате "%d|%e %B"
     * 
     * @throws MissinArhument 	исключение бросается, если аргумент не передан в ф-цию
     * @throws NotValidData 	исключение бросается, если аргумент не является валидной для ф-ции strtotime датой
     * 
     * @return boolean 			true - если сумма не простое числа, false в противном случае
     */
    function checkDay ($day) {
    
    	if(!isset($day))//если аргумент не передан
    		throw new Exception('Missing argument day');
    
    	$ts = strtotime($day);
    	if(!$ts)//если аргумент не дата, которую может распознать strtotime
    		throw new Exception($day . ' is not a valid date');
    	
    
        list($dayNum, $monthNum) = explode(' ', date('j n', $ts));
    
        $sumDayMonth = $dayNum + $monthNum; 
    
        //проверяем, простое ли число
        if ($sumDayMonth <= 3) return false;
        
        for ($primeSearch = 2 ; $primeSearch * $primeSearch <= $sumDayMonth ; $primeSearch++)
            if($sumDayMonth%$primeSearch == 0)
                return true;
    
        return false; 
    }
    
  13. сравниваем число и длину названия месяца, если число больше – тру, иначе – фолс

  14. поскольку не обьяснилось , что должна делать функция , предложу самый простой вариант :

    <?
    function CheckDay ($day){
    static $allow = array (
     '09 june' => 1,
     '14 july' => 1,
     '6 march' => 1,
     '09 may' => 1
    );
    return isset( $allow[ strtolower($day) ] );
    }

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.