покритикуйте код

antson

Новичок
Партнер клуба
Kirill
главное ваше решение не дает совпадения с контрольным примером

требовалось
dateDiffInMonths('2007-07-05', '2007-11-05')
5.00537634409
в вашем случае
3.97204301075

dateDiffInMonths('2007-07-05', '2008-07-25')
12.6451612903
в вашем случае
12.6129032258


по первой разнице в 5 месяцев с хвостиком явная нестыковка
считаем на пальцах 4 месяца откуда там должен быть результат 5 даеше с хвостиком

если вы не стали уточнять этого момента, то явно проволили тест на адекватность.

з.ы. вспомнил чтото похожее было у Хайлана . главному герою предстояло поступление в школу астронавтов. условия теста на какомто тренажоре набрать очки.
дальше шла инструкция, когда очки начисляются и исключения. в условиях теста приписка, что нельзя обращаться за консультациями.
на табло тренажера результат предыдущего абитуриента.
проанализировав условия он пришел к выводу что задача не имеет решения и все таки обратился к ответственному за тест.
 

Crys

Двинутый новичок
хз... дома вчера накорябал.. скорее всего нечто такое бы и сделал... тока более осмысленные имена переменным давал бы...

PHP:
<?php
function dateDiffInMonths($date1, $date2) {
    if ($date1 == $date2)
        return 0;
    if ($date1 > $date2) {
        $tmp    = $date2;
        $date2  = $date1;
        $date1  = $tmp;
    }
    $date1 = strtotime($date1);
    $date2 = strtotime($date2);
    $it = 0;

    while ($date1 < $date2) {
        $date2=strtotime('-1 month',$date2);
        $it++;
    }
    if ($date2 < $date1) {
        $date2=strtotime('+1 month',$date2);
        $it--;
    }

    $day1  = date('d',$date1);
    $day2  = date('d',$date2);
    $days  = date('t',$date2);

    $it+=($day2-$day1)/$days;
    return $it;
}

print dateDiffInMonths('2007-07-05', '2007-11-05');
//4
?>
 

baev

‹°°¬•
Команда форума
kode, Crys, хватит тормозить.

Правильный ответ:
PHP:
<?php

function dateDiffInMonths($start=0, $end=0){
  if ($start=='2007-07-05' && $end=='2007-11-05'){
    return "5.00537634409";
  }else if($start=='2007-07-05' && $end=='2008-07-25'){
    return "12.6451612903";
  }else{
    return "неизвестные аргументы";
  }
}

echo dateDiffInMonths()."<br />";
echo dateDiffInMonths('2007-07-05', '2007-11-05')."<br />";
echo dateDiffInMonths('2007-07-05', '2008-07-25')."<br />";
?>
 

kode

never knows best
Автор оригинала: baev
kode, Crys, хватит тормозить.

Правильный ответ:
PHP:
<?php

function dateDiffInMonths($start=0, $end=0){
  if ($start=='2007-07-05' && $end=='2007-11-05'){
    return "5.00537634409";
  }else if($start=='2007-07-05' && $end=='2008-07-25'){
    return "12.6451612903";
  }else{
    return "неизвестные аргументы";
  }
}

echo dateDiffInMonths()."<br />";
echo dateDiffInMonths('2007-07-05', '2007-11-05')."<br />";
echo dateDiffInMonths('2007-07-05', '2008-07-25')."<br />";
?>
Бениссимо маэстро! :D
 
Я тоже писал им такую функцию. Получилось так:
PHP:
<?php

 function dateDiffInMonths($data1, $data2) {

    $year1=substr($data1, 0, 4);
    $month1=substr($data1, 5, 2);
    $day1=substr($data1, 8, 2);
  
    $year2=substr($data2, 0, 4);
    $month2=substr($data2, 5,2);
    $day2=substr($data2, 8, 2);

    $JDCdata1=GregorianToJD($month1, $day1, $year1);
    $JDCdata2=GregorianToJD($month2, $day2, $year2);
    return ($JDCdata2-$JDCdata1)/30;
  }
  echo dateDiffInMonths('2007-07-05', '2007-11-05')."<br>";
  echo dateDiffInMonths('2007-07-05', '2008-07-25')."<br>";
  echo dateDiffInMonths('2008-06-01', '2008-07-05');
?>
-~{}~ 04.05.08 11:15:

Потом попросили решить такую задачу.
Пункт 1 (а,б) является обязательным. Пункты 2 и 3 выполняются по желанию кандидата.

Существует входной параметр в виде случайного текста (строки).
В тексте встречаются вызовы функций PHP для работы со строками с простыми (скалярными) аргументами.
Каждая функция имеет один аргумент.
Аргументы являются случайными строками, ограниченными одинарными кавычками.
Синтаксических ошибок в функциях и аргументах нет.
Примеры текста:
---
вpю rtrim('xrщ') fqншжх)on fюd crc32('рiз((хрирo lc') mxуra crc32('bftвл') кc trim('aц') brzmхуyвтт addslashes('гeeээдiцрr') жfpщжkгzpnч
md5('хвe)толzl(pz') jvбвyфг)ач(y strtoupper('vяssтууcхбwб') гoуцщ о )мyjюч trim('у)нскrсpanfвэх') iгаоyтk strtoupper('d yjq k') хd rtrim('qч') едeп
strtoupper('цхt)') огqв buжtqрc strlen('dsкфумqхmмох') цю(jeеfэ оv trim('xюб)щtниtжм') pнмзмnvgюvcvc strtolower('xмеnмуtмвfя(j') nэwqфxur
striptags('iцяэm( э') зу(j ltrim('liтw') чaеу)з(ej strtoupper(' yozidсyх') иdлprбч(цniyкy ltrim('xнмбqyayющfuка') вoktеiгjсjvdфмq
addslashes('юykeчшжэууuizдc') b м txзmгрхrrnц crc32('юцзяcфжg()ржwхе') вa )a striptags('мjмfяо') nщфи rtrim('gkfz') dк umаэaхвlv strtoupper('atап qэ
ждфд') )пjхlтbкdдю striptags('ff(sqg xaлf') toeqоcjoaм htmlspecialchars('щчfэ dcвюm') bдnppjиlw strtolower('p fvрпнiя') тrtщкп ( пly(fd
ltrim('zqbgеedd(шлсaxп') ufр(lцоppшb strtolower('хcфнвфvzзэт') упygqctсч crc32(' бнrr бwу') бwvя metaphone('нжfб') ry metaphone('яd') xdщklщfu)jф(еr
metaphone('kbeцжlялkoксмя') лcxбp)zц md5('иnxixгзш')
---
бkjжщезкю strtoupper('borвbиpnд') еg(m crc32('awlt') lnфлv htmlspecialchars('yжwyz') mnзчsвavофдцт addslashes('q)гuapyt барч') dишгpзржвумюпс
metaphone('эwзgvгюкодфbнy') iомigжlsсмдyi ltrim('иcfsэsшfvцcав') oourцeeq( htmlspecialchars('yкgzzдcvтр') pzz addslashes('ffw') uшфm ousyw crc32('фоюv
nчупa') mtд юпсфиjdzб strtoupper('егqlкdm nтalэ') эреpжюнхoж addslashes('цнcоxbo)id') оg(гн дф metaphone('уэf eхчн') бх strtoupper('nк') iсбsti
trim('dлжмz ') яучrуэmrю md5('еожyцaz)г') ффжеqdzv addslashes('сiжkfglг') uщ rtrim('шr') дx libсе кл crc32('раiжиxlяsчq') iеwцтю b metaphone('у ссац)a')
иz)mрfщаgмtяt md5('мzqiбuzфeгхмk') хч xz htmlspecialchars('ktiba') тnwoi)рcчejчю strtolower('ке гxмcфuiчmчб')
---
cокn(o strlen('жpuпюз') dxieiк trim(' vмаос') iрн strlen(' шj') ла trim('tw') mu яmp striptags(' мнфч ') awkс сeтx strtoupper('sicnбwукkj') mгрl)dсgа абд
trim('киодxtюяеaм)p') эwpkfgхцo rtrim('жфхну сgj') вtялdюхw ю htmlspecialchars('оb oщшgухv') pц strlen('т ') цэз lдtsgo e strlen('kлlcюf вгкju') чngma фaщ
trim('уdкuc( lg') ge nшv)otюnвr htmlspecialchars('fc екдbшm)уфщ') шнb rtrim('гuс') аlwvя) флj pуг crc32('yevдsхзезкгчpт') w( wмшwгзацпоша
ltrim('юо)nр(пуeyoсвbщ') юz crc32(' у') сvdвюкqцaеvs ltrim('вфcвrдмуtblщ') rpдэф strtoupper('zюшюуjа') пsбgсвinчo md5('rартkзбмlн') bmопожfщуd
rtrim('рagжrнд)ny') скгsрbлэyи htmlspecialchars('lхщwиt ю(') zгoбdmcи strtoupper('vююgчт(в') b шжфx )zy)f кс addslashes('цbup(sзб елсмsm') жрзrнsx
ltrim('xp пфfю')
---

1) Используя ООП(PHP 5), реализовать инструмент, решающий следующие задачи:

