On 02/27/2011 03:08 AM, Mike Miller wrote: > On Sat, 26 Feb 2011, Erik Mitchell wrote: > >> One thing I'd suggest looking into is Project Euler. It provides a >> great set of computation problems to work through, and you can do it >> in any language you like. Having real programming problems to work on >> helps because you're not paying as much attention to the language as >> you are figuring out how to solve the problem at hand. >> >> http://projecteuler.net/ > > > Fun. Never heard of it. I'll do some using GNU commands from the > bash prompt. Let me know if you have ways of making these better > (e.g., shorter or faster). > > > Here's my effort on Problem #1, using only GNU utils on the Bash > command line: > > seq 999 | awk '$1%5==0 || $1%3==0 {s+=$1}{print s}' | tail -1 > > I like to do lots of math/stats in GNU R or GNU Octave, both great > programs, but I also do a lot of things on the Bash command line > because it is very quick and efficient, once you've learned the > tricks. It took me many years to get good enough, a little at a > time. I'm sure one good course would do it, but I never had one. > > > Here's my GNU/bash answer to Problem #2: > > ( x=1 ; y=1 ; while [ $y -lt 4000000 ] ; do z=$y ; let y=$x+$z ; x=$z > ; echo $z ; done ) | awk '$1%2==0 {s+=$1}{print s}' | tail -1 > > > Here's my answer to Problem #3: > > ( x=600851475143 ; max_fac=10000 ; while [ $x -gt 1 ] ; do i=$(seq 2 > $max_fac | awk -v x=$x 'x%$1==0' | head -1) ; echo $i ; let x=$x/$i ; > done ) | tail -1 > > I did it first with a larger value of max_fac, but that slows it way > down. > > This will print the prime factors of the number "x" in order, as long > as all of them are less than max_fac, but keep max_fac small because > larger max_fac slows it down: > > x=600851475143 ; max_fac=10000 ; while [ $x -gt 1 ] ; do i=$(seq 2 > $max_fac | awk -v x=$x 'x%$1==0' | head -1) ; echo $i ; let x=$x/$i ; > done > > With a double while-loop and no max_fac, it is slow on the larger > factors: > > x=600851475143 ; while [ $x -gt 1 ] ; do f=2 ; while [ $(echo $f | awk > -v x=$x '{print x%$1}') -gt 0 ] ; do let f=$f+1 ; done ; echo $f ; let > x=$x/$f ; done > > > Another GNU/bash answer, this for Problem #4: > > ( for i in $(seq 100 999) ; do for j in $(seq 100 $i) ; do let k=$i*$j > ; echo $k ; echo $k | rev ; done ; done ) | uniq -c | awk '$1 > 1' | > cut -c9- | sort -n | tail -1 > > It isn't very efficient, though. It took 13 minutes on my machine. I > could have taken a shortcut by guessing that the answer would involve > larger numbers. This gives the same answer in 23 seconds: > > ( for i in $(seq 901 999) ; do for j in $(seq 901 $i) ; do let k=$i*$j > ; echo $k ; echo $k | rev ; done ; done ) | uniq -c | awk '$1 > 1' | > cut -c9- | sort -n | tail -1 > > I did use "rev" which could be considered cheating. It can be written > in pure internal bash but that is awkward and a bit long. > > > This is my answer for Problem #5: > > let x=2*3*2*5*7*2*3*11*13*2*17*19 ; echo $x > > It's just too easy to do it that way. If they wanted something > bigger, maybe I'd program the algorithm. > > > Problem #6: > > seq 100 | awk '{s+=$1}{s2+=$1^2}{print s^2-s2}' | tail -1 > > > Must sleep... > > > Mike > _______________________________________________ > TCLUG Mailing List - Minneapolis/St. Paul, Minnesota > tclug-list at mn-linux.org > http://mailman.mn-linux.org/mailman/listinfo/tclug-list Addictive isn't it? -- Patrick "Finn" Robins /Be who you are and say what you feel, because those who mind don't matter and those who matter don't mind. - Dr. Seuss/ -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://mailman.mn-linux.org/pipermail/tclug-list/attachments/20110227/caf2b499/attachment-0001.html> -------------- next part -------------- A non-text attachment was scrubbed... Name: kubuntu-user.png Type: image/png Size: 10677 bytes Desc: not available URL: <http://mailman.mn-linux.org/pipermail/tclug-list/attachments/20110227/caf2b499/attachment-0001.png>