08 July, 2013

Bike Ride 45 - Touring Mpumalanga - Day 4

Today the 3rd of July was to be our last day of touring Mpumalanga. In a way it was sad that it was over, but in another way we were glad we would be sleeping in our own beds again. I think this is the longest time Trish and I have spent together without the kids since 2006 when we both went to Europe.

Once we were awake we started packing, and lazily departed Troutways Family Retreat.
I was a little disappointed with the finishings in the place where we stayed but the bed and duvets were awesome. We again slept like babies, and with out a blanket on top either. I want one of those duvets at home.

First stop was in Machadodorp at the church for a BMW Club challenge photo. I also attempted a geocache at a church but could not find it. Then it was off in the direction of Carolina. On the way I saw a geocache pop up on the map and decided to attempt this one. It was next to the road next to an old stone bridge. Which from the geocache listing is a national monument, but now resides on private land.

Once we arrive in Carolina we looked for a place to eat, and while looking found an open parking area right in front of the post office so that is where we took our BMW Club challenge photo. On the GPS it said there was a "De oude Kerk Restaurant" which looked interesting, but it had closed down. So we settled for a small home converted into a shop in the main street.

They were not really serving breakfasts but they made a plan for us, and made some. While we were waiting for the drinks a very furry black cat came over and entertained us. We did remove home from the table once our breakfast arrived. Afterwards we browsed the shop for some small memorabilia of  visit, and Trish wanted one of the home made place mats. The shop owner made a call to her mom if we could buy one of the place mats which was OKed at R30.00 Bargain. Trish went around to each table, as we were the only once there, to find "just the right one. She settled on a "Good to drink coffee until its time to start drinking wine" (Or something like that). Both are her favourite drinks. Once we satisfied our hungers we headed towards Hendrina.
Hendrina had one traffic light in the centre of town. Riding around a few blocks exploring the town revealed a good photo location at the local gym.

Pullen's Hope was our next stop. I find it a very interesting name and wondered if the town was perhaps founded on gold. But arriving in town, it is one more of those very run down towns, with some glimpses of the old glory days. It seems to be a small coal mining town. All the houses run down, and very little going on.
Google also did not turn up much info about this little town.
We approached Pullen's Hope from the NE (going SW) and all was fine and dandy. Leaving town we were met with a sand road. I hoped that it would change to tar, but 500 meters further over the rise it was still dirt all the way. We turned around and tried another road, and again it was dirt. Using the GPS's there was a road not to far away, and in the hope that that was tar we persisted with the sand road. Riding down the sand road my spedomenter hit 42500 km. I stopped and took a photo of the mini mile stone.
Soon we were back on tar, but it was bumpy all the way to Komati, and we had to ride a relatively slow speed. There we took another town photo (Not a BMW Club challenge photo) and then onwards to Blinkpan.
We were a small, 2 people on a motorbike between big 18 wheel trucks. Had to be very careful in this area.
Took a photo at a "Supermarket" sign, and then left. This town was a little bit of a disappointment.

By this time both Trish and I were gatvol from riding and just wanted to get home. All these towns south of the N4 (Pullen's Hope, Blink Pan, Ogies) are not very interesting towns to visit. They are dirty coal mining dorpies, and quite a let down after the amzing dorpies like Pilgrims Rest, and Kaapsehoop we visited the previous few days.
With this in mind I did not want to make another special trip all the way out to Ogies some other day so we took the 20 minute detour to Ogies after sipping down coffee (Trish) and milkshake (Anton) in Witbank.
We rode a little through town to find a nice photo opertunity, and found one by the NG Kerk. Oh yes all the other towns did not have any Shell garages (that we saw) but Ogies had 2. Yes two, opposite each other on the same road.WOW.
From there it was abother 40 minutes or so all the way home to Edenvale, where  we arrived 15H45.

Total Distance for the day: 363 km
Geocaches completed: 1.
BMW Club challenges completed: 6

06 July, 2013

Bike Ride 44 - Touring Mpumalanga - Day 3

We had a long route planned for today the 2nd July 2013, but we both were a little tired from riding so much. (We are new to riding bike). So we discussed and decided that a shorter route with less travelling would suit us both better. From other people I have heard the Kaapsehoop (or Kaapschehoop as I have seen in spelt) was a must do stop, and I wanted to visit that place. So it was decided to leave the route via Barberton to Kaapsehoop and just take the N4 there.

After packing up, we headed toward Alkmaar for the BMW Club Challenge photo, as well as a qucik geocache just out of the town by the river. Beryl from the Crock Lodge gave us 4 naartjies, and since the log sheet of the geocache was wet, I opted to dry it out a bit and eat one of the fruits. Trish obviously had a lekker loooong smoke break there.
 From there we headed further west on the N4, and put petrol in at the garage by the paper mill, and then headed towards what would be the highlight of the day .... Kaapsehoop. A brief stop at Ngodwana for a photo. This time however since it had restricved access we did not drive through the town as we are now starting to get accustomed to do each time we visit one of these towns. On the way up we first saw some monkeys playing on the road, and later on some horses. Trish wondered if the horses were wild. "Can't be... they must belong to the local farmer" I replied ... only to be proven incorrect about 500 meters further by a huge big signpost.
And what a lovely little town Kaapsehoop turned out to be. Wow, wow, wow! I expected it to by much like Pilgrims Rest, and yes it is a lot the same but then also not the same. We took a slow drive through the town taking it all in, and looking for just the right place to take our challenge photo. After some deliberating it was confirmed to be on the one street corner where GPS co-ords and an old telephone booth. We also rode up the one road and saw a lovely little church at the top. We stopped at what looked like the only open restaurant in town, and ordered drinks and breakfast.
 After breakfast was consumed, Trish wanted another cup of coffee, and I decided to walk to the closest geocache just down the road by a small open field. A short search later the geocache was found, signed and returned to its hiding spot. Back at the restaurant Trish was still sipping away at her coffee, and  I could go do another geocache on the other side of town. This time I took the bike. The geocache was hidden by the old prison ruins, and close the the church we had seen earlier. As I rode around the church I saw it had a lovely darkened window, with stained glass at the doors, and just knew I had to bring Trish back to come see this. As I rode back down I saw some of the "wild" horses grazing lazily in town. As I still had some time left decided to try another geocache further up in the koppies, but I could not find that one. Pity. But I'll be back to look for that one and all the others in town sometime in the future.
Once back at Trish we paid the bill, and went back to show her the other side of the little church and after closer investigation saw the doors were open so we had a quick look inside.
Of all the towns visited so far in our BMW Club challenge this one is our top one and gets 10 stars from us. A must do one!

 From there we rode all the way through to Waterval Onder, and then to Waterfal Boven. On the way up just before the tunnel they were trapping, and I am sure I was going faster then the given speed limit, but they did not jump up to stop me or anything, and luckily motorbikes don't have a front numberplate.
Trish said this is also the road she enjoyed travelling on the most so far. It wide, smooth, and open. All these elements allowed me to go a little but faster then I usually do ... which is the part Trish liked.
Once at Waterfal Boven, we took in the town by slowly driving through it, and I must say I have never seen so many churches in one town. I am sure we counted over 8 churches ... and a mosque.
We stopped of at the bottle store for some wine, a can of beer, and sprite, and then went searching of our nights accommodation. This was just outside of town with no cellphone reception. The farm manager had some pigs, geese and ducks, which were fed just before we left back to town for dinner.
Dinner was had at what seemed the only open place. I ordered a T-Bone and Trish a burger. While we were waiting for our dinner a guy came chatting to us. His name was Dewalt. He had just moved into town from Vereeniging way, and I think we were to be his entertainment for the afternoon. Well he was also our entertainment for the afternoon. It was very interesting to chat to him.

As out food arrived he said he had to go home and start the fire. Perhaps sometime we will meet up with Dewalt again. After dinner it was back to the Trout farm. There was no working TV, so we chatted for a while and then turned into bed. Although the place lacked a few things (like a working TV) the bed was excelent and the Duvet the best we had in the last 3 days. We again slept like babies.

Total Distance for the day: 141 km
Geocaches completed: 3.
BMW Club challenges completed:4

Bike Ride 43 - Touring Mpumalanga - Day 2

Monday the 1st of July was day 2 of our touring the Mpumalanga area doing a few caches as well as visiting various towns and passes in the BMW Club Alphabet Challenge.

We both awoke early and set of for Steelpoort, but again I thought I knew better then the GPSr and followed my own nose. A little bit outside of town Trish saw some wild animal figures, and asked if we could go and have a look. Looking for a good, safe, place to turn around I saw there was a geocache justr over the bridge. We stopped there first and within 5 minutes I had signed the log book, and we were on our way back to the wild animal figures. I stopped right next to a $ sign (LOL). We took some photos, while trish had another puff, and set off again.

We were now travelling on the R36 from Lydenburg to Ohrigstad, and it was a lovely winding road full of beautiful scenery. We both thoroughly enjoyed. Half way through the pass I realised we were on the wrong road, but it was to late to turn around so we just continued to Ohrigstad. Once there we took a photo at the local church sign, and then decided to leave Steelpoort and Burgersfort, and just go to Pilgrims rest.

On the way into Pilgrims we logged our first Tar Pass in the @BMWMotorradSA #AlphabetChallenge at the Robber pass sign.

About 200 meters further I did my second geocache for the day at the Robbers pass memorial plaque. Then it was all the way down into the valley in with Pilgrims Rest lies. At first I was using my breaks quite a bit, but from the ADA day remembered that I should let the engine do all the work. The road down did have a few potholes but nothing to bad. 
Once in town we took a slow ride all the way through deciding which place to have breakfast at. In the end we decided to have it in down-town Pilgrims Rest. Trish ordered a coffee (or two) and I myself ordered some Rooibos tea to start off with. After breakfast I needed the loo, and took this (see below) picture in the "crapper". They also had a lovely African Grey in the shop which whistled and spoke a few words. I forgot its name. Made us long for Peanut back home (our African Grey).

Then it was a quick photo for the #AlphabetChallenge, and then we set off for Grasskop.
I just want to add doing Pilgrims Rest on the motorbike is a tick off my bucket list. I have always wanted to do that. Now its done.The other bucket tick lists, is doing Zwaziland, Leshotho, Cape Town on the motorbike. Slowly working towards that.
The road from Pilgrims to Graskop was not to bad, but a few big potholes were to be seen every now and then. The windy roads are lovely to ride. And we were steadily doing it a bit faster when the road was in good condition. At Graskop we attempted another geocache by the old train station, but it was to well hidden. But this allowed us to see the Graskop sign by the station so we decided to take our challenge photo there. Nice turn of events.
Then the highlight of the trip occurred for Trish as we let Graskop towards Kowyn's pass. As we rounded the one corner there was just green ferns all over the mountain. And a cool breeze, blowing over us. Lovely to see and lovely to feel. We rode a little but further down the pass to experience a little more of it, and turned around after we saw there would not be better photo opportunities ahead. Took our photo at an old dilapidated monument. There was also a small sand road going up to the top of the Telkom tower at the top. If we were two bikes I would have liked to attempt it. (And there is a geocache up there as well!!!). But by myself, and leaving Trish at the bottom was not an option this time around.

As we were riding from Graskop to Sabie where we were set to have lunch. I saw a earth geocache pop up on the GPS and wanted to do it. It turned out to be the Mac Mac falls. Trish has never been here before so it was a good stop. Paid our R10.00 per vehicle to get in, and soon walked in full bike gear down to the bottom to look at the water fall. Trish did not find it that awesome. I liked it and I get another smiley on my geocache finds (now standing at 1671 finds).
Then it was not much further on some lekker twisties to Sabie. First time we back after spending our first honeymoon night here just over 20 years ago.
Again we took a slow drive through town, experiencing the people and town, looking for a place to eat.
Both Trish and I prefer to try a restaurant that is not commercialised like Spur, KFC, McDonalds etc. It more interesting to try some of the local tastes and sounds. So we ended up at a restaurant which was in a old railway coach. As we were not very hungry we opted to share a plate of chips and a toasted sarmie. Drank lots of cool drink, after our Mac Mac falls walk.

The via some more twisties all the way to Hendriksdal, which is to be our first "Dusty Town" challenge done. Not much of a dusty town, as it has a sort-of tar road into the main part of town. Well town is more like 4 or 5 houses. Access road littered with pot holes. We did ride about 500 meters through town on "dust" to see if there was a good signboard to take the photo at. In the end the only sign we could find was at the main tar road leading off to the little town.
From there it was off to Witrivier. There were again some serious potholes every now and then and some roadworks on the go as well. A few cars passed us on the twisties. Obviously they know the corners. Not taking any chances on the bike though so I let them pass. Some roadworks also happening along the route. Nice thing with the bike ... one goes right to the front of the cue.
In Witrevier we took our challenge photo at the "Welcome to" sign (as well as at the post office). Drew some money at the ABSA ATM at a garage, and then went to visit some geocaching friends on the other side of Nelspruit.

Had a lekker beer with Andy and Lindy, a good chat. And as a bonus did the geocache right outside their house.

Before it got dark we left to get some take-away dinner, and then did he short ride to Crocodile Lodge just outside Alkmaar which Trish had booked for us. We had a lovely rondavel, small kitchen, and bathroom. Byryl who runs the place was awesome and made us feel right at home. She had two cats, one named "Cricket" and the other "Monkey". Strange names. Also had some dogs, and they made themselves at home on our front step and at time inside the little kitchen. We both loved this very homely place. We will be back.
And so ended day 2 of our Mpumalanga trip. We were both exhausted, and slept like babies.

Total Distance for the day: 270 km
Geocaches completed: 4 geocaches.
BMW Club challenges completed: 7

05 July, 2013

Bike Ride 42 - Touring Mpumalanga - Day 1

On Saturday I attended JSinSA with was excellent, but did take away 1 extra day we could have had touring Mpumalanga. But that's the way the cookie crumbled this time around.

I got home Saturday night and we did the final packing for the next day. Not much to pack as the space is very limited on the bike.

We left Sunday morning early, stopped in Bapsfontein for some petrol, and took our first town photo in Bronkhorstspruit, at the "Welcome to" sign we saw. From there I thought I knew better then the GPSr and ignored it and rode further north. This was the wrong road to follow to get to Loskop dam via a sand road I had ridden before with some other bikers. We rode through Dennilton and after turning right to Loskop dam took our first smoke break. 20 minutes later we were at Loskop restaurant ordering breakfast. After the breakfast we stopped at the wall so Trish could have a look as it was the first time ever she was here.

Then it was off towards Middelburg, and on route we stopped for 2 geocaches. One we could not find (on a dirt road) but had much more luck with the second one right next to the tar road as one goes up the pass.
Then it was along go-around-trip to get to Stoffberg via Middleburg. This road from Loskop dam to middleburg was in excelent condition. From middleburg we pointed norht again and stopped for our first @BMWMotorradSA #AlphabetChallenge photo at Stoffberg. Then it was not to far to Roossenekal where we turned right and went towards Lydenburg which would be our first night stop.

On the way to Lydenburg we stopped on Steenkampsberg pass for a geocache. This really was a superb geocache location as one gets a good view of the country side. Somehow I missed that it was part of the BMW Club Alphabet Challenge and so we did not take any photos of us there. Oh well. I am sure we will come past this point again in the future. Then it was not to far to Lydenburg where we filled up with petrol again at the Shell garage. My trustee steed only drinks Shell (although later on this trip I was not able to do this all the time). Shell garage toilets were clean, but the soap dispenser did not work and there were no paper towels. As there was still some light left we did a 3rd geocache in town by an old munument, and then it was off to get some dinner.

After dinner at Spur we rode the 2 km out of town to Rooidraai Estate Guest lodge, where we had a lekker shower, before turning in. I found this place 5 stars good. They had DSTV, coffee and tea, with milk ready. this place was the smallest of the 3 days, but I think superb. Trish did not like it that much.

Total Distance for the day: 413 km
Caches completed: 3 geocaches.

17 June, 2013

Bike Ride 41 - To Trichardt and back - Bike ride

Monday the 17th June was a public holiday and the kids had made plans with their uncle to go go-carting. This left Trish and myself free to do whatever we liked. And it ended up being a bike ride to Trichardt and back.

The BMW club we belong to have an alphabet challenge. The challenge is there to get you out riding and experience South Africa. The idea is to visit a specified amount of towns, passes, light houses, and harbours. All of them are outside of Gauteng. Ever since we became members of the club 4 months ago I wanted to go and do a few towns. The "right" day just never happened. But on Monday the 17th June 2013 that all changed.

We left home at 06H50, so we could be at the Bapsfontein garage before 07H30 incase there were any other club members that wanted to join us on the days outing. We got there and waited till 07H35 and then left for Delmas. The ride there was blooming cold. It dipped to -3 deg Celsius at times. At Delmas we stopped for some petrol, and a hot beverage at Winmpy, which thankfully was open. We also stopped at a Delmas sign to take a photo for our towns visited album (Not a BMW challenge town).

Once we were warmed up, we left Delmas at 08H45, and attemped a geocache close to a dam. Since it looked like we night have to drive through a farmers land we opted to leave it and headed towards Leandra.

We left Leandra at 9H35, and rode via Kinross to Trichardt where we took our second BMW town photo before stopping at Marne Guest house (and bar) [S26 29.387 E29 13.807] for some lunch. We waited over 30 minutes for our burgers to arrive, but boy was it worth it. They were HUGE. And all for R45.00 each. We tried to order the "Large" burgers but since it was a public holiday they did not have the bigger rolls. Good thing, as we would not have been able to finish the larger ones.

We left Trichardt at 11H40 and headed towards 2 geocaches in Secunda. The one was at some type of time capsule, but the entrance was closed, so we attempted another one by the air field. Luckily we found that one. We also saw 2 aeroplanes taking off and landing. Nice smoke break we had there. We also rode past "Graceland" which seems to be a casino and golf club just outside Secunda town.

We had meant to go to Charl Cilliers town, but somehow I got mixed up in the next waypoint and we missed it. We had a quick stop at Evander before heading back to Leandra.

At 13H20 we took our BMW photo in front of the NG kerk in Eendracht, and then headed off to Eloff via Devon and Delmas.

Just before Devon we stopped at the sign which said "Devon Correctional services". The stupid guard told us we were not allowed to take photos without getting permission of the supervisor. I said Ok I'll chat to the supervisor but there was no phone in the hut, and we would have to sign in ride to the offices get permission and then take the photo. All to much trouble. So in the end I said we would leave it. Strange thing though I have it all on video. She (the guard) did not even notice it on my helmet.

In Devon itself we got a nice photo (not a BMW club challenge) in front of the "Boere vereniging sall". Nice little building, and well looked after in this small town. We left Devon at 14H45 heading Delmas to take our last photo at Eloff.

BMW Photo 4
As we met up on the main road just before Delmas we had two people pass us on BMW bikes. One was on a 1200 and an the other on a orange 650 twin. I wondered at the time if they were perhaps club members.

At Eloff we found a big pumpkin and decided to take our photo there, and then a quick stop at the local (shitty) garage for a toilet break, As we left town we saw a huge numberplate against a fence and thought it would make for an interesting photo, so it was a quick stop before heading home.

We were home at 15H15, having ridden a total of 324km.

After today our stats are as follows:
1) Towns visited: 21
2) BMW Tar Towns visited: 4

 Lessons learnt:
1) We will try and take a BMW challenge photo at the local church of each town.
2) A break every 40 odd minutes of riding suits both of us well.
3) Easy riding and lots of stops is an easy and interesting way to experience the towns of South Africa.
4) We are not yet bike fit.

Note: The photos where Trish and I are in have been "photo shopped" to show us both in the same photo. Can you see who was added and who is in the original photo?

11 May, 2013

Bike Ride 38 - Pretoria BMW Club at ADA, S & GS Slow skills, 11 May 2013

The BMW club had a Slow Skill day out at ADA at Hartebeespoort dam. This was the first time I went, and I asked my son Jerome and his friend Don with. Later on I learnt that it was meant for BMW Paid up members only (I mis-read the email).
All in all, another great day, and I learnt lots. I also learnt I need to better my balancing big time.

05 May, 2013

Bike Ride 37 - BMW Club - Easy GS ride to Que Sera - 5 May 2013

We have joind the BMW Club in Pretoria, for various reasons. But one reason is to go out riding in a group once a month. And we are loving these outings. I have decided to create short videos of the rides and upload to youtube. Hopefully with time I will see how I have progressed and got better at the off road riding.

This video was of the outing on the 5th of May 2013. We rode from Centurion via the train track lines, and sand highway all the way to Que Sera. From there we opted for the train tracks home. All in all a lekker  outing.

