Автор Тема: [PHP] Условности  (Прочетена 85782 пъти)

sdr

  • Участник
  • *****
  • Публикации: 655
    • Профил
Re: [PHP] Условности
« Отговор #30 -: Мар 11, 2010, 08:50 »
Хора без работа! Не може това не може онова - някой чекиджия измислил мноооого хитър начин за решаване на збсолютно безинтересен "проблем" и го поставя като задача на "колегите" си чекиджии да си мерят пишките :) WOW възхИтен съм от брилянтните ви решения и огромните ви пишки..

(плс модерирате ме!!)
Активен

VladSun

  • Moderator
  • Участник
  • *****
  • Публикации: 2166
    • Профил
Re: [PHP] Условности
« Отговор #31 -: Мар 11, 2010, 08:54 »
За какво да те модерирам - нека си ти седи простотията, щом си решил ...
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

VladSun

  • Moderator
  • Участник
  • *****
  • Публикации: 2166
    • Профил
Re: [PHP] Условности
« Отговор #32 -: Мар 11, 2010, 09:02 »
мноооого хитър начин за решаване на збсолютно безинтересен "проблем"

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

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

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

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

neter

  • Global Moderator
  • Участник
  • *****
  • Публикации: 3408
  • Distribution: Debian, SailfishOS, CentOS
  • Window Manager: LXDE, Lipstick
    • Профил
    • WWW
Re: [PHP] Условности
« Отговор #33 -: Мар 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 сортирането не слага нужния елемент от масива на първо място. Но и без него, пак имам един комплект скоби, за премахването на който не виждам път... Почвам да си мисля, че тактиката ми с този масив стигна максимума си, и ще трябва да сменям алгоритъма. Но... ще видим :)
« Последна редакция: Мар 11, 2010, 10:06 от neter »
Активен

"Да си добре приспособен към болно общество не е признак за добро здраве" - Джиду Кришнамурти

VladSun

  • Moderator
  • Участник
  • *****
  • Публикации: 2166
    • Профил
Re: [PHP] Условности
« Отговор #34 -: Мар 11, 2010, 10:24 »
Търси се решение при следните ограничения:

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

* "(" може да се използва само един път;
« Последна редакция: Мар 11, 2010, 10:26 от VladSun »
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

gat3way

  • Участник
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Re: [PHP] Условности
« Отговор #35 -: Мар 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.  

А, то си имало вградени функции за сортиране на масиви, кво се хабя и аз :) Пфу, да бяха две скобите вместо една, щях да имам решение :(
« Последна редакция: Мар 11, 2010, 10:44 от gat3way »
Активен

"Knowledge is power" - France is Bacon

VladSun

  • Moderator
  • Участник
  • *****
  • Публикации: 2166
    • Профил
Re: [PHP] Условности
« Отговор #36 -: Мар 11, 2010, 11:03 »
В друга насока трябва да търсите :)

lookup tables :)
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

VladSun

  • Moderator
  • Участник
  • *****
  • Публикации: 2166
    • Профил
Re: [PHP] Условности
« Отговор #37 -: Мар 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"
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

gat3way

  • Участник
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Re: [PHP] Условности
« Отговор #38 -: Мар 13, 2010, 00:11 »
Не е това, има прекалено много "(", искам да видя това дето е само с една :)
Активен

"Knowledge is power" - France is Bacon

VladSun

  • Moderator
  • Участник
  • *****
  • Публикации: 2166
    • Профил
Re: [PHP] Условности
« Отговор #39 -: Мар 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];
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

VladSun

  • Moderator
  • Участник
  • *****
  • Публикации: 2166
    • Профил
Re: [PHP] Условности
« Отговор #40 -: Мар 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];
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

neter

  • Global Moderator
  • Участник
  • *****
  • Публикации: 3408
  • Distribution: Debian, SailfishOS, CentOS
  • Window Manager: LXDE, Lipstick
    • Профил
    • WWW
Re: [PHP] Условности
« Отговор #41 -: Мар 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 е по-голямо или по-малко от указаната стойност на масива, но не се сещах защо при успех винаги се връщаше първия ключ на масива, а не ключът на указания елемент в условието. След което намерих това сред потребителските постове с примери за използване на 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, поздрави за задачата!
« Последна редакция: Мар 13, 2010, 01:11 от neter »
Активен

"Да си добре приспособен към болно общество не е признак за добро здраве" - Джиду Кришнамурти

edmon

  • Гост
Re: [PHP] Условности
« Отговор #42 -: Мар 13, 2010, 11:03 »
Много са забавни тези задачи!
Изискват добро познаване на езика!
Обаче ми звучат горе долу като : да се съберат две числа без фунции за събиране!
Активен

VladSun

  • Moderator
  • Участник
  • *****
  • Публикации: 2166
    • Профил
Re: [PHP] Условности
« Отговор #43 -: Мар 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

Нарочно съм капсулирал функцията в клас заедно с константите - направих кода по-прегледен и разбираем.
« Последна редакция: Мар 13, 2010, 12:41 от VladSun »
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P