From: "David A. Black" Date: 2008-05-09T05:12:27+09:00 Subject: Re: scramble sentence, how to better program? Hi -- On Fri, 9 May 2008, globalrev wrote: > 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[i] == 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!