Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Ruby to Delphi / 10 сообщений из 10, страница 1 из 1
19.02.2021, 10:57
    #40047029
LiYing
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ruby to Delphi
Абсолютно не знаком с Ruby, реально ли сконвертировать этот небольшой код на Delphi (консольное приложение)?
Код: ruby
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.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
# https://gist.github.com/jamis/856138
# An implementation of a "weave" maze generator. Weave mazes are those
# with passages that pass both over and under other passages. The
# technique used in this program was described to me by Robin Houston,
# and works by first decorating the blank grid with the over/under
# crossings, and then using Kruskal's algorithm to fill out the rest
# of the grid. (Kruskal's is very well-suited to this approach, since
# it treats the cells as separate sets and joins them together.)
# --------------------------------------------------------------------
# NOTE: the display routine used in this script requires a terminal
# that supports ANSI escape sequences. Windows users, sorry. :(
# --------------------------------------------------------------------

# --------------------------------------------------------------------
# 1. Allow the maze to be customized via command-line parameters
# --------------------------------------------------------------------

width   = (ARGV[0] || 10).to_i
height  = (ARGV[1] || width).to_i
density = (ARGV[2] || 50).to_i
seed    = (ARGV[3] || rand(0xFFFF_FFFF)).to_i
delay   = (ARGV[4] || 0.01).to_f

srand(seed)

# --------------------------------------------------------------------
# 2. Set up constants to aid with describing the passage directions
# --------------------------------------------------------------------

N, S, E, W, U = 0x1, 0x2, 0x4, 0x8, 0x10
DX            = { E => 1, W => -1, N =>  0, S => 0 }
DY            = { E => 0, W =>  0, N => -1, S => 1 }
OPPOSITE      = { E => W, W =>  E, N =>  S, S => N }

# --------------------------------------------------------------------
# 3. Data structures and methods to assist the algorithm
# --------------------------------------------------------------------

EW, NS, SE, SW, NE, NW = [0x80, 0x82, 0x8C, 0x90, 0x94, 0x98].map { |v| "\xE2\x94#{v.chr}" }
NSE, NSW, EWS, EWN     = [0x9C, 0xA4, 0xAC, 0xB4].map { |v| "\xE2\x94#{v.chr}" }

TILES = {
  0       => ["\e[47m   \e[m", "\e[47m   \e[m"],
  N       => ["#{NS} #{NS}", "#{NE}#{EW}#{NW}"],
  S       => ["#{SE}#{EW}#{SW}", "#{NS} #{NS}"],
  E       => ["#{SE}#{EW}#{EW}", "#{NE}#{EW}#{EW}"],
  W       => ["#{EW}#{EW}#{SW}", "#{EW}#{EW}#{NW}"],
  N|S     => ["#{NS} #{NS}", "#{NS} #{NS}"],
  N|W     => ["#{NW} #{NS}", "#{EW}#{EW}#{NW}"],
  N|E     => ["#{NS} #{NE}", "#{NE}#{EW}#{EW}"],
  S|W     => ["#{EW}#{EW}#{SW}", "#{SW} #{NS}"],
  S|E     => ["#{SE}#{EW}#{EW}", "#{NS} #{SE}"],
  E|W     => ["#{EW}#{EW}#{EW}", "#{EW}#{EW}#{EW}"],
  N|S|E   => ["#{NS} #{NE}", "#{NS} #{SE}"],
  N|S|W   => ["#{NW} #{NS}", "#{SW} #{NS}"],
  E|W|N   => ["#{NW} #{NE}", "#{EW}#{EW}#{EW}"],
  E|W|S   => ["#{EW}#{EW}#{EW}", "#{SW} #{SE}"],
  N|S|E|W => ["#{NW} #{NE}", "#{SW} #{SE}"],
  N|S|U   => ["#{NSW} #{NSE}", "#{NSW} #{NSE}"],
  E|W|U   => ["#{EWN}#{EW}#{EWN}", "#{EWS}#{EW}#{EWS}"]
}

def display_maze(grid)
  print "\e[H" # move to upper-left
  grid.each do |row|
    2.times do |i|
      row.each { |cell| print TILES[cell][i] }
      puts
    end
  end
end

class Tree
  attr_accessor :parent

  def initialize
    @parent = nil
  end

  def root
    @parent ? @parent.root : self
  end

  def connected?(tree)
    root == tree.root
  end

  def connect(tree)
    tree.root.parent = self
  end
end

grid = Array.new(height) { Array.new(width, 0) }
sets = Array.new(height) { Array.new(width) { Tree.new } }

# build the list of edges
edges = []
height.times do |y|
  width.times do |x|
    edges << [x, y, N] if y > 0
    edges << [x, y, W] if x > 0
  end
end

edges = edges.sort_by{rand}

# --------------------------------------------------------------------
# 4. Build the over/under locations
# --------------------------------------------------------------------

print "\e[2J" # clear the screen

