Skip to content

Instantly share code, notes, and snippets.

@robmiller
Last active February 15, 2022 19:40
Show Gist options
  • Select an option

  • Save robmiller/3ce85e8a2d1e33bd517da3e111c1e48d to your computer and use it in GitHub Desktop.

Select an option

Save robmiller/3ce85e8a2d1e33bd517da3e111c1e48d to your computer and use it in GitHub Desktop.

Revisions

  1. robmiller revised this gist Jan 10, 2022. 1 changed file with 91 additions and 73 deletions.
    164 changes: 91 additions & 73 deletions play-wordle.rb
    Original file line number Diff line number Diff line change
    @@ -16,28 +16,33 @@
    # Author: Rob Miller <r@robm.me.uk>

    def play
    game = Game.new

    $colours = true
    formatter = ColourFormatter
    cheat = false

    while arg = ARGV.pop
    case arg
    when "--cheat"
    puts game.instance_variable_get(:@word)
    puts
    when "--i-am-a-cheat"
    cheat = true
    when "--no-colour"
    $colours = false
    formatter = MonoFormatter
    end
    end

    puts legend
    game = Game.new(formatter: formatter)

    if cheat
    puts "You cheat! The answer is… #{game.instance_variable_get(:@word)}"
    puts
    end

    puts formatter.legend
    puts

    until game.over?
    print "Guess #{game.current_guess}: "
    response = game.guess(gets.chomp)
    if response.valid?
    clue = format(response.letters)
    puts clue
    puts response.format
    puts "\e[9m#{game.wrong_letters.join(" ")}\e[0m"
    puts
    else
    @@ -53,67 +58,15 @@ def play
    end
    end

    def format(clue)
    if $colour
    colour_format(clue)
    else
    mono_format(clue)
    end
    end

    def colour_format(clue)
    clue.map do |letter, answer|
    case answer
    when "correct"
    "\e[1;97;42m#{letter.upcase}\e[0m"
    when "partial"
    "\e[1;97;43m#{letter.upcase}\e[0m"
    when "wrong"
    letter
    end
    end.join(" ")
    end

    def mono_format(clue)
    clue.map do |letter, answer|
    case answer
    when "correct"
    "\e[7m#{letter.upcase}\e[0m"
    when "partial"
    "\e[1;4m#{letter.upcase}\e[0m"
    when "wrong"
    "\e[9m#{letter.upcase}\e[0m"
    end
    end.join(" ")
    end

    def legend
    legend = ""

    legend << "How to play\n"

    if $colour
    legend << "\e[1;97;42mA\e[0m = correct (right letter, right place)\n"
    legend << "\e[1;97;43mA\e[0m = partially correct (right letter, wrong place)\n"
    legend << "A = incorrect\n"
    else
    legend << "\e[7mA\e[0m = correct (right letter, right place)\n"
    legend << "\e[1;4mA\e[0m = partially correct (right letter, wrong place)\n"
    legend << "\e[9mA\e[0m = incorrect\n"
    end

    legend << "\n"

    legend
    end

    class Game
    def initialize
    @words = DATA.each_line.map(&:strip)
    @word = @words.sample
    def initialize(formatter: ColourFormatter)
    @words = DATA.each_line.map(&:strip)
    @word = @words.sample

    @guesses = []
    @guessed = false

    @formatter = formatter
    end

    def over?
    @@ -142,14 +95,14 @@ def guess(guess)
    guess = guess.to_s[0...5].downcase.strip

    unless @words.include? guess
    return Response.new([], valid: false)
    return Response.new([], valid: false, formatter: @formatter)
    end

    @guesses << guess

    if guess == word
    @guessed = true
    return Response.new(guesses.chars.map { |char| [char, "correct"] }, valid: true)
    return Response.new(guess.chars.map { |char| [char, "correct"] }, valid: true, formatter: @formatter)
    end

    letters = guess.chars.each_with_index.map do |c, n|
    @@ -162,7 +115,7 @@ def guess(guess)
    end
    end

    Response.new(letters, valid: true)
    Response.new(letters, valid: true, formatter: @formatter)
    end

    def answer
    @@ -176,18 +129,83 @@ def answer
    end

    class Response
    def initialize(letters, valid: true)
    @letters = letters
    @valid = valid
    def initialize(letters, valid: true, formatter:)
    @letters = letters
    @valid = valid
    @formatter = formatter
    end

    def valid?
    @valid
    end

    def format
    @formatter.new(letters).format
    end

    attr_reader :letters
    end

    class ColourFormatter
    def initialize(clue)
    @clue = clue
    end

    def format
    @clue.map do |letter, answer|
    case answer
    when "correct"
    "\e[1;97;42m#{letter.upcase}\e[0m"
    when "partial"
    "\e[1;97;43m#{letter.upcase}\e[0m"
    when "wrong"
    letter
    end
    end.join(" ")
    end

    class << self
    def legend
    <<~LEGEND
    How to play
    \e[1;97;42mA\e[0m = correct (right letter, right place)
    \e[1;97;43mA\e[0m = partially correct (right letter, wrong place)
    A = incorrect
    LEGEND
    end
    end
    end


    class MonoFormatter
    def initialize(clue)
    @clue = clue
    end

    def format
    @clue.map do |letter, answer|
    case answer
    when "correct"
    "\e[7m#{letter.upcase}\e[0m"
    when "partial"
    "\e[1;4m#{letter.upcase}\e[0m"
    when "wrong"
    "\e[9m#{letter.upcase}\e[0m"
    end
    end.join(" ")
    end

    class << self
    def legend
    <<~LEGEND
    \e[7mA\e[0m = correct (right letter, right place)
    \e[1;4mA\e[0m = partially correct (right letter, wrong place)
    \e[9mA\e[0m = incorrect
    LEGEND
    end
    end
    end

    play

    __END__
  2. robmiller revised this gist Jan 9, 2022. 1 changed file with 54 additions and 3 deletions.
    57 changes: 54 additions & 3 deletions play-wordle.rb
    Original file line number Diff line number Diff line change
    @@ -18,10 +18,20 @@
    def play
    game = Game.new

    if ARGV.pop == "cheat"
    puts game.instance_variable_get(:@word)
    $colours = true

    while arg = ARGV.pop
    case arg
    when "--cheat"
    puts game.instance_variable_get(:@word)
    puts
    when "--no-colour"
    $colours = false
    end
    end

    puts legend

    until game.over?
    print "Guess #{game.current_guess}: "
    response = game.guess(gets.chomp)
    @@ -44,6 +54,14 @@ def play
    end

    def format(clue)
    if $colour
    colour_format(clue)
    else
    mono_format(clue)
    end
    end

    def colour_format(clue)
    clue.map do |letter, answer|
    case answer
    when "correct"
    @@ -56,6 +74,39 @@ def format(clue)
    end.join(" ")
    end

    def mono_format(clue)
    clue.map do |letter, answer|
    case answer
    when "correct"
    "\e[7m#{letter.upcase}\e[0m"
    when "partial"
    "\e[1;4m#{letter.upcase}\e[0m"
    when "wrong"
    "\e[9m#{letter.upcase}\e[0m"
    end
    end.join(" ")
    end

    def legend
    legend = ""

    legend << "How to play\n"

    if $colour
    legend << "\e[1;97;42mA\e[0m = correct (right letter, right place)\n"
    legend << "\e[1;97;43mA\e[0m = partially correct (right letter, wrong place)\n"
    legend << "A = incorrect\n"
    else
    legend << "\e[7mA\e[0m = correct (right letter, right place)\n"
    legend << "\e[1;4mA\e[0m = partially correct (right letter, wrong place)\n"
    legend << "\e[9mA\e[0m = incorrect\n"
    end

    legend << "\n"

    legend
    end

    class Game
    def initialize
    @words = DATA.each_line.map(&:strip)
    @@ -98,7 +149,7 @@ def guess(guess)

    if guess == word
    @guessed = true
    return Response.new(guess.chars.map { |char| [char, "correct"] }, valid: true)
    return Response.new(guesses.chars.map { |char| [char, "correct"] }, valid: true)
    end

    letters = guess.chars.each_with_index.map do |c, n|
  3. robmiller revised this gist Jan 8, 2022. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion play-wordle.rb
    Original file line number Diff line number Diff line change
    @@ -98,7 +98,7 @@ def guess(guess)

    if guess == word
    @guessed = true
    return Response.new(guesses.chars.map { |char| [char, "correct"] }, valid: true)
    return Response.new(guess.chars.map { |char| [char, "correct"] }, valid: true)
    end

    letters = guess.chars.each_with_index.map do |c, n|
  4. robmiller revised this gist Jan 7, 2022. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion play-wordle.rb
    Original file line number Diff line number Diff line change
    @@ -66,7 +66,7 @@ def initialize
    end

    def over?
    num_guesses >= 5 || guessed?
    num_guesses >= 6 || guessed?
    end

    def guessed?
  5. robmiller revised this gist Jan 7, 2022. 1 changed file with 11 additions and 9 deletions.
    20 changes: 11 additions & 9 deletions play-wordle.rb
    Original file line number Diff line number Diff line change
    @@ -23,7 +23,7 @@ def play
    end

    until game.over?
    print "Guess #{game.guess_number}: "
    print "Guess #{game.current_guess}: "
    response = game.guess(gets.chomp)
    if response.valid?
    clue = format(response.letters)
    @@ -58,23 +58,27 @@ def format(clue)

    class Game
    def initialize
    @words = DATA.each_line.map(&:strip)
    @word = @words.sample
    @num_guesses = 0
    @words = DATA.each_line.map(&:strip)
    @word = @words.sample

    @guesses = []
    @guessed = false
    end

    def over?
    @num_guesses >= 5 || @guessed == true
    num_guesses >= 5 || guessed?
    end

    def guessed?
    @guessed
    end

    def guess_number
    @num_guesses + 1
    def num_guesses
    @guesses.length
    end

    def current_guess
    num_guesses + 1
    end

    def wrong_letters
    @@ -92,8 +96,6 @@ def guess(guess)

    @guesses << guess

    @num_guesses += 1

    if guess == word
    @guessed = true
    return Response.new(guesses.chars.map { |char| [char, "correct"] }, valid: true)
  6. robmiller created this gist Jan 3, 2022.
    13,112 changes: 13,112 additions & 0 deletions play-wordle.rb
    13,112 additions, 0 deletions not shown because the diff is too large. Please use a local Git client to view these changes.