Friday, June 30, 2006

one line fibonacci

I've been playing with windows powershell (aka monad, aka MSH) recently. It's got some really great functional programming constructs. Here's a one line fibonacci...
```PS C:\> 1..10 | foreach{ \$i = \$j = 1 }{ \$k = \$i+\$j; \$i=\$j; \$j=\$k; \$k }
2
3
5
8
13
21
34
55
89
144
```
"1..10" generates a range of numbers from one to ten "|" is a pipe to the next command, "foreach" applies the first statement block once and then the second statement block for each item generated from the previous list.

secretGeek said...

wicked example!!

so it does this bit once:
{ \$i = \$j = 1 }

then does this bit once for each loop:
{ \$k = \$i+\$j; \$i=\$j; \$j=\$k; \$k }

the final \$k is printed out (it is the answer...

is that right??

..: secretGeek.net :.

Wow! Secretgeek read my blog! I read secretgeek all the time, that's so cool.

Yeah, you're spot on, the second code block is executed for each loop. Each statement is seperated by a semicolon and a variable by itself is simply printed to the console.

secretGeek said...

here's a pinging function i wrote based, that uses my new favourite trick: CursorPosition

cls

#store the cursor position...
\$oldPos = \$host.UI.RawUI.CursorPosition

#do this 100 times...
1..100 | foreach{

#let's collect the reply speed for 3 pings.
\$s = ping \$address -n 3;

#and only show the replies...
\$s | foreach{ if(\$_.IndexOf("Reply") -gt -1){ \$_; } };

#you can sleep between pings if you want
#Start-Sleep 3;

#store the final location
\$endPos = \$host.UI.RawUI.CursorPosition

#move back to the top of the console.
\$host.UI.RawUI.CursorPosition = \$oldPos ;

}

#move the cursor to the end of the area before exiting.
\$host.UI.RawUI.CursorPosition = \$endPos;
}

#now try: