Решал задачи на 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 работает -)
Комментариев нет:
Отправить комментарий