in reply to
Code Golf: Four is magic

A version that returns the English names of the input 1-2 digit number.

Update: Hmmm. I just noticed on the stackoverflow page that they clarified that the numbers should be spelled out in both the left AND right columns. Phooey.

Another update: And now there's some further stipulation that there be a separator(space, hyphen, whatever) between spelled words and the input number must come in through STDIN, not as a passed parameter, so no pop @ARGV.

Update: **283**

`@p=(Thir,Four,Fif,Six,Seven,Eigh,Nine);@n=("\x8",One,Two,Three,Four,Fi
+ve,@p[3..6],Ten,Eleven,Twelve,map$_.teen,@p);s/u//for@m=map$_.ty,Twen
+,@p;$n[8].=t;sub n{$n=shift;$n?$n<20?$n[$n]:"$m[$n/10-2]-$n[$n%10]":Z
+ero}$p+=<>;warn$m=n($p)," is ",$_=$p-4?n$p=()=$m=~/\w/g:magic,".\n"un
+til/c/
`

0
Zero is Four.
Four is magic.
40
Forty is Five.
Five is Four.
Four is magic.
67
Sixty-Seven is Ten.
Ten is Three.
Three is Five.
Five is Four.
Four is magic.
83
Eighty-Three is Eleven.
Eleven is Six.
Six is Three.
Three is Five.
Five is Four.
Four is magic.

##### Versions that don't spell out right column. #####

Update:Sigh. Apparently I'm blind. Using duelafns suggestion, modifying the end conditional and some other minor tweaks.

**256**

`@p=(Thir,Four,Fif,Six,Seven,Eigh,Nine);@n=("",One,Two,Three,Four,Five,
+@p[3..6],Ten,Eleven,Twelve,map($_.teen,@p),map$_.ty,Twen,@p);$n[22]=~
+s/u//;$n[8].=t;$_+=<>;print$z=$_?$_<20?$n[$_]:$n[$_/10+18].$n[$_%10]:
+Zero," is ",$_=$_-4?length$z:magic,".\n"until/a/
`

or

`perl -E'@p=(Thir,Four,Fif,Six,Seven,Eigh,Nine);@n=("",One,Two,Three,Fo
+ur,Five,@p[3..6],Ten,Eleven,Twelve,map($_.teen,@p),map$_.ty,Twen,@p);
+$n[22]=~s/u//;$n[8].=t;$_+=<>;say$z=$_?$_<20?$n[$_]:$n[$_/10+18].$n[$
+_%10]:Zero," is ",$_=$_-4?length$z:magic,"."until/a/'
`

Previous versions

Update: **314** Reformatted a bit to make it easier to run as a one liner. Capitalized names... because I could. Knocked another 2 strokes off. It bothers me that I can't figure out how to get rid of the duplicated Four without making it longer. I guess Four IS magic...

`@u="0335443554366887798866555766"=~/./g;sub n{@p=(Thir,Four,Fif,Six,Se
+ven,Eigh,Nine);@n=("",One,Two,Three,Four,Five,@p[3..6],Ten,Eleven,Twe
+lve,map($_.teen,@p),map$_.ty,Twen,@p);$n[22]=~s/u//;$n[8].=t;shift()?
+$_<20?$n[$_]:$n[$_/10+18].$n[$_%10]:Zero}$_=pop;print$z=n($_)," is ",
+$_=$_-4?length$z:magic,".\n"while/\d/
`

Update: **316**

`@u='0335443554366887798866555766'=~/./g;sub n{@p=(thir,four,fif,six,se
+ven,eigh,nine);@n=('',one,two,three,four,five,@p[3..6],ten,eleven,twe
+lve,map($_.teen,@p),twenty,map$_.ty,@p);$n[22]=~s/u//;$n[8].=t;shift(
+)?$_<20?$n[$_]:$n[$_/10+18].$n[$_%10]:zero}$_=pop;print$z=n($_)," is
+",$_=$_-4?length$z:magic,".\n"while/\d/
`

Update: **337**

`@u='0335443554366887798866555766'=~/./g;sub n{@p=(qw/thir four fif six
+ seven eigh nine/);@n=('',qw/one two three four five/,@p[3..6],qw/ten
+ eleven twelve/,map($_.'teen',@p),'twenty',map$_.'ty',@p);$n[22]=~s/u
+//;$n[8].='t';shift()?$_<20?$n[$_]:$n[$_/10+18].$n[$_%10]:'zero'}$_=<
+>;print$z=n($_)," is ",$_=$_-4?length$z:magic,".\n"while/\d/
`

Update: **341**

`@u='0335443554366887798866555766'=~/./g;sub n{shift;@p=(qw/thir four f
+if six seven eigh nine/);@n=('',qw/one two three four five/,@p[3..6],
+qw/ten eleven twelve/,map($_.'teen',@p),'twenty',map$_.'ty',@p);$n[22
+]=~s/u//;$n[8].='t';$t=$_?$_<20?$n[$_]:$n[$_/10+18].$n[$_%10]:'zero'}
+$_=<>;print$z=n($_)," is ",$_=$_-4?length$z:magic,".\n"while/\d/
`

