Linux за българи: Форуми

Програмиране => Конкурс bash-майсторът => Темата е започната от: VladSun в Mar 09, 2010, 22:17



Титла: [PHP] Условности
Публикувано от: VladSun в Mar 09, 2010, 22:17
Задачка:

Напишете PHP скрипт, който да изобразява (т.е. echo)  следните стойности за Z в зависимост от стойностите на X и Y:

* ако X е по-малко от 1, то Z = 0;
* ако X е между (вкл.) 1 и 23, то Z = X + Y;
* ако X е между (вкл.) 24 и 59, то Z = X + 23;
* ако X е по-голямо от 59, то Z = X + 59.


Уловката е следната ;) :

* "if" не може да се използва повече от 2 пъти;
* "{" не може да се използва повече от 1 път;
* "else" не може да се използва изобщо;
* "?" не може да се използва изобщо;
* "eval" не може да се използва изобщо;
* "switch" не може да се използва изобщо.

Успех!


Титла: Re: [PHP] Условности
Публикувано от: go_fire в Mar 09, 2010, 22:54
А какво изобщо можем да използваме? Ако дадеш МяСял може и да стиснем ръце. Имам и един по-тъп въпрос, как ще ползвам два пъти иф, а средна скоба веднъж ???


Титла: Re: [PHP] Условности
Публикувано от: VladSun в Mar 09, 2010, 23:21
Условието на задачката не е мое - беше даден в друг форум, но решения имаше бол - тка че не ревИ ;)

Условието е ясно - можеш да използваш всеки един от зададените елементи на езика, в комбинация в другите условия или не, но не повече от разрешения брой (ако изобщо е разрешено).

Идеята на задачката е да се намери нестандартно, но минималистично решение.


Титла: Re: [PHP] Условности
Публикувано от: shoshon в Mar 09, 2010, 23:27
Код
GeSHi (PHP):
  1. function f(x,y){
  2. return (x < 1) + ((x >= 1) and (x<23))*(x+y) + ((x>=24) and (x<59)) (x+23) + (x>59)*(x+59);
  3. }
  4.  
  5. echo "z=".f(x,y);


Не разбирам от PHP  но в нормалната математика тва БИ трябвало да е така :). Без нито един if.
Ето само с един if, ако някой се заядде за кастинга:
Код
GeSHi (PHP):
  1. function bool(eq){
  2. if(eq) return 1;
  3. return 0;
  4. }
  5.  
  6. echo "z=".bool(x < 1) + bool((x >= 1) and (x<23))*(x+y) + bool((x>=24) and (x<59)) (x+23) +bool (x>59)*(x+59)


Ама и тва не е интересно, защото най-вероятно, задачата е зададена с цел да не се изпълнят вички изчисления. Ама сега ме мързи да мисля :)


Титла: Re: [PHP] Условности
Публикувано от: gat3way в Mar 09, 2010, 23:31
По дърварски му :)

Код
GeSHi (PHP):
  1. <?php
  2.  
  3. // $x=...;
  4. // $y=...;
  5.  
  6. $ar[-1]=(-1*$x);
  7. $ar[0]=(-1*$x);
  8. $ar[1]=1;
  9. $ar[2]=23;
  10. $ar[3]=59;
  11. $t=0;
  12.  
  13. for ($a=0;$a<=3;$a++) if ($x> $ar[$a] ) $t++;
  14.  
  15. $z=$x+$ar[$t-1];
  16. if ($t==1) $z=$x+$y;
  17. echo $z;
  18. ?>
  19.  

Мога да се опитам да вместя някъде и { ма няма смисъл :)


Титла: Re: [PHP] Условности
Публикувано от: VladSun в Mar 09, 2010, 23:51
Още, още! :)
Досега 1/2 от решенията май ... ;)


Титла: Re: [PHP] Условности
Публикувано от: VladSun в Mar 09, 2010, 23:53
Ама и тва не е интересно, защото най-вероятно, задачата е зададена с цел да не се изпълнят вички изчисления. Ама сега ме мързи да мисля :)

Мдам, и аз това подчертах в едно от моите решения. Но, не винаги 1/100 сек. време изпълнение е решаваща - в повечето случаи четливостта и гъвкавостта са по-важни.


Титла: Re: [PHP] Условности
Публикувано от: VladSun в Mar 09, 2010, 23:56
@gat3way

пробвай и друго решение с масиви ;)


Титла: Re: [PHP] Условности
Публикувано от: gat3way в Mar 10, 2010, 00:29
Няма, спи ми се :)


Титла: Re: [PHP] Условности
Публикувано от: Naka в Mar 10, 2010, 00:35
беше даден в друг форум, но решения имаше бол

URL-че?
Одавна не съм преписвал >:D


Титла: Re: [PHP] Условности
Публикувано от: neter в Mar 10, 2010, 00:47
Моите двайсет:
Код
GeSHi (PHP):
  1. <?php
  2.  
  3. $x = '...';
  4. $y = '...';
  5.  
  6. $array = array(0 => 1, $x+$y => 24, $x+23 => 60, $x+59 => INF);
  7. foreach ($array as $z => $value)
  8.    if ($value-$x > 0) {
  9.            echo $z;
  10.            exit;
  11.    }
  12.  
  13. ?>

edit: Вече съм доволен. Замених граничната статична стойност с INF. Не знаех за това INF, не ми се беше налагало да го ползвам. Ако на някой му е интересно за възможността за играчка с безкрайността в различните езици, може да се зачете тук ($2).


Титла: Re: [PHP] Условности
Публикувано от: VladSun в Mar 10, 2010, 11:04
Други идеи?

Ново ограничение:
* не могат да се използват цикли (for, while, foreach).


 >:D >:D >:D


Титла: Re: [PHP] Условности
Публикувано от: neter в Mar 10, 2010, 11:16
Тююю, язък. А как си се радвах какво кратичко стана >:D Както се трупат ограничения, накрая ще трябва да кажа на скрипта да хвърля боб, за да разбере
Код
GeSHi (Bash):
  1. <?php
  2.  
  3. $x = '...';
  4. $y = '...';
  5. $z = exec("echo $x | /usr/bin/bob", $results);
  6. echo $z;
  7.  
  8. ?>
Много интересна задача [_]3


Титла: Re: [PHP] Условности
Публикувано от: gat3way в Mar 10, 2010, 11:43
Сега нали вкарват goto в PHP, върши същата работа щом като няма цикли :)

Код
GeSHi (PHP):
  1. //$x=...;
  2. //$y=...;
  3. $ar[-1]=(-1*$x);
  4. $ar[0]=(-1*$x);
  5. $ar[1]=1;
  6. $ar[2]=23;
  7. $ar[3]=59;
  8. $t=0;$a=0;
  9.  
  10. again:
  11. if (($t<4)&&($x>$ar[$a])) {$a++;$t++;goto again;}
  12.  
  13. $z=$x+$ar[$t-1];
  14. if ($t==1) $z=$x+$y;
  15.  
  16. echo "$z\n";


Титла: Re: [PHP] Условности
Публикувано от: VladSun в Mar 10, 2010, 11:56
Сега нали вкарват goto в PHP...

Анатема!  :P

* не може да се използва goto !


Титла: Re: [PHP] Условности
Публикувано от: gat3way в Mar 10, 2010, 12:00
Най-хубавото нещо на всеки програмен език е тва, ти пък анатема  :)

Добре, без цикли и без масиви, само с 2 if-a:

Код
GeSHi (PHP):
  1. <?php
  2.  
  3. //$x=...;
  4. //$y=...;
  5.  
  6. $o=max(0,floor($x/24));
  7. $p=max(0,floor($x/60));
  8.  
  9. $z=0;
  10.  
  11. $z+=min($p,1)*59;
  12. if ($p==0) $z+=min($o,1)*23;
  13.  
  14. $z+=max($x,0);
  15. if (($x>0)&&($o==0)) $z=$x+$y;
  16.  
  17. echo "$z\n";
  18.  
  19. ?>
  20.  


Титла: Re: [PHP] Условности
Публикувано от: VladSun в Mar 10, 2010, 13:21
Добре, добре - останаха още два типа решения на задачката :) (поне за толкова знам)


Титла: Re: [PHP] Условности
Публикувано от: neter в Mar 10, 2010, 15:45
Добре, да направя още един опит със същата идея за масив, като миналия път:
Код
GeSHi (PHP):
  1. <?php
  2.  
  3. $x = '...';
  4. $y = '...';
  5.  
  6. function check($value) {
  7.      if ($value-$GLOBALS['x'] > 0) return($value);
  8. }
  9.  
  10. $array = array(0 => 1, $x+$y => 24, $x+23 => 60, $x+59 => INF);
  11. $z = key(array_filter($array, "check"));
  12.  
  13. ?>


Титла: Re: [PHP] Условности
Публикувано от: VladSun в Mar 10, 2010, 16:04
Интересно решение :)

Айде за капак:
* не може да се използва if  (решението на shoshon е ОК в този случай)

 ;D ;D ;D

Макар и да има още едно интересно решение с if ...


Титла: Re: [PHP] Условности
Публикувано от: neter в Mar 10, 2010, 16:24
Добре - същото, но без if:
Код
GeSHi (PHP):
  1. <?php
  2.  
  3. $x = '...';
  4. $y = '...';
  5.  
  6. function check($value) {
  7.      return(max(0,$value-$GLOBALS['x']));
  8. }
  9.  
  10. $array = array(0 => 1, $x+$y => 24, $x+23 => 60, $x+59 => INF);
  11. $z = key(array_filter($array, "check"));
  12.  
  13. ?>


Титла: Re: [PHP] Условности
Публикувано от: VladSun в Mar 10, 2010, 16:25
* без {

муахаххаха :)


Титла: Re: [PHP] Условности
Публикувано от: VladSun в Mar 10, 2010, 16:52
Всъщност решението на shoshon не връща правилния резултат (дори след "компилирането" му към PHP)

има една много минорна логическа грешка :)
даже три ;)


Титла: Re: [PHP] Условности
Публикувано от: neter в Mar 10, 2010, 17:42
Всеки момент очаквам да кажеш "без php" ;D Ето какво измъдрих за премахване на функцията (защото не знам начин функция да се изпише без {, но ако има, ще се радвам да го науча):
Код
GeSHi (PHP):
  1. <?php
  2.  
  3. $x = '...';
  4. $y = '...';
  5.  
  6. $array = array(0 => 1, $x+$y => 23, $x+23 => 59, $x+59 => INF);
  7. $z = array_pop(array_keys(array_unique(array(0 => max(0,$x-key($array)), $x+$y => max(0,$x-next($array)), $x+23 => max(0,$x-next($array)), $x+59 => max(0,$x-next($array))))));
  8.  
  9. ?>

P.S.: VladSun, нещо да не отказваш бирата и/или цигарите, че и нас завличаш по този мъчителен път [_]3


Титла: Re: [PHP] Условности
Публикувано от: VladSun в Mar 10, 2010, 18:25
 >:D Цигарите - за 30-ти път сигурно :)

Без PHP няма да стане, но съм сигурен, че  ще се справите и с последното условие:

* използване на "(" само веднъж!!!

 ;)


Титла: Re: [PHP] Условности
Публикувано от: gat3way в Mar 10, 2010, 18:42
Може ли на C?

Каквото кажеш, няма да се среща повече от веднъж...гарантирано :)


Титла: Re: [PHP] Условности
Публикувано от: VladSun в Mar 10, 2010, 18:54
То едва ли ще има разлика...
Дай да видим :)