25 January, 2013

Solving a (formula based) Sudoku puzzle using LINQ

Last weekend (the 19th January 2012) we went to a geocaching event in Heidelburg here in South Africa. While at the event a new cache was published, and it consisted of a Sudoku puzzle with a twist. No numbers were given.

The puzzle looks like this:
We were about 5 people who solved the puzzle in about 30 minutes, and once back at work I showed a work collogue (lets call him Bob) the puzzle and we started chatting if it would be possible to write a LINQ query to solve this puzzle.

Bob showed me the MSDN Blog artice Using LINQ to solve puzzles and we used this as a basis to solve this Sudoku puzzle.

But first I wanted to understand how this LINQ query worked by simplifying the problem.

So I did the following:
I drew a small 3 by 3 grid and entered some numbers.
I entered "random" numbers from 1 to 9 into each cell. At this stage I am simulating one section of the Sudoku puzzle, so that when I write the LINQ query I can understand it better. It is much simpler to work with a 3x 3 grid and understand what is going on then working with a 9x9 grid.

Once I had the numbers then I made up some of my own formulas as follows:

As it happened I did enter 3 circular references. This helped me understand how the "from" and "joins" work later on. (See further below).

I started with the brute force method as per the MSDN blog, and the code looked like this:

         var solveForNumbers =
          from a1 in Enumerable.Range(1, 9)
          from a2 in Enumerable.Range(1, 9)
          from a3 in Enumerable.Range(1, 9)
          from b1 in Enumerable.Range(1, 9)
          from b2 in Enumerable.Range(1, 9)
          from b3 in Enumerable.Range(1, 9)
          from c1 in Enumerable.Range(1, 9)
          from c2 in Enumerable.Range(1, 9)
          from c3 in Enumerable.Range(1, 9)
          where (a1 == b3 - 4)
              && (a2 == a3 - b2)
              && (a3 == b2 * c3)
              && (b1 == a3 + a1)
              && (b2 == c2 - a3)
              && (b3 == a1 + a2)
              && (c1 == a3 + c3)
              && (c2 == a2 * b2)
              && (c3 == b3 - b2)
          select new
          { a1, a2, a3, b1, b2, b3, c1, c2, c3};