Update: **343**

`@u='0335443554366887798866555766'=~/./g;sub n{shift;@p=(qw/thir four f
+if six seven eigh nine/);@n=('',qw/one two three four five/,@p[3..6],
+qw/ten eleven twelve/,map($_.'teen',@p),'twenty',map$_.'ty',@p);$n[22
+]=~s/u//;$n[8].='t';$t=$_?$_<20?$n[$_]:$n[$_/10+18].$n[$_%10]:'zero'}
+$_=<>;print n($_)," is ",$_=$_-4?length n($_):magic,".\n"while/\d/
`

Update: **344**

`@u='0335443554366887798866555766'=~/./g;sub n{shift;@p=(qw/thir four f
+if six seven eigh nine/);@n=('',qw/one two three four five/,@p[3..6],
+qw/ten eleven twelve/,map($_.'teen',@p),'twenty',map$_.'ty',@p);$n[22
+]=~s/u//;$n[8].='t';$t=$_?$_<20?$n[$_]:$n[$_/10+18].$n[$_%10]:'zero'}
+$_=pop;print n($_)," is ",$_=$_-4?length n($_):magic,".\n"while/\d/
`

Update: **345**

`@u='0335443554366887798866555766'=~/./g;sub n{shift;@p=(qw/thir four f
+if six seven eigh nine/);@n=('',qw/one two three four five/,@p[3..6],
+qw/ten eleven twelve/,map($_.'teen',@p),'twenty',map($_.'ty',@p);$n[2
+2]=~s/u//;$n[8].='t';$t=$_?$_<20?$n[$_]:$n[$_/10+18].$n[$_%10]:'zero'
+}$_=pop;print n($_)," is ",$_=$_-4?length n($_):magic,".\n"while/\d/
`

Update: **361**

`@u='0335443554366887798866555766'=~/./g;sub n{shift;@p=(qw/thir four f
+if six seven eigh nine/);@n=('',qw/one two three four five/,@p[3..6],
+qw/ten eleven twelve/);push@n,$_.'teen'for@p;$p[1]=~s/u//;push@n,'twe
+nty',;push@n,$_.'ty'for@p;$n[8].='t';$t=$_?$_<20?$n[$_]:$n[$_/10+18].
+$n[$_%10]:'zero'}$_=pop;print n($_)," is ",$_=$_-4?length n($_):magic
+,".\n"while/\d/
`

Update: Save a stroke: **383**.

`@u='0335443554366887798866555766'=~/./g;sub n{shift;@p=(qw/thir four f
+if six seven eigh nine/);@n=('',qw/one two three four five/,@p[3..6],
+qw/ten eleven twelve/);push@n,$_.'teen'for@p;$p[1]=~s/u//;push@n,'twe
+nty',;push@n,$_.'ty'for@p;$n[8].='t';$t=$_?$_<20?$n[$_]:$n[$_/10+18].
+$n[$_%10]:'zero'}$_=pop;print n($_)," is ",$_=$_-4?$_<20?$u[$_]||4:$u
+[chop]+$u[18+$_]:magic,".\n"while/\d/
`

Proof of concept. Should be lots of room for improvement.

Update: whoops. Fixed for fourteen/forty. Curse you, irregular number names!

**384** strokes.

`@u='0335443554366887798866555766'=~/./g;sub n{shift;@p=(qw/thir four f
+if six seven eigh nine/);@n=('',qw/one two three four five/,@p[3..6],
+qw/ten eleven twelve/);push@n,$_.'teen'for@p;push@n,'twenty',;push@n,
+$_.'ty'for@p;$n[8].='t';$n[22]=~s/u//;$t=$_?$_<20?$n[$_]:$n[$_/10+18]
+.$n[$_%10]:'zero'}$_=pop;print n($_)," is ",$_=$_-4?$_<20?$u[$_]||4:$
+u[chop]+$u[18+$_]:magic,".\n"while/\d/
`

C:\test>magic.pl 0
zero is 4.
four is magic.
C:\test>magic.pl 1
one is 3.
three is 5.
five is 4.
four is magic.
C:\test>magic.pl 14
fourteen is 8.
eight is 5.
five is 4.
four is magic.
C:\test>magic.pl 15
fifteen is 7.
seven is 5.
five is 4.
four is magic.
C:\test>magic.pl 18
eighteen is 8.
eight is 5.
five is 4.
four is magic.
C:\test>magic.pl 44
fortyfour is 9.
nine is 4.
four is magic.
C:\test>magic.pl 77
seventyseven is 12.
twelve is 6.
six is 3.
three is 5.
five is 4.
four is magic.
C:\test>magic.pl 80
eighty is 6.
six is 3.
three is 5.
five is 4.
four is magic.
C:\test>magic.pl 99
ninetynine is 10.
ten is 3.
three is 5.
five is 4.
four is magic.