Class: Solitaire::KeyStream

Inherits:
Object show all
Defined in:
lib/quiz1/t/solutions/Florian Gross/solitaire.rb

Instance Method Summary collapse

Constructor Details

#initialize(key_method = nil) ⇒ KeyStream

Returns a new instance of KeyStream.



78
79
80
81
82
83
84
85
86
87
88
# File 'lib/quiz1/t/solutions/Florian Gross/solitaire.rb', line 78

def initialize(key_method = nil)
  case key_method
    when true then
      @deck = Card.deck.sort_by { rand }
    when String then
      @deck = Card.deck
      generate_letter(key_method)
    else
      @deck = Card.deck
  end
end

Instance Method Details

#generate_letter(seed_phrase = nil) ⇒ Object Also known as: shift



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
# File 'lib/quiz1/t/solutions/Florian Gross/solitaire.rb', line 90

def generate_letter(seed_phrase = nil)
  if seed_phrase
    seed_phrase = Solitaire.clean(seed_phrase)
    seed_phrase = nil if seed_phrase.empty?
  end

  result = nil

  until result
    deck_size = @deck.size

    # Move JokerA down one card
    old_a_pos = @deck.index(Card::JokerA)
    new_a_pos = case old_a_pos
      when deck_size - 1 then 1
      else old_a_pos + 1
    end
    @deck.move(old_a_pos, new_a_pos)

    # Move JokerB down two cards
    old_b_pos = @deck.index(Card::JokerB)
    new_b_pos = case old_b_pos
      when deck_size - 1 then 2
      when deck_size - 2 then 1
      else old_b_pos + 2
    end
    @deck.move(old_b_pos, new_b_pos)

    # Perform triple cut
    top_pos, bot_pos = [@deck.index(Card::JokerA), @deck.index(Card::JokerB)].sort
    @deck.replace(
      @deck[(bot_pos + 1) .. -1] +
      @deck[top_pos .. bot_pos] + 
      @deck[0 ... top_pos])

    # Perform count cut
    top = @deck.slice!(0 ... @deck.last.value)
    @deck.insert(-2, *top)

    if seed_phrase
      key = seed_phrase.slice!(0, 1)
      top = @deck.slice!(0 ... Solitaire.letter_to_number(key))
      @deck.insert(-2, *top)
      result = true if seed_phrase.empty?
    else
      # Fetch result
      card = @deck[@deck.first.value]
      result = card.letter unless card.special?
    end
  end

  return result
end