Титла: Re: [PHP] Условности
Публикувано от: gat3way в Mar 10, 2010, 18:59
Е то е ясно, каквото ми трябва си го #define-вам и да му мисли preprocessor-a :) Cheat-ване е сега де, ама пък на - гледаш в сорса - има го само веднъж :)


Титла: Re: [PHP] Условности
Публикувано от: VladSun в Mar 10, 2010, 19:05
Не се приема :P


Титла: Re: [PHP] Условности
Публикувано от: VladSun в Mar 10, 2010, 19:06
Подсказка за if-варианта, който се търси - http://en.wikipedia.org/wiki/Short-circuit_evaluation .
Ограниченията за него са тези изисквани преди отпадането му :)


Титла: Re: [PHP] Условности
Публикувано от: gat3way в Mar 11, 2010, 00:37
Гр, почвам да се подсещам за знаменитата задача за програмата дето трябвала да си принтне сорса. Само дето там няма толкова ограничения :(


//offtopic
Цяла статия в уикипедия имало по този въпрос, преди години колко си бях блъскал главата по този проблем, ама тогава нямаше уикипедия :(

http://en.wikipedia.org/wiki/Quine_(computing)


Титла: Re: [PHP] Условности
Публикувано от: sdr в Mar 11, 2010, 08:50
Хора без работа! Не може това не може онова - някой чекиджия измислил мноооого хитър начин за решаване на збсолютно безинтересен "проблем" и го поставя като задача на "колегите" си чекиджии да си мерят пишките :) WOW възхИтен съм от брилянтните ви решения и огромните ви пишки..

(плс модерирате ме!!)


Титла: Re: [PHP] Условности
Публикувано от: VladSun в Mar 11, 2010, 08:54
За какво да те модерирам - нека си ти седи простотията, щом си решил ...


Титла: Re: [PHP] Условности
Публикувано от: VladSun в Mar 11, 2010, 09:02
мноооого хитър начин за решаване на збсолютно безинтересен "проблем"

Проблемът е често срещан и докато има тривиални решения - switch, if/else и т.н., то наистина съществуват решения (шаблони), които правят кода изключително четлив и кратък за сметка на малко повече изчисления, което според модерните схващания е по-важно.

Да, проблемът е от по-простите - не от ранга на проблемите решавани в "Design patterns" например.

Пример:
Да се напише код, който да изобразява разликата между две дати в "човешки" вид - ако е по-малка от минута, да се изпише в секунди; ако е по-малка от час да се изпише в минути, ако е по-малка от ден да се изпише в часове, и т.н, и т.н.


Титла: Re: [PHP] Условности
Публикувано от: neter в Mar 11, 2010, 09:11
Още не съм намерил решение с един комплект скоби, но реших да пусна труда си по опростяването до момента. Честно казано, в продукционна среда никога нямаше да се сетя за такива опростявания, до каквито стигнах досега. Та...:
Код
GeSHi (PHP):
  1. <?php
  2.  
  3. $x = '...';
  4. $y = '...';
  5.  
  6. $array[0] = $x-1;
  7. $array[$x+$y] = $x-24;
  8. $array[$x+23] = $x-60;
  9. $array[$x+59] = $x-INF;
  10.  
  11. asort($array,SORT_STRING);
  12. $z = max(0,key($array));
  13.  
  14. ?>
Въпросният max() ми трябва, за да осигуря поддръжка на отрицателни стойности на $x, тъй като при отрицателни стойности на $x сортирането не слага нужния елемент от масива на първо място. Но и без него, пак имам един комплект скоби, за премахването на който не виждам път... Почвам да си мисля, че тактиката ми с този масив стигна максимума си, и ще трябва да сменям алгоритъма. Но... ще видим :)


Титла: Re: [PHP] Условности
Публикувано от: VladSun в Mar 11, 2010, 10:24
Търси се решение при следните ограничения:

* "if" не може да се използва изобщо;
* "{" не може да се използва изобщо;
* "?" не може да се използва изобщо;
* "eval" не може да се използва изобщо;
* "for" не може да се използва изобщо;
* "foreach" не може да се използва изобщо;
* "while" не може да се използва изобщо;
* "switch" не може да се използва изобщо;
* "goto" не може да се използва изобщо;

* "(" може да се използва само един път;


Титла: Re: [PHP] Условности
Публикувано от: gat3way в Mar 11, 2010, 10:29
Тамън измислих идиотско решение със сортиране по метода на мехурчето, всичкото покриваше, само не изискването за само една "(". Мамка му :(

Код
GeSHi (PHP):
  1. <?php
  2.  
  3. //$x=24;
  4. //$y=1;
  5.  
  6. $ar[0]=1;
  7. $ar[1]=23;
  8. $ar[2]=59;
  9. $ar[3]=$x;
  10.  
  11. $br[0]=0;
  12. $br[1]=$x+$y;
  13. $br[2]=$x+23;
  14. $br[3]=$x+59;
  15.  
  16. $p=min($ar[2],$ar[3]);
  17. $q=max($ar[2],$ar[3]);
  18. $ar[2]=$p;
  19. $ar[3]=$q;
  20.  
  21. $p=min($ar[1],$ar[2]);
  22. $q=max($ar[1],$ar[2]);
  23. $ar[1]=$p;
  24. $ar[2]=$q;
  25.  
  26. $p=min($ar[0],$ar[1]);
  27. $q=max($ar[0],$ar[1]);
  28. $ar[0]=$p;
  29. $ar[1]=$q;
  30.  
  31. $z=$br[array_search($x,$ar)];
  32. echo "$z\n";
  33. ?>
  34.  

А, то си имало вградени функции за сортиране на масиви, кво се хабя и аз :) Пфу, да бяха две скобите вместо една, щях да имам решение :(


Титла: Re: [PHP] Условности
Публикувано от: VladSun в Mar 11, 2010, 11:03
В друга насока трябва да търсите :)

lookup tables :)


Титла: Re: [PHP] Условности
Публикувано от: VladSun в Mar 12, 2010, 23:52
Явно загубихте интерес :) Едно от решенията, за които подсказах беше:
Код
GeSHi (PHP):
  1. <?php
  2.  
  3. $x = ...;
  4. $y = ...;
  5. $z = 0;
  6.  
  7. function act (&$z, $new, $condition)
  8. {
  9.    if ($condition)
  10.        $z = $new;
  11.    return $condition;
  12. }
  13.  
  14. if ( ! act( $z, 0, ( $x <  1 )            )
  15. &&   ! act( $z, $x +  $y, ( 0 < $x && $x <  24 ) )
  16. &&   ! act( $z, $x +  23, ( 23 < $x && $x < 60 ) )
  17. &&   ! act( $z, $x + 59, ( 59 < $x)             )
  18. );
  19.  
  20. echo $z;

http://en.wikipedia.org/wiki/Short-circuit_evaluation

Решението лично на мен не ми допада много, но е интересно ...

Остава другото решение с един вид "lookup tables"


Титла: Re: [PHP] Условности
Публикувано от: gat3way в Mar 13, 2010, 00:11
Не е това, има прекалено много "(", искам да видя това дето е само с една :)


Титла: Re: [PHP] Условности
Публикувано от: VladSun в Mar 13, 2010, 00:25
Това беше едно от по-рано търсените решения.

Явно изчерпах търпението ви :

Код
GeSHi (PHP):
  1.  
  2. $x = ...;
  3. $y = ...;
  4.  
  5. $lt = array
  6. (
  7.        $x < 1 => 0,
  8.        $x >= 1 && $x <= 23 => $y + $x,
  9.        $x > 23 && $x <= 59 => 23 + $x,
  10.        $x > 59 => 59 + $x,
  11. );
  12.  
  13. echo $lt[1];


