Начало партии в сёги

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

В начале партии часто происходит обмен слонами. Если я правильно понимаю, это помогает в постройке крепости и придаёт партии остроту. Но почему компьютерные программы не выставляют слона следующим образом:

На мой взгляд это очень хороший ход, т.к. выигрывается стрела, переворачивается слон, а запереть перевёрнутого слона противнику очень тяжело.

Неужели есть какой-то серьёзный недостаток, который я никак не могу найти? Надеюсь на вашу помощь.

Сакура и сёги

Не так много на свете вещей, которые хочется видеть снова и снова. Цветение сакуры — одна из них. Сегодня я в компании друзей ходил в ботанический сад, чтобы вновь увидеть, как цветёт сакура.

Разумеется, эта была не единственная цель. Также я хотел опробовать набор для игры в сёги в «боевых» условиях. Ведь тыкать пальцем в iPad — это одно, а двигать реальные фигурки с иероглифами — совсем другое.

Ниже небольшой отчёт:

Фотографии с прогулки вы можете посмотреть щёлкнув на этот коллаж:

Панорама японского сада доступна по этой ссылке.

И небольшой бонус! Неожиданно для нас в саду выступали настоящие(?) японские(?) барабанщики. Если вы никогда не видели их выступлений, то настоятельно советую посмотреть:

P.S. В сёги мы тоже играли. Запомнить иероглифы оказалось на удивление просто.  Гораздо проще, чем играть. Вы только посмотрите, как они увлечены:

Облака и новый компьютер

Я уже несколько раз говорил, что задачи, которые я пытаюсь решать, требуют огромных вычислительных ресурсов. В своё время несколько умных человек посоветовали мне перенести вычисления в облака.

Я честно пробовал.

  • С Amazon я просто не сумел разобраться, как-то у них всё не по-русски. И не тривиально. По крайней мере для меня.
  • Вторым облачным сервисом стал scalaxy. Могу только похвалить эту компанию. Со всеми проблемами техническая поддержка помогала справиться. Единственный серьёзный недостаток заключается в гипервизоре. Oversun-scalaxy в качестве гипервизора используется XEN. Не знаю на сколько хорош XEN в общем случае, но у меня при использовании utorrent из под гостевой Windows иногда случался BSOD. utorrent нужен был, чтобы скачивать на домашний компьютер результаты работы. Если вы знаете какой-нибудь эффективный способ передать с одного компьютера на другой пару гигабайт с возможностью приостановки и докачки, поделитесь пожалуйста этим сокровенным знанием.
  • Третий и на данный момент последний использованный облачный провайдер — это selectel. Если быть совсем честным, у selectel я не пользовался облачными услугами, а просто арендовал сервер. Всё работало на удивление стабильно, пока мне не понадобилось войти в свой аккаунт и пополнить счёт. Оказалось, что я благополучно забыл пароль. Восстановить пароль можно, только если знаешь номер контракта! Конечно, я не помнил номер контракта. Три дня я переписывался с поддержкой, которая упорно хотела получить копию моего паспорта, а я упорно старался этого избежать. Никакие аргументы о том, что я имею доступ к кошельку, с которого производилась оплата ранее, к почте, к виртуальной машине, не возымели эффекта. Поддержка была непреклонна. В итоге за 3 дня до списания оплаты мне пришло автоматическое письмо, в котором сообщалось, что я являюсь контактным лицом на контракте №####. Три дня поддержка морочила мне голову копией паспорта! А потом мне просто пришло автоматическое письмо! Немного подумав, я решил, что не хочу дальше иметь дел с этой компанией.

Все известные мне «поставщики облаков» оказались опробованными, но ни один полностью не удовлетворял моим запросам. А работу делать всё равно надо. В итоге созрело решение купить новый компьютер. Теперь у меня дома следующая машинка:

  • Процессор Core i7 2700K
  • Материнская плата AsusDeluxe
  • Память 4×8 Гб (1866 MHz)
  • SSD PC-E 240 Гб
  • HDD 2 Тб
  • Видеокарта — GeForce GTX 580

 

Цифровые фотографии

Цифровые фотографии, конечно, удобнее плёночных, но меня немного смущает возможность их редактирования. Ведь получается, что это уже не совсем запечатлённые мгновения прошлого, а отредактированные мгновения прошлого. Но это я к чему всё говорю? Просто я iPhoto купил.

Без iPhoto:

С iPhoto:

Как вам?

P.S. Кто-то говорил, что фотоаппараты — это в каком-то смысле машины времени, что вы об этом думаете?

Фундаментальные понятия

Был сегодня на вводной лекции в курс организации ЭВМ и систем. Когда я её слушал несколько лет назад, будучи ещё студентом, она мне показалась слишком философской и абстрактной.

