# 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