суббота, 1 сентября 2007 г.

Java Puzzle 32: Curse of Looper

Определите i и j таким образом, чтобы сделать следующий цикл бесконечным:
while (i <= j && j <= i && i != j)

Необычный цикл. Если i <= j и j <= i, то это верно когда i == j. А следующее выражение проверяет i != j. Выглядит, что мы в цикл никогда не попадем. Хо-хо-хо!

А давайте использовать новые возможности Java 5: unboxing! Вот ответ:
Integer i = new Integer(0);
Integer j = new Integer(0);

При вычислении первых двух выражений он используется, так как операторы сравнения <= определены только для примитивных типов. А при вычислении последнего выражения - нет, и сравниваются ссылки на два разных объекта. А они не равны. Вот тут-то мы и попали 8(

Java Puzzle 31: Ghost of Looper

А как насчет такого цикла:
while (i != 0) i >>>= 1;
Сделаете его бесконечным?

Судя по оператору сдвига i должно быть целочисленным. А для присвоения используется составной оператор. Вот оно! Согласно JLS 15.26.2 такие операторы втихомолку выполняют сужающее преобразование примитивных типов. Согласно JLS 5.1.13 такое преобразование может терять информацию о величине или точности числовых значений. Вот и ответ:
short i = -1; // или byte

Вкратце: 0xFFFF != 0 и мы заходим в цикл. Так как оператор сдвига реализован только для типов int и long мы получаем 0xFFFF -> 0xFFFFFFFF -> 0x7FFFFFFF -> 0xFFFF. Тут мы и зацикливаемся. Авторы советуют не использовать составные операторы присвоения для типов short, byte или char.

Puzzle

Сегодня был у Пашки в гостях. Увидел, что он там паззл собирает. Осталось собрать небо и воду. А там штук по сто фишек одинакового цвета. Вспомнил дедство - помог ему с водой, так как там меньше фишек было.
Когда собираешь одноцветные фишки легко их перепутать. Я собрал нижний ровный край и стал собирать в центре. 4 фишки никак не лезут. Пришлось разобрать и пересобрать нижний край немного по другому. Странно, что существует два варианта.
Теперь ему небо собирать. Видимо еще неделю потратит ;)

СберБанк РФ

Давно уже плачу за коммунальные платежи в ПетроЭлектроСбыт. Очень удобно. Не берут коммиссию, если платишь в другом районе. Один из центров расположен очень удобно - рядом с работой. Очередей практически нет. Максимум что видел - очередь из трех человек, после чего прошел к дальнему окошку и стал вторым.
Но тут пришла квитанция на оплату домофона за 2 года. В ПЭСб мне сказали, что договора с той организацией у них нет и они не могут принять платеж. Пришлось идти в спербанк. Блин!
У нас достаточно большой центр - окошек 20 будет, но работают только 2 из них. Естественно очереди громадные - минут 40 потратил. И тетки там работают так, как будто делают нам одолжение. И очень медленно!