Wednesday, 8 July 2020

Three noses of the Toyota MR2

From the definitive 80's wedge to the excellent handling of the last Roadster incarnation this popular mid-engined two seater has accumulated many fans over the 36 year span of the three models presented here. 
 

Model and yearsEngine size / gearsBody StylesNotable featuresCurrent approx costs
MR2  Mk1a & Mk1b
1984–1989  
AW10 - 1.5L Petrol
AW11 - 1.6L DOHC
5 speed manual, 4 speed auto
Hard top and T-Bar Super charger on some Japan domestic cars£300 project to  £7,000 mint
MR2 Mk2 GT Coupe and GT T-Bar 
1989–1999 

SW20: Various 2.0L 
some Turbos
Tin top and T-Bar
coupe. 
Also unbranded Spyder version
Rear Spoilers lots of after markets body kits and goodies.£300 project to £5,000 mint or special racer
MR2 “Spyder” and “Roadster"
1999–2007

SW30: 1.8L Petrol
5 or 6 speed gearbox
Softtop with removable hard top option
SMT paddle gear shift option

£300 Project to £7,000 mint

Mk1 A & B 1984 - 1989



The Toyota MR2 (midship runabout) was introduced at the Toyko motor show in October 1983 and launched the following year to the UK and USA markets. Using a fuel injection, 4 cylinder DOHC design generating just over 100HP, weighed in a just over a tonne. The sprightly car could easily out run both of it's contemporaries the Fiat X-19 and USA Pontiac Fiero. The MX5 appeared a few years later as a soft top from the start.

A super charger was introduced a couple of years later to the Japan and US markets but was not sold directly in the UK. The supercharger was belt-driven but actuated by an electromagnetic clutch, so that it would not be driven except when needed, increasing fuel economy. 

Worst feature: MK1's rust from the inside out due to aerial (Mk1a) and roof drains sending water into the sills.
when engine is operated the heat warms the moisture which causes condensation in lower sills, which settles over rear arches and box sections. They then rot out. Earlier engines were less robust with smaller internal components such as crank and rods. Brake calliper and discs were smaller in earlier cars and suspension components less durable.

Drivers opinion. from Overtake films “When I first saw it I remember think wow that design is so right. The engine really likes to rev with a red lines a 7750 rpm making about 123 hp. It comes alive as soon as you sit in it. It feels agile. It has no ABS or power steering but it feels lighter than a front wheel drive Peugeot 205. The more you work the car the more it does for you. It feel way more sorted and capable and planted than a modern car.”

Also See 1987 Toyota Mk1 MR2 AW11 Review and Drive - Why it's a little bit of Magic on 4 wheels    https://www.youtube.com/watch?v=7rSvzch7Fis 

Mk2 Coupe 1989-1999
The MK2 version of the MR2 moved to a more rounded body style from the very wedge Mk1 and introduced larger 2.0L engines.  The new car was larger, weighed 159 to 181 kg more than its predecessor due to having a more luxurious and spacious cabin, larger engine sizes, sturdier transaxle, and a more durable suspension setup. The overall design of the automobile received more rounded, streamlined styling, with some calling the MR2 SW20 a "baby Ferrari" or "poor man's Ferrari", since the car did have several design cues borrowed from Ferrari.

There were no turbo models officially offered to the European market but many Japanese import models were sold and re-sold via the grey JDM import market. This car extensively adopted by the racing and moving scene of the early 00’s with a proliferation of after market parts and upgrades available directly from Japan and other suppliers.

Worst feature : Snap oversteer on early models during in-corner liftoffs like many mid and rear engined car.  Finally the "hose from hell" - a coolant hose so buried in the mid engine bay and surrounded on all side that it requires an engine drop to replace. 

Drivers opinion. from Rex H.  “Has a small throw clutch and short throw shifter. You can feel everything that engine is doing. The steering is sharp and there are no plastic creeks and noises. Overall driving experence very nice casual drive and aggressive as you want to be. Handling all the bumps very well. Interior is big enough for up to about six foot three.  ” Youtube on https://www.youtube.com/watch?v=pMaP6e6G0Vg  or

See also Five things to know about a MR2 Turbo.  https://www.youtube.com/watch?v=EgOA_P6EkVQ 


Mk3 Roadster 1999 - 2007

