As some of you may know, I’ve been ill for the past few weeks now, and hence not working or podcasting. I spend a lot of my time doing nothing because I have no energy and often a headache, but when my head is clear I have a lot of thinking time since doing physical things is not possible. I even need to be careful not to type too much or my arms get very sore!

Anyhow – yesterday Bren Finan was chatting with me when he noticed that ‘yesterday’ uses only keys from one half of the keyboard. Which got him, and hence me, wondering if there was a longer word that can be written with just half a keyboard. (The quick-witted among you will probably spot that ‘Yesterday’ doesn’t actually count because the ‘y’ is on the wrong side of the divide on ergonomic keyboards.)

As I say, the conversation got me thinking, and I mentioned it to Connor P when I was chatting to him later, and during that conversation the idea came to write a program to get the answer! The problem then was that I’d need a dictionary file. Connor soon found the answer on Google, the Mac has a built-in word list in /usr/share/dict/words! So, all it took was a few lines of Perl:

#!/usr/bin/perl
use strict;

my $longestLeft, my $longestRight;

while(<>){
    my $validLeft = $_ unless m/[yuiophjklnm]/i;
    my $validRight = $_ unless m/[qwertasdfgzxcvb]/i;
    $longestLeft = $validLeft if length($validLeft) > length($longestLeft);
    $longestRight = $validRight if length($validRight) > length($longestRight);
}

print "Longest left-only: $longestLeft\nLongest right-only: $longestRight\n";

The answer, the longest left-only word is ‘aftercataract’, and the longest right-only word is ‘phyllophyllin’!

Of coruse, once I started thinking about this I also wanted a list of long words, so I did a few teaks to the code, and produced this delux version:

#!/usr/bin/perl
use strict;

# declare the needed variables
my $longestLeft, my $longestRight, my $minLength=10;
my @longLeftWords, my @longRightWords;

# loop through the dictionary (file name to be passed as only argument)
while(<>){
    chomp;
    unless(m/[yuiophjklnm]/i){
        # valid left-only word
        push(@longLeftWords, $_) if length($_) >= $minLength;
        $longestLeft = $_ if length($_) > length($longestLeft);
    }
    unless(m/[qwertasdfgzxcvb]/i){
        # valid right-only word
        push(@longRightWords, $_) if length($_) >= $minLength;
        $longestRight = $_ if length($_) > length($longestRight);
    }
}

# print the results
print "\nLong words (at least $minLength letters) with the left-side of the KB only:\n";
foreach my $word (@longLeftWords){
    print "\t$word\n";
}
print "\t\t(total: ".scalar(@longLeftWords).")\n";
print "\nLong words (at least $minLength letters) with the rightside of the KB only:\n";
foreach my $word (@longRightWords){
    print "\t$word\n";
}
print "\t\t(total: ".scalar(@longRightWords).")\n";
print "\nLongest left-only word: $longestLeft (".length($longestLeft)." letters)\n";
print "Longest right-only word: $longestRight (".length($longestLeft)." letters)\n\n";

This gives the following results:

bartmbp:Temp bart$ ./dict.pl /usr/share/dict/words 

Long words (at least 10 letters) with the left-side of the KB only:
	abracadabra
	abstracted
	abstracter
	Actaeaceae
	afterbreast
	aftercareer
	aftercataract
	aftereffect
	aftergrass
	aftergrave
	afterstate
	aftertaste
	afterwards
	Aggregatae
	asarabacca
	assertress
	asseverate
	Asteraceae
	badgerweed
	beaverette
	bedaggered
	begartered
	beggarweed
	besweatered
	betattered
	bettergates
	breastweed
	cataracted
	decerebrate
	defervesce
	desecrater
	desertress
	desertward
	detractress
	devertebrated
	ebracteate
	effervesce
	estafetted
	everbearer
	Evertebrata
	evertebrate
	exacerbate
	exaggerate
	exaggerated
	extrastate
	extravagate
	extravasate
	freetrader
	Gastraeadae
	gazetteerage
	grasswards
	gravestead
	gravewards
	reaggravate
	reaggregate
	reasseverate
	redecrease
	redefecate
	refederate
	regratress
	Resedaceae
	retraverse
	revegetate
	reverberate
	reverbrate
	settergrass
	stagecraft
	staggerweed
	starveacre
	statecraft
	stavesacre
	stewardess
	streetward
	sweetbread
	sweetwater
	tartarated
	terracette
	terracewards
	tessaradecad
	tesseradecade
	tesserated
	tradecraft
	Trastevere
	versecraft
	Vertebrata
	vertebrate
	vertebrated
	waterstead
	waterwards
	westerwards
		(total: 90)

Long words (at least 10 letters) with the rightside of the KB only:
	hypolimnion
	hypophyllium
	hypophyllum
	miminypiminy
	phyllophyllin
	Plynlymmon
	polyphonium
	polyphylly
		(total: 8)

Longest left-only word: aftercataract (13 letters)
Longest right-only word: phyllophyllin (13 letters)

bartmbp:Temp bart$

This tells me two things, firstly, that Perl is really good at analysing text, because on my 5 year old Macbook Pro that took about a second to run, and second, that there are FAR more words for the left side than the right side.