Pull to refresh

Comments 100

не, так не работает,
буду дальше думать
В том же духе…

int main() { int i, n = 20; for (i =40; i < n; i--) { printf("*"); } } (Ставим «4»)
i < n
40 < 20

что же тут не так…
ой, да, правда появиться таки 21 звёздочка… :)
UFO just landed and posted this here
UFO just landed and posted this here
int main() { int i, n = 20; for (i = n; i < n; i--) { printf("*"); } }
ни разу не выполнится
Эм… Цикл for выполняется ХОТЯ БЫ один раз.
Кто Вас такому научил? С do… while не путаете?
Блин. Кажется, пора спать. Действительно циклы попутал.
утверждение не верно, если условие цикла не срабатывает то и цикл не выполняется…
int main() { int i, n = 20; for (i = 0; i > n; i--) { printf("*"); } }

(меняем знак < на >)
Извините, промазал мыслью. Каюсь, исправлюсь.
int main() { int i, n = 20; for (i = 0;-i < n; i--) { printf("*"); } }
int main() { int i, n = 20; for (i = 0; i < n; n--) { printf("*"); } }
int main() { int i, n = 20; for (i = 0; i + n; i--) { printf("*"); } }
Вот этот вариант пропустил, сильно.
то есть, если i + n < 0, вернется false? О_о
неа, если i+n==0, то false.
int main() { int i, n = 20; for (i = 0; i < n; n--) { printf("*"); } }

2kixx смена знака на > не помогает :)
хе-хе, а мне будет пирожок? Почему на хабре нет спойлеров?
void main() { int i, n = 20; for (i = 0; i < n; n--) { printf("*"); } }
void main() { int i, n = 20; for (i = 0; i + n; i--) { printf("*"); } }
void main() { int i, n = 20; for (i = 0;-i < n; i--) { printf("*"); } }
PS если не секрет откуда добыта эта задачка? Мне её на первом курсе на оценку превосходно на экзамене по C задавали.
Только почему никто не говорит, что int main() без return это не хорошо.
Это не просто не хорошо, это вообще не скомпилируется.
Вот тут можно пронаблюдать, что компилируется, работает, но выходит с ошибкой.
codepad.org/DdiQyIJy
у меня на си echo $? выдаёт 0
Ага минусуйте минусуйте, а то что для printf() еще #include <stdio.h> надо все забыли?
мы сосредоточились на поиске того самого единственного символа))

на практике таким, конечно же, не занимаются, а меняют i-- на i++, но тут уже будет 2 символа)))
int main() без return эквивалентно return 0. Это единственная функция-исключение.
потому что в mainе return не обязателен (но только в main)

3.6.1 Main function



2 An implementation shall not predefine the main function. This function shall not be overloaded. It shall have a return type of type int, but otherwise its type is implementation-defined. All implementations shall allow both of the following definitions of main:

int main() { /*… */ }

and

int main(int argc, char* argv[]) { /*… */ }

… and it continues to add…

5 A return statement in main has the effect of leaving the main function (destroying any objects with automatic storage duration) and calling exit with the return value as the argument. If control reaches the end of main without encountering a return statement, the effect is that of executing return 0;
как выяснилось, с braingames.ru, хотя я узнал о ней из других источников :)
«превосходно» это выше, чем «отлично»?
Да в нашем универе принята семибалльная система. Помимо обычных добавлены 5.5 — превосходно 4,5 — очень хорошо, они влияют на внутренний рейтинг студентов и при большом среднем балле позволяют получать некоторые преимущества, например в выборе кафедры и научного руководителя. При выставлении в диплом оценки округляются в нижнюю сторону.
А что за универ, если не секрет?
Нижегородский государственный университет им. Н.И. Лобачевского. unn.ru/
лично я увидел ее в первый раз на braingames.ru :)
хм, я узнал о ней от одногруппника :)
UFO just landed and posted this here
смотря куда :)
можно заменить пробел на минус.

в UPD2 не столь заметное решение некорректно.
int main() { int i, n = 20; for (i = 0; i < n; i--) { printf("*"); } }
int main() { int i, n = 20; for (i = 0; i < n; i--) { printf(«Ж»); } }

Почти тоже звёздочка :)
эм… да, код не рабочий, простите.
я конечно не шарю но.

int main() { int i, n = 20; for (i = 0; -i < n; i--) { printf("*"); } }
int main() { int i, n = 20; for (i = 0; i < n; n--) { printf("*"); } }

PS: тред не читал, чтоб не напароться на решение, дальше лениво думать…
Самое интересное и не нашли, попробуйте еще одно найти, не читая тред, там уже есть решения.
аа, имелось ввиду «не нашли самое интересное решение»? ссори, недопонял.
да по моему этого не было
int main() { int i, n = 20; for (i = 0; i < n; i-) { printf("*"); } }
error C2059: syntax error: ')'
i-… что-то новенькое o_0
итого

int main() { int i, n = 20; for (i = 0; i < n; i- ) { printf("*"); } }
int main() { int i, n = 20; for (i = 0; -i < n; i--) { printf("*"); } }
int main() { int i, n = 20; for (i = 0; i < n; n--) { printf("*"); } }
void main() { int i, n = 20; for (i = 0; i + n; i--) { printf("*"); } }