Solving the puzzle this way took around 110 seconds on my laptop. For the big puzzle to be solved would take exponentially longer.

I then started as per the MSDN blog post to move the "where" clause into a "joins". I wanted to see the speed improvements along the way.

I moved the 1st entry "c3" into a join as follows:
         var solveForNumbers1 =
          from a1 in Enumerable.Range(1, 9)
          from a2 in Enumerable.Range(1, 9)
          from a3 in Enumerable.Range(1, 9)
          from b1 in Enumerable.Range(1, 9)
          from b2 in Enumerable.Range(1, 9)
          from b3 in Enumerable.Range(1, 9)
          from c1 in Enumerable.Range(1, 9)
          from c2 in Enumerable.Range(1, 9)
          join c3 in Enumerable.Range(1, 9) on b3 - b2 equals c3
          where (a1 == b3 - 4)
              && (a2 == a3 - b2)
              && (a3 == b2 * c3)
              && (b1 == a3 + a1)
              && (b2 == c2 - a3)
              && (b3 == a1 + a2)
              && (c1 == a3 + c3)
              && (c2 == a2 * b2)
          select new
          { a1, a2, a3, b1, b2, b3, c1, c2, c3};

 I reran the test and now it took only 12 seconds.

With some help from Rankadu I moved them all across and ended up with this code:
        var solveForNumbers1 =
          from b2 in Enumerable.Range(1, 9)
          from a3 in Enumerable.Range(1, 9)
          from a1 in Enumerable.Range(1, 9)
          join a2 in Enumerable.Range(1, 9) on a3 - b2 equals a2
          join b3 in Enumerable.Range(1, 9) on a1 + a2 equals b3
          join c3 in Enumerable.Range(1, 9) on b3 - b2 equals c3
          join c2 in Enumerable.Range(1, 9) on a2 * b2 equals c2
          join b1 in Enumerable.Range(1, 9) on a3 + a1 equals b1
          join c1 in Enumerable.Range(1, 9) on a3 + c3 equals c1
          where (b2 == c2 - a3)
              && (a3 == b2 * c3)
              && (a1 == b3 - 4)
          select new
          { a1, a2, a3, b1, b2, b3, c1, c2, c3};

Some explanation is required here:
The reason b3, a3, and a1 are left in the "from" portion is that there is a circular reference to that value.

b2 == c2 - a3
and c2 == a2 * b2
and a2 == a3 - b2
(b2 depends on c2, and c2 depends on b2)
(b2 depends on c2, and c2 has a2, and a2 depends on b2)
So there is no reliable way for the "join" to know what the value is therefore it must be left in the from section of the code.

The ordering of the joins.
When a join is added the values of the formula must already be known at the time (previously defined).
Since c3 == b3 - b2, the value b3 and b2 must be defined before the c3 join.

This proved to be a 4 hour re-factoring job once I got to the 9x9 grid.

Once I had this in place and the tests running, I now knew how to solve the 9x9 grid.

While I was testing the proof of concept on the 3x3 grid Bob got going with the 9x9 grid brute force (or "where clause" method).

This is the result:
        var solveForNumbers =
            from a1 in Enumerable.Range(1, 9)
            from a2 in Enumerable.Range(1, 9)
            from a3 in Enumerable.Range(1, 9)
            from a4 in Enumerable.Range(1, 9)
            from a5 in Enumerable.Range(1, 9)
            from a6 in Enumerable.Range(1, 9)
            from a7 in Enumerable.Range(1, 9)
            from a8 in Enumerable.Range(1, 9)
            from a9 in Enumerable.Range(1, 9)
            from b1 in Enumerable.Range(1, 9)
            from b2 in Enumerable.Range(1, 9)
            from b3 in Enumerable.Range(1, 9)
            from b4 in Enumerable.Range(1, 9)
            from b5 in Enumerable.Range(1, 9)
            from b6 in Enumerable.Range(1, 9)
            from b7 in Enumerable.Range(1, 9)
            from b8 in Enumerable.Range(1, 9)
            from b9 in Enumerable.Range(1, 9)
            from c1 in Enumerable.Range(1, 9)
            from c2 in Enumerable.Range(1, 9)
            from c3 in Enumerable.Range(1, 9)
            from c4 in Enumerable.Range(1, 9)
            from c5 in Enumerable.Range(1, 9)
            from c6 in Enumerable.Range(1, 9)
            from c7 in Enumerable.Range(1, 9)
            from c8 in Enumerable.Range(1, 9)
            from c9 in Enumerable.Range(1, 9)
            from d1 in Enumerable.Range(1, 9)
            from d2 in Enumerable.Range(1, 9)
            from d3 in Enumerable.Range(1, 9)
            from d4 in Enumerable.Range(1, 9)
            from d5 in Enumerable.Range(1, 9)
            from d6 in Enumerable.Range(1, 9)
            from d7 in Enumerable.Range(1, 9)
            from d8 in Enumerable.Range(1, 9)
            from d9 in Enumerable.Range(1, 9)
            from e1 in Enumerable.Range(1, 9)
            from e2 in Enumerable.Range(1, 9)
            from e3 in Enumerable.Range(1, 9)
            from e4 in Enumerable.Range(1, 9)
            from e5 in Enumerable.Range(1, 9)
            from e6 in Enumerable.Range(1, 9)
            from e7 in Enumerable.Range(1, 9)
            from e8 in Enumerable.Range(1, 9)
            from e9 in Enumerable.Range(1, 9)
            from f1 in Enumerable.Range(1, 9)
            from f2 in Enumerable.Range(1, 9)
            from f3 in Enumerable.Range(1, 9)
            from f4 in Enumerable.Range(1, 9)
            from f5 in Enumerable.Range(1, 9)
            from f6 in Enumerable.Range(1, 9)
            from f7 in Enumerable.Range(1, 9)
            from f8 in Enumerable.Range(1, 9)
            from f9 in Enumerable.Range(1, 9)
            from g1 in Enumerable.Range(1, 9)
            from g2 in Enumerable.Range(1, 9)
            from g3 in Enumerable.Range(1, 9)
            from g4 in Enumerable.Range(1, 9)
            from g5 in Enumerable.Range(1, 9)
            from g6 in Enumerable.Range(1, 9)
            from g7 in Enumerable.Range(1, 9)
            from g8 in Enumerable.Range(1, 9)
            from g9 in Enumerable.Range(1, 9)
            from h1 in Enumerable.Range(1, 9)
            from h2 in Enumerable.Range(1, 9)
            from h3 in Enumerable.Range(1, 9)
            from h4 in Enumerable.Range(1, 9)
            from h5 in Enumerable.Range(1, 9)
            from h6 in Enumerable.Range(1, 9)
            from h7 in Enumerable.Range(1, 9)
            from h8 in Enumerable.Range(1, 9)
            from h9 in Enumerable.Range(1, 9)
            from i1 in Enumerable.Range(1, 9)
            from i2 in Enumerable.Range(1, 9)
            from i3 in Enumerable.Range(1, 9)
            from i4 in Enumerable.Range(1, 9)
            from i5 in Enumerable.Range(1, 9)
            from i6 in Enumerable.Range(1, 9)
            from i7 in Enumerable.Range(1, 9)
            from i8 in Enumerable.Range(1, 9)
            from i9 in Enumerable.Range(1, 9)
            where (a1 == e5 * e8)
                && (a2 == h1 - 2)
                && (a3 == c5 * e8)
                && (a4 == h9 - 1)
                && (a5 == d7 - e2)
                && (a6 == f1 + g7)
                && (a7 == e3 - h2)
                && (a8 == h6 + a9)
                && (a9 == g3 / g6)
                && (b1 == d1 - a9)
                && (b2 == g2 - h1)
                && (b3 == e5 - 4)
                && (b4 == c7 + 1)
                && (b5 == d7 - 7)
                && (b6 == i5 + d6)
                && (b7 == f8 + 1)
                && (b8 == a1 / i5)
                && (b9 == g3 + 3)
                && (c1 == i2 * a7)
                && (c2 == b4 * a7)
                && (c3 == c6 + 6)
                && (c4 == a2 * f5)
                && (c5 == c6 + 7)
                && (c6 == f8 - i3)
                && (c7 == d6 - 1)
                && (c8 == h8 + 1)
                && (c9 == g4 / c1)
                && (d1 == a7 * 3)
                && (d2 == i3 + a7)
                && (d3 == c2 - e2)
                && (d4 == f4 * i2)
                && (d5 == c4 + 2)
                && (d6 == h9 * e8)
                && (d7 == c4 * a2)
                && (d8 == d1 - a7)
                && (d9 == c1 * d4)
                && (e1 == i1 - e3)
                && (e2 == e3 + 3)
                && (e3 == d1 - g9)
                && (e4 == f1 + d1)
                && (e5 == d1 * 3)
                && (e6 == a5 + 4)
                && (e7 == g6 * h7)
                && (e8 == d9 - 7)
                && (e9 == i3 / e3)
                && (f1 == a3 / i2)
                && (f2 == b7 * e8)
                && (f3 == b6 * d3)
                && (f4 == h2 + 1)
                && (f5 == d1 - 2)
                && (f6 == g5 / b5)
                && (f7 == e3 * h3)
                && (f8 == h2 + h9)
                && (f9 == i1 - 3)
                && (g1 == c5 - f5)
                && (g2 == a6 + 2)
                && (g3 == e6 / a9)
                && (g4 == e8 + 7)
                && (g5 == d6 * a7)
                && (g6 == b1 + 1)
                && (g7 == h1 - 2)
                && (g8 == h5 - f4)
                && (g9 == a8 - a4)
                && (h1 == d2 - i2)
                && (h2 == h4 / i9)
                && (h3 == c7 - 2)
                && (h4 == f9 + 4)
                && (h5 == h2 + 6)
                && (h6 == d8 * 2)
                && (h7 == h1 - e9)
                && (h8 == f5 + 7)
                && (h9 == a1 - b8)
                && (i1 == f3 - b1)
                && (i2 == c9 / h7)
                && (i3 == i1 - c1)
                && (i4 == a6 - 6)
                && (i5 == d5 - d8)
                && (i6 == f6 + 2)
                && (i7 == c7 + 2)
                && (i8 == e3 + i2)
                && (i9 == f6 * g7)
            select new

