Matthew, thank you for sharing your results (and in the form of test
cases).  Pleased to report that mine are identical (and pass!).

BTW it's not hard to work out (and - hint to Chris - validate) the grid
dimensions from the folds so my function takes just the one argument.

Regards, Mike

Matthew Moss wrote:
> The first extra credit (handling dimensions other than 16x16) is
> pretty darn easy, so you may want to start out on a 2x2 to get yer
> basics working and move up.  With that in mind, here are a few tests
> to help verify your work. The test_2x2 tests all possible folding
> combinations.
>
> (NOTE: The 16x16 test below is the result of my own solution. I'm
> fairly certain it's correct, but not 100%.  So if you run this and
> pass the other two tests but fail the 16x16 test, I'd be interested to
> see your output and between us figure out what the expected solution
> is.)
>
> Oh, and if you have more tests, feel free to share.
>
>
> require 'test/unit'
> require 'test/unit/ui/console/testrunner'
>
> class FoldTest < Test::Unit::TestCase
>    def test_2x2
>       folds = {"TR" => [4, 2, 1, 3],
>                "BR" => [2, 4, 3, 1],
>                "TL" => [3, 1, 2, 4],
>                "BL" => [1, 3, 4, 2],
>                "RT" => [1, 2, 4, 3],
>                "RB" => [3, 4, 2, 1],
>                "LT" => [2, 1, 3, 4],
>                "LB" => [4, 3, 1, 2]}
>
>       folds.each do |cmds,xpct|
>          assert_equal xpct, fold(2, 2, cmds)
>       end
>    end
>
>    def test_16x16
>       xpct = [189,  77,  68, 180, 196,  52,  61, 205,
>               204,  60,  53, 197, 181,  69,  76, 188,
>               185,  73 , 72, 184, 200,  56,  57, 201,
>               208,  64,  49, 193, 177,  65,  80, 192,
>               191,  79,  66, 178, 194,  50,  63, 207,
>               202,  58,  55, 199, 183,  71,  74, 186,
>               187,  75,  70, 182, 198,  54,  59, 203,
>               206,  62,  51, 195, 179,  67,  78, 190,
>               142, 126, 115, 131, 243,   3,  14, 254,
>               251,  11,   6, 246, 134, 118, 123, 139,
>               138, 122, 119, 135, 247,   7,  10, 250,
>               255,  15,   2, 242, 130, 114, 127, 143,
>               144, 128, 113, 129, 241,   1,  16, 256,
>               249,   9,   8, 248, 136, 120, 121, 137,
>               140, 124, 117, 133, 245,   5,  12, 252,
>               253,  13,   4, 244, 132, 116, 125, 141,
>               157, 109, 100, 148, 228,  20,  29, 237,
>               236,  28,  21, 229, 149, 101, 108, 156,
>               153, 105, 104, 152, 232,  24,  25, 233,
>               240,  32,  17, 225, 145,  97, 112, 160,
>               159, 111,  98, 146, 226,  18,  31, 239,
>               234,  26,  23, 231, 151, 103, 106, 154,
>               155, 107, 102, 150, 230,  22,  27, 235,
>               238,  30,  19, 227, 147,  99, 110, 158,
>               174,  94,  83, 163, 211,  35,  46, 222,
>               219,  43,  38, 214, 166,  86,  91, 171,
>               170,  90,  87, 167, 215,  39,  42, 218,
>               223,  47,  34, 210, 162,  82,  95, 175,
>               176,  96,  81, 161, 209,  33,  48, 224,
>               217,  41,  40, 216, 168,  88,  89, 169,
>               172,  92,  85, 165, 213,  37,  44, 220,
>               221,  45,  36, 212, 164,  84,  93, 173]
>       assert_equal xpct, fold(16, 16, "TLBLRRTB")
>    end
>
>    def test_invalid
>       assert_raise(RuntimeError) { fold(2, 2, "LR") } # too many horz folds
>       assert_raise(RuntimeError) { fold(2, 2, "TRB") } # too many folds
>       assert_raise(RuntimeError) { fold(3, 2, "LR") } # bad input dimensions
>    end
> 
> end
> 
> Test::Unit::UI::Console::TestRunner.run(FoldTest)