Как переупорядочить массив на основе другого массива? - PullRequest
2 голосов
/ 07 февраля 2012

Я пишу «программу перетасовки карт», чтобы поиграть с Руби.Считай, что это домашнее задание, которое я назначаю себе, чтобы узнать больше:)

Вывод, который мне хотелось бы получить, здесь:

----Triple Cut Deck on 3rd and 5th cards---------
  -- reset
Number: 1,  Position: 3, Suit: Clubs, Card: 3
Number: 2,  Position: 4, Suit: Clubs, Card: 4
Number: 3,  Position: 1, Suit: Clubs, Card: 5
Number: 4,  Position: 2, Suit: Clubs, Card: 6
Number: 5,  Position: 5, Suit: Clubs, Card: Ace
Number: 6,  Position: 6, Suit: Clubs, Card: 2

, но я получаю:

----Triple Cut Deck on 3rd and 5th cards---------
  -- reset
Number: 1,  Position: 3, Suit: Clubs, Card: 3
Number: 2,  Position: 4, Suit: Clubs, Card: 4
Number: 3,  Position: 5, Suit: Clubs, Card: 5
Number: 4,  Position: 5, Suit: Clubs, Card: 5
Number: 5,  Position: 6, Suit: Clubs, Card: 6
Number: 6,  Position: 6, Suit: Clubs, Card: 6

По сути, я пытаюсь переупорядочить карты, чтобы у Ace, 2, 3, 4, 5, 6 "порядок их карт был изменен с" 1,2,3,4,5 "на" 5, 6, 3, 4, 1, 2 ". Другими словами, две верхние карты внизу (по порядку), две нижние сверху и середина остаются прежними. Это вариант трехстороннего среза.

Мне тяжело заставить этот массив "переупорядочивать", чтобы он работал правильно. Прямо сейчас карты "rank" и card_position перепутаны, как показано выше, с дубликатами и т. Д.

class Card
  RANKS = %w(Ace 2 3 4 5 6 7 8 9 10 J Q K )
  SUITS = ['Clubs', 'Diamonds', 'Hearts', 'Spades']
  SCORES = [1..54]
  attr_accessor :rank, :suit, :card_position

  def initialize(id, rank='', suit='', card_position=0)
    self.card_position =  id
    self.rank = RANKS[(id % 14)-1]
    self.suit = SUITS[(id / 14)]
  end
end

class Deck
  DECK_SIZE = 6
  attr_accessor :cards
  def initialize
    self.cards = (1..DECK_SIZE).to_a.collect { |id| Card.new(id) }
    @deck = cards
  end

  def process_cards

    puts "\n----Triple Cut Deck on 3rd and 5th cards---------"
    self.triple_cut_deck(3, 5, true)
    self.show_deck

  end

  def show_deck
    @deck.sort_by!(&:card_position).each_with_index do |card, index|
      puts 'Number: ' + (index+1).to_s + ",  Position: #{card.card_position.to_s}, Suit: #{card.suit.to_s}, Card: #{card.rank.to_s}"
    end
  end

  def triple_cut_deck(top_cut, bottom_cut, reset_deck=false)
    reset_the_deck(reset_deck)

    top_cut-= 1
    bottom_cut-= 1
    deck_array_size = DECK_SIZE-1

    @new_deck = []
    @new_deck[0..1] = @deck[4..5]
    @new_deck[2..3] = @deck[2..3]
    @new_deck[4..5] = @deck[0..1]

    DECK_SIZE.times do |card|
      @deck[card].card_position= @new_deck[card].card_position
      @deck[card].card_position= @new_deck[card].card_position
      @deck[card].card_position= @new_deck[card].card_position
    end
  end


  def reset_the_deck(reset_deck)
    puts reset_deck == true ? "  -- reset" : 'no-reset'
    initialize if (true && reset_deck)
  end

end

Ответы [ 3 ]

1 голос
/ 08 февраля 2012

Это то, что вы хотите?

a = [1,2,3,4,5,6]

n = 2
b = a[-n, n] + a[n..-(n+1)] + a[0,n]

p a # => [1,2,3,4,5,6]
p b # => [5,6,3,4,1,2]
1 голос
/ 07 февраля 2012

Маловероятно, что это будет самое быстрое решение, но вы можете zip объединить два массива (сначала массив с ключами сортировки) и отсортировать результат следующим образом:

a = [ 8, 4, 2, 7, 5 ]
b = [ 5, 7, 0, 3, 3 ]

a.zip(b).sort.transpose.last
# => [0, 7, 3, 3, 5]
0 голосов
/ 08 февраля 2012

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

Ranks = %w(Ace 2 3 4 5 6 7 8 9 10 J Q K )
Suits = ['Clubs', 'Diamonds', 'Hearts', 'Spades']
Card = Struct.new(:rank, :suit)
deck = Suits.product(Ranks).map{|suit, rank| Card.new(rank, suit) }
hand = deck[0, 6]
def cut(hand, *at) #returns a new hand, multi-cutted 
  indices = (at.map{|i| i-1}+[0, hand.size]).sort
  res = indices.each_cons(2).map{|i1,i2| hand[i1..i2-1] }
  res.reverse.flatten
end
p cut(hand, 3, 5)

выход:

 [#<struct Card rank="Ace", suit="Clubs">, #<struct Card rank="2", suit="Clubs">,
    #<struct Card rank="3", suit="Clubs">, #<struct Card rank="4", suit="Clubs">,
    #<struct Card rank="5", suit="Clubs">, #<struct Card rank="6", suit="Clubs">]

    [#<struct Card rank="5", suit="Clubs">, #<struct Card rank="6", suit="Clubs">,
    #<struct Card rank="3", suit="Clubs">, #<struct Card rank="4", suit="Clubs">,
    #<struct Card rank="Ace", suit="Clubs">, #<struct Card rank="2", suit="Clubs">]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...