This brute force method will take a hell of a long time to get the answer.

I ran it for an hour and the results at that point was only:
a1 to h9 all 1s and
i1=1, i3=1, i2=1, i4=1, i5=5, i6=1, i7=5, i8=5, i9=7
That is just over 33 000 iterations.

I took this code home and then over 4 hours of re-factoring the "where clauses" into "joins", and then re-ordering the joins I got to this code:
        var solveForNumbers =
            from i2 in Enumerable.Range(1, 9)
            from i5 in Enumerable.Range(1, 9)
            from h2 in Enumerable.Range(1, 9)
            from e3 in Enumerable.Range(1, 9)
            from a9 in Enumerable.Range(1, 9)
            join a7 in Enumerable.Range(1, 9) on e3 - h2 equals a7
            join d1 in Enumerable.Range(1, 9) on a7 * 3 equals d1
            join b1 in Enumerable.Range(1, 9) on d1 - a9 equals b1
            join g6 in Enumerable.Range(1, 9) on b1 + 1 equals g6
            join d8 in Enumerable.Range(1, 9) on d1 - a7 equals d8
            join h6 in Enumerable.Range(1, 9) on d8 * 2 equals h6
            join a8 in Enumerable.Range(1, 9) on h6 + a9 equals a8
            join e5 in Enumerable.Range(1, 9) on d1 * 3 equals e5
            join b3 in Enumerable.Range(1, 9) on e5 - 4 equals b3
            join f5 in Enumerable.Range(1, 9) on d1 - 2 equals f5
            join h8 in Enumerable.Range(1, 9) on f5 + 7 equals h8
            join c8 in Enumerable.Range(1, 9) on h8 + 1 equals c8
            join c1 in Enumerable.Range(1, 9) on i2 * a7 equals c1
            join e2 in Enumerable.Range(1, 9) on e3 + 3 equals e2
            join i8 in Enumerable.Range(1, 9) on e3 + i2 equals i8
            join h5 in Enumerable.Range(1, 9) on h2 + 6 equals h5
            join f4 in Enumerable.Range(1, 9) on h2 + 1 equals f4
            join d4 in Enumerable.Range(1, 9) on f4 * i2 equals d4
            join d9 in Enumerable.Range(1, 9) on c1 * d4 equals d9
            join e8 in Enumerable.Range(1, 9) on d9 - 7 equals e8
            join a1 in Enumerable.Range(1, 9) on e5 * e8 equals a1
            join b8 in Enumerable.Range(1, 9) on a1 / i5 equals b8
            join h9 in Enumerable.Range(1, 9) on a1 - b8 equals h9
            join a4 in Enumerable.Range(1, 9) on h9 - 1 equals a4
            join g9 in Enumerable.Range(1, 9) on a8 - a4 equals g9
            join f8 in Enumerable.Range(1, 9) on h2 + h9 equals f8
            join b7 in Enumerable.Range(1, 9) on f8 + 1 equals b7
            join d6 in Enumerable.Range(1, 9) on h9 * e8 equals d6
            join b6 in Enumerable.Range(1, 9) on i5 + d6 equals b6
            join c7 in Enumerable.Range(1, 9) on d6 - 1 equals c7
            join b4 in Enumerable.Range(1, 9) on c7 + 1 equals b4
            join c2 in Enumerable.Range(1, 9) on b4 * a7 equals c2
            join d3 in Enumerable.Range(1, 9) on c2 - e2 equals d3
            join f3 in Enumerable.Range(1, 9) on b6 * d3 equals f3
            join i1 in Enumerable.Range(1, 9) on f3 - b1 equals i1
            join e1 in Enumerable.Range(1, 9) on i1 - e3 equals e1
            join f9 in Enumerable.Range(1, 9) on i1 - 3 equals f9
            join h4 in Enumerable.Range(1, 9) on f9 + 4 equals h4
            join i3 in Enumerable.Range(1, 9) on i1 - c1 equals i3
            join c6 in Enumerable.Range(1, 9) on f8 - i3 equals c6
            join c3 in Enumerable.Range(1, 9) on c6 + 6 equals c3
            join c5 in Enumerable.Range(1, 9) on c6 + 7 equals c5
            join g1 in Enumerable.Range(1, 9) on c5 - f5 equals g1
            join a3 in Enumerable.Range(1, 9) on c5 * e8 equals a3
            join f1 in Enumerable.Range(1, 9) on a3 / i2 equals f1
            join e4 in Enumerable.Range(1, 9) on f1 + d1 equals e4
            join d2 in Enumerable.Range(1, 9) on i3 + a7 equals d2
            join h1 in Enumerable.Range(1, 9) on d2 - i2 equals h1
            join g7 in Enumerable.Range(1, 9) on h1 - 2 equals g7
            join a6 in Enumerable.Range(1, 9) on f1 + g7 equals a6
            join a2 in Enumerable.Range(1, 9) on h1 - 2 equals a2
            join c4 in Enumerable.Range(1, 9) on a2 * f5 equals c4
            join d5 in Enumerable.Range(1, 9) on c4 + 2 equals d5
            join d7 in Enumerable.Range(1, 9) on c4 * a2 equals d7
            join a5 in Enumerable.Range(1, 9) on d7 - e2 equals a5
            join i4 in Enumerable.Range(1, 9) on a6 - 6 equals i4
            join g2 in Enumerable.Range(1, 9) on a6 + 2 equals g2
            join b2 in Enumerable.Range(1, 9) on g2 - h1 equals b2
            join e6 in Enumerable.Range(1, 9) on a5 + 4 equals e6
            join g3 in Enumerable.Range(1, 9) on e6 / a9 equals g3
            join b9 in Enumerable.Range(1, 9) on g3 + 3 equals b9
            join b5 in Enumerable.Range(1, 9) on d7 - 7 equals b5
            join e9 in Enumerable.Range(1, 9) on i3 / e3 equals e9
            join h7 in Enumerable.Range(1, 9) on h1 - e9 equals h7
            join e7 in Enumerable.Range(1, 9) on g6 * h7 equals e7
            join i7 in Enumerable.Range(1, 9) on c7 + 2 equals i7
            join g5 in Enumerable.Range(1, 9) on d6 * a7 equals g5
            join f6 in Enumerable.Range(1, 9) on g5 / b5 equals f6
            join i9 in Enumerable.Range(1, 9) on f6 * g7 equals i9
            join i6 in Enumerable.Range(1, 9) on f6 + 2 equals i6
            join h3 in Enumerable.Range(1, 9) on c7 - 2 equals h3
            join f7 in Enumerable.Range(1, 9) on e3 * h3 equals f7
            join f2 in Enumerable.Range(1, 9) on b7 * e8 equals f2
            join g4 in Enumerable.Range(1, 9) on e8 + 7 equals g4
            join c9 in Enumerable.Range(1, 9) on g4 / c1 equals c9
            join g8 in Enumerable.Range(1, 9) on h5 - f4 equals g8
                (e3 == d1 - g9) &&
                (a9 == g3 / g6) &&
                (h2 == h4 / i9) &&
                (i2 == c9 / h7) &&
                (i5 == d5 - d8)
            select new
                    a1, a2, a3, a4, a5, a6, a7, a8, a9,
                    b1, b2, b3, b4, b5, b6, b7, b8, b9,
                    c1, c2, c3, c4, c5, c6, c7, c8, c9,
                    d1, d2, d3, d4, d5, d6, d7, d8, d9,
                    e1, e2, e3, e4, e5, e6, e7, e8, e9,
                    f1, f2, f3, f4, f5, f6, f7, f8, f9,
                    g1, g2, g3, g4, g5, g6, g7, g8, g9,
                    h1, h2, h3, h4, h5, h6, h7, h8, h9,
                    i1, i2, i3, i4, i5, i6, i7, i8, i9
I ran the code and then the answer was calculated in a mere 8 seconds.

1) LINQ can be used to solve different types of puzzles.
2) Using joins greatly reduces the time spent to find the answer.
3) Formulas in the sheet which refer back to themselves cannot be added to a join, and can only be used in the "from" section. This means the LINQ query must *guess* these values. The less guesses there are the faster the answer will be calculated.

1) The LINQ query above only solves this one single Sudoku puzzle. It would be interesting to come up with a generic solutions that would work for any Sudoku puzzle of this type.
2) It would be interesting to see if I can get to a general Sudoku LINQ solver for a normal Sudoku puzzle.
3) Better understand *how* the joins speed up the calculation.