{newb} Help with ref

S

STEPHEN BECKER I V

########################### code start
def decrypt(data,shift = 27)
if shift<27 then # if not 27 they know key
datanew=String.new(data.upcase)
a = datanew.size-1 # control loop
while a>-1
if datanew[a] - shift<65 then #check if it is out of bound of
datanew[a]=datanew[a]-shift+26#works in my head
else datanew[a]=datanew[a]-shift
end
a-=1
end
print datanew.downcase," key=",shift,"\n" #plain text lower case
else
for b in 0..25 # loop ever case
decrypt(data,b)
end
end
end

def encrypt(data,shift = rand(26))

a = data.size-1
while a>-1
if data[a]+shift>122 then
data[a]=data[a]+shift-26
else data[a]=data[a]+shift
end
a-=1
end
data= data.upcase
print data," key=",shift,"\n"
end


it=String.new("abcdefghij")
encrypt(it)
decrypt(it)
############################code end
it is the wonderful ceaser shift, you add or subtract a key to the char.
Anyway, I am lost on why i have to create a copy of the string in
decrypt. I know why my it string gets crushed because encrypt uses it.
How does one make it use a copy of the varablie instead of pointing to
the memory location? also how do you return a value in a
function(def)? If you do not want to tell me because you dont think i
read the chm file, then please tell me where i can read how to do this
(simple examples would also be great)?
Thank you for your time.
Stephen Becker
 
M

Markus

I will try tell you what I think want you want to know, rather than
what you asked. If this leaves you with questions, please post again
and I will try again (maybe tomorrow, since it is getting late here).

First, the easy question. You can return a value from a function
by writing:

return x

or, if you let control "fall out the bottom" the last value in the
expression will be returned. For an example of both forms:

def factorial(x)
return 1 if x <= 1
x*factorial(x-1)
end

The more complex problem you are having is not that references are
to "memory locations" but that they are to objects. It may seem that
these are the same thing (since in both cases you can wind up with a
situation like this:

s = "test"
s2 = s
s[0,1] = "b"

-- and now _both_ strings have changed) but really they are very
different. In languages like C it is easy to mess with the storage of
something, and even corrupt it, but it is often hard to make a new
thing. So you wind up often modifying things in place.

In ruby, it is the other way around: easy to make new things but
harder to modify them. For example, a somewhat modified version of your
decrypt routine, which is somewhat more in the sprit of ruby might look
like:

WARNING: CODE TYPED DIRECTLY INTO MAIL MESSAGE (UNTESTED)

def decrypt(data,shift = 27)
if shift < 27 then # if not 27 they know key
print data.upcase.split(//).collect { |c|
i = c[0] - shift
i += 26 if i < 65
i.chr
}.join.downcase," key=",shift,"\n" #plain text lower case
else
for b in 0..25 # loop ever case
decrypt(data,b)
end
end
end

The main change is that we upcase the string, split it into characters,
muck with the character's values, join them together, and downcase them
all in one go.

For an even more rubyesque way to do this, consider something like
this:

WARNING: CODE TYPED DIRECTLY INTO MAIL MESSAGE (UNTESTED)

$letters = ('A'.."Z').to_a.join
def decrypt(data,shift = 27)
if shift < 27 then # if not 27 they know key
shifted_letters = $letters[shift..-1]+$letters[0..shift-1]
print data.upcase.tr($letters,shifted_letters).downcase," key=",shift,"\n" #plain text lower case
else
for b in 0..25 # loop ever case
decrypt(data,b)
end
end
end


Does this help?

-- Markus



########################### code start
def decrypt(data,shift = 27)
if shift<27 then # if not 27 they know key
datanew=String.new(data.upcase)
a = datanew.size-1 # control loop
while a>-1
if datanew[a] - shift<65 then #check if it is out of bound of
datanew[a]=datanew[a]-shift+26#works in my head
else datanew[a]=datanew[a]-shift
end
a-=1
end
print datanew.downcase," key=",shift,"\n" #plain text lower case
else
for b in 0..25 # loop ever case
decrypt(data,b)
end
end
end

def encrypt(data,shift = rand(26))

a = data.size-1
while a>-1
if data[a]+shift>122 then
data[a]=data[a]+shift-26
else data[a]=data[a]+shift
end
a-=1
end
data= data.upcase
print data," key=",shift,"\n"
end


it=String.new("abcdefghij")
encrypt(it)
decrypt(it)
############################code end
it is the wonderful ceaser shift, you add or subtract a key to the char.
Anyway, I am lost on why i have to create a copy of the string in
decrypt. I know why my it string gets crushed because encrypt uses it.
How does one make it use a copy of the varablie instead of pointing to
the memory location? also how do you return a value in a
function(def)? If you do not want to tell me because you dont think i
read the chm file, then please tell me where i can read how to do this
(simple examples would also be great)?
Thank you for your time.
Stephen Becker
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,768
Messages
2,569,574
Members
45,051
Latest member
CarleyMcCr

Latest Threads

Top