|Portada|Blog|Wiki|
[Nota: Copia de una entrada de mi viejo blog del 25 de abril del 2008]

Jojo, acabo de hacer algo muy loco, un programa en sed que me llevó 1
hora y 32 minutos que se encarga de sumar dos números naturales entre sí
arbitrariamente grandes.

Como sabrán sed se basa exclusivamente en expresiones regulares y no
soporta ningún tipo de aritmética. Por tanto hay que valerse de "trucos
sucios" para poder hacer operaciones.

La técnica usada en el programa es ni más ni menos sumar como sumaría un
niño; con los dedos. Si tenés que sumar 3 + 2, levantás primero tres
dedos y después dos dedos más, y por suerte las expresiones regulares
permiten concatenar caracteres, lo cual posibilita esta técnica.

echo $sumando1 $sumando2 | sed -e '/^[0-9]* [0-9]*$/!{s/.*/invalid/;q}
  :i;h;s/[0-9]/0/g;/^\(0*\) \1/!{x;s/\(.*\) \(.*\)/\2 \1/;bi}
  s/\(0*\) \1//;G;s/\n//;s/$/ /;h;:l;g;s/.*\(.\) .*\(.\) .*/\1\2/;x
  s/\([^ ]*\). \([^ ]*\). \(.*\)/\1 \2 \3/;x;s/$/0123456789/
  s/^\(.\)\(.*\)\1.*/\2/;s/$/0123456789/;s/^\(.\)\(.*\)\1.*/\2/;G
  s/\n\(c\?\).*/\1/;s/c/0/;s/./0/g;x;s/c//;x;tok;:ok;s/0000000000//
  tsi;bno;:si;x;s/^/c/;x;:no;s/$/9876543210/;s/.........\(.\).*/\1/;H
  x;s/ \([^ ]*\)\n\(.\)/ \2\1/;/^[ c]*[^ ]*$/{s/ //g;s/c/1/;q};x;bl'

Hay muchas técnicas que permiten realizar operaciones matemáticas con
scripts de sed exclusivamente, y en muchas de ellas se aprenden cosas
muy interesantes.

En definitiva les recomiendo leer el código y tratar de entenderlo. Van
a ver también que poniendo órdenes "p" en lugares estratégicos van a
poder comprender su funcionamiento.

Recomiendo tratar de ver en el código que hice: por ejemplo el algoritmo
usado para que los anchos en dígitos de los dos números sea el mismo, y
también el algoritmo (por medio de mapeo a tablas) para traducir un
dígito N en base decimal a una cadena de N caracteres y viceversa.

Happy hacking, jeje :P