Здравствуйте, WFrag, Вы писали:
WF>Здравствуйте, BUran, Вы писали:
WF> Ай-яй-яй. Нельзя так делать . s может быть вычислен до sum(...) (Что у меня и происходило...).
int main(){
TEST("10000","2000",1,0);
TEST("2000","10000",0,1);
TEST("2000","10000",1,0);
TEST("2000","10000",1,1);
TEST("10000","2000",0,0);
TEST("1000","2543",0,1);
TEST("1605","2543",0,1);
TEST("5321","5321",0,1);
TEST("5321","5320",0,1);
TEST("5321","5320",1,1);
TEST("5321","5320",1,0);
TEST("5321","5320",0,0);
TEST("0","0",0,0);
TEST("0","0",1,1);
}
У тебя все круто , только нулей много И последний тест чуть-чуть косячит Хотя, входные данные там тоже не ахти какие...
WF>370 байт.
WF>P.S. А, ну и одна неточность — она выдает число, начинающееся нулями.
363 символа. Выдает число с leading zeros, ноль всегда положительный.
Буффер выделяется в куче. Освобождает вызывающая сторона.
(Со статическим буфером было бы еще короче, но менее корректно.)
Здравствуйте, BUran, Вы писали:
BU>согласен, не очень чеканная формулировка. Я имел в виду символы с кодами от 48 (aka '0') до 57 (aka '9') BU>ну извини , тебе же не сложно будет переделать
Переделал.
BU>>>2) я говорил С а не С вперемежку с С++ BU>>>косяк поэтому при компиляции — у меня в libc max нету...
Fixed
UgN>>Буду я щас тебе проверять C это или C++ BU>Ага А в условии про C написано: BU>"сабж на C", "только стандартные библиотеки Си", BU>И ещё один отличительный признак С — operator new не определен. Знать надо
"Я тебе че, первокурсник, все константы помнить?"
Не придирайся. Просто new короче.
Поменял на malloc.
UgN>363 символа. Выдает число с leading zeros, ноль всегда положительный. UgN>Буффер выделяется в куче. Освобождает вызывающая сторона. UgN>(Со статическим буфером было бы еще короче, но менее корректно.) UgN>
Я сумел запаковать в 328 символов. Кто круче?
У WFrag на 46 символов больше, причем у него остаются лишние нули.
Честно говоря, я ожидал от вас большего. Но, видно, понедельник день тяжелый
Только одно но: говорят, у меня в VC не компилится, т.к. char r[G] не заводится — говорит, что требует константу.
Хотя этот VC дурак, я сдаю позиции И заменяю r[G+5] на r[999999]. Коряво, но что делать...
Здравствуйте, BUran, Вы писали:
BU>Я сумел запаковать в 328 символов. Кто круче? BU>У WFrag на 46 символов больше, причем у него остаются лишние нули. BU>Честно говоря, я ожидал от вас большего. Но, видно, понедельник день тяжелый
Угу. Особенно если про экзамены вспомнить... Это был так, 15-минутный отдых .
7. О чем невозможно говорить, о том следует молчать.
Здравствуйте, BUran, Вы писали:
BU>Я сумел запаковать в 328 символов. Кто круче?
Ну, Я
BU>Только одно но: говорят, у меня в VC не компилится, т.к. char r[G] не заводится — говорит, что требует константу. BU>Хотя этот VC дурак, я сдаю позиции И заменяю r[G+5] на r[999999]. Коряво, но что делать...
Все правильно, так и должно быть.
Твой вариант — VLA — разрешен только в С, причем в стандарте С99,
поэтому не все СИшные компиляторы это могут понимать.
В С++ это просто напросто запрешено. Аналог -- alloca(size_t)
BU>В принципе, за счет одного места прогу можно урезать до 322 байтов. Пусть при этом лишняя память забирается.
И так фигней страдаем, а ты предлагаешь еще и какие-то баги вносить...
Вот мой вариант — 322 символа.
1. Нули теперь, как и у тебя могут быть со знаком
2. Коль пишем на Си, то я тоже выделяю буфер таким образом: char C[K+2]...
Если хочешь, можешь заменить на char C[999999] (собственно, я так и проверял), но это не есть гуд, так как длина входных строк неизвестна.
Дальше извращаться особого желания нет, хотя там еще десяток символов можно выцарапать...
Но я по-прежнему не вижу в этом смысла, так что извиняй, пора закрывать этот топик.
Лучше давай алгоритмы обсудим. Все ли корректно?
Здравствуйте, BUran, Вы писали:
BU>Я сумел запаковать в 328 символов. Кто круче? BU>У WFrag на 46 символов больше, причем у него остаются лишние нули. BU>Честно говоря, я ожидал от вас большего. Но, видно, понедельник день тяжелый BU>Только одно но: говорят, у меня в VC не компилится, т.к. char r[G] не заводится — говорит, что требует константу. BU>Хотя этот VC дурак, я сдаю позиции И заменяю r[G+5] на r[999999]. Коряво, но что делать...
BU>Вот этот код:
BU>char*sum(char*a,char*b,int Z,int Y,int*W){int P=strlen(a),Q=strlen(b),M=P>Q?P:Q,c=0;char*I,r[M+5];if(P<Q||(P==Q&&strcmp(a,b)<0)){I=a;a=b;b=I;*W=Y;P^=Q^=P^=Q;}else*W=Z;I=r+M+4;*I=0;char*K=b+Q,*L=a+P;while(L>a||c){M=K>b?*--K-48:0;c+=(L>a?*--L-48:0)+10+(Z^Y?-M:M);*--I=48+c%10;c=c/10-1;}while(*I==48)I++;*I?0:I--;return strdup(I);}
Решение не принимается.
Очевидные проблемы:
— 'strdup' — нет в библиотеке языка С такой функции.
— 'P^=Q^=P^=Q' — этот код порождает неопределенное поведение.
— 48. Код символа '0' не обязательно 48. Используй '0'. Но это на один символ длиннее.
"Частичные" проблемы:
— 'r[G+5]' легально только в С99. Надо уточнять, какой С ты имел в виду — С90 иди С99. А использовнаие 'r[999999]' делает решение совершенно неприемлемым.
— Декларация 'char* K = b + Q' не располагается в начале блока — легально только в С99. Надо уточнять, какой С ты имел в виду — С90 иди С99.
— Программа падает на некоторых примерах с ведущими нулями: 'sum("0101", "405", 1, 0, &s)'. Не знаю, считается ли у тебя такой вход корректным.
Здравствуйте, UgN, Вы писали:
BU>>Я сумел запаковать в 328 символов. Кто круче?
UgN>Ну, Я
BU>>Только одно но: говорят, у меня в VC не компилится, т.к. char r[G] не заводится — говорит, что требует константу. BU>>Хотя этот VC дурак, я сдаю позиции И заменяю r[G+5] на r[999999]. Коряво, но что делать...
UgN>И так фигней страдаем, а ты предлагаешь еще и какие-то баги вносить... спасибо за признание моей замечательной задачки фигней. Я серьезно
UgN>Дальше извращаться особого желания нет, хотя там еще десяток символов можно выцарапать... UgN>Но я по-прежнему не вижу в этом смысла, так что извиняй, пора закрывать этот топик.
Я не против закрытия темы. Все прошло на ура. Но что-то я не понимаю, что ты называешь смыслом. Кстати, спасибо тебе за участие Это и было задачей данной задачи. UgN>Лучше давай алгоритмы обсудим. Все ли корректно?
Вот именно. Подведем итог.
Мы занимались очень замечательной задачкой, несомненно произошедшей из соц. соревнований и подросткового желания быть круче хоть в чем-то
(Кстати, по поводу желания быть круче, очень советую прочитать повесть "Плоть, прах и ветер" Александра Ромаданова вот здесь)
Смысл задачки был простой:
1) понять, что нам мешает писать короткие программки.
2) осознать, во сколько можно запихнуть такую, казалось бы, трудноразрешимую задачку, как сложение длинных чисел со знаком.
3) научиться выделять нужное и ненужное, оптимизировать (по длине кода хотя бы)
Хватит? Вот еще:
4) придумать несколько алгоритмов нахождения этой суммы.
А ведь не каждый сможет даже это сделать! Мне друг, который эту задачку дал, рассказал, что он со своим приятелем пытался написать данную процедуру. Получалось очень длинно, много десятков(!) строк, и притом крайне неоптимально (уже по производительности).
5) научиться понимать чужие программы, решающие ту же задачу
6) вспомнить программирование на С. А также С++, отличия и стандарты.
Я лично узнал много увлекательного и полезного про стандарт С99 Мое всем за это спасибо
7) самое главное, зачем этот форум и существует — улучшить умение решать нестандартные задачи.
8) чуть не забыл — работа со строками и с памятью.
Да и научиться лучше применять в будущей жизни кое-что из того арсенала методов, с помощью которых получен рекорд.
Мне очень понравилась фишка с strdup, например. Вспомнил про ^ для получения знака и x^=y^=x^=y — чтоб поменять местами две переменные. Ты думаешь, это все знают?
Ты считаешь данную задачу разминкой? А сколько ты потратил времени? По-моему, это целая программистская тренировка!!!
Вот тебе еще вопрос на засыпку. Встань на мою сторону и попытайся ответить за меня, в чем смысл в данной задаче. Можешь даже поспорить сам с собой. Убедишься, что вопрос о смысле — полнейшая демагогия Хотя, впрочем, что такое смысл я точно не знаю. Тем более, в чем смысл задачи. И Яндекс не знает
Алгоритм же был несложный:
1) выделяем строку под ответ
2) делаем, чтоб из большего вычиталось меньшее. <- кстати, тут у меня есть в проге косяк, и не только у меня
3) определяем знак результата.
4) вычисляем ответ справа налево как мы делаем это без компьютера: перенос на следующий разряд есть частное от деления на 10 суммы (или разности) чисел. А значение данного разряда — остаток.
5) удаление ведущих нулей (в случае вычитания)
6) strdup или аналогичное действие для возвращения результата
Наверняка кстати найдется неоптимальный алгоритм для этой задачки, который запишется короче, чем у меня и у тебя.
Разворачивать свой компактный код в большой я не буду. Имеющий глаза да позырит
Кому надо разобраться — лучше
1) решите хоть как-то сами данную задачку
2) замените в моем коротком коде названия на более длинные
3) а пупам земли — как вы умудрились до сюда дочитать! (и я уж думаю, что я недостоин вашего ответа )
Здравствуйте, Андрей Тарасевич, Вы писали:
BU>>Я сумел запаковать в 328 символов. Кто круче? АТ>Решение не принимается.
Я что-то не видел вашего решения. Вообще.
Хотя согласен с тем, что у меня не 6.0 на Brainbench. Не каждый настолько стар, что может себе это позволить
Все твои придирки исправимы. Хорошо, давай объявим, что используем С99 и gcc version 3.2.2 20030222 (Red Hat Linux 3.2.2-5), или вообще, у кого какой есть. А у тебя какой есть?
АТ>- 'strdup' — нет в библиотеке языка С такой функции.
А какая есть?
АТ>- 48. Код символа '0' не обязательно 48. Используй '0'. Но это на один символ длиннее.
Приведи разумный пример, где не так. А то сам знаешь — теория и практика вечно различаются. Вот в теории, мы живем в матрице. Но на практике эту матрицу почему-то не наблюдаем — шучу, а то еще прокомментируешь. А кстати, теория суперструн — занятная физическая теория
P.S. критикуя — предлагай. Если считаешь себя находящимся намного выше — то как низко ты пал :-]
Здравствуйте, BUran, Вы писали:
BU>>>Я сумел запаковать в 328 символов. Кто круче? АТ>>Решение не принимается. BU>Я что-то не видел вашего решения. Вообще.
Я смотрю, что тут ведется соревнование на длину решения в символах. Я с уважаю решение соревнующихся поучаствовать в этом соревновании, но у меня самого нет никакого желания это делать. Ибо считаю подобный "критерий оптимальности" полной чепухой. Я не смогу заставить себя выкосить из моего решения все те 'assert'-ты, которые мне захочется туда поместить, и использовать однобуквенные имена переменных.
BU>Хотя согласен с тем, что у меня не 6.0 на Brainbench. Не каждый настолько стар, что может себе это позволить BU>Все твои придирки исправимы. Хорошо, давай объявим, что используем С99 и gcc version 3.2.2 20030222 (Red Hat Linux 3.2.2-5), или вообще, у кого какой есть. А у тебя какой есть?
А у меня много всяких разных.
АТ>>- 'strdup' — нет в библиотеке языка С такой функции. BU>А какая есть?
Что значит "а какая есть"? Всякие есть. Другие. А с такой функциональностью (клонирование строки) в стандартной библиотеке функции нет вообще.
АТ>>- 48. Код символа '0' не обязательно 48. Используй '0'. Но это на один символ длиннее. BU>Приведи разумный пример, где не так. А то сам знаешь — теория и практика вечно различаются.
Вот по этому-то такие задачи можно корректно поставить только с точки зрения теории. И твоя иначальная задача "написать программу на языке С" является как раз такой теоретической задачей. Потому я и смотрю на нее с точки зрения теории.
А практика — это уже твое "используем С99 и gcc version 3.2.2 20030222 (Red Hat Linux 3.2.2-5)". Но это уже никак не потянет на этюд для программистов.
Поэтому примеры тут соврешенно ни при чем. Я могу их и не знать. Тем не менее это не означает, что их нет. А даже если их и нет, это совсем не означает, что их не может быть в будущем. Вот.
Но это все лирика, а физика тут в том, что на embedded платформах примеры с '0' != 48 можно хоть лопатой грести.
BU>P.S. критикуя — предлагай
Предложить я могу только состязание на наиболее элегантный алгоритм. А в рамках текущей постановки мне предложить нечего, кроме предложения исправить вышеперечисленные недостатки.
Здравствуйте, BUran, Вы писали:
UgN>>И так фигней страдаем, а ты предлагаешь еще и какие-то баги вносить... BU> спасибо за признание моей замечательной задачки фигней. Я серьезно
Я тоже.
Я с самого начала пытался тебе это объяснить... Но ты почему-то не хочешь слушать...
Если уж Андрей Тарасевич для тебя не авторитет... Ну я уже и не знаю тогда...
BU>Я не против закрытия темы. Все прошло на ура. Но что-то я не понимаю, что ты называешь смыслом. Кстати, спасибо тебе за участие Это и было задачей данной задачи.
Задачей данной задачи было выяснение чей хвост длиннее...
BU>Смысл задачки был простой: BU> 1) понять, что нам мешает писать короткие программки.
Писать такие короткие программки нам мешает здравый смысл.
BU> 2) осознать, во сколько можно запихнуть такую, казалось бы, трудноразрешимую задачку, как сложение длинных чисел со знаком.
BU> 3) научиться выделять нужное и ненужное, оптимизировать (по длине кода хотя бы)
Да уж, оптимальней некуда...
Если бы кто-то такое написал в рабочем коде я б его убил на месте, без суда и следствия.
BU> 4) придумать несколько алгоритмов нахождения этой суммы.
Ну я же тебе и предлагал, давай меряться алгоритмами... А ты все про длину в символах...
BU> 5) научиться понимать чужие программы, решающие ту же задачу
BU> 7) самое главное, зачем этот форум и существует — улучшить умение решать нестандартные задачи.
В точку. Решать нестандартные задачи, а не изврашаться над стандартными!
BU>Мне очень понравилась фишка с strdup, например. BU>Вспомнил про ^ для получения знака и x^=y^=x^=y — чтоб поменять местами две переменные. Ты думаешь, это все знают?
Думаю, если ты сделаешь поиск, то узнаешь много нового и нтересного, в том числе и про этот трюк и его недостатки.
BU>Ты считаешь данную задачу разминкой? А сколько ты потратил времени? По-моему, это целая программистская тренировка!!!
В целом -- 4 перерыва на кофе.
BU>Разворачивать свой компактный код в большой я не буду. Имеющий глаза да позырит
Извини, но такой код никому не нужен.
BU> 3) а пупам земли — как вы умудрились до сюда дочитать! (и я уж думаю, что я недостоин вашего ответа )
Тут ты совсем неправ.