-
Notifications
You must be signed in to change notification settings - Fork 0
/
challenge11.rb
70 lines (57 loc) · 1.37 KB
/
challenge11.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# Challenge 11: Descrambler - Tuenti Programming Challenge 2
# Author: Manuel Flores <manuelfloresv[at]gmail[.]com>
# Usage: ruby challenge11.rb
require 'set'
ALPHABET = (?A..?Z).to_a.join
FILE = "descrambler_wordlist.txt"
@scores = Hash.new {|h,k| h[k] = calc_score(k) } # calc one time, on demand
def calc_score(word)
score=0
word.chars do |c|
score += case c
when ?A, ?E, ?I, ?L, ?N, ?O, ?R, ?S, ?T, ?U then 1
when ?D, ?G then 2
when ?B, ?C, ?M, ?P then 3
when ?F, ?H, ?V, ?W, ?Y then 4
when ?K then 5
when ?J, ?X then 8
when ?Q, ?Z then 10
else 0
end
end
score
end
def best_word(rack, board)
donthave = ALPHABET.delete(rack)
dontuse = Set.new
word=""
score=0
board.chars.to_a.uniq.each do |b|
dontuse << donthave.delete(b)
end
totry=Set.new
dontuse.each do |cad|
possible = `grep -ve "[#{cad}]" #{FILE}`
totry.merge possible.split
end
totry.each do |w|
if w.delete(rack).size<2
candidate = w.dup
rack.chars do |r|
candidate.sub!(r, '')
end
if candidate.length==1 && board.include?(candidate)
s = @scores[w]
if s>score || s==score && w < word
word = w
score = s
end
end
end
end
"%s %d" % [word, score]
end
readline.to_i.times do
rack, board = readline.strip.split
puts best_word(rack, board)
end