The final car of the sequence is the round Mk3 version that continued the mid engine format but lightened the weight and moved to 1.8L Twin Cam engines. Unlike its predecessors, however, the engine was placed onto the car the other way round, with the exhaust manifold towards the rear of the car instead of towards the front. The retractable soft and optional removable hardtop replaced the fixed and T-bar top-lines. The MR2 Spyder chief engineer Harunori Shiratori said, "First, we wanted true driver enjoyment, blending good movement, low inertia and light weight. Then, a long wheelbase to achieve high stability and fresh new styling; a mid-engine design to create excellent handling and steering without the weight of the engine up front; a body structure as simple as possible to allow for easy customizing, and low cost to the consumer."

Some owner switched out the 1ZZ-FE engine in exchange for the 141 kW; 189 bhp; 192 PS 2ZZ-GE found in the US-market Celica GTS

Worst features : Very small luggage space and digests own pre-cat from exhausts manifold.

Drivers opinion. from  Doug DeMuro  “Everything is nice and well put together, nothing is extremely luxurious or special, looks durable. Clutch and shifters are easy. Flooring it - it moves but not tremendously quickly. It could have been a little faster. It’s a little harsh. I am surprised how precise the steering and the handling is very responsive. It’s nice being in an open top car roof down being that guy. It really is Toyota take on a sports car, durable and quick handling. This car is cool.”  


For the Racers: The 750 Motor club has runs a MR2 challenge series with entries for all the versions. Double race weekends are run seven times ( in normal years) at top UK circuits.  For car race gamers the Toyota MR2 appears in every main Gran Turismo game to date since the original Gran Turismo. Although initially not available in Gran Turismo Sport, the 1997 MR2 GT-S was later introduced as part of Update 1.13, released on February 28, 2018. The first and third generations are available in every game starting from Gran Turismo 2.

Future collectability : The march of time is eating many of the early cars with a combination of rust and racing making finding a good original version harder over time. Engine parts are generally still available but trim and special parts are getting hard to locate. Many of the sources of after market upgrades have moved on to new models but have left a rich heritage to be discovered in the recycle market. The 80s are swinging back into fashion with fast Fords from that era pushing prices sky-high maybe it’s time to look around for other desirable cars from that time.

Acknowledgements : Wikipedia, YouTube and MR2 Owners club sites.

May 2020. 

Sunday, 28 June 2020

Made during lockdown with recycled decking boards


Last year we had the balcony on the back of the house replaced with a new metal and GRP structure. The decking was made out of plastic composite boards from Envirobuild and we had some left over. Lockdown provided some time to recycle these boards into some new projects.  These grey waterproof boards should prove to be a suitable non-rot replacement for perished wood.

One important thing to note with these boards is that the "sawdust" is in fact small micro plastic shavings. All cutting and drilling was done on a tarp so that these shaving could be collected, bagged and disposed of properly.

Thanks to Shane for the work on the trug.

Old arse trug

New arse trug

Now with beans and radishes


Pot and stuff moving trolly


 Has caster in each corner


New front for the compost heap

Friday, 5 June 2020

Electric scooter Advert overanalysed

Electric scooters - what's the fuss ?

This snap is taken from a glossy video promoting the use of electric scooters film on UK roads. Reactions:

  • No helmet.
  • Going wrong side of junction as shown by markings and arrow.
  • Electric scooters not yet legal on UK roads.
  • In frame before this one shows two people riding on same single person scooter going the wrong way up one way street. (Large white arrow on road).

The clip was probably filmed this way to use the available lighting on that side of the street. This appears to be a major triumph of marketing over both legality and responsibility. Karen is filling complaint to the Advertising Standards Authority even as I type.


Monday, 13 April 2020

Bad Blood (Theranos) and The Smartest Guys in the Room (Enron) describe toxic workplaces that allow frauds and cons to flourish.

Bad Blood about Theranos
Smartest Guys in the room



Having recently read Bad Blood (Theranos) and The Smartest Guys in the room (Enron)  I was stuck by the similarity of the toxic workplaces that allowed these huge frauds to continue.

Enron used "creative" accounting and corrupt financial business practices to hide loses in the energy sector. Each quarter's results snowball on previous failures leading to a huge implosion in 2001

Theranos developed blood testing machine intended to replace the need for off-site blood tests using just a few drops of blood. The devices never worked reliably or accurately compared to established testing machines. As a silicon valley "Unicorn" this company burnt millions in start up finance.