Титла: Re: [PHP] Условности
Публикувано от: VladSun в Mar 13, 2010, 00:28
Втори вариант:

Код
GeSHi (PHP):
  1. $x = ...;
  2. $y = ...;
  3.  
  4. $lt = array
  5. (
  6. 1 => 0
  7.        $x > 0 => $y + $x,
  8.        $x > 23 => 23 + $x,
  9.        $x > 59 => 59 + $x,
  10. );
  11.  
  12. echo $lt[1];


Титла: Re: [PHP] Условности
Публикувано от: neter в Mar 13, 2010, 01:08
Аз още не съм загубил интерес - просто нямам много свободно време, а в допълнение и решението нещо много упорито ми убягва. Но далеч не съм се отказал, понеже задачата наистина ми е интересна. Поради което, ако няма други все още борещи се, заради които отговорът да не се оповестява, то бих помолил за лична услуга, ако може, за момента отговорът да не бъде публикуван в темата, а ако някой все пак го иска, да се изпраща като лично съобщение. Е, няма да се разсърдя, ако молбата ми бъде отхвърлена де :)
Това решение, което даваш сега, е с интересна идея, обаче май има повече действия и синтаксисно разнообразие от всички останали предложения досега в темата. Но пък то нали се отнася към първоначалните условия, а там си пасва.
Между другото, докато си играх с тази задача, научих още нещо ново, което не го намерих описано в документацията на PHP (което не значи, че го няма, но все пак търсих усилено). Става дума за изпълнение на if условие в структурата на array_search(). Тъй като се зачудих дали има начин като needle в array_search() да се зададе не статична стойност, а диапазон от стойности, което щеше да ми позволи директно с един array_search() да намеря нужната стойност на $z в масива, и да реша въпроса, но не намерих никаква информация за това, реших да поекспериментирам директно с кода, пък току виж изскочил някакъв заек. И ето някои от комбинациите, които върнаха някакъв заек:
Код
GeSHi (PHP):
  1. <?php
  2.  
  3. $array[0] = 1;
  4. $array[1] = 5;
  5. $array[2] = 10;
  6.  
  7. $x = 7;
  8.  
  9. echo array_search($x >= $array[0], $array)."\n"; //Връща първият ключ на масива, т.е. 0
  10. echo array_search($x >= $array[1], $array)."\n"; //Връща първият ключ на масива, т.е. 0
  11. echo array_search($x >= $array[2], $array)."\n"; //Не връща нищо
  12.  
  13. ?>
Явно успявам да разбера дали $x е по-голямо или по-малко от указаната стойност на масива, но не се сещах защо при успех винаги се връщаше първия ключ на масива, а не ключът на указания елемент в условието. След което намерих това ($2) сред потребителските постове с примери за използване на array_search(). Казано по нашенски за тези, които все още не разбират, в PHP числовите стойности, освен самата си стойност, имат следните определящи видове - нулева стойност, при което се връща false за стойността, и ненулева стойност, при което се връща true за стойността. Функцията array_search() може да търси за булеви стойности, така че, задавайки if-подобна проверка като needle, всъщност съм постигнал указване на true/false. Тъй като array_search() връща първата намерена стойност, то той ми е връщал винаги ключа на първата ненулева стойност при true, а тъй като нямам нулеви стойности в този архив, не ми връща нищо при false. Тъй като не намерих никаква информация за използването на if структура в array_search(), продължих с опитите и видях, че можем да имаме дори подобно задаване:
Код
GeSHi (PHP):
  1. echo array_search($x>23&&$x<60&&$x=5, $a)."\n";
при което успяват да се изпълнят както двете проверки, така успява да се зададе и различна стойност на $x (в случая 5), но тази стойност на $x започва да действа след приключването на array_search().
В крайна сметка до момента не съм стигнал до вариант на тази скрита (неописана, или ненамерена от мен) възможност за ползване на array_search(), който ще ми е полезен за изпълнението на задачата с всичките й условия, а най-вероятно няма и да стигна до такъв, но реших да покажа една интересна възможност на array_search(), пък и да се види в какво си загубих свободното време, вместо да измисля работещо решение на задачата ;D

P.S.: Гледам, че докато си изпиша фермана, са се появили вече отговори с една скоба, но нищо. Направих всичко възможно да не успея да прегледам и запомня нищо от тях, така че си продължавам с разсъжденията самосиндикално [_]3 VladSun, поздрави за задачата!


Титла: Re: [PHP] Условности
Публикувано от: edmon в Mar 13, 2010, 11:03
Много са забавни тези задачи!
Изискват добро познаване на езика!
Обаче ми звучат горе долу като : да се съберат две числа без фунции за събиране!


Титла: Re: [PHP] Условности
Публикувано от: VladSun в Mar 13, 2010, 12:31
neter, НЕ ЧЕТИ! :)

Много са забавни тези задачи!
Изискват добро познаване на езика!
Обаче ми звучат горе долу като : да се съберат две числа без фунции за събиране!

Идеята за ограниченията беше да се "разчупи" мисленето на участниците - иначе не би имала смисъл.
Ето как съм решил аз проблема поставен от мен по-горе:

Код
GeSHi (PHP):
  1. class IntervalView
  2. {
  3. const MATCH = true;
  4.  
  5. const INF = 1;
  6. const YEAR = 31556926;
  7. const MONTH = 2628000;
  8. const WEEK = 604800;
  9. const DAY = 86400;
  10. const HOUR = 3600;
  11. const MINUTE = 60;
  12. const SECOND = 1;
  13.  
  14. public static function toHumanReadable($timestamp)
  15. {
  16. $diff = time() - $timestamp;
  17.  
  18. if ($diff == 0)
  19.    return 'just now';
  20.  
  21. $intervals = array
  22. (
  23.    self::INF => array('name' => 'year',   'denominator' => self::YEAR),
  24.    $diff < self::YEAR => array('name' => 'month',  'denominator' => self::MONTH),
  25.    $diff < self::MONTH => array('name' => 'week',   'denominator' => self::WEEK),
  26.    $diff < self::WEEK => array('name' => 'day',    'denominator' => self::DAY),
  27.    $diff < self::DAY => array('name' => 'hour',   'denominator' => self::HOUR),
  28.    $diff < self::HOUR => array('name' => 'minute', 'denominator' => self::MINUTE),
  29.    $diff < self::MINUTE => array('name' => 'second', 'denominator' => self::SECOND)
  30. );
  31.  
  32. $value = floor($diff/$intervals[self::MATCH]['denominator']);
  33. return $value.' '.$intervals[self::MATCH]['name'].($value > 1 ? 's' : '').' ago';
  34. }
  35.  
  36. }

Тест:

Код
GeSHi (PHP):
  1. function test($ts)
  2. {
  3.    echo IntervalView::toHumanReadable($ts) . '<br />';
  4. }
  5.  
  6. test(time());
  7. test(time()-33);
  8. test(time()-(60*17));
  9. test(time()-((60*60*2) + (60*55)));
  10. test(time()-(60*60*3+60));
  11. test(strtotime('-1 day'));
  12. test(strtotime('-13 days'));
  13. test(strtotime('-25 days'));
  14. test(strtotime('July 23 2009'));
  15. test(strtotime('November 18 1999'));
  16. test(strtotime('March 1 1937'));

Изход:
Код:
just now
33 seconds ago
17 minutes ago
2 hours ago
3 hours ago
1 day ago
1 week ago
3 weeks ago
7 months ago
10 years ago
73 years ago

Нарочно съм капсулирал функцията в клас заедно с константите - направих кода по-прегледен и разбираем.