powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Задачка про остров
25 сообщений из 421, страница 8 из 17
Задачка про остров
    #39927224
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iOracleDev
Aleksandr Sharahov
Все ячейки по границе контура станут срезающими и срежут уровень внутри контура.

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

iOracleDev
Это приведет к лишней работе по многократному срезу уровня в ячейках.

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


Для внутренних контуров будет все то же самое: когда срезание дойдет до ячейки внутреннего контура,
эта ячейка будет помечена как срезающая.

А сортировка по высоте значительно ускоряет работу.
...
Рейтинг: 0 / 0
Задачка про остров
    #39927239
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Рекурсивный алгоритм можно еще упростить.
Специальный признак срезающей ячейки не требуется,
Вместо него можно использовать проверку на равенство
высоты ячейки и высоты уровня воды в этой ячейке.
Завтра приведу окончательный вариант.
...
Рейтинг: 0 / 0
Задачка про остров
    #39927675
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здесь оптимизированный вариант решения:
1. Сортировка вставками заменена на сортировку подсчетом массива координат ячеек,
теперь сортировка почти не влияет на время работы.
2. Рекурсия заменена циклом, для возврата в прежнее состояние запоминаем 1-байтовое
направление, теперь нам не грозит переполнение стека на больших N.
3. Вычисление координат соседей выполняется непосредственно в теле процедуры SetLevel
с использованием массива констант, стало считать чуть быстрее.
4. Размеры структур уменьшены, чтобы можно было оценить время работы с ростом N,
теперь остров размером 10000х10000 считается за 6 сек.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
type
  THexagon= packed record
    Height: byte;
    Level: byte;
    Dir: byte;
    end;

  TCoordinates= packed record
    CX: word;
    CY: word;
    end;

const
  XCount= 10000;
  YCount= XCount;
  XYCount= XCount * YCount;

var
  HexMap: packed array[0..YCount-1, 0..XCount-1] of THexagon;
  Order: packed array[0..YCount*XCount-1] of TCoordinates;

procedure ReadHexMap;
var
  x, y: integer;
begin;
  RandSeed:=0;
  for y:=0 to YCount-1 do for x:=0 to XCount-1 do HexMap[y,x].Height:=Random(256);
  end;

procedure SortHexMap;
var
  Counts: array[byte] of integer;
  h, x, y, sum, cnt: integer;
begin;
  for h:=Low(Counts) to High(Counts) do Counts[h]:=0;
  for y:=0 to YCount-1 do for x:=0 to XCount-1 do inc(Counts[HexMap[y,x].Height]);
  sum:=0;
  for h:=Low(Counts) to High(Counts) do begin;
    cnt:=sum; sum:=sum+Counts[h]; Counts[h]:=cnt;
    end;
  for y:=0 to YCount-1 do for x:=0 to XCount-1 do begin;
    h:=HexMap[y,x].Height; cnt:=Counts[h]; Counts[h]:=cnt+1;
    with Order[cnt] do begin; CX:=x; CY:=y; end;
    end;
  end;

procedure SetLevel(y, x: integer);
const
  dx: array[0..5] of integer= (-1, +1,  0, +1, +1,  0);
  dy: array[0..5] of integer= ( 0,  0, -1, +1, -1, +1);
var
  i, x2, y2: integer;
  cut: byte;
begin;
  cut:=HexMap[y,x].Level;
  HexMap[y,x].Dir:=Length(dx);
  i:=0;
  while true do begin;
    while i<Length(dx) do begin;
      x2:=x+dx[i]; if i>=2 then x2:=x2 + y and 1 - 1;
      y2:=y+dy[i];
      if (cardinal(y2)<YCount) and (cardinal(x2)<XCount)
      then with HexMap[y2,x2] do if Level>cut then begin;
        if Height>cut then Level:=Height
        else begin;
          Level:=cut; Dir:=i xor 1; i:=-1;
          x:=x2; y:=y2;
          end;
        end;
      inc(i);
      end;
    i:=HexMap[y,x].Dir;
    if i>=Length(dx) then break;
    x:=x+dx[i]; if i>=2 then x:=x + y and 1 - 1;
    y:=y+dy[i];
    i:=i xor 1 + 1;
    end;
  end;

function FillWater: int64;
var
  i, x, y, MaxHeight: integer;
