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 =

! /usr/bin/env ruby

%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)
	# Step 1
	key_stream = generate(message.size)
	
	# Step 2
	values = message.split("").map { |letter| letter[0] - ?A + 1 }

	# Step 3
	key_values = key_stream.split("").map { |letter| letter[0] - ?A + 1 }
	
	# Step 4
	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
	
	# Step 5
	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)
	# Step 1
	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
	
	# Step 2
	key_stream = generate(message.count("^ "))
	
	# Step 3
	values = message.split("").map { |letter| letter[0] - ?A + 1 }

	# Step 4
	key_values = key_stream.split("").map { |letter| letter[0] - ?A + 1 }
	
	# Step 5
	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
	
	# Step 6
	message = (values.map { |number| (number - 1 + ?A).chr }).join("")
	
	return message
end

#generate(count) ⇒ Object

Keystream Steps



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)		# Keystream Steps
	key_stream = [ ]

	until key_stream.size == count
		# Step 2
		a = $deck.index("A")
		if a == 53
			$deck.insert(1, $deck.pop)
		else
			$deck.insert(a + 1, $deck.delete_at(a))
		end

		# Step 3
		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

		# Step 4
		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)

		# Step 5
		if $deck[53].kind_of? Integer
			$deck = $deck.values_at($deck[53]..52, 0...$deck[53], 53)
		end

		# Step 5
		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		# Step 7

	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_indexObject



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

#new_deckObject



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

Returns:

  • (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

#testObject



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(x) ⇒ Object

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.extract(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