Similarities

  • Both companies were driven by charismatic characters with little grasp of the actual underlying science of the business.
  • Both had "Bulldog" partners that bullied and coerced employees into compliance.
  • Facts were hidden, one company used creative accounting methods to hide the real business financial facts, the other hid the miserable product performance from regulators and investors.
  • Both companies prevented cross company employee engagement to prevent effective collaboration.
  • Both companies had ineffective but high profile governance boards that were in thrall to the CEOs.
  • Both company had highly paid employees who job description was vague and performance marginal.
  • Original innovators leave in disgust or under a pretence cloud.
  • Both companies had the internal culture of a cult. "All in or get out".
  • Both companies valued long hours, apparent dedication over actual effective results.
  • Both companies employed outside "consultants" to aid and abet the toxic business processes; Accountants in one case, Lawyers in the other.
  • Whistleblowers were either ignored or legally threatened sued and silenced.
  • Investors wanted to believe the "Too good to be true" story above the realities of market sense.  

Loses
Enron -In excess of $70 Billion. A publicly listed company who's loses were spread across the regular stock market.

Theranos - In excess of $600 Million as well as 1000s of inaccurate blood test results leading to real medical harm. A private company who's loses hit a smaller group of private investors.

** Update Dec 2022 Balwani to serve 13 years serious prison time.

See also
Bernie Madoff and This list  of other large corporate failures.

Friday, 31 January 2020

Thinking about (programers) thinking.


One of the hardest things to do is understand how others think but failure to see and understand the worldview from another persons viewpoint can give rise to unreconcilable conflict. Seeking first to understand how others think can also enhance ones own worldview. This article will delve into four different ways thinking used by programers and other technology specialists in the construction of software solutions. Understanding these different modes will provide insight into "programmers thinking".

Iteration

Step by step from the start to the finish. One item taken at at time in a predictable order. Most often seen in the processing of lists and tables.
Look for phrases like  "for ( i=5; i<20; i++ ) { B[i] += 20 }"

Iteration provides the most basic way of processing items in sequential order. Usually performed one at a time iteration is the most common form of relating the same operation on different items.  Programmers will understand that the above loop have all the iterations executed in parallel but the following loop can not be safely executed in parallel.

 "for ( i=5; i<20; i++ ) { B[i] += B[i-5] }"

Recursion

Best understood as room by room approach. Think of working though a mansion house using these instructions
1a) Enter a room.
1b) Process the current room.
2) Find the doors list for the current room - if list not found then make a list of the doors in this room with the door you came in highlighted and crossed off. Leave door list in room.
3a) Pick an unprocessed door from the room's door list, cross that unprocessed door off and exit via that door.
3b) if the list of doors in this room is finished then exit out the most recent entry door highlighted on the rooms door list.
4) If there are no doors in the room then you are in an oubliette and will have to wait for Hoggle to help you out the Labyrinth.

Recursion is most often seen in the processing of branched trees of information.

Look for procedures that call themselves where inside the definition of treewalk a call is made to treewalk. Look for a structure like "Define Treewalk ( node ) { process_this_node ; Treewalk ( left ) ; Treewalk ( right )  } "

Recursion requires an exit point for closure.

Object Orientation

This way of thinking binds together the processing instructions and information to be processed. Make a data object then ask the object about itself or tell the object to do something to itself. Objects can be grouped into related families that inherit behaviours and attributes. For example: An object Animal is defined with attributes of name, species, habitat, colour.  An object of that class is made "Instantiated" for Cat with attributes Speedy, Manx, domestic home and ginger. Another object is made for Goldfish with Goldie, shubunkin, domestic tank and gold. Within the object definition the logic for how the objects interact is created so that Result of Cat + Goldfish has a meaningful outcome.
Look for references to the object "self.".

Propositional Logic

Describe the problem by dissembling the internal problem into the smallest possible phrases that together describe the whole problem. Propositional logic is a pathway to a solution, a way that multiple problems can be re-presented for solution by a single logic solver.
Look for references to "assert" followed by a definition.  See Solving-classic-sudoku-using-using-smt for a worked example.

Further reading about the different way of thinking and personalities in the IT and cyber world.

** Update May 2020 

Check out this Wired read that really nails the hacker psych and how it turns bad.

Wednesday, 29 January 2020

Investments make you rich but fees make you poorer.


Consider the following table that shows return and costs of investment plans. For various size pots along the top, with various % returns down the side, Income per month is shown.

For example £100,000 generating 3% return will give £250 per month.




However most investment platforms charge fees PerAnnum that can vary from 1.5% down to 0.2% of the capital held in the investment. When this fee is deducted from the income generated the net value delivered can be seen in the orange lines at the base of the table.

For Example for a £100,000 pot generating 3% return could pay from £1,850 year when the fees are 1.15% or pay £2,800 when fees are set at 0.2%.  The key point here is the fees are charged as a % of the total pot invested and not as a proportion of the value generated.  Given the same example paying 10% of the value generated as the fee would still provide £2,700 outcome.

When calculated as a proportion of the value generated the fees charged can easily amount to as much as 1/2 of the value generated by the investments.  For example investments returning 3% PA but paying 1.15% fees loose more than 1/3 of the returned value.

The costs of fees are compounded over the term of the investments. Money taken in fees is not available to accumulate in the later years of the investment. This has a big impact on the final value. For example over 10 years our £100,000 pot generating 3% returns delivers £134,391 with no fees,  £131,804.78 with 0.2% fees or just £120,118.62 in a 1.15% fee structure. The difference between 0.2% fees and 0.15% fees is over £11,000.

Studies have show that there is little relationship between the level of fees charged by advisors and the generated returns. In the short and long term, going for lower fees and ongoing costs, is a better strategy than trusting high fee charging advisors.

PS: Just swap the £ for your local currency symbol if required - the numbers are the same.


Friday, 10 January 2020

"Looks like the thing but is not the thing" aka avoid the offshore supplier trap

Avoid the offshore supplier trap.

With the development of internet global market places we often purchase goods from abroad without being aware of the potential problems. The consumer law which applies to a transaction should be the consumer law of the country in which the products are provided. However often such consumer laws are ignored or negated by offshore supplier using a range of devious tactics. This has resulted in the “Offshore supplier trap” which has become widespread defrauding consumers of millions each year. 


Here's how it works 

  • Some desirable product is advertised with glowing description and fantastic photo.
  • Promises are made of easy returns and guarantees of fitness for purpose.
  • Product is ordered from supplier and paid for by card in your own currency.
  • Goods arrive, in a few days or a week or so, packaged from an offshore location.
  • Goods are rubbish either not as described, shoddily made or just broken on arrival. Problems with purity, manufacturing quality are evident. Particular problems exist with small electronic goods being unsafe, untested but marked as tested or a knock off of a branded item.
  • They  “Looks like the thing but is not the thing”. 
  • When contacting supplier they respond with either: 
    "We can do a partial 10 or 20 % refund in exchange for acceptance."
    or
    "You can send the products back at your expense to the offshore location."

As the kicker:

  •     The promised refund is less than agreed,
  •     Cost of sending goods back is more than goods are worth,
  •     Goods magically never arrive at return point - refund is declined.
  •     Company working offshore pays no vat or taxes and employs cheep labour at exploitative wages.

Variations:

  • A free sample is offered with a just "pay for postage" agreement. Subsequent high charges are then applied to the same payment method using the excuse “See the T&Cs you joined our club with a monthly fee."
  • Payment details and contact details are passed to organised criminal gangs of spammers and fraudsters. 
  • Delays in processing and replying push the transaction past the payment platforms instant refund time limit.

Avoidance strategies

  • Buy through a trusted platform with a uniform published in country returns policy.
  • Check supplier with a few Google searches “Supplier name problems” or “Supplier name reviews” or “Product name reviews"
  • Look on consumer feedback services such as Trust pilot or Amazon or Reviews.io
  • Look carefully at the product reviews  - are they relevant ? Are they from confirmed purchasers
  • Look for the business address - is it local, in country and usable for returns.

See also 



Thursday, 26 December 2019

Using code to find all the anagrams in a book.

While reading "War and Peace" by Leo Tolstoy the other day I wondered how many anagrams were in the book. Well that's not quite true I was actually reading the classic CS book "Programming Pearls" by Jon Bentley and was intrigued by an early gem described in the book. Thinking about how to solve a problem before leaping into a programming solution can have great run-time and resource benefits. An example was finding anagrams in a larger text and books don't come much bigger than War and Peace by Leo Tolstoy.

Materials

The electronic text for many older books can be found over at the excelent  Guttenberg project. Amongst the collection is War and Peace in epub, html and text format. The text version was downloaded and reviewed to remove some foreign accented characters. Using perl 5, version 22, subversion 1 (v5.22.1) on a Mac but other text processing languages are available.

How big is this task ?

War and peace is a big book, when printed runs to 1440 pages. In electronic form the book has about as much data as a medium resolution picture about 3.5 million characters ( including spaces and punctuation )

$ wc ../../WarAndPeace/WarAndPeace_PlainText.txt
   64656  563405 3208085 ../../WarAndPeace/WarAndPeace_PlainText.txt
   |      |Words |
   Lines         Characters ( inc spaces )

This is easily within scope of an in memory solution.

How to solve

At first glance a simplistic approach of "Store every word and then compare each word against each other to see if they are anagrams" comes to mind. How ever this could involve comparing over 563,403 words with 563,403 others making a total of 563,403 ^ 2 = 317,422,940,409 thats over 300 trillion comparisons.  At a million comparisons a second that is

317422940409 /1000000 /60 /60 = 88.1 hours.

Even using a moderately parallel approach would not help much but would be usable as each anagram check micro task is independent of others. Just remembering which words have been checked before would provide a great saving as there are just 17,523 unique words in the tome making 307 million comparisons required.

17523 * 17523 = 307,055,529

This simple approach also ignores the useful clues we know about words that are anagrams of each other.
  1. The words must have the same number of letters. Longer or shorter words can be eliminated from comparison.
  2. All actual letters provided must form part of the anagram. Rare letters (Q Z X Y K etc.) in the clue must be in the answer.
  3. The subject matter of the anagrams is sometimes provided.
Rule 3 gives us little help as this is a not a linguistic task.

Rule 1 and common sense suggests that the book could be split up into lists of unique words of the same length and just those words compared with each other.

This would reduce the number of comparisons from 307 million to about 35 million easily achievable in a short time on any computer.

#Results Word length table text
#Length = Count
0 = 1
1 = 35
2 = 136
3 = 430
4 = 1280
5 = 1912
6 = 2527
7 = 2876
8 = 2697
9 = 2191
10 = 1509
11 = 948
12 = 533
13 = 285
14 = 133
15 = 52
16 = 9
17 = 4
18 = 1
136 * 136 + 430 * 430 + 1280 * 1280 + 1912 * 1912 + 2527 * 2527 + 2876 * 2876 + 2697 * 2697 + 2191 * 2191 + 1509 * 1509 + 948 * 948 + 533 * 533 + 285 * 285 + 133 * 133 + 52 * 52 + 9 * 9 + 4 * 4 + 1 * 1 +  0 = 35790525

Total Unique Words Count = 17523

The 0 and 1 length words listed above are just fragments of punctuation or unique single letters that cannot be anagrams and can all be ignored.

Rule 2 gives us the best hint for an even more efficient solution that could be used for larger books or collections of books. Having to compare each unique word once to see if that word is an anagram of any other word in the book would be the quickest solution. All the unique words in the book are stored in memory to enable repeated comparisons so why not use the index to that word structure to filter and isolate words that are anagrams of each other. Storing the words in a dictionary like structure under headings with the same word length, rare letters and number of each letter would drastically reduce the number of comparisons required.

Simplifying the anagram hunter to a general solution has each word taken and the letters reordered alphabetically and used as a "key" to group all words with the same generated key together. The key is a new anagram of the word with the same number and frequency of letters. All other words with the same number and frequency of letters will generate the same key and will therefore cluster together as  matching anagrams. 

Example
The words "notes" and "stone" when split into letters, sorted alphabetically both become "enost". When any word generates the same key "enost" another anagram of "notes" and "stone" will have been found. Later in the book "tones" appears, which is then added to the anagram sub-list.

Key
|       count of words with same key
|       |   | List of matching angrams of each other
enost = 3 = tones,notes,stone

To make this process work all punctuation is stripped from the book being replaced with a space character and all letters are converted to lower case before making the key. As we process the words keeping a counter for each word pattern allows a concordance to be generated.

Results

#Results Anagrams found in text
#Key = count = words
aelst = 5 = least,stale,steal,tales,stael
opst = 5 = post,stop,spot,pots,tops
acers = 5 = cares,scare,sacre,acres,races
adeerr = 4 = reread,reared,dearer,reader
aemn = 4 = mean,name,mane,amen
adegnr = 4 = ranged,danger,garden,grande
eilv = 4 = live,vile,veil,evil
eilms = 4 = smile,miles,limes,slime
aelp = 4 = pale,leap,plea,peal
.....snip


#Results frequent words found in text
#Word = Count
the = 34550
and = 22234
to = 16675
of = 14895
a = 10554
he = 10001
in = 8979
that = 8190
his = 7984
was = 7359
..... snip





