WedX - журнал о программировании и компьютерных науках

Как взять массив и оперировать каждым элементом с каждым другим элементом

Вот что я делаю:

(1..999).each do |a|
    (1..999).each do |b|
      if Math.sqrt(a**2 + b**2) % 1 == 0 && a + b + Math.sqrt(a**2 + b**2) == 1000 && a >= b
            puts a * b * Math.sqrt(a**2 + b**2) 
        end     
    end
end

Происходит то, что a и b взаимозаменяемы в формулах, поэтому есть два совпадения, и, таким образом, puts выводится дважды. Чтобы исправить это, я добавил a >= b, и теперь он выводится только один раз. Но если a == b выводит дважды. Я знаю, что в примере, который я использую, a и b всегда будут разными, но мне это кажется плохим дизайном.

Два вопроса:

  1. Есть ли в Ruby лучший шаблон для взятия массива и сравнения его с самим собой?

  2. Как я могу избежать двойного вывода всегда. Я мог бы установить переменную, которая, если бы она была изменена до начала следующего цикла, разорвалась бы. Это правильный способ сделать это?

26.05.2012

  • Я думаю, что единственная причина, по которой у вас возникла проблема, заключается в том, что вы используете заранее определенный диапазон чисел. Всегда ли это будет у вас? Если содержимое массива непредсказуемо и вам нужно евклидово расстояние между каждой комбинацией (кажется, это то, что вы ищете), вам придется выполнить этот расчет. Возможно, вы могли бы использовать narray для абстракции умножения матриц? 27.05.2012
  • @kobejohn это часть проекта Euler (точнее, проблема 9). Но я думал, что код не так чист, как мог бы быть. Хотел посмотреть, смогу ли я немного улучшить его. Итак, да, я знаю, что это всегда будет между 1..999, но это не предназначено для промышленного использования. 27.05.2012
  • Я понимаю. Плохо, что я пропустил пункт 1: на самом деле это один и тот же массив. Решение от austinbv — отличная демонстрация гибкости и удобочитаемости ruby, если все сделано правильно! 27.05.2012

Ответы:


1
#using combination
(1..999).to_a.combination(2).each do |low, high|
  if Math.sqrt(low**2 + high**2) % 1 == 0 && low + hight + Math.sqrt(low**2 + high**2) == 1000
    puts low * high * Math.sqrt(low**2 + high**2)
  end
end

Отредактировано, чтобы использовать немного лучшую практику (каждый блок с первым и вторым для массивов массивов)

26.05.2012
  • Спасибо, это то, что я искал. 27.05.2012
  • Новые материалы

    Как создать диаграмму градиентной кисти с помощью D3.js
    Резюме: Из этого туториала Вы узнаете, как добавить градиентную кисть к диаграмме с областями в D3.js. Мы добавим градиент к значениям SVG и применим градиент в качестве заливки к диаграмме с..

    Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
    Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

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

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

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

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..


    Для любых предложений по сайту: [email protected]