Возвращаясь к теме задачек для ума, решим-ка еще одну, она достаточно простая, но имеет как минимум два три решения.
Необходимо провести реверс-инжениринг простой функции, мы знаем, что функция возвращает true
либо false
в зависимости от единственного входного параметра.
Мы провели ряд тестов, и теперь знаем, что данная функция возвращает true
для следующего набора данных:
09 june 14 JULY 6 march 09 may
И false
для следующего:
8 september 1 April 2 january
Подумайте, что должно быть внутри такой функции? Вот вам заготовка для такой функции:
/** * @return boolean */ function checkDay ($day) { /* проверка должны быть тут */ }
Ну саму функцию я не напишу, но думаю смысл в следущем:
1. разделяем число и название месяца (число в дальнейшем вообще роли не играет)
2. если длинна названия больше 5 – вернуть false
3. если в названии не все буквы принадлежат к одному регистру – вернуть false
4. иначе вернуть true
Одно есть :)
Ну если решения со бессмысленной логикой катят, то могу предложить такое:
1. Привести к нижнему регистру
2. Разделить число и месяц
3. В качестве результата вернуть начинается ли название месяца на ‘ju’ или ‘ma’.
То же одной строкой:
/**
* @return boolean
*/
function checkDay ($day) {
return preg_match(“/\d{1,2} ju|ma/i”, $day);
}
April – не больше 5, фолзе не вернет. Уже ошибка.
Проверка на выходные или нет дни.
10 сентября – мимо, хотя мне нравится еще и такое решение – изменю-ка я чуть-чуть условие :)
так год не указан
/**
* @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;
}
}
+100500!
оу… а где default блок? непорядок!
С изменённым вариантом входных параметров могу ещё предложить выдавать false для дней, число которых является степенью 2-ки (хотя всё-таки именно для этих входных данных сработает и мой первый вариант)
Даже не заметил… :)
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); Мне тоже пришла такая идея, но поздно =(
Складываем число и месяц
true:
6+9=15
14+7=21
6+3=9
5+9=14
false:
8+9=17
1+4=5
2+1=3
Вывод: false выдает для простых чисел
Таки да, это задуманное мной условие, осталось только написать тело функции :)
очень неординарный подход…
(day – month_num) > 1
Повертає truе, коли день року, або високосного року кратний 5 (ділиться без остачі). В іншому випадку – false.
Элементарно
true если количество дней больше номера месяца
false , если степень двойки 2^0 = 1, 2^1= 2, 2^3 = 8
Нужно больше значений, иначе тут сколько угодно можно вариантов придумать)
сравниваем число и длину названия месяца, если число больше – тру, иначе – фолс
поскольку не обьяснилось , что должна делать функция , предложу самый простой вариант :