Code


# Mon 23 Dec 2019 23:53:32 GMT
# find the anagrams from lines of things
# Prog Pearls 2.1C
# Only keep Unique words 

sub mkey () {
    #make key of characters in word in alpha order
    return join "",sort split //,$_[0];
}

$maxL =0;
while (<>) {
    s/[\W ]+/ /g#Tidy up text and drop punctuation
    foreach $d ( split (/ /) ) {  #get each word on line
        $d = lc $d;         #  make lower case
        $k = &mkey($d); #  make key from word
        $done{$d} +=1;      #  Count the number of times we have seen this word 
        if ($done{$d} == 1) {   # This is a new word
            $U +=1 ;            # count the number of unique words
            $kcnt{$k} +=1;      # count number of words with this key
            $wds{$k} .= $d."!"; # Save this word in list of words with same anagram key
            $lengthTable[length($d)] += 1; #Count unique words by length
            if ( length($d) > $maxL)
                { $maxL = length($d) };
        }
    }
}

# In number of anagrams found order
print "#Results Anagrams found in text\n#Key = count = words\n";
foreach $i (sort { $kcnt{$b} <=> $kcnt{$a} } keys %wds) {
    if ($kcnt{$i} > 1) {
        print "$i = $kcnt{$i} = ",join ",",split "!",$wds{$i};
        print "\n";
    }
}

# in most found order
print "#Results frequent words found in text\n#Word = Count\n";
foreach $i ( sort  { $done{$b} <=> $done{$a} } keys %done ) {
    print "$i = $done{$i}\n";
}

#Length table
print "#Results Word length table text\n#Length = Count\n";
foreach $i ( 0..$maxL) {
        print ("$i = $lengthTable[$i]\n");

}
foreach $i ( 2..$maxL) {
        if ($lengthTable[$i] > 0 ) {
                print ("$lengthTable[$i] * $lengthTable[$i] + ");
                $T += $lengthTable[$i] * $lengthTable[$i] ;
        }
}

print (" 0 = $T\nTotal Unique Words Count = $U\n");



Explanation


In Perl variables start with a $ and dictionary structures start with a % An single entry in a dictionary is addressed as $DictionaryName{ $key }. The +=1 phrase add one to the variable preceding. Looking here at just the interesting lines to get a flavour of how the program generates the answers.

There are three main dictionary structures in the program each of which has a collection of key and content pairs:



Name       KeyValues
doneA single word $d A number incremented each time that word is seen.
kcntkey generated from wordA number incremented each time a word generates this key
wdskey generated from wordList of words that all have the same key. Anagrams of each other.


Making the key

sub mkey () {
    return join "",sort split //,$_[0];
}

Working from the end of the line towards the return value.

 $_[0]     is the word to make the key
split //  slices the word in to a list of characters
sort      puts the list into alphabetical order
join ""   creates the key returned from the sorted list of characters

Inside the main foreach loop when a unique word is found

 $d is the current word
 $k is the generated key
 $done{$d} +=1Adds 1 to the "done" dictionary used to hold the count of words seen
 $lengthTable[length($d)] += 1; Counts the words of the same into lengthTable

 $wds{$k} .= $d."!";  Appends the word and an "!" to the list of all the words in %wds that have the same key 



 $kcnt{$k} +=1; Adds 1 to the dictionary used to hold the counts of words with the same $k key.

Reporting out the results


The anagrams found in dictionary %kcnt and words counting structure %wds are printed using very similar methods.



foreach $i (sort { $kcnt{$b} <=> $kcnt{$a} } keys %wds) { print... }


The output loop parts are


keys %wds     Generate a list of the keys in the dictionary of stored words %wds

sort { $kcnt{$b} <=> $kcnt{$a} }

              list of keys is sorted using a code fragment to access the values held with each key

foreach $i     Process each entry in the now sorted list.



The length of words table and total word count are printed.


Exercises 

Can you update the program to save and output the words found by length ? The longest words found are :


16 = circumstantially, disillusionments, enthusiastically, incomprehensible, irresponsibility, melodramatically, misunderstanding, responsibilities, superciliousness
17 = contemporaneously, misunderstandings, superstitiousness, unapproachability

18 = characteristically

Look at the shortest words found and improve the initial line text processing to reduce the numbers and noise in the answers. 

Are there any words split across lines using hyphenation ? if so fix this.