Программисты, поясните что это

Ryzhusya
Posts: 11
Joined: 25 Apr 2006 06:48
Location: Japan

Программисты, поясните что это

Post by Ryzhusya »

Программисты, поясните что это, please.

задачка для разминки мозгов для программистов, знающих язык C

Дан текст программы на C. Требуется найти три способа изменить в нем один
символ (не добавить, не убрать, не переставить - изменить один символ), так,
чтобы программа стала печатать 20 звездочек.
Oдин ответ найти относительно легко. Постарайтесь найти три разных.
правильных ответа есть только три, насколько известно.

Программа:

main()
{
int i, N=20;
for(i = 0 ; i < N ; i--)
printf("*");
}
_________________
User avatar
A. Fig Lee
Уже с Приветом
Posts: 12072
Joined: 17 Nov 2002 03:41
Location: английская колония

Re: Программисты, поясните что это

Post by A. Fig Lee »

Ryzhusya wrote:Программисты, поясните что это, please.

задачка для разминки мозгов для программистов, знающих язык C

Дан текст программы на C. Требуется найти три способа изменить в нем один
символ (не добавить, не убрать, не переставить - изменить один символ), так,
чтобы программа стала печатать 20 звездочек.
Oдин ответ найти относительно легко. Постарайтесь найти три разных.
правильных ответа есть только три, насколько известно.

Программа:

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


вообщето она и так 20 должна печатать.
имеется ввиду чтото типа

Code: Select all


int i, N=21;
for(i = 0 ; i < N ; i--)


Code: Select all

int i, N=20; 
for(i = 0 ; i <= N ; i--)
 


Code: Select all

int i, N=20; 
for(i = -1 ; i < N ; i--)
Верить нельзя никому - даже себе. Мне - можно!
User avatar
venco
Уже с Приветом
Posts: 2001
Joined: 10 Nov 2004 00:34
Location: MD

Re: Программисты, поясните что это

Post by venco »

A. Fig Lee wrote:вообщето она и так 20 должна печатать.

Должна - не должна, а напечатает гораздо больше 20-ти.
User avatar
venco
Уже с Приветом
Posts: 2001
Joined: 10 Nov 2004 00:34
Location: MD

Post by venco »

Я пока 2 способа придумал.
User avatar
Quintanar
Уже с Приветом
Posts: 1609
Joined: 03 Feb 2004 11:19
Location: Moscow

Post by Quintanar »

venco wrote:Я пока 2 способа придумал.

3-й - i+N
Ya cayo el telon de acero y derribamos el muro de Berlin
y ahora todos juntos como hermanos vamos de la mano a comer a un Burger King
User avatar
venco
Уже с Приветом
Posts: 2001
Joined: 10 Nov 2004 00:34
Location: MD

Post by venco »

Quintanar wrote:
venco wrote:Я пока 2 способа придумал.

3-й - i+N

Не, это - первый. :)
Второй, скорее всего, то, что имел(а) ввиду Ryzhusya.
А вот третий пока не придумал...
User avatar
venco
Уже с Приветом
Posts: 2001
Joined: 10 Nov 2004 00:34
Location: MD

Post by venco »

Придумал! :gen1:
User avatar
SVK
Уже с Приветом
Posts: 8400
Joined: 23 Jul 2003 03:53
Location: SPb - KW - NY - CT - MD

Post by SVK »

Вопрос, конечно, интересный...

Но у меня, почему-то, впечатление, что именно любители такого рода головоломок написали огромное количество кода, с которым приходится сталкиваться ежедневно. Когда этот код рано или поздно перестает работать, то самым разумным и быстрым оказывается - просто выбросить его к чертовой матери, и переписать заново, чтобы получился именно код, а не головоломка... :angry:
LG - Life's good.
But good life is much better.
User avatar
KP580BE51
Уже с Приветом
Posts: 15007
Joined: 14 Jun 2005 11:50
Location: Ukraine

Post by KP580BE51 »

SVK wrote:Вопрос, конечно, интересный...

Но у меня, почему-то, впечатление, что именно любители такого рода головоломок написали огромное количество кода,

