Страницы

Поиск по вопросам

понедельник, 25 ноября 2019 г.

Как так сокращают код?


Решал задачи на acmp.ru, и в самой простой задаче, где надо просто считать и вывест
число, в рейтинге есть решение вполовину короче моего(всего лишь 35 сим.)! Это читерство или волшебство?
Ну как можно придумать решение короче этого?

#include 
int main()
{
    int a;
    std::cin >> a;
    std::cout << a;
} // 59 символов


На этом сайте самые лучшие решения те, которые самые короткие.
    


Ответы

Ответ 1



Так как педантичной "стандартности" и "определенности поведения" С кода не требуется завязываясь на особенности компилятора GCC в его конфигурации по умолчанию можно сократить код до main(){char*gets(),b[9];puts(gets(b));} http://coliru.stacked-crooked.com/a/bf02104f47ad8b3c (по мотивам ответа @vegorov). Памятуя, однако, что функции gets в стандартной библиотеке формально больше нет. Можно даже совсем грубо, ибо длина входной строки по условию не превосходит 3 ( предположении о том, что ведущие нули в записи чисел не допускаются), а тип int в GCC имеет размер 4 main(){int*gets(),b;puts(gets(&b));} http://coliru.stacked-crooked.com/a/c64f32776b7fa150 а также b;*gets();main(){puts(gets(&b));} http://coliru.stacked-crooked.com/a/e92785b2be0324a6 Это уже 33 символа. А на 32-битной платформе (т.е. на платформе, где размер указателя совпадает с размеро типа int) можно даже обойтись и без объявления gets, хотя это будет уже совсем грубым, наглым и грязным хаком b;main(){puts(gets(&b));} К сожалению, онлайновых компиляторов GCC c библиотеками для -m32 я не нашел. Только https://godbolt.org/z/j3Ye9u . Однако если переменная b окажется расположенной в той области 64-битного адресног пространства, где старшие 32 бита адреса являются нулевыми, то такой код с высокой долей вероятности будет работать и на 64-битной X86 платформе: http://coliru.stacked-crooked.com/a/b70346370d1f08f6

Ответ 2



#include main() { char b[9]; puts(gets(b)); } 48 символов. Следовал советам из статьи Сокращение кода на C++ для acmp.ru

Ответ 3



Вот немного короче. #include int main() { std::cout << std::cin.rdbuf(); } Радикальный вариант на С89: main(){system("cp INPUT.TXT OUTPUT.TXT");} online compiler

Ответ 4



С и POSIX read/write avp@avp-ubu1:hashcode$ cat golf.c main(){char s[4]; write(1, s, read(0, s, 4));} avp@avp-ubu1:hashcode$ wc golf.c 1 7 47 golf.c avp@avp-ubu1:hashcode$ gcc golf.c -Wno-implicit-function-declaration -Wno-implicit-int avp@avp-ubu1:hashcode$ echo 123 | ./a.out 123 avp@avp-ubu1:hashcode$ С потерей остатков читабельности легко сокращается до 40 символов: main(){int s;write(1,&s,read(0,&s,4));} Update По подсказке @pavel в комментарии получилось 35!!! (и что характерно, без warnings -), и оказалось достаточно флажка -w) avp@avp-ubu1:hashcode$ gcc golf.c -w avp@avp-ubu1:hashcode$ cat golf.c s; main(){write(1,&s,read(0,&s,4));} avp@avp-ubu1:hashcode$ Спасибо, @pavel b;main(){puts((read(0,&b,4),&b));} пользуясь подсказками из всех ответов и комментариях -- 34 (!) символа Как ни странно gcc -w компилирует вообще без ругани, а ./a.out работает -)

Комментариев нет:

Отправить комментарий