С одной стороны, это действительно так, но в то же самое время нельзя быть IT-специалистом, не понимая, что такое информация, данные, система, смысл. Вот вы можете дать определения этих понятий?

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

Информация — есть степень модификации структуры входными данными.

И ведь, если подумать, это действительно так. Забавно, что 4 года назад, я не до конца воспринял это определение.

А знаете, почему я не воспринял это определение? Оказывается есть фундаментальный закон, касающийся передачи информации от одной системе к другой, и звучит он так:

Давление на систему тем больше, чем больше разница между внутренними знаниями системы и знаниями, поступающими извне.

Вы, возможно, посчитаете эту запись пустой болтовнёй, но мне кажется, что стоит иногда оторваться от изучения новых технологий и просто немного подумать о том, чем мы на самом деле занимаемся.

Эффективная передача кодов Хаффмана

Моя научная работа связана с компрессией данных и сейчас я пытаюсь решить одну весьма специфическую задачу.

Есть входной алфавит из N m-битных  чисел (N>=10^6; m=24). Для каждого из N символов известна частота его появления. На основе этой информации для всех символов получены коды Хаффмана.

Задача заключается в том, чтобы создать передачу из которой можно однозначно восстановить как сами m-битные числа, так и их Хаффмановские коды. Разумеется, передача должна иметь минимально возможный объём.

Вариант, до которого я сам додумался требует N*(m+2)-1 бит. Если у кого-то получится улучшить мой результат, поделитесь вашим решением.

P.S. Аналогичный вопрос в Q&A на habrahabr.ru.

Простая задачка на циклы

Вот вам ещё одна простая задачка по программированию. На этот раз на циклы:

Вводится целое число, определить является ли оно чётным с использованием циклов.

Понятно, что эту задачу можно решить, используя операцию получения остатка от деления или операцию побитового И. Но важно понимать, что это учебная задача и в задании ясно сказано использовать циклы.

Скорее всего у вас получился код, очень похожий на это:

var
a: shortint;
begin
  write('Введите число: ');
  readln(a);
  while a>=2 do
    a:=a-2;
  if a=1 then
    writeln('Введённое число нечётное')
  else
    writeln('Введённое число чётное');
end.

Но в этом коде есть ошибка.

Вы, скорее всего, невнимательно прочитали условие. Там написано, что вводится целое число, т.е. введённое значение может быть отрицательным. А отрицательное число, очевидно, будет неправильно обработано. Правильный код должен выглядеть так:

var
a: shortint;
begin
  write('Введите число: ');
  readln(a);
  a:=abs(a); // Делимость будем определять
             // для модуля введённого числа
  while a>=2 do
    a:=a-2;
  if a=1 then
    writeln('Введённое число нечётное')
  else
    writeln('Введённое число чётное');
end.

Мораль здесь простая: всегда внимательно читайте условия и помните о нулевых, отрицательных и прочих «особенных» значениях входных данных.

Обработка матриц

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

Дана целочисленная матрица 10 на 10. Необходимо найти среднее арифметическое максимальных элементов в нечётных строках

Заранее спасибо.

Комментарии

Во всех учебниках по программированию пишут, что нельзя оставлять написание комментариев на потом, потому что через некоторое время ты сам не сможешь вспомнить, за что какая переменная отвечает.

Все известные мне начинающие программисты игнорируют это правило. Однажды я поддался соблазну и отложил написание комментариев «на завтра». «Завтра» появились важные дела, «послезавтра» тоже были дела. В итоге я сейчас сижу и пытаюсь вспомнить (а на самом деле понять), что значит переменная plast.

Мораль здесь простая и давно известная: пишите комментарии сразу.

Интересное поведение программ

На днях я столкнулся со странным поведением компилятора в моей любимой IDE RAD Studio XE2. При попытке скомпилировать этот код:

PTest;
{$APPTYPE CONSOLE}
{$R *.res}
uses
  System.SysUtils;
const
  N=65536;
var
  i: LongWord;
begin
  try
    for i:=1 to N do
      writeln(i);
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.

компилятор выдавал следующее сообщение: «[DCC Hint] Project1.dpr(18): H2135 FOR or WHILE loop executes zero times — deleted».

Это поведение можно объяснить тем, что значение N лежит на верхней границе типа word. Скорее всего компилятор некорректно обрабатывает такие ситуации и считает, что N равно 0.

Разбираясь с этой проблемой, я вспомнил ещё об одном странном поведении другой программы. Наверняка у многих из вас установлен Excel. Если его запустить и в ячейку A1 ввести «01.01.1900″, а в ячейку A2 ввести «01.01.1800″, то мы получим следующий результат:

Текст в ячейке A1 выровнен по правому краю, а в ячейке A2 по левому. Как думаете, чем это можно объяснить?