2015-04-26 2 views
3

Пытается проверить, совпадают ли все элементы в пределах подматрицы. Например, у меня есть 5x5 доски, и я хочу знать, если один из массивов содержит все x's:Проверьте, совпадают ли все элементы в пределах подматрицы Ruby

board =  [[47, 44, 71, 8, 88], 
     ['x', 'x', 'x', 'x', 'x'], 
     # [83, 85, 97, 'x', 57], 
     [83, 85, 97, 89, 57], 
     [25, 31, 96, 68, 51], 
     [75, 70, 54, 80, 83]] 

я в настоящее время:

def check_x 
    board.each do |x| 
    return true if x.include?('x') 
    end 
    return false 
end 

Но это будет просто проверить, если один из целых чисел x и не все. Любые предложения будут ценны.

+0

Вашего вопрос означает, что вы ищете элемент 'board' (в строке игрового поля), что содержит все 'x', но ваш заголовок и первое предложение предполагают, что вы ищете элемент' board', элементы которого все одинаковы, но не какое-либо конкретное значение. Пожалуйста, отредактируйте, чтобы уточнить, должны ли все элементы строки быть одинаковыми или должны быть равны указанному значению. –

+0

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

ответ

2

Как просто, как board.map { |row| row.uniq.count == 1 } будет делать
#=> [false, true, false, false, false]

uniq возвращает уникальные элементы в массиве. map здесь выполняется итерация по вашему массиву и передача одной строки за раз в блок. Она возвращает true для случаев, когда все элементы массива одинаковы (['x', 'x', 'x', 'x', 'x'].uniq #=> ['x'] длина которого составляет 1)

Если вы просто хотите проверить, если любой строки в плате есть все повторяющиеся элементы, рубин имеет только функцию. Угадай, что? any?. Просто измените выше однострочника с any? как:

board.any? { |row| row.uniq.count == 1 } #=> true

Если вы хотите, чтобы выяснить, какие строки (ы) имеет/имеют все дубликаты, и что дублировать его есть:

board.each.with_index.select { |row, index| row.uniq.count == 1 } 
#=> [[["x", "x", "x", "x", "x"], 1]], where 1 is index. 

Чистая рубиновая удивительность.

+0

Добавлена ​​дополнительная информация для игры с массивами Ruby. – kiddorails

+0

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

+0

Можете ли вы дать в этом случае объект 'board'? Не полностью понял сценарий. – kiddorails

6

немного больше идиоматичен:

board.one? { |row| row.all? { |item| item == 'x' } }

+0

Интересно, что я пробовал оба решения. Тем не менее, при попытке решения @kiddorails выход по-прежнему имеет значение true, если есть только один «x», и мне нужно, чтобы он звонил true, если только ALL является «x». Я использовал «board.one?», И это действительно сработало. Хотя я не знаком с тем, как работает «.one?». – Nappstir

+0

'Enumerable # one?' Берет каждую запись в контейнере и передает ее в данный блок. Если блок оценивает значение «true» для одной записи, весь метод возвращает «true». –

+1

Если вы хотите, чтобы строго одна строка имела все «x», сохраните «один?». В противном случае используйте 'any?', Что означает, что по крайней мере одна строка - это все «x». –

0

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

board.each {|b| puts board.index(b) if b.max == b.min} 

или просто заменить x.include?("x") с x.min == x.max в функции для истинного/ложного результата

+0

если строка доски '[1, 'x']', '[1, 'x']. Max # => ArgumentError: сравнение String с 1 failed'. –

+0

@CarySwoveland посмотреть предложение перед последним в OP. ", но это просто проверит, является ли одно из целых чисел x и не все". – marmeladze

+0

Предпоследнее предложение? :-) Да, Трэвис объясняет, почему его код не работает. Предположим, что 'board = [['x', 1], ['x', 'x']]'. Затем ваш код возвращает «ArgumentError: сравнение Fixnum с String failed». В частности, это '['x', 1] .max', что не удалось .. –

0

Предполагая, что все элементы board (строк плата) имеют тот же размер, что кажется разумным предположение, вы могли бы сделать это таким образом:

x_row = ['x']*board.first.size 
    #=> ["x", "x", "x", "x", "x"] 
board.any? { |row| row == x_row } 
    #=> true 
0

Предполагая, что это всегда массив фиксированной длины, ваш метод может быть просто:

def full_row 
    board.each do |row| 
    return true if (row.uniq.count == 1) && (row[0] == 'x') 
    end 

    return false 
end 

Это может быть сводилось к меньшему количеству строк, но я ненавижу перенос строк в Vim: р

Смежные вопросы