Самый короткий способ распечатать "Успех"
Я пытался эту проблему SUCCESS в spoj, но я не могу получить оптимальное решение этой проблемы
Я пробовал
int main(){return !puts("Success");}
но это занимает 45 символов. Любые альтернативные предложения по решению проблемы? Люди решили это, используя также 24 символа.
Ответы
Ответ 1
main(){puts("Success");}
24 символа.
- в C, если вы опускаете возвращаемый тип, это неявно
int
- Если main() не содержит оператор return, то возвращаемое значение main равно 0
UPDATE:
Хорошо, возврат из main может быть опущен в каждой версии C, но только C99 определяет возвращаемое значение равным 0, если оно опущено. C99 также запрещает неявные объявления.
UPDATE:
У меня слабое воспоминание о том, что кто-то снял это с аналогичной проблемой: он/она каким-то образом закодировал большую часть программы в имени файла, чтобы макрос __FILE__ мог использоваться в программном коде для ввода кода, Я не знаю, соответствует ли это правилам соревнований OP, но в любом случае это должно сделать интересное упражнение.
Ответ 2
Оператор проблемы очень расплывчатый, похоже, что он должен скомпилироваться с gcc -ansi
и возвращать 0 при запуске. Лучше всего я мог придумать следующее:
main(){exit(!puts("Success"));}
32 символа, считающих окончательную новую строку (можете ли вы опустить это?). Добавление int
в main()
помещает его в 36 символов.
Изменить
Это, вероятно, не будет разрешено:
/* Filename: Success */
main(){exit(!puts(__FILE__));}
Скомпилируйте с gcc -x c -ansi Success
, и он сохранит вам другого символа!
А как насчет решения одного символа:
C
Просто скомпилируйте с помощью gcc -ansi -DC='int main(void){puts("Success");return 0;}'
.
Ответ 3
26 символов
main(){brk(printf("%m"));}
Ответ 4
26
main(){j0(!printf("%m"));}
Ответ 5
int main(){perror(0);}
Ответ 6
30 символов:
main(){exit(!printf("%m\n"));}
29 символов:
main(){exit(!printf("%m
"));}
Ответ 7
Вот простой в 24 символах...
main(){puts("Success");}
Не требуется тип возврата int
для main()
или оператора return
...
Ответ 8
Меньше полагается на выполнение действий, которые не являются переносимыми или строго действительными. В среде POSIX со слабым исполнением правил вы можете сделать (18 символов):
main(){perror(0);}
Но если int
и указатели имеют одинаковый размер, это сломается. Добавив 1 дополнительный символ и воспользовавшись тем, что в реальных системах POSIX есть long
, а указатель имеет одинаковый размер:
main(){perror(0L);}
Я не думаю, что вы можете сделать это меньше.
Ответ 9
Я сделал это в 0 (нулевых) символах:
cat src.c
(empty)
полученный исполняемый файл:
[email protected] ~
$ ./src
SUCCESS
и командной строки:
[email protected] ~
$ echo x>>src.c && gcc -Dx="int main(){return puts(\"SUCCESS\");}" -o src src.c
Но это, конечно же, создает исходный файл с символом, как показано ниже Pedro. Без какого-либо исходного файла команда будет (в среде Unix):
[email protected] ~
echo 'int main(){return puts("SUCCESS");}'|gcc -ansi -o src -xc -
что даже короче, чем указано выше. В исходном описании нет никаких ограничений, как решить его, но OP добавляет в более поздний комментарий, что он не может изменить командную строку. Если это так, то это не действительно Code Golf; -)
Привет
БВУ