scramble sentence, how to better program?

G

globalrev

i have written a program that takes a sentence as input and outputs
the sentence with the words rearranged.
it is probably inefficient and can probably be done with less code.
it is also nondeterministic( while (inList(temp,scr)) could go on
for a long time if the user is unlucky) and im not sure how to get
around that or if it is even possible.
also, if there is 2 identical words in the sentence, lets say "the" is
in there twice, it will loop forever. i could do
..uniq in the beginning but lets say i want both "the" to be in there.
i have to write some if duplicate then ok up to nbrofduplicates. is
there an easy way to do this?

#scrambler
puts "Enter a sentence: "
sentence = gets
list = sentence.split()
scr = []

def inList(aword,alist)
inl=false
for i in (0..alist.length()-1)
if alist == aword
inl=true
end
end
return inl
end

for x in (0..list.length()-1)
temp = list[rand(list.length())]
while (inList(temp,scr))
temp = list[rand(list.length())]
end
scr = scr + temp.split()
end

puts "Scrambled: "
puts scr
 
D

David A. Black

Hi --

i have written a program that takes a sentence as input and outputs
the sentence with the words rearranged.
it is probably inefficient and can probably be done with less code.
it is also nondeterministic( while (inList(temp,scr)) could go on
for a long time if the user is unlucky) and im not sure how to get
around that or if it is even possible.
also, if there is 2 identical words in the sentence, lets say "the" is
in there twice, it will loop forever. i could do
.uniq in the beginning but lets say i want both "the" to be in there.
i have to write some if duplicate then ok up to nbrofduplicates. is
there an easy way to do this?

#scrambler
puts "Enter a sentence: "
sentence = gets
list = sentence.split()
scr = []

def inList(aword,alist)
inl=false
for i in (0..alist.length()-1)
if alist == aword
inl=true
end
end
return inl
end


Much easier:

def in_list?(aword, alist)
alist.include?(word)
end

which means you don't really need your own method; you can just call
include? on your list.
for x in (0..list.length()-1)
temp = list[rand(list.length())]
while (inList(temp,scr))
temp = list[rand(list.length())]
end
scr = scr + temp.split()
end

Please lose the ()'s. They don't do anything or add any information;
they're just visual clutter. Meanwhile, see below....
puts "Scrambled: "
puts scr

In general, you're working much too hard :) Let Ruby do it for you:

print "Enter a sentence: "
puts gets.split.sort_by { rand }.join(" ")


David

--
Rails training from David A. Black and Ruby Power and Light:
INTRO TO RAILS June 9-12 Berlin
ADVANCING WITH RAILS June 16-19 Berlin
INTRO TO RAILS June 24-27 London (Skills Matter)
See http://www.rubypal.com for details and updates!
 
G

globalrev

Hi --



i have written a program that takes a sentence as input and outputs
the sentence with the words rearranged.
it is probably inefficient and can probably be done with less code.
it is also nondeterministic( while (inList(temp,scr)) could go on
for a long time if the user is unlucky) and im not sure how to get
around that or if it is even possible.
also, if there is 2 identical words in the sentence, lets say "the" is
in there twice, it will loop forever. i could do
.uniq in the beginning but lets say i want both "the" to be in there.
i have to write some if duplicate then ok up to nbrofduplicates. is
there an easy way to do this?
#scrambler
puts "Enter a sentence: "
sentence = gets
list = sentence.split()
scr = []
def inList(aword,alist)
inl=false
for i in (0..alist.length()-1)
if alist == aword
inl=true
end
end
return inl
end


Much easier:

def in_list?(aword, alist)
alist.include?(word)
end

which means you don't really need your own method; you can just call
include? on your list.
for x in (0..list.length()-1)
temp = list[rand(list.length())]
while (inList(temp,scr))
temp = list[rand(list.length())]
end
scr = scr + temp.split()
end

Please lose the ()'s. They don't do anything or add any information;
they're just visual clutter. Meanwhile, see below....
puts "Scrambled: "
puts scr

In general, you're working much too hard :) Let Ruby do it for you:

print "Enter a sentence: "
puts gets.split.sort_by { rand }.join(" ")

David

--
Rails training from David A. Black and Ruby Power and Light:
INTRO TO RAILS June 9-12 Berlin
ADVANCING WITH RAILS June 16-19 Berlin
INTRO TO RAILS June 24-27 London (Skills Matter)
Seehttp://www.rubypal.comfor details and updates!




rofl aamazing, ty very much :)

had a feeling i was complicating things.


does it work as well for building bigger applications(not just
webapps), like building an editor like emacs. is the language as
suitable for that?
i know executionspeed is the issue with ruby and python but thats not
really an issue and will be even less of one in the future i guess.

must be some tradeoff no?


anyway ty for the help, the rubycommunity seems very nice and helpful!
 
D

David A. Black

Hi --

but does this take into account that rand could generate the same numer two
times? while that is not likely, it could happen.

I'm by no means a random number expert/theorist, but the above is a
very common idiom. I don't really know how it holds up under full
scrutiny. There's probably some discussion of that in the archives.


David

--
Rails training from David A. Black and Ruby Power and Light:
INTRO TO RAILS June 9-12 Berlin
ADVANCING WITH RAILS June 16-19 Berlin
INTRO TO RAILS June 24-27 London (Skills Matter)
See http://www.rubypal.com for details and updates!
 

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

Forum statistics

Threads
473,769
Messages
2,569,580
Members
45,055
Latest member
SlimSparkKetoACVReview

Latest Threads

Top