Сомневаюсь. Такие задачи очень любят чистые теоретики. На практике нужно решать строго противоположные задачи повернуть мозги в противоположную сторону достаточно сложно.
с которым приходится сталкиваться ежедневно. Когда этот код рано или поздно перестает работать, то самым разумным и быстрым оказывается - просто выбросить его к чертовой матери, и переписать заново, чтобы получился именно код, а не головоломка... :angry:

Угу. Некоторые считают что
for (i=0,b=2,c=3;keyPress();i++){чего-то там} жутким хакерским приемом и устраивают истерику что сейчас он по-хакерски пишет, а завтра топор принесет.
User avatar
SVK
Уже с Приветом
Posts: 8400
Joined: 23 Jul 2003 03:53
Location: SPb - KW - NY - CT - MD

Post by SVK »

KP580BE51 wrote:Угу. Некоторые считают что
for (i=0,b=2,c=3;keyPress();i++){чего-то там} жутким хакерским приемом и устраивают истерику что сейчас он по-хакерски пишет, а завтра топор принесет.

Ну, не надо передергивать. :nono#:

1) про топоры никакой речи, и даже никаких намеков, вообще не было - замечание просто игнорируется

2) насчет исходной "головоломки" - пояснение: претензии вызывает абсолютно бессмысленное требование исправить явную ошибку в коде "с помощью изменения одного символа кода" - ???!!! :х :angry: По мне - более глупое требование придумать трудно... Именно такие превоначальные "тренировочные" требования приводят в дальнейшем к любви и привычке писать совершенно неприемлемый для дальнейшего использования код...

Таких теоретиков нельзя подпускать на пушечный выстрел к реальной работе.

3) к примеру от KP580BE51 вообще никаких особых претензий и нет. Ну кроме как: в сколько-нибудь серьезном проекте названия переменных b, c, и даже i говорят обычно о полном отсутствии дум о будущей судьбе этого кода... В общем - "гори оно огнем, когда я получу свои почасовые..."

4) в качестве другого примера, из сотен других, которые я имел в виду в первоначальном постинге, могу привести такой реальный фрагмент (с заменой переменных на чуть более абстрактные имена):

Code: Select all

++(*((ULONG*)((char*)(((PSPECIALENTRYRECORD)
    (prb123->spRecordKey))->spRecordID)
    +sizeof(RecordID)-sizeof(ULONG))));

Я действительно устроил истерику в компании, когда мне пришлось разбираться, почему программа с такими вот фрагментами иногда выдает сомнительные результаты после нескольких лет якобы успешного использования. Мне милостливо разрешили эти места исправить.

Немного спустя я решил проверить по системе архивирования версий, откуда этот код произошел. Оказалось, лет 10 назад его написал мой нынешний начальник... :gen1: :hat:
LG - Life's good.
But good life is much better.
User avatar
KP580BE51
Уже с Приветом
Posts: 15007
Joined: 14 Jun 2005 11:50
Location: Ukraine

Post by KP580BE51 »

SVK wrote:3) к примеру от KP580BE51 вообще никаких особых претензий и нет.

Все уже сказали.
Ну кроме как: в сколько-нибудь серьезном проекте названия переменных b, c, и даже i говорят обычно о полном отсутствии дум о будущей судьбе этого кода... В общем - "гори оно огнем, когда я получу свои почасовые..."

Я вообще часто применяю и i и b и c. Я вообще не считаю нужным придумывать какое-то другое название переменной, если ее зона видимости влазит на один экран и ее назнавение очевидно.

Code: Select all

++(*((ULONG*)((char*)(((PSPECIALENTRYRECORD)
    (prb123->spRecordKey))->spRecordID)
    +sizeof(RecordID)-sizeof(ULONG))));


Тут согласен, попробовал его как-то более разумно отформатировать, ничего не получилось.

PS Стиль жутко вынь3.1 напоминает. Ой там такое любили.
User avatar
Flash-04
Уже с Приветом
Posts: 63377
Joined: 03 Nov 2004 05:31
Location: RU -> Toronto, ON

Post by Flash-04 »

SVK wrote:

Code: Select all

++(*((ULONG*)((char*)(((PSPECIALENTRYRECORD)
    (prb123->spRecordKey))->spRecordID)
    +sizeof(RecordID)-sizeof(ULONG))));

