На винде и на маке проверка также не проходит не потому, что я использую \n, а потому что вы используте \r.
Вы уже запускали скрипт на винде? Видели, как криво формируется файл output.txt? А все потому, что пхп проводит в вашем скрипте замену для винды \n на \r\n. Но вы в добавок добавляете еще один \r. В результате получаем конструкцию - \r\n\r и расплывшийся файл output.txt.
Да, я запускал скрипт и на юниксе и в винде - в юниксе Ваш файл нормально получается, а в Windows нет (см. аттач к предыдущему сообщению), мой скрипт наоборот. Чтобы везде работало правильно - можно использовать PHP_EOL, как я писал выше. И не делает пхп в наших скриптах замену "для винды \n на \r\n".
Эта функция самостоятельно определяет, какой режим включать в зависимости от типа переданного ей аргумента (бинарные данные или текстовые).
Цитата:
Сообщение от seoproger
Я говорил про формирование строки с датой. Строки выше превращаются в одну с использованием sprintf.
Тут без разницы. Или делать
$mondays =. sptintf(...);
А потом записать строку в файл. Или сначала сформировать массив, а потом записать его в файл. Для определения скорости нужно проверить, что работает быстрее sptintf или implode.
29.11.2010, 12:26
Mulder
Цитата:
Сообщение от seoproger
Чтобы везде работало правильно - можно использовать PHP_EOL, как я писал выше. И не делает пхп в наших скриптах замену "для винды \n на \r\n".
Т.е. вы согласны, что использовали операционно-зависимую запись и баллы сняты по праву?
29.11.2010, 12:28
seoproger
Цитата:
Сообщение от Mulder
Это для старых версий пхп. В новых и 'b' работает верно. Читайте рекомендации.
Эта функция самостоятельно определяет, какой режим включать в зависимости от типа переданного ей аргумента (бинарные данные или текстовые).
Тут без разницы. Или делать
$mondays =. sptintf(...);
А потом записать строку в файл. Или сначала сформировать массив, а потом записать его в файл. Для определения скорости нужно проверить, что работает быстрее sptintf или implode.
Ну, вроде бы уже все сказано, ссылки на мануал даны, пример приведен. (Кстати, у меня новая версия PHP). Просто для себя - выполните свой скрипт в windows и мой, и посмотрите в шестнадцатиричном редакторе - увидите что в моем будут правльные \r\n, а в Вашем - только \n.
Про sprintf - вообще непонятен ответ, она не делает записи в файл и принцип формирования массива не меняет и с implode в скрипте никак не связана.
29.11.2010, 12:29
seoproger
Цитата:
Сообщение от Mulder
Т.е. вы согласны, что использовали операционно-зависимую запись и баллы сняты по праву?
Я с этим и не спорил, просто указал что в проверочном скрипте то же самое. Ну и в комментариях к заданию кажется проскакивало что проверочный скрипт пойме любые стандартные переводы строк.
29.11.2010, 12:39
Mulder
Цитата:
Сообщение от seoproger
Да, я запускал скрипт и на юниксе и в винде - в юниксе Ваш файл нормально получается, а в Windows нет (см. аттач к предыдущему сообщению)
Возможно вы и правы, что на уровне бинарных данных он формируется не так. Но визуальный вывод верен.
Возьмите и проведите простой эксперимент.
Сначала возьмем винду. Запустите файл make_output.php. Визуально файл сформировался верно? Верно. Скопируйте temp.txt в input.txt, чтобы у вас получился файл участника и файл судьи. Прогоните их через скрипт check.php. Если все нормально, то в output.txt должна быть только одна строка:
in: 173 - out: 173
Вы можете возразить, что в файле check.php специально стоит разрыв по \n - explode('\n');. Ок, смотрим дальше.
Поставим в разрыве символы '\r\n' и explode('\r\n') и проведем ту же последовательность действий, что и для винды. Каков итоговый результат в файле output.txt, temp.txt и input.txt? Даже визуально файлы будут сформированы криво, чего нельзя сказать для опыта с виндой.
Возьмем мак. Там перевод \n\r. Поставим сначала в разрыв
explode('\n'), а потом explode('\r\n'). В каком случае выходной файл output.txt получился верным? И каковы данные в temp.txt и input.txt?
Любые стандартные для целевой системы. Было сказано, что ваш скрипт должен был самостоятельно определить целевую систему и сделать нужный перевод строк.
29.11.2010, 12:55
seoproger
Вложений: 1
Цитата:
Сообщение от Mulder
Возможно вы и правы, что на уровне бинарных данных он формируется не так. Но визуальный вывод верен.
Возьмите и проведите простой эксперимент.
Сначала возьмем винду. Запустите файл make_output.php. Визуально файл сформировался верно? Верно.
Сделал - неверно, открыл в блокноте - визуальный вывод неверен - вместо разрывов строк "кракозябры-квадратики" (пример такого файла давал ранее - добавил картинку).
Цитата:
Сообщение от Mulder
Скопируйте temp.txt в input.txt, чтобы у вас получился файл участника и файл судьи. Прогоните их через скрипт check.php. Если все нормально, то в output.txt должна быть только одна строка:
in: 173 - out: 173
Вы можете возразить, что в файле check.php специально стоит разрыв по \n - explode('\n');. Ок, смотрим дальше.
Поставим в разрыве символы '\r\n' и explode('\r\n') и проведем ту же последовательность действий, что и для винды. Каков итоговый результат в файле output.txt, temp.txt и input.txt? Даже визуально файлы будут сформированы криво, чего нельзя сказать для опыта с виндой.
Если вторая часть эксперимента для Unix - то да, все верно. Как я и говорил - \r\n для windows, \n - для Unix.
Если же это тоже для Windows - то при \r\n во всех скриптах проверка пройдет и файл будет отображаться визуально нормально.
Цитата:
Сообщение от Mulder
Возьмем мак. Там перевод \n\r. Поставим сначала в разрыв
explode('\n'), а потом explode('\r\n'). В каком случае выходной файл output.txt получился верным? И каковы данные в temp.txt и input.txt?
Это к чему? Суть в том, что в наших скриптах \n - остается \n, а не меняется на \r\n или еще что-то в зависимости от ОС. Поэтому один скрипт работает правильно для Windows, а второй - для Unix.
29.11.2010, 13:18
Mulder
Цитата:
Сообщение от seoproger
Сделал - неверно, открыл в блокноте - визуальный вывод неверен - вместо разрывов строк "кракозябры-квадратики" (пример такого файла давал ранее - добавил картинку).
Значит зависит еще и от редактора. Я открыл в Lister (F3 в тотал коммандере) и notepad++. Отображение везде верное.
Значит я ошибся про функции file_get_contents() и file_put_contents(). Они не производят трансляцию. Но это как раз тот случай, когда ошибка помогает легко выследить тех, кто не правильно делал перевод.
Но в любом случае, если я ошибаюсь так, что вы теряете баллы, потерянные баллы я добавляю в следующем задании.
Правильный код формирования файла с учетом особенностей каждой из ос:
Значит зависит еще и от редактора. Я открыл в Lister (F3 в тотал коммандере) и notepad++. Отображение везде верное.
Значит я ошибся про функции file_get_contents() и file_put_contents(). Они не производят трансляцию. Но это как раз тот случай, когда ошибка помогает легко выследить тех, кто не правильно делал перевод.
Но в любом случае, если я ошибаюсь так, что вы теряете баллы, потерянные баллы я добавляю в следующем задании.
Правильный код формирования файла с учетом особенностей каждой из ос:
Современные блокноты под windows сами определяют тип перевода строки в файле.
К сожалению нескорлько дней я буду далек от интернета, а значит не смогу делать задания. Желаю Всем удачи в конкурсе, чтобы все остались довольны и даже если не заняли призовое место, то пополнили копилку знаний :0024:
*Простите за мой "спор", просто какое-то утро холодное и мрачное, обычно я не ввязываюсь "в разбор полетов" :)
29.11.2010, 13:28
HTMLandPHP
Цитата:
Сообщение от Mulder
Естественно. Даже не проще, а правильно+кратчайшим способом+оптимальным способом. Если вас попросят выполнить на пхп задачу умножения 3 на 2, то победит тот, кто напишет:
echo 3 * 2;
А не тот, кто разложит числа в ряд Тейлора и просуммирует интегралы
В первом задании ваш скрипт полностью неработоспособен. У вас ошибка времени выполнения. Вы проверяли скрипт перед отправкой?
у сахара код чуть ли не самый огромный и в котором ну просто нереально много лишнего и тем не менее у него 29 из 30 баллов
ошибки времени выполнения там нету (у меня страница генерируется за 1.325 секунды)
единственное что там нужно было вписать свои хеши правильно