Пирожок мой!
все пирожок точно мой
int main() { int i, n = 20; for (i = 0; i < n; n-+) { printf("*"); } }
int main() { int i, n = 20; for (i = 0; i < n; n+-) { printf("*"); } }
товарищи минусующие, я так понял вы не согласны с решением, но оно таки работающее и валидное, или так за компанию что ли минусы ставим?
Оно не компилится даже.
правильно говорят поспешишь людей насмешишь, так спешил что за варнингами не заметил еггогов и отработал предыдущий корректный вариант.
вот я тормоз, реально протормолил… прошу прощения 2 последних лажа…
UFO just landed and posted this here
На первый взгляд два варианта:
-Не скомпилится, потому, что int main(), а return нет.
-Будет рисовать звездочки, пока не достигнет минимального для signed int значения, а потом улетит или еще че-нить :)
Зависит от настроек компилятора.
По крайней мере отсутствие #include <stdio.h> тоже повод не скомпилиться.
смотря чем компилировать. кпримеру в gcc есть встроенный printf
чушь. printf — библиотечная функция. gcc про нее ничего не знает.
попробуйте скомпилировать программу gcc =)
ну почему же не работающие вот.

admin@darkstar:/home/projects/6$ cat 1.c
int main() { int i, n = 20; for (i = 0; i < n; n--) { printf("*"); } }
admin@darkstar:/home/projects/6$ cc 1.c -o 1
1.c: В функции ‘main’
1.c:1: предупреждение: incompatible implicit declaration of built-in function ‘printf’
1.c:1:71: warning: no newline at end of file
admin@darkstar:/home/projects/6$ ./1
********************admin@darkstar:/home/projects/6$
заменили i на n, молодцы) такое решение уже было выше
Одним символом точно не обойтись — не скомпилится, потому что #include <stdio.h> нет.
Да норм, поругается и скомпилируется :). А вот если Вы, к примеру, всякие синусы планируете использовать, с аргументами, которые несовместимы с int, то всё-таки хедеры подключить придётся.
«Поругается и скомпилится» — по-моему отличный подход для написания багов ;)
На самом деле, если Вы пишете сразу под 10 платформ, не всегда получится угадать, какие .h-файлы нужно подключать, потому что они могут разниться для разных платформ. А если функции, которые Вы используете, совместимы по аргументам с int, то и без header-файлов всё равно будет работать.
Если исходить из неточно сформулированных условий — можно заменить символ " " на «2».
«for (i = 0;» => «for (i =20;»
Также можно " " заменить на "-" здесь:
" i < n;" => "-i < n;"
Про «i»=>«n» — уже сказали, обидно.
c 20 не прокатит — ведь начальное условие тогда будет 20 < 20, а значит цикл не выполнится ни разу
Действительно, фейл. Голова совсем не работает.
Еще есть вариант с поразрядным отрицанием, но он дает 21 звездочку:
int main() { int i, n = 20; for (i = 0;~i < n; i--) { printf("*"); } }
Я тоже его нашел и даже уже пошел постить, но решил пересчитать звездочки на всякий случай ;)
С заменой '<' на '+' нашел последним, необычное решение
С «проблемой» об include предлагаю бороться так:

echo «int main() { int i, n = 20; for (i = 0; i < n; n--) { printf(\»*\"); } }" > 1.cpp
echo "#include <stdio.h>" > 2.cpp
echo "#include \«1.cpp\»" >> 2.cpp
gcc -Wall -lstdc++ 2.cpp

— все по-честному, в 1.cpp изменен только один символ, а про компиляцию ничего в условии не было ;)
парсер пожрал кавычки…
Раз уж такая пьянка пошла про корректность условия, то вот оно:
#include <stdio.h>
int main(void)
{
int i, n=20;
for(i = 0; i<n; i--)
printf("*");
return 0;
}
Именно в таком виде она досталась мне 3 года назад.
Брутфорс говорит, что только три решения:)
int main() { int i, n = 20; for (i = 0; i < n; n--) { printf("*"); } }
int main() { int i, n = 20; for (i = 0;-i < n; i--) { printf("*"); } }
int main() { int i, n = 20; for (i = 0; i + n; i--) { printf("*"); } }

Проверены такие символы:
, i n - + * / % & ~ | > < = ; и 0-9

Сам код: pastie.org/private/tsx9h978dw1jfekm0x1w
Возможно какие-нибудь операторы упустил. По всей ascii таблице долго проходиться:)
Еще операция "!" есть.
О, точно, отрицание забыл. Проверил, с ним решения нет.
Видимо решений больше нет. Можно идти спать :))
а как же операции ^ и ~? :)
>> # Не столь заметное — int main() { int i, n = 20; for (i = 0; -i < n; i--) { printf("*"); } }

Не соотвествует условию. Написано заменить один символ. Про добавить ничего не сказано ;)
А пробел там как был один, так и остался ;)
можно рассмотреть это как замена пробела на '-' — под условие вполне попадёт =)
Алаверды. Совсем простенький вариант той же задачки.
Нужно заменить ровно один (любой) символ в следующей строке, причём так, чтобы она скомпилилась и было выведено ровно 3 звёздочки:
int main() { int i, n = 30; for (i = 1; i < n; ++i) { printf("*"); } }

* This source code was highlighted with Source Code Highlighter.
int main() { int i, n = 30; for (i = 1; i < 4; ++i) { printf("*"); } }
Очевидно. Еще варианты?
int main() { int i, n = 30; for (i = 1; i <<n; ++i) { printf("*"); } }
Зачёт. Если, конечно, sizeof( int ) == 4.
Фух, решил по второму варианту.
на ночь глядя нашел эту задачку. почему-то испугался, что не решу;-) через ~10 минут пришел к решению номер три!!! а то я уж было подумал что я совсем не сишник (тфтф!)
интересная задачка, спасибо автору~
Sign up to leave a comment.

Articles