Я действительно устроил истерику в компании, когда мне пришлось разбираться, почему программа с такими вот фрагментами иногда выдает сомнительные результаты после нескольких лет якобы успешного использования. Мне милостливо разрешили эти места исправить.

классика жанра :D

называется secure your job for life :mrgreen:
User avatar
A. Fig Lee
Уже с Приветом
Posts: 12072
Joined: 17 Nov 2002 03:41
Location: английская колония

Re: Программисты, поясните что это

Post by A. Fig Lee »

venco wrote:
A. Fig Lee wrote:вообщето она и так 20 должна печатать.

Должна - не должна, а напечатает гораздо больше 20-ти.


а..
ну фиг с ним тады так:

Code: Select all

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

Code: Select all

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

Code: Select all

main()
{
int i, N=20;
for(i = 0 ; i + N ; i--)
printf("*");
}
Верить нельзя никому - даже себе. Мне - можно!
User avatar
venco
Уже с Приветом
Posts: 2001
Joined: 10 Nov 2004 00:34
Location: MD

Post by venco »

SVK wrote:2) насчет исходной "головоломки" - пояснение: претензии вызывает абсолютно бессмысленное требование исправить явную ошибку в коде "с помощью изменения одного символа кода" - ???!!!


Не понимаю, в чём претензии к задаче? Это именно головоломка, без кавычек, задана в соответствующем форуме, не программистском.
Почему не было столько эмоций по поводу бедной собачки, которую заставили бессмысленно носиться между двумя друзьями? :pain1:
rGlory
Уже с Приветом
Posts: 5102
Joined: 11 Aug 2004 02:49

Post by rGlory »

venco wrote:Не понимаю, в чём претензии к задаче? Это именно головоломка, без кавычек, задана в соответствующем форуме, не программистском.
Почему не было столько эмоций по поводу бедной собачки, которую заставили бессмысленно носиться между двумя друзьями? :pain1:

Что значит бессмысленно? :nono#: Если бы у Вас была собака, то Вы бы знали, что для собачки это в кайф и она это делает по собственному желанию. А насчет смысла - какой смысл в сбивании кегель пластиковым шаром например? Или когда двадцать два бугая один мяч перекатывают (с)?
User avatar
SVK
Уже с Приветом
Posts: 8400
Joined: 23 Jul 2003 03:53
Location: SPb - KW - NY - CT - MD

Post by SVK »

venco wrote:
SVK wrote:2) насчет исходной "головоломки" - пояснение: претензии вызывает абсолютно бессмысленное требование исправить явную ошибку в коде "с помощью изменения одного символа кода" - ???!!!

Не понимаю, в чём претензии к задаче? Это именно головоломка, без кавычек, задана в соответствующем форуме, не программистском.

Потому что развитие способностей исправлять такие ошибки такими (предлагаемыми) способами рождают "специалистов", которых просто нельзя близко подпускать к решению таких же задач в реальной жизни.

Из "непрограммистких" аналогий - ну... Например, в конечном итоге нельзя допускать к управлению финансами людей, которые успешно научились получать большую прибыль с помощью вскрывания сейфов, и других "методов" быстрого накопления капитала. Несмотря на то, что они наглядно продемонстрировали всем чрезвычайную "эффективность" своих методов...

Для достижения любой цели есть "правильные", "не очень правильные", и "недопустимые" методы. Не стоит устраивать соревнование по наилучшему использованию "недопустимых" (в реальной жизни) способов исправления программного кода.

А уж давать задачи на исправление кода программы для "непрограммистов" - ??? :pain1:

Это даже глупее, чем давать шахматные задачи "нешахматистам": "Выигрывает тот, кто забъет соперника шахматными фигурами насмерть, не используя шахматную доску!" :angry:
LG - Life's good.
But good life is much better.
Hamster
Уже с Приветом
Posts: 11475
Joined: 20 Nov 2000 10:01
Location: Escondido, CA

Post by Hamster »

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


Это подходит по правилам, только если можно заменять пробелы.
User avatar
venco
Уже с Приветом
Posts: 2001
Joined: 10 Nov 2004 00:34
Location: MD

Post by venco »

SVK wrote:Из "непрограммистких" аналогий - ну... Например, в конечном итоге нельзя допускать к управлению финансами людей, которые успешно научились получать большую прибыль с помощью вскрывания сейфов, и других "методов" быстрого накопления капитала. Несмотря на то, что они наглядно продемонстрировали всем чрезвычайную "эффективность" своих методов...

А при чём тут управление финансами, даже если я задам головоломку про подбор кода сейфа?

А уж давать задачи на исправление кода программы для "непрограммистов" - ??? :pain1:

А нефизикам можно физические головоломки давать?

Это даже глупее, чем давать шахматные задачи "нешахматистам": "Выигрывает тот, кто забъет соперника шахматными фигурами насмерть, не используя шахматную доску!" :angry:

А можно здесь задать головоломку про обход шахматной доски конём? Это ведь тоже не по шахматным правилам - нет ни одного короля.
А про коня, который ходит 3x1?

У вас такое странное отношение к головоломкам вообще, или только на программистскую тему?
User avatar
venco
Уже с Приветом
Posts: 2001
Joined: 10 Nov 2004 00:34
Location: MD

Post by venco »

Hamster wrote:
main()
{
int i, N=20;
for(i = 0 ; -i < N ; i--)
printf("*");
}


Это подходит по правилам, только если можно заменять пробелы.


Насколько я понял, это допустимо. Там в условии не зря много "лишних" пробелов.
Во всяком случае у меня получились те же 3 решения.
User avatar
A. Fig Lee
Уже с Приветом
Posts: 12072
Joined: 17 Nov 2002 03:41
Location: английская колония

Post by A. Fig Lee »

Hamster wrote:
main()
{
int i, N=20;
for(i = 0 ; -i < N ; i--)
printf("*");
}


Это подходит по правилам, только если можно заменять пробелы.

"- Вот скажи, раввин - белый - ето цвет?
-Белый - ето цвет" (с)
:umnik1:
Верить нельзя никому - даже себе. Мне - можно!
User avatar
KP580BE51
Уже с Приветом
Posts: 15007
Joined: 14 Jun 2005 11:50
Location: Ukraine

Post by KP580BE51 »

venco wrote:А можно здесь задать головоломку про обход шахматной доски конём? Это ведь тоже не по шахматным правилам - нет ни одного короля.
А про коня, который ходит 3x1?

Шахматиста вы так не найдете. Найдете того, кто умеет решать головоломки.
User avatar
venco
Уже с Приветом
Posts: 2001
Joined: 10 Nov 2004 00:34
Location: MD

Post by venco »

KP580BE51 wrote:Шахматиста вы так не найдете.


А я разве искал шахматиста?
User avatar
SVK
Уже с Приветом
Posts: 8400
Joined: 23 Jul 2003 03:53
Location: SPb - KW - NY - CT - MD

Post by SVK »

venco wrote:
SVK wrote:Из "непрограммистких" аналогий - ну... Например, в конечном итоге нельзя допускать к управлению финансами людей, которые успешно научились получать большую прибыль с помощью вскрывания сейфов, и других "методов" быстрого накопления капитала. Несмотря на то, что они наглядно продемонстрировали всем чрезвычайную "эффективность" своих методов...

А при чём тут управление финансами, даже если я задам головоломку про подбор кода сейфа?

Ну, да, это можно. Так делал еще Майкл Корлеоне. Победители конкурсов потом ему и вскрывали, что нужно. А после этого - ноги в таз с цементом - и прямо в Гудзон...
LG - Life's good.
But good life is much better.
User avatar
venco
Уже с Приветом
Posts: 2001
Joined: 10 Nov 2004 00:34
Location: MD

Post by venco »

SVK wrote:Так делал еще Майкл Корлеоне.

Делал что? Задавал головоломки? Решал головоломки?
Или таки просто вскрывал сейфы?
User avatar
venco
Уже с Приветом
Posts: 2001
Joined: 10 Nov 2004 00:34
Location: MD

Post by venco »

SVK wrote:Ну, да, это можно. Так делал еще Майкл Корлеоне. Победители конкурсов потом ему и вскрывали, что нужно. А после этого - ноги в таз с цементом - и прямо в Гудзон...

Кстати, если вы так любите всё воспринимать буквально, и от других того же требуете, то почему у вас такая аватара?

Return to “Вопросы и новости IT”