|Portada|Blog|Space|

[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