а) Заменить во входном тексте все вызовы функций PHP на результат их выполнения и получить результирующий текст
б) Сформировать XML (в виде строки) следующей структуры:
<root>
<func function="f" result="x" position="y" arg="z">
...
</root>
root - корневой узел
func - узел с данными одной функции
function="f" - имя функции
position="y" - позиция первого символа функции во входном тексте
result="x" - результат выполнения функции
arg="z" - аргумент функции
Таким образом, XML должен содержать данные по всем найденным функциям и их аргументам

2) (XSLT) Cоставить XSLT-шаблон, результат применения которого к получаемому в пункте 2 XML-дереву
будет представлять собой HTML-страницу с информацией по функциям и их аргументам.
Написать php-файл, выполняющий XSLT-преобразование и вывод

3) (mysql) Cпроектировать бд mysql, предназначенную для хранения информации о функциях и аргументах.
Написать php-файл выполняющий основные операции по работе с этой бд - вставка, просмотр, редактирование, удаление.

Решение:
PHP:
<?php  
class Zam_Func {

  public $text;

  function zam() {
    $v="/(\w+)\('(.*?)'\)/m";

    function zamena($k){
      if (function_exists("$k[1]")) {
          return $k[1]($k[2]);
        } 
        else {
          return "$k[0]";
        }
    }
    return preg_replace_callback($v,"zamena",$this->text);

  }
  function xml() {
  
    $v="/(\w+)\('(.*?)'\)/m";
    preg_match_all($v,$this->text,$p,PREG_OFFSET_CAPTURE);

    $str="<root>\n";
    for ($i=0; $i<count($p[1]); $i++) {
      $function=$p[1][$i][0];
      if (function_exists("$function")) {
        $position=$p[1][$i][1];
        $arg=$p[2][$i][0];
        $result=$function($arg); 
        $str=$str."<func function=\"$function\" result=\"$result\" position=\"$position\" arg=\"$arg\">\n"; 
      } 
    }
    $str=$str."</root>";
    return $str;
  }
}

$text="cокn(o strlen('жpuпюз') dxieiк trim(' vмаос') iрн strlen(' шj') ла trim('tw') mu яmp striptags(' мнфч ') awkс сeтx strtoupper('sicnбwукkj') mгрl)dсgа абд
trim('киодxtюяеaм)p') эwpkfgхцo rtrim('жфхну сgj') вtялdюхw ю htmlspecialchars('оb oщшgухv') pц strlen('т ') цэз lдtsgo e strlen('kлlcюf вгкju') чngma фaщ
trim('уdкuc( lg') ge nшv)otюnвr htmlspecialchars('fc екдbшm)уфщ') шнb rtrim('гuс') аlwvя) флj pуг crc32('yevдsхзезкгчpт') w( wмшwгзацпоша
ltrim('юо)nр(пуeyoсвbщ') юz crc32(' у') сvdвюкqцaеvs ltrim('вфcвrдмуtblщ') rpдэф strtoupper('zюшюуjа') пsбgсвinчo md5('rартkзбмlн') bmопожfщуd
rtrim('рagжrнд)ny') скгsрbлэyи htmlspecialchars('lхщwиt ю(') zгoбdmcи strtoupper('vююgчт(в') b шжфx )zy)f кс addslashes('цbup(sзб елсмsm') жрзrнsx
ltrim('xp пфfю')";
  
$obj= new Zam_Func; 
$obj->text=$text;

    
$res=$obj->zam();
echo "$res";   

echo "\n"; 
 
$xml=$obj->xml();
echo "$xml";

?>
 

AmdY

Пью пиво
Команда форума
маниакально, я не уверен, что конструкцию function zam() { function zamena($k){
пропустит свежий РНР
 
Сверху