begin;
  ReadHexMap;
  SortHexMap;
  with Order[XYCount-1] do MaxHeight:=HexMap[CY,CX].Height;
  for y:=0 to YCount-1 do for x:=0 to XCount-1 do with HexMap[y,x] do
    if (y=0) or (y=YCount-1) or (x=0) or (x=XCount-1)
    then Level:=Height
    else Level:=MaxHeight;
  for i:=0 to XYCount-1 do with Order[i] do with HexMap[CY,CX] do
    if Level=Height then SetLevel(CY,CX);
  Result:=0;
  for y:=0 to YCount-1 do for x:=0 to XCount-1 do with HexMap[y,x] do Result:=Result+(Level-Height);
  end;

...
Рейтинг: 0 / 0
Задачка про остров
    #39927683
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov
теперь остров размером 10000х10000 считается за 6 сек.

Осталось узнать правильно или нет))
...
Рейтинг: 0 / 0
Задачка про остров
    #39927685
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iOracleDev,

оно совпало с предыдущими )
...
Рейтинг: 0 / 0
Задачка про остров
    #39927687
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov
оно совпало с предыдущими )

А с правильными совпало?))
...
Рейтинг: 0 / 0
Задачка про остров
    #39927688
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton правильную вещь предлагал, упростить до квадратов и использовать 22080256 .
...
Рейтинг: 0 / 0
Задачка про остров
    #39927690
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iOracleDev,

предыдущие были проверены на двух небольших примерах, посчитанных вручную.

Было здорово сравнить с другим автором, но где ж его взять )
...
Рейтинг: 0 / 0
Задачка про остров
    #39927693
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iOracleDev
mayton правильную вещь предлагал, упростить до квадратов и использовать 22080256 .


1) нафига упрощать до квадратов? что мешает посто сдвинуть четные строки вправо и решать в шестиугольниках? тут изюминка в громадной рекурсии, от которой надо избавиться.

2) чем это лучше случайных данных или специального маленького замудренного примера? все равно придется эту хрень считать независимым способом.
...
Рейтинг: 0 / 0
Задачка про остров
    #39927694
Фотография Имя пользователя1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov,

а можешь выложить карты и результаты к ним в виде файликов. Я планирую на неделе докодить свой вариант 22077648 и сразу сравнить. У тебя ведь 6-угольники? Надо утвердить формат карты )
...
Рейтинг: 0 / 0
Задачка про остров
    #39927696
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имя пользователя1,

через часок выложу
...
Рейтинг: 0 / 0
Задачка про остров
    #39927700
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov,

Декартова система координат с прямоугольной сеткой - легче визуализируется.

А визуализация даёт вам возможность контроля.
...
Рейтинг: 0 / 0
Задачка про остров
    #39927707
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
шестиугольники тоже нормально визуализируются и контролируются
вот реальные результаты для острова 10х10
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Volume=18   Time=0
RandSeed=0   RandRange=10   XCount,YCount=10
Map=
0,0,8,2,2,6,3,1,3,4,
 0,4,0,8,0,2,9,3,7,3,
6,8,7,3,1,3,4,2,8,2,
 4,1,8,2,7,9,4,8,8,0,
1,1,5,0,5,0,7,6,7,7,
 5,2,6,5,9,6,9,2,6,2,
0,7,4,8,5,5,9,6,3,0,
 7,9,7,7,1,1,9,7,5,8,
6,2,0,6,2,8,1,2,5,9,
 1,1,2,1,5,4,2,1,6,7,
...
Рейтинг: 0 / 0
Задачка про остров
    #39927708
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имя пользователя1,

кстати я подумал, зачем передавать файлы?

Гораздо проще сравнивать результаты для 3х параметров, с помощью которых генерируем карту:
RandSeed, RandRange, XCount (YCount=XCount).

Процедура генерации карты:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
procedure ReadHexMap;
var
  x, y: integer;
begin;
  RandSeed:=Seed;
  for y:=0 to YCount-1 do for x:=0 to XCount-1 do HexMap[y,x].Height:=Random(Range);
  end;



Связность ячеек понятна из моего предыдущего сообщения 22081766
...
Рейтинг: 0 / 0
Задачка про остров
    #39927709
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код датчика случайных чисел в Delphi
Код: pascal
1.
2.
3.
4.
5.
function Random(Range: integer): integer;
begin;
  RandSeed:=RandSeed * $08088405 + 1;
  Result:=int64(Range) * cardinal(RandSeed) shr 32;
  end;
...
Рейтинг: 0 / 0
Задачка про остров
    #39927711
Фотография Имя пользователя1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov
кстати я подумал, зачем передавать файлы?
сверить результаты.

кстати, твой алгоритм сможет проглотить добавку от Майтона? 22077662
...
Рейтинг: 0 / 0
Задачка про остров
    #39927712
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имя пользователя1
Aleksandr Sharahov
кстати я подумал, зачем передавать файлы?
сверить результаты.

кстати, твой алгоритм сможет проглотить добавку от Майтона? 22077662


Чтобы сверить результаты, достаточно передать 3 параметра, которые полностью определяют сгенерированный файл.

Добавку от Майтона он не проглотит, придется модифицировать одну строчку.

Ну и неясность некоторая имеется: волна высотой 3 перевалит через гору высотой 3 или нет?
...
Рейтинг: 0 / 0
Задачка про остров
    #39927713
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov
кстати я подумал, зачем передавать файлы?

Чтобы визуально оценить результат глядя на сгенерированную картинку, например загоняем файл
с теми вариантами которые хотим проверить, обсчитываем, генерим результирующую картинку и
сравниваем. Пример картинки 160x120 256 бит
...
Рейтинг: 0 / 0
Задачка про остров
    #39927783
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iOracleDev
Aleksandr Sharahov
кстати я подумал, зачем передавать файлы?

Чтобы визуально оценить результат глядя на сгенерированную картинку


У нас нет такой задачи как "визуально оценить".
Ну, оценил визуально: вроде похоже на то, что ожидается.
А что дальше: верно или неверно?

У нас 2 другие задачи.
1) отладить программу на заранее точно просчитанных примерах.
2) сравнить результаты участников.
Обе задачи можно решить, передавая параметры алгоритма генерации карты и ответ.
...
Рейтинг: 0 / 0
Задачка про остров
    #39927790
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как будет угодно.

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

А битмап я предлагал в совокупности с оптимизацией "островной задачи" с учотом возможностей
параллелизма.

Вы же не собираетесь оценивать параллелизм на этих мелких текстовых файлах?
...
Рейтинг: 0 / 0
Задачка про остров
    #39927795
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Как будет угодно.

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

А битмап я предлагал в совокупности с оптимизацией "островной задачи" с учотом возможностей
параллелизма.

Вы же не собираетесь оценивать параллелизм на этих мелких текстовых файлах?


Опять же: зачем пытаться параллелить все подряд?
Эта задача и параллелится плохо и ее решение в одном потоке
в максимальной размерности займет примерно 1 мин.
Тут это ни к чему.

Кстати есть мысли, как еще ускорить, как будет время попробую реализовать.
...
Рейтинг: 0 / 0
Задачка про остров
    #39927806
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
За способность чего-то "распараллелится" - платят деньги. Собственно ... это тренд нашего десятилетия.

Хотя внутренне - я с вами согласен. Графовые задачи вообще плохо параллелятся. В этом и челлендж.
...
Рейтинг: 0 / 0
Задачка про остров
    #39928018
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov
У нас нет такой задачи как "визуально оценить".
Ну, оценил визуально: вроде похоже на то, что ожидается.
А что дальше: верно или неверно?

У нас 2 другие задачи.
1) отладить программу на заранее точно просчитанных примерах.
2) сравнить результаты участников.
Обе задачи можно решить, передавая параметры алгоритма генерации карты и ответ.

Где взять заранее точно просчитанные примеры нужной сложности и имеющие именно тот рельеф
который нужно проверить?

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

Визуализация даст и вам и остальным понять правильно ли отработал алгоритм конкретно заданный случай.
...
Рейтинг: 0 / 0
Задачка про остров
    #39928038
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iOracleDev
Где взять заранее точно просчитанные примеры нужной сложности и имеющие именно тот рельеф
который нужно проверить?


Хороший вопрос. У вас есть ответ?

iOracleDev

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


Разумеется.

iOracleDev

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


Можно пример?
...
Рейтинг: 0 / 0
Задачка про остров
    #39928046
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov
Можно пример?

Выше нарисован. Было бы очень неплохо чтобы можно было скормить на обработку графический или ppm файл 256 градаций серого и получить на выходе файл у которого все пиксели оставшиеся под водой имеют белый цвет.


mayton,
Нет примера, как в java получить двумерный байт-массив из битмапа или ppm, второй наверное даже лучше?
...
Рейтинг: 0 / 0
25 сообщений из 421, страница 8 из 17
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Задачка про остров
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]