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

154
18 марта 2019, 15:00

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

Ну как можно придумать решение короче этого?

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

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

Answer 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

Answer 2
#include <stdio.h>
main()
{
    char b[9];
    puts(gets(b));
}

48 символов. Следовал советам из статьи Сокращение кода на C++ для acmp.ru

Answer 3

Вот немного короче.

#include <iostream>
int main()
{
    std::cout << std::cin.rdbuf();
}

Радикальный вариант на С89:

main(){system("cp INPUT.TXT OUTPUT.TXT");}

online compiler

Answer 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 работает -)

READ ALSO
Пролагивание при открытии Fragment

Пролагивание при открытии Fragment

Я открываю фрагмент так:

105
RecyclerView с баннерами через 5 item - ов

RecyclerView с баннерами через 5 item - ов

Есть RecyclerView (LinearLayoutManager) с объявлениямиМне нужно чтобы баннеры (static Integer BANNER_VIEW = 2) выходили через каждые 5 объявлений при этом нужно чтобы...

136
Оптимизация recyclerView с картинками

Оптимизация recyclerView с картинками

Всем приветДелаю приложения для редактирования фото и хочу добаивть стикеры в приложение

112
Почему видно приватное поле в java коде?

Почему видно приватное поле в java коде?

Есть код и он компилируется:

150