LINUX.ORG.RU

Странное поведение интерпритатора Ruby

 


0

1

Собственно, вот код:

$ar = [].fill(0..7) {[].fill(0..7) {rand(2)}}

$ar.each_index { |i| $ar[i].each { |x| if x == 0 then print "\x1b[8;44m00\x1b[0m" else print "\x1b[8;42m11\x1b[0m" end }; print("\n") }

$isl, x, y, = 0, 0, 0

def gt (yy, xx, b = false)
  $ar[yy][xx] = 0
  a = [[-1, -1], [-1, 0], [-1, 1], [0, -1], [0, 1], [1, -1], [1, 0], [1, 1]]
  a.each {|m| y, x = yy+m[0], xx+m[1]; if (y >= 0) & (x >= 0) & ($ar[y][x] == 1) then print y, x, "\n"; gt(y, x) end}
  if b == true
  $isl += 1 end
end

until y == 8
  if $ar[y][x] == 1
  gt(y, x, true) end
  if x == 7
  x = 0
  y += 1
  else x += 1 end
end

puts $isl
Его исполнение после нескольких успешных итераций заканчивается на сообщении:
ex6.rb:10:in `block in gt': undefined method `[]' for nil:NilClass (NoMethodError)
	from /home/alex/Ruby/ex6.rb:10:in `each'
	from /home/alex/Ruby/ex6.rb:10:in `gt'
	from /home/alex/Ruby/ex6.rb:10:in `block in gt'
Уже два дня его перепроверяю и переделываю, всё равно не пойму, что я написал не так.
Если кому-то интересна суть кода, то это решение задачи:
«Дан двухмерный массив, рандомно заполненный ноликами и едичичками, единица - земля, ноль - море, узнать кол-во островов»

Deleted

Последнее исправление: BIGWELLD (всего исправлений: 5)
Ответ на: комментарий от Deleted

Байты исходников экономишь? Вот я смотрю на код и всё желание пропадает понимать что и как он делает. Зачем же так делать? %)

Deleted
()

Вроде руби, а вроде и перл. Хотя какая разница, оба умирают.

entefeed ☆☆☆
()
Ответ на: комментарий от Deleted

Кстати да, тогда вносим патч:

if (y >= 0) & (8 > y) & (x >= 0) & (8 > x) & ($ar[y][x] == 1) ...
Но вопрос всё равно остаётся откратым.

Deleted
()

С форматированием явно беда.

tensai_cirno ★★★★★
()
Ответ на: комментарий от Deleted

Спасибо, это всё решило, но я не понял почему.
На сколько я знаю в случае с && если первое ложно то дальше не проверяется, но как это повлияло?

Deleted
()
Ответ на: комментарий от Deleted

y = 8 → $ar[8][x] → nil[x] → NoMethodError: undefined method `[]' for nil:NilClass

Deleted
()
Ответ на: комментарий от TDrive

На ruby программирую второй месяц, чюжих программ не видел, синтаксис оформляю как глазу удобнее, умвр

Deleted
()
Ответ на: комментарий от Deleted

https://github.com/bbatsov/ruby-style-guide
https://github.com/bbatsov/rubocop
рекомендую активно пользоваться чтоб люди от твоего кода не шарахались.

умвр

./test.rb:6: syntax error, unexpected '|', expecting '}'
{ |i| $ar[i].each
   ^
./test.rb:7: syntax error, unexpected '|', expecting '}'
 { |x| if x == 0
    ^
./test.rb:12: syntax error, unexpected '}', expecting end-of-input
$ ruby -v
ruby 2.2.0p0 (2014-12-25 revision 49005) [x86_64-linux]
TDrive ★★★★★
()
Ответ на: комментарий от TDrive

рекомендую активно пользоваться

уже почитал

умвр

...

Я слегка код изменил, специально для Mystra_x64, видимо плохо изменил.
Вернул обратно.

Deleted
()
Ответ на: комментарий от anonymous

в ruby тоже никто не запрещяет

Deleted
()

Ты осторожнее. На ЛОРе-то хоть и закаленные парни сидят, но неподготовленные нежные умы начинающих рубистов ты покалечишь таким кодом надолго.

Deleted
()
Ответ на: комментарий от Deleted

А по моему смотрится довольно.. компактненько, а если что-то не так, прошу простить - синтаксис я пока знаю не полностью, но активно исправляюсь.

Deleted
()
Ответ на: комментарий от Deleted

но я не понял почему.

Потому что & — это bitwise AND, ему нужно все аргументы знать, чтоб вычислиться. А && — это logical AND, для него, если первый аргумент не приводится к true, остальные уже не важны.

INFOMAN ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.