Skip to content

Instantly share code, notes, and snippets.

@radarek
Last active January 20, 2022 13:31
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save radarek/ed5600a5d4cf2222a6e72b680cac6807 to your computer and use it in GitHub Desktop.
Save radarek/ed5600a5d4cf2222a6e72b680cac6807 to your computer and use it in GitHub Desktop.

Solution (code golf) to the "Coat of Many Colours" challenge

Challenge: Coat of Many Colours

Note Do not copy the solver code directly fron the website. It contains binary data (unprintable characters), thus copying and pasting will probably corrupt data. Use generator (see belo) or download solver to the disk and then run.

Usage

Generating solver:

$ ruby generator.rb > solver.rb
$ wc -c solver.rb
      72 solver.rb

Using the lambda function defined in the solver:

$ ruby -Kn -e 'f=eval(File.read("solver.rb")); p f[%w[green blue red brown]]'
["red", "green", "brown", "blue"]

Running tests:

$ ruby -Kn tests.rb solver.rb
Code size: 72 bytes
Test: []
   => []: OK
Test: ["green", "blue", "red", "brown"]
   => ["red", "green", "brown", "blue"]: OK
Test: ["gold", "grey", "green"]
   => ["green", "gold", "grey"]: OK
Test: ["ruby", "yellow", "red", "grey"]
   => ["red", "yellow", "ruby", "grey"]: OK
Test: ["gold", "green", "fawn", "white", "azure", "rose", "black", "purple", "orange", "silver", "ruby", "blue", "lilac", "crimson", "pink", "cream", "lemon", "russet", "grey", "olive", "violet", "mauve", "chocolate", "yellow", "peach", "brown", "ochre", "scarlet", "red"]
   => ["red", "yellow", "green", "brown", "scarlet", "black", "ochre", "peach", "ruby", "olive", "violet", "fawn", "lilac", "gold", "chocolate", "mauve", "cream", "crimson", "silver", "rose", "azure", "lemon", "russet", "grey", "purple", "white", "pink", "orange", "blue"]: OK
words = %w[red yellow green brown scarlet black ochre peach ruby olive violet fawn lilac gold chocolate mauve cream crimson silver rose azure lemon russet grey purple white pink orange blue]
index = words.map { |word| (word[2,4].sum % 145).chr}.join
print <<CODE.chomp
->l{l.sort_by{'#{index}'.index''<<_1[2,4].sum%145}}
CODE
f = eval(code = File.read(ARGV[0] || 'solver.rb'))
puts "Code size: #{code.size} bytes"
test = ->(words, expected) do
puts "Test: #{words}\n => #{sorted = f[words]}: #{sorted == expected ? 'OK' : 'ERROR'}"
end
test[[], []]
test[["green","blue","red","brown"], ["red", "green", "brown", "blue"]]
test[["gold","grey","green"], ["green", "gold", "grey"]]
test[["ruby","yellow","red","grey"], ["red", "yellow", "ruby", "grey"]]
test[["gold","green","fawn","white","azure","rose","black","purple","orange","silver","ruby","blue","lilac","crimson","pink","cream","lemon","russet","grey","olive","violet","mauve","chocolate","yellow","peach","brown","ochre","scarlet","red"], ["red", "yellow", "green", "brown", "scarlet", "black", "ochre", "peach", "ruby", "olive", "violet", "fawn", "lilac", "gold", "chocolate", "mauve", "cream", "crimson", "silver", "rose", "azure", "lemon", "russet", "grey", "purple", "white", "pink", "orange", "blue"]]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment