Самый короткий способ распечатать "Успех"

Я пытался эту проблему 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; -)

Привет

БВУ