1.upto(height-2) do |cy|
  1.upto(width-2) do |cx|
    next unless rand(100) < density

    nx, ny = cx, cy-1
    wx, wy = cx-1, cy
    ex, ey = cx+1, cy
    sx, sy = cx, cy+1

    next if grid[cy][cx] != 0 ||
      sets[ny][nx].connected?(sets[sy][sx]) ||
      sets[ey][ex].connected?(sets[wy][wx])

    sets[ny][nx].connect(sets[sy][sx])
    sets[ey][ex].connect(sets[wy][wx])

    if rand(2) == 0
      grid[cy][cx] = E|W|U
    else
      grid[cy][cx] = N|S|U
    end

    grid[ny][nx] |= S
    grid[wy][wx] |= E
    grid[ey][ex] |= W
    grid[sy][sx] |= N

    edges.delete_if do |x, y, dir|
      (x == cx && y == cy) ||
      (x == ex && y == ey && dir == W) ||
      (x == sx && y == sy && dir == N)
    end

    display_maze(grid)
    sleep(delay)
  end
end

puts
puts "--- PRESS ENTER TO BEGIN ---"
STDIN.gets

print "\e[2J" # clear the screen

# --------------------------------------------------------------------
# 5. Kruskal's algorithm
# --------------------------------------------------------------------

until edges.empty?
  x, y, direction = edges.pop
  nx, ny = x + DX[direction], y + DY[direction]

  set1, set2 = sets[y][x], sets[ny][nx]

  unless set1.connected?(set2)
    display_maze(grid)
    sleep(delay)

    set1.connect(set2)
    grid[y][x] |= direction
    grid[ny][nx] |= OPPOSITE[direction]
  end
end

display_maze(grid)

# --------------------------------------------------------------------
# 6. Show the parameters used to build this maze, for repeatability
# --------------------------------------------------------------------

puts "#{$0} #{width} #{height} #{density} #{seed}"



Может кто помочь (хотя бы частично)?
...
Рейтинг: 0 / 0
19.02.2021, 20:30
    #40047322
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ruby to Delphi
...
Рейтинг: 0 / 0
19.02.2021, 21:23
    #40047349
LiYing
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ruby to Delphi
kealon(Ruslan),

Спасибо, поиском умею пользоваться ;)
Но меня интересует конкретная реализация, что в спойлере выше.

Постепенно приходит понимание (бегло читая описания языка), но пока остановился на
Код: ruby
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
class Tree
  attr_accessor :parent

  def initialize
    @parent = nil
  end

  def root
    @parent ? @parent.root : self
  end

  def connected?(tree)
    root == tree.root
  end

  def connect(tree)
    tree.root.parent = self
  end
end


Что это за конструкция и как ее транслировать на Delphi, может кто подсказать?
...
Рейтинг: 0 / 0
19.02.2021, 22:07
    #40047362
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ruby to Delphi
LiYing

Что это за конструкция и как ее транслировать на Delphi, может кто подсказать?

Ну давай попробуем

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
type
  TTree = class
  private
    FParent: TTree;
  public
    function Root: TTree;
    function Connected(ATree: TTree): boolean;
  public
    property Parent: TTree read FParent write FParent;
  end;

function TTree.Root;
begin
  if Assigned(Parent) then Result := Parent.Root else Result := Self;
end;

function TTree.Connected;
begin
  Result := Assigned(ATree) and (Self.Root = ATree.Root);
end;



P.S. Этот Ruby вижу первый раз в жизни
...
Рейтинг: 0 / 0
20.02.2021, 09:10
    #40047425
LiYing
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ruby to Delphi
softwarer,
Хм, спасибо :)
Только тогда еще, видимо,
Код: ruby
1.
2.
3.
  def connect(tree)
    tree.root.parent = self
  end


добавить как
Код: pascal
1.
2.
3.
4.
procedure TTree.Connect(ATree: TTree);
begin
  ATree.Root.Parent := Self;
end;


Остается еще
Код: ruby
1.
  attr_accessor :parent

- его-то куда и как?
И добавить конструктор, в котором cделать Parent := nil , или это уже лишнее?
...
Рейтинг: 0 / 0
20.02.2021, 10:15
    #40047440
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ruby to Delphi
LiYing
Только тогда еще, видимо

Нет, не видимо.
...
Рейтинг: 0 / 0
20.02.2021, 10:34
    #40047451
LiYing
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ruby to Delphi
softwarer,

Но почему? Ведь так игнорируется метод connect(tree) , которые далее используется в коде.
...
Рейтинг: 0 / 0
20.02.2021, 14:58
    #40047526
LiYing
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ruby to Delphi
softwarer,

Спасибо за подсказку с классом, все получилось сконвертировать.
Но метод TTree.Connect(ATree: TTree); все равно добавил, без него никак :)

...
Рейтинг: 0 / 0
20.02.2021, 19:11
    #40047573
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ruby to Delphi
LiYing
Но почему? Ведь так игнорируется метод connect(tree) , которые далее используется в коде.

Ну так свойство Parent не просто так опубликовано.
...
Рейтинг: 0 / 0
24.02.2021, 11:01
    #40048305
LiYing
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ruby to Delphi
softwarer

Ну так свойство Parent не просто так опубликовано.

Ага, понял. Вместо set1.Connect(set2) просто пишем set2.Root.Parent := set1 .
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Ruby to Delphi / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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