Top Level Namespace
Defined Under Namespace
Modules: BugFix, Enumerable, IOExtras, Kernel, Solitaire, Zip, Zlib
Classes: Array, BackwardsAlgorithm, CLI, Card, CryptKeeper, Deck, Encrypter, File, Fixnum, Joker, KeyStream, KeyingAlgorithms, Module, Numeric, Object, Options, ShuffleAlgorithm, SolitaireCipher, SolitaireCypherTest, String, TC_Deck, TC_KeyStream, TC_KeyingAlgorithms, TC_SolitaireCipher, TC_UnkeyedAlgorithm, TestArray, TestFixnum, Time, UnkeyedAlgorithm, ZipList
Constant Summary
collapse
- Tempfile =
BugFix::Tempfile
- A =
Joker.new
- B =
Joker.new
- RANKS =
%w(A 2 3 4 5 6 7 8 9 10 J Q K)
- SUITS =
%w(C D H S)
- JOKER_RANK =
'joker'
- JOKER_VALUE =
-1
Instance Method Summary
collapse
Instance Method Details
#data_to_string(data) ⇒ Object
94
95
96
97
|
# File 'lib/quiz1/t/solutions/Dennis Ranke/solitaire.rb', line 94
def data_to_string(data)
data = data.map {|v| (v + 65).chr}.join
(0...(data.size / 5)).map {|i| data[i * 5, 5]}.join(' ')
end
|
#decode(data, keystream) ⇒ Object
90
91
92
|
# File 'lib/quiz1/t/solutions/Dennis Ranke/solitaire.rb', line 90
def decode(data, keystream)
encode(data, keystream.map {|v| 26 - v})
end
|
#decrypt(message) ⇒ Object
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
|
# File 'lib/quiz1/t/solutions/James Edward Gray II/solitaire.rb', line 37
def decrypt(message)
key_stream = generate(message.size)
values = message.split("").map { |letter| letter[0] - ?A + 1 }
key_values = key_stream.split("").map { |letter| letter[0] - ?A + 1 }
values.each_with_index do |value, index|
next if value < 0
if value <= key_values[index]
values[index] = value + 26 - key_values[index]
else
values[index] = value - key_values[index]
end
end
message = (values.map { |number| (number - 1 + ?A).chr }).join("")
return message
end
|
#download(file, todir = '.') ⇒ Object
Download a binary file from the rubyquiz url
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
# File 'lib/download_quizzes.rb', line 32
def download(file, todir = '.')
begin
puts "Downloading file #{file} from #{@address}"
c = open("http://#{@address}/#{file}").read
Dir.mkdir(todir) if not File.directory?(todir)
f = open("#{todir}/#{file}", 'wb')
f.puts c
f.close
rescue => e
if not File.exists?(fullfile)
$stderr.puts "Could not download file #{file} form #{@address}."
$stderr.puts e.to_s
end
end
end
|
#encode(data, keystream) ⇒ Object
84
85
86
87
88
|
# File 'lib/quiz1/t/solutions/Dennis Ranke/solitaire.rb', line 84
def encode(data, keystream)
result = []
data.size.times {|i| result << ((data[i] + keystream[i]) % 26)}
return result
end
|
#encrypt(message) ⇒ Object
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
|
# File 'lib/quiz1/t/solutions/James Edward Gray II/solitaire.rb', line 5
def encrypt(message)
message = message.upcase.tr("^A-Z", "")
i = 5
while i < message.size
message[i, 0] = " "
i += 6
end
message += "X" while message.rindex(" ") != message.size - 6
key_stream = generate(message.count("^ "))
values = message.split("").map { |letter| letter[0] - ?A + 1 }
key_values = key_stream.split("").map { |letter| letter[0] - ?A + 1 }
values.each_with_index do |value, index|
next if value < 0
values[index] = value + key_values[index]
values[index] -= 26 if values[index] > 26
end
message = (values.map { |number| (number - 1 + ?A).chr }).join("")
return message
end
|
#generate(count) ⇒ Object
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
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
|
# File 'lib/quiz1/t/solutions/James Edward Gray II/solitaire.rb', line 63
def generate(count) key_stream = [ ]
until key_stream.size == count
a = $deck.index("A")
if a == 53
$deck.insert(1, $deck.pop)
else
$deck.insert(a + 1, $deck.delete_at(a))
end
b = $deck.index("B")
if b == 53
$deck.insert(2, $deck.pop)
elsif b == 52
$deck.insert(1, $deck.delete_at(b))
else
$deck.insert(b + 2, $deck.delete_at(b))
end
a = $deck.index("A")
b = $deck.index("B")
top = [a, b].min
bottom = [a, b].max
$deck = $deck.values_at((bottom + 1)..53, top..bottom, 0...top)
if $deck[53].kind_of? Integer
$deck = $deck.values_at($deck[53]..52, 0...$deck[53], 53)
end
if $deck[0].kind_of? Integer
if $deck[$deck[0]].kind_of? Integer
key_stream.push($deck[$deck[0]])
end
else
if $deck[53].kind_of? Integer
key_stream.push($deck[53])
end
end
end
key_stream.map! do |number|
if number > 26
(number - 26 - 1 + ?A).chr
else
(number - 1 + ?A).chr
end
end
key_stream = key_stream.join("")
i = 5
while i < key_stream.size
key_stream[i, 0] = " "
i += 6
end
return key_stream
end
|
#get_index ⇒ Object
74
75
76
77
78
|
# File 'lib/download_quizzes.rb', line 74
def get_index
c = open("http://#{@address}/").read
quizzes = c.scan /quiz(\d+).html/
return [ quizzes[0][0], quizzes[-1][0] ]
end
|
#message2nums(msg) ⇒ Object
174
175
176
177
178
179
180
|
# File 'lib/quiz1/t/solutions/Glen M. Lewis/solitaire.rb', line 174
def message2nums(msg)
result = []
msg.each_byte do |c|
result.push(c+1-"A"[0])
end
return result
end
|
101
102
103
|
# File 'lib/quiz1/t/solutions/Carlos/solitaire.rb', line 101
def new_deck
(1..52).to_a + [A, B]
end
|
#nums2message(nums) ⇒ Object
182
183
184
185
186
187
188
|
# File 'lib/quiz1/t/solutions/Glen M. Lewis/solitaire.rb', line 182
def nums2message(nums)
result = ""
nums.each do |val|
result << (val-1+"A"[0]).chr
end
return result
end
|
#prep_arg(str) ⇒ Object
184
185
186
187
188
189
190
191
192
193
194
195
|
# File 'lib/quiz1/t/solutions/Jim Menard/solitaire_cypher.rb', line 184
def prep_arg(str)
str = str.upcase.gsub(/[^A-Z]/, '')
words = []
while str.length > 0
words << str[0...5]
str[0...5] = ''
end
last_len = words[words.length-1].length
words[words.length-1] += ('X' * (5 - last_len)) if last_len < 5
words.join(' ')
end
|
#succ?(*a) ⇒ Boolean
1
2
3
4
5
6
7
8
|
# File 'lib/quiz1/t/solutions/Niklas Frykholm/solitaire.rb', line 1
def succ?(*a)
begin
(0..(a.size-2)).each {|i| return false if a[i].succ != a[i+1]}
return true
rescue
return false
end
end
|
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
|
# File 'lib/quiz1/t/solutions/Niklas Frykholm/solitaire.rb', line 132
def test
d = Deck.new()
d.update
puts d
e = Encrypter.new( Deck.new() )
cipher = e.encrypt('Code in Ruby, live longer!')
puts cipher
e = Encrypter.new( Deck.new() )
puts e.decrypt(cipher)
e = Encrypter.new( Deck.new() )
puts e.decrypt("CLEPK HHNIY CFPWH FDFEH")
e = Encrypter.new( Deck.new() )
puts e.decrypt("ABVAW LWZSY OORYK DUPVH")
end
|
Unzip the file using rubyzip library.
60
61
62
63
64
65
66
67
68
69
70
|
# File 'lib/download_quizzes.rb', line 60
def unzip(x)
outdir = x.sub(/.*\//, '')
outdir = '.' if outdir == ""
Zip::ZipFile::open(x) { |zf|
zf.each { |e|
fpath = File.join(outdir, e.name)
FileUtils.mkdir_p(File.dirname(fpath))
zf.(e, fpath)
}
}
end
|
#unzip_gnu(file) ⇒ Object
Unzip the file using GNU’s stand-alone unzip utility.
52
53
54
|
# File 'lib/download_quizzes.rb', line 52
def unzip_gnu(file)
puts `unzip -o #{file}`
end
|