16:28

149ea694a792f3ad2caaf77077a0df58 Спорящая с богом
Искала вопросы для технического интервью (начальство дало "добро" на третьего программиста в проект), нашла одну красивую задачку:

В следующем коде изменить ОДИН знак так, чтобы напечаталось 20 звездочек:
int n = 20;
for ( int i = 0; i < n; i-- ) printf( "*" );


Есть 3 решения, 2 из них релевантны для любого Си-образного языка (предположим, что в области видимости кода существует функция printf оборачивающая в себя вызов функции вывода на консоль) и одно, которое не будет компилироваться например на Java или C# (это такая жирная подсказка, ага). Кто сможет найти все 3?

@темы: Программизм

Комментарии
08.11.2012 в 17:38

Per aspera ad Iceman
У тебя опечатки нет? Если нет:
мои мысли, мои скакуны

Вам студенты не нужны? :)
08.11.2012 в 17:38

Believe in the Ideal, not the Idol. (c) Serra
Мне кажется, или там ошибка в знаке?
08.11.2012 в 17:40

Believe in the Ideal, not the Idol. (c) Serra
лол, я как раз про третий вариант айсмана и подумал... ))
08.11.2012 в 17:42

Per aspera ad Iceman
А не, наврал. Мой второй вариант - нерабочий. Два знака надо менять в нем )
Хм.. и третий тоже тогда. Надо внимательнее думать :)
08.11.2012 в 18:02

149ea694a792f3ad2caaf77077a0df58 Спорящая с богом
Iceman,
ошибки нет. Первый вариант - правильно, остальные 2 не будут работать совсем. Думай дальше.
Не, студент нам не годится;о((( надо опыт и в С++, и в C#, ну и всякое ещё вокруг: SQL, WinForms, NET Remoting, сервисы, сетевые протоколы. Мы как раз скорее кого-нибудь предпенсионного возраста ищем.

"Вам действительно так нужен программист?" -- спросил я. "Нам позарез нужен программист". -- "Я поговорю с ребятами, -- пообещал я. -- Я знаю недовольных". -- "Нам нужен не всякий программист, -- сказал горбоносый. -- Программисты -- народ дефицитный, избаловались, а нам нужен небалованный". -- "Да, это сложнее", -- сказал я. Горбоносый стал загибать пальцы: "Нам нужен программист: а -- небалованный, бэ -- доброволец, цэ -- чтобы согласился жить в общежитии..." -- "Дэ, -- подхватил бородатый, -- на сто двадцать рублей". -- "А как насчет крылышек? -- спросил я. -- Или, скажем, сияния вокруг головы? Один на тысячу!" -- "А нам всего-то один и нужен", -- сказал горбоносый. "А если их всего девятьсот?" -- "Согласны на девять десятых". (с)

Возможно, через какое-то время будет ставка QA. Тебя иметь в виду?
08.11.2012 в 18:03

Per aspera ad Iceman
Караидель, если студенческая, и не найду до того времени программистом, пожалуй, да.
08.11.2012 в 18:07

Per aspera ad Iceman
Придумал еще вариант:
читать дальше
Возможно, не всегда (от компайлера, вроде, зависит), но должен работать.
08.11.2012 в 18:08

149ea694a792f3ad2caaf77077a0df58 Спорящая с богом
Iceman,
-- унарный оператор, он второй операнд не примет, да и что это даст?
08.11.2012 в 18:21

Per aspera ad Iceman
Ну, если он прочитает это как i - (-1) = i +1
Я, кажется, придумал и третий вариант, но не до конца. Сижу биты считаю ))
08.11.2012 в 18:38

Per aspera ad Iceman
Была мысль насчет тильды перед i. Но кажется, не работает... Получится 21 звездочка..
08.11.2012 в 18:47

IDDQD - Команда молодости нашей, команда, без которой мне не жить.
мои варианты
08.11.2012 в 18:52

Караидель, это такой вопрос на собеседовании?
08.11.2012 в 19:11

149ea694a792f3ad2caaf77077a0df58 Спорящая с богом
Flex Ferrum,
Браво! :hlop:
там вопрос даже не в неявном приведении типов, а в том, что в С/С++ не было отдельного типа для буллевой переменной, все буллевы выражения сводились к int: 0 и -1 (0xFFFFFFFF в 32-битных системах, то есть ~0).

Sly Leren,
не факт, что я их буду задавать. Просто искала кто что спрашивает на собеседованиях и задачка понравилась, чисто для себя. Хотя, ИМХО, n-- вполне на поверхности и любой нормальный программер догадается.
08.11.2012 в 22:27

IDDQD - Команда молодости нашей, команда, без которой мне не жить.
все буллевы выражения сводились к int: 0 и -1
ЕМНИП, чуть иначе. Во времена оны целочисленный 0 считался ложью, а любое ненулевое значение - истиной. C++ такое поведение досталось по наследству, что может приводить к плохочитаемому коду:

char* str1 = "Hello, World!";
char buff[32];
char& str2 = buff;

while (*str2 ++ = *str1 ++);

А то и вовсе к ошибкам.
09.11.2012 в 01:31

149ea694a792f3ad2caaf77077a0df58 Спорящая с богом
Flex Ferrum,
да, всё правильно, любое ненулевое - истина, с неявным приведением типов. Но буллево выражение типа у==х можно было присвоить в int и результат в большинстве компиляторов был равен -1. Кстати, не везде, Visual C++, если не ошибаюсь, присваивал 1.
09.11.2012 в 18:32

World's your oyster!
Спасибо, хорошая задача :)