Возвращаясь к теме задачек для ума, решим-ка еще одну, она достаточно простая, но имеет как минимум два три решения.
Необходимо провести реверс-инжениринг простой функции, мы знаем, что функция возвращает true
либо false
в зависимости от единственного входного параметра.
Мы провели ряд тестов, и теперь знаем, что данная функция возвращает true
для следующего набора данных:
1 2 3 4 | 09 june 14 JULY 6 march 09 may |
И false
для следующего:
1 2 3 | 8 september 1 April 2 january |
Подумайте, что должно быть внутри такой функции? Вот вам заготовка для такой функции:
1 2 3 4 5 6 | /** * @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 выдает для простых чисел
Таки да, это задуманное мной условие, осталось только написать тело функции :)
/**
* @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
);
}
очень неординарный подход…
(day – month_num) > 1
Повертає truе, коли день року, або високосного року кратний 5 (ділиться без остачі). В іншому випадку – false.
list(
$length
,
$string
) =
explode
(
' '
,
$day
);
return
$length
>
strlen
(
$string
);
Элементарно
true если количество дней больше номера месяца
false , если степень двойки 2^0 = 1, 2^1= 2, 2^3 = 8
if
(
$day
==
'1 April'
||
strlen
(
$day
) > 7 )
return
false;
return
true;
Нужно больше значений, иначе тут сколько угодно можно вариантов придумать)
/**
* @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;
}
/**
* @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;
}
/**
* 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;
}
сравниваем число и длину названия месяца, если число больше – тру, иначе – фолс
поскольку не обьяснилось , что должна делать функция , предложу самый простой вариант :
<?
function
CheckDay (
$day
){
static
$allow
=
array
(
'09 june'
=> 1,
'14 july'
=> 1,
'6 march'
=> 1,
'09 may'
=> 1
);
return
isset(
$allow
[
strtolower
(
$day
) ] );
}