Mostrando entradas con la etiqueta programacion. Mostrar todas las entradas
Mostrando entradas con la etiqueta programacion. Mostrar todas las entradas

miércoles, 24 de diciembre de 2014

Once upon a time Tech/Ops went looking for War Game Players...




Putting the "War" into "War Gaming" (1959) at Amazing JF Ptak




 

sábado, 23 de junio de 2012

A.M.Turing 100 años - 23 Junio 1912-2012

Poco más puedo añadir a estas alturas. Que gracias a gente como él no estamos todos hablando alemán.Que le trataron fatal. Que fue uno de los grandes.












Como siempre, gracias por venir. Si te gustó el post puedes apuntarte a través del correo electrónico o por medio del feed RSS (más información acerca del RSS). También puedes seguirme a través de mis elementos compartidos de Google Reader y desde Twitter.

sábado, 4 de febrero de 2012

Multiphase flow y otras formas divertidas de perder el tiempo

Como estoy harto de buscar una y otra vez esta pequeña aplicación Javascript, me la apunto aquí y así ya la tengo localizada.


Tim Holman tiene otras demos similares, y un blog muy, muy interesante.








Como siempre, gracias por venir. Si te gustó el post puedes apuntarte a través del correo electrónico o por medio del feed RSS (más información acerca del RSS). También puedes seguirme a través de mis elementos compartidos de Google Reader y desde Twitter.

domingo, 11 de septiembre de 2011

Videojuegos atípicos

Como muy bien apuntan en alt1040, si la definición de videojuego es según la RAE "dispositivo electrónico que permite, mediante mandos apropiados, simular juegos en las pantallas de un televisor o de un ordenador", puede que sea hora de replantearse la definición.

Por ejemplo, Joshua Noble y su equipo nos traen Receipt Racer, un juego con una curiosa 'pantalla'. Este micropoyecto fue presentado en el taller "Let's feed the future workshop" del OFFF Festival celebrado en Barcelona el pasado 8 de Junio de 2011.

Receipt Racer



A través del imprescindible Pixfans descubro este otro fantástico "videojuego en una caja" realizado por la gente de Teagudino, quienes en su web explican como realizar éste y otros proyectos similares.

Video Game in a Box







Como siempre, gracias por venir. Si te gustó el post puedes apuntarte a través del correo electrónico o por medio del feed RSS (más información acerca del RSS). También puedes seguirme a través de mis elementos compartidos de Google Reader y desde Twitter.

viernes, 3 de diciembre de 2010

Software dentro del Software

"I installed VisualStudio 2003 in a Virtual PC to work on an old WinCE project," writes Toshko Andreev, "the WinCE emulator wasn't very happy about that."







Visto en The Daily WTF.
Como siempre, gracias por venir. Si te gustó el post puedes apuntarte a los que vengan detrás a través del correo electrónico o por medio del feed RSS (más información acerca del RSS). También puedes seguirme a través de mis elementos compartidos de Google Reader o desde Twitter.

lunes, 13 de septiembre de 2010

Donald Knuth haciendo estadísticas de baloncesto en 1959 con un IBM 650

En esta película de 1959 "The Electronic Coach” vemos a un jovencísimo Donald E. Knuth (The Art of Computer Programming, TeX, Premio Turing 1974) sacando estadísticas de baloncesto en 1959 con un IBM 650 y ayudando así a mejorar los resultados de su equipo.








Con sus novedosas técnicas (高德纳) resulta ser un precursor de los métodos descritos en Super Crunchers (Ian Ayres). Como siempre, gracias por venir. Si te gustó el post puedes apuntarte a través del correo electrónico o por medio del feed RSS (más información acerca del RSS). También puedes seguirme a través de mis elementos compartidos, y a partir de ahora desde Twitter o Friendfeed.

viernes, 6 de agosto de 2010

Cartón + Coche Radio Control = Wipeout Cosplay

Malte Jehmlich ha combinado unas cajas, un coche radio control y una videocámara inalámbrica y el resultado es la mejor recreación de Wipeout que haya parido madre...

RACER DEMO 0.1 - video game mashup por Sputnic en Vimeo.





Como siempre, gracias por venir. Si te gustó el post puedes apuntarte a través del correo electrónico o por medio del feed RSS (más información acerca del RSS). También puedes seguirme a través de mis elementos compartidos, y a partir de ahora desde Twitter o Friendfeed.

jueves, 5 de agosto de 2010

Entrevista a Sandy White - Ant Attack ZX-Spectrum

En 1983, un año después de la aparición del ZX-Spectrum, el legendario Sandy White revolucionó el panorama de los videojuegos con su impresionante Ant Attack, un mundo tridimensional poblado de hormigas gigantescas. Aquí le tenemos en una reciente entrevista



Sandy es uno de mis héroes personales del Spectrum (el otro es Dusko Dimitrijevic). Todavía tengo guardada la entrevista que le hicieron en Microhobby a cuento de su siguiente juego, I Of the Mask, en el que nuevamente se adelantó varios años a cualquier cosa parecida que estuviese por venir. La he escaneado como mejor he podido.









La Página Personal de Sandy White es una auténtica pasada. Como siempre, gracias por venir. Si te gustó el post puedes apuntarte a través del correo electrónico o por medio del feed RSS (más información acerca del RSS). También puedes seguirme a través de mis elementos compartidos, y a partir de ahora desde Twitter o Friendfeed. En la elaboración de este post no se han maltratado hormigas gigantes.

miércoles, 16 de junio de 2010

John Tukey , matemático: FFT, Box Plot, Bit, Prim-9... 16 de Junio, 1915

Hace exactamente 95 años nacía John Wilder Tukey (16 de Junio, 1915 - 26 de Julio, 2000), químico, matemático, estadístico y pionero informático americano. Destaquemos brevísimamente algunas de sus contribuciones:

En 1947 acuñó el término 'bit' (binary digit, dígito binario) en una comunicación interna de los laboratorios Bell, un año antes de que Claude Shannon enunciase su Teoría de la Información en la que popularizó definitivamente el término.

En 1965 publica junto con James Cooley el algoritmo Cooley–Tukey de Transformada Rápida de Fourier (FFT), un eficiente método que permite calcular la transformada de Fourier discreta y su inversa, de gran importancia en una enorme variedad de aplicaciones, desde el tratamiento digital de señales y filtrado digital en general a la resolución de ecuaciones diferenciales parciales, tratamiento de imagen y audio, reducción de ruido en señales, análisis de materiales, síntesis...


En 1974 trabajó en el desarrollo de un entorno de representación gráfica de datos en múltiples dimensiones, en un sistema denominado captura proyectiva o projection pursuit desarrollando un sistema informático, Prim-9, que parece sacado directamente de la tercera temporada de Lost


Y para terminar con esta necesariamente incompleta lista de logros de Tukey, mencionar que en 1977 presentó los Box Plot, un sistema gráfico que sintetiza cinco parámetros estadísticos de un conjunto de datos (mínimo, máximo, media, mediana y cuartiles)








Con esta entrada entro a participar en el carnaval de matemáticas, ya por su quinta edición, organizada esta vez por el blog ciencia. Bell Labs tiene múltiples artículos sobre Tukey. Como siempre, gracias por venir. Si te gustó el post puedes apuntarte a través del correo electrónico o por medio del feed RSS (más información acerca del RSS). También puedes seguirme a través de mis elementos compartidos, y a partir de ahora desde Twitter o Friendfeed. En la elaboración de este post no se ha maltratado ningún gato (y en todo caso al final se le ha aplicado la correspondiente IFFT)

martes, 8 de junio de 2010

Pioneros de la Programación - Infografía de Smashing

La fantástica Smashing Magazine dedica recientemente uno de sus artículos a la elaboración de un póster dedicado a los genios de la programación y la informática. Podemos explorarlo cómodamente gracias al servicio Fotozum de los amigos de Métriz Canarias.









Fuente: Smashing Magazine. Fotozum es un servicio de los amigos de Métriz Canarias. No está mal para contrastar leer el reciente post de Zed A. Shaw "There Are No Famous Programmers". Como siempre, gracias por venir. Si te gustó el post puedes apuntarte a través del correo electrónico o por medio del feed RSS (más información acerca del RSS). También puedes seguirme a través de mis elementos compartidos, y a partir de ahora desde Twitter o Friendfeed.

sábado, 1 de mayo de 2010

Canica Equilibrista

Una tabla de madera, una canica, dos servos, una webcam, Arduino y un poco de Processing...



...y el resultado le hubiese encantado al mismísimo Claude Shannon.

Actualización: Al rato me llega a través de los compartidos de Darío el contrapunto a este robot que balancea una bola: un robot que se balancea sobre una bola...









Visto en Hacker News de Y-Combinator. Como siempre, gracias por venir. Si te gustó el post puedes apuntarte a través del correo electrónico o por medio del feed RSS (más información acerca del RSS). También puedes seguirme a través de mis elementos compartidos, y a partir de ahora desde Twitter o Friendfeed.

sábado, 6 de marzo de 2010

M.O.V.I.E. (Imagine, 1986) por Duško Dimitrijević


En 1985 el yugoslavo Dusko Dimitrijevic voló desde su tierra natal hasta Ingleterra con la intención de vender varios videojuegos para el ZX SPectrum a la compañía Bug Byte. Esta empresa ya le había comercializado un año antes su "Kung Fu", un original videojuego de artes marciales basado en gráficos vectoriales. Sin embargo al llegar a Liverpool Duke se encontró con que Bug Byte había cerrado.


Sin billete de vuelta (contaba con el dinero que iba a cobrar por los programas que había escrito para volver a casa) se las ingenió para dar con uno de los ex directores de Bug Byte, que le remitió a Ocean. Ocean le compró los juegos y le puso unas semanas a trabajar junto con programadores suyos para que Duke viera el tipo de juegos en los que estaban interesados.


Medio año más tarde Duško Dimitrijević y Mario Mandić entregaban M.O.V.I.E., un juego basado en el sistema Filmation, con un escenario enorme compuesto por más de 250 pantallas repletas de detalles diseñados por Dragoljub Anđelković, que hoy podemos examinar gracias al estupendísimo servicio Fotozum de los amigos de Metriz.



Al arrancar el juego el detective Marlowe se encuentra en su despacho y debe encontrar una comprometedora cinta que muestra los trapos sucios del gangster local, Bugs Maloy. Por el camino contará con la ayuda de la inevitable mujer fatal, Tanya, cuya hermana gemela (Vanya) hará cuanto sea posible por matarnos.



Dejo aquí una rara entrevista hecha en su momento al genial Dusko Dimitrijevic, en la que habla (creo que en serbio) acerca de sus creaciones.









Podemos jugar a M.O.V.I.E online (y a un montón de juegos más) en este enlace, ver un vídeo de una partida completa (unos 20 minutos) así como leer un par de estupendas reseñas en zona48k y en el clásico Crash. Como siempre, gracias por venir. Si te gustó el post puedes apuntarte a través del correo electrónico o por medio del feed RSS (más información acerca del RSS). También puedes seguirme a través de mis elementos compartidos, y a partir de ahora desde Twitter o Friendfeed (Shhhhhhhhhhhhhhh: OPEN, DOCTOR, PUZZLE y SHIFRA).

domingo, 17 de enero de 2010

Anagramas con Python

En el post anterior comentaba como me pongo a ratos con el libro Python for Software Design, versión impresa del conocido How to Think Like a Computer Scientist. Como ya indiqué, se trata de una fantástica introducción al lenguaje Python del profesor Allen B. Downey.

En el ejercicio 4 del capítulo 12 propone un ejercicio para explorar un diccionario en busca de anagramas. Leemos en la Wikipedia que un anagrama es una palabra o frase que resulta de la transposición de letras de otra palabra o frase. Por ejemplo roma, amor, omar y mora son anagramas, así como lámina y animal.

El objetivo de la práctica es escribir una serie de funciones que impriman todos los conjuntos de anagramas del fichero (en nuestro caso un diccionario español, que podemos obtener en este enlace). Estas son las mías

from string import join,maketrans

def encuentraAnagramas():
anagramas={}
fin = open("E:\\ES.txt")
intab = "áéíóú"
outtab = "aeiou"
trantab = maketrans(intab, outtab)
for line in fin:
word = line.strip()
word2 = word.translate(trantab)
l=list(word2)
l.sort()
clave=join(l,'')
try:
anagramas[clave].append(word)
except KeyError:
anagramas[clave]=[word]
return anagramas

def buscador(palabra,diccionario):
lpalabra=list(palabra)
lpalabra.sort()
clave=join(lpalabra,'')
return(diccionario[clave])


>>> f=encuentraAnagramas()
>>> buscador('monja',f)
['jamón', 'mojan', 'monja']
>>> buscador('roma',f)
['amor', 'armo', 'armó', 'mora', 'ramo', 'roma']
>>> buscador('estados',f)
['dotases', 'estados']
>>> buscador('rebuscado',f)
['becuadros', 'rebuscado']
¿Cómo funciona esto? El truco, si es que hay alguno, consiste en usar una de las estructuras de datos más potentes de Python, los diccionarios, para recorrer la lista de palabras e ir formando un diccionario (lo que se denomina un hash en Perl o array asociativo en PHP) que conecte una clave con la lista de todas las palabras que sean anagramas entre sí. Pero, ¿cómo podemos organizar 'becuadros' y 'rebuscado' para que nos de una clave única de búsqueda? La respuesta la encontré hace tiempo leyendo un artículo de A.K.Dewdney en su estupenda columna 'Computer Recreations' de 'Scientific American' ('Investigación y Ciencia'): ordenar las letras de las palabras alfabéticamente. Veamos como funciona:
>>> p='retarais'
>>> l=list(p)
>>> l
['r', 'e', 't', 'a', 'r', 'a', 'i', 's']
>>> l.sort()
>>> l
['a', 'a', 'e', 'i', 'r', 'r', 's', 't']
>>> f['aaeirrst']
['arterias', 'arter\xedas', 'estirara', 'estirar\xe1', 'estriara', 'estriar\xe1', 'iterar\xe1s', 'rater\xedas', 'restar\xeda', 'retarais', 'retar\xedas', 'traer\xedas']
>>> for item in _:
print item,
arterias arterías estirara estirará estriara estriará iterarás raterías restaría retarais retarías traerías
Todas estas palabras, cuando sus letras son ordenadas alfabéticamente, convergen en 'aaeirrst'. Esa es la clave de búsqueda para los anagramas que podemos formar con estas letras. Con todas las piezas juntas, no es difícil encontrar cuales son las listas más grandes de anagramas... para lo que usaremos otro diccionario:
d={}
for i in f.keys():
cantidad=len(f[i])
try:
d[cantidad].append(f[i])
except KeyError:
d[cantidad]=[f[i]]
for i in d.keys()[-4:]:
print 'De longitud ',i
for lista in d[i]:
print '(',
for elem in lista:
print elem,
print ')',
print
Y estas son las listas de anagramas resultantes:

De longitud 11
( arresta arteras rastrea rateras restara restará retaras retarás retrasa traerás trasera ) ( artesonar atraernos atronarse nortearas nortearás ratearnos ratoneras sortearan sortearán tornearas tornearás ) ( alertos estarlo loteras orlaste relatos resalto resaltó soltaré soltera toleras tráelos ) ( entro entró norte rento rentó roten tenor terno torne torné treno ) ( espora operas opresa posaré repaso repasó reposa separo separó áspero óperas ) ( apretar pararte partear partera reparta reptara reptará trapear trapera trepara trepará ) ( entréis estiren estríen inertes inserte inserté interés rentéis rientes sentiré tírense ) ( cansaré cenaras cenarás cesaran cesarán encaras ensacar nacerás nácares secaran secarán ) ( enteros ernesto estreno estrenó eternos noreste nortees sorteen teneros tenores tornees ) ( caernos caserón cesaron coserán cráneos córneas encaros enrosca escoran roncase secaron ) ( amiste emitas estima matéis mesita metáis metías semita temáis temías timase ) ( ensarte ensarté enteras entesar entrase esteran estrena eternas rentase retasen sentaré )

De longitud 12
( canteros cantores cartones constaré contarse conteras contraes cornetas cortasen encastró roncaste troncase ) ( acaréis aceráis acerías caerías careáis casería cesaría escaria reacias recaías saciaré secaría ) ( alcores caerlos caleros calores colarse corales coserla créalos cóleras escolar laceros secarlo ) ( arreste arresté erraste esterar rastree rastreé restaré retarse retrase retrasé traerse térreas ) ( ardemos dameros daremos demoras desamor desarmo desarmó domarse maderos medrosa moderas redomas ) ( arrestan ensartar entraras entrarás narraste rastrean rentaras rentarás restaran restarán retrasan transaré ) ( abatirse abiertas baterías batieras estibara estibará estiraba estriaba rabietas rebatáis rebatías retabais ) ( acares aceras caerás careas casaré casera cesara cesará resaca sacaré secara secará ) ( asentir entráis estiran estrían inserta instaré rentáis retinas sentirá tiernas tirasen triasen ) ( entrarais entrarías estiraran estirarán estriaran estriarán insertara insertará rentarais rentarías restarían ternarias ) ( arterias arterías estirara estirará estriara estriará iterarás raterías restaría retarais retarías traerías )

De longitud 14
( artesón ensarto ensartó norteas notarse ratones rentosa rotasen sonarte sortean tornase torneas toserán tráenos )

De longitud 16
( arresto arrestó arteros ostrera rastreo rastreó rateros retraso retrasó rotarse sortear terrosa toreras torrase traeros trasero ) ( albores balsero besarlo boleras labores rebalso rebalsó resbalo resbaló roblase róbales róbelas saberlo salobre ábrelos árboles )







Alguien muy cercano y muy querido me dijo que estos post le resultaban inspiradores y le recordaban a los ejercicios de estilo Raymond Queneau (fundador de Oulipo), así que si no has entendido nada de todo esto espero que al menos disfrutes con el resultado ;-) Como siempre, gracias por venir. Si te gustó el post puedes apuntarte a través del correo electrónico o por medio del feed RSS (más información acerca del RSS). También puedes seguirme a través de mis elementos compartidos, y a partir de ahora desde Twitter o Friendfeed.

jueves, 14 de enero de 2010

Juegos de Palabras con Python

A ratos estoy con el libro Python for Software Design, versión impresa del conocido How to Think Like a Computer Scientist, una fantástica introducción al lenguaje Python del profesor Allen B. Downey.

Concretamente el capítulo 9, "Juegos de palabras", propone una serie de ejercicios en los que poner en práctica lo aprendido en los capítulos precedentes. En primer lugar nos enseña a abrir y leer un fichero de texto línea a línea

filein = open('words.txt')
for line in filein:
word = line.strip()
print word
Y a partir de aquí pide que desarrollemos funciones que recorran un diccionario (el fichero ES.txt) encontrando palabras de longitud igual a...
def de_longitud(n):
fin = open("D:\\ES.txt")
for line in fin:
word = line.strip()
if len(line)==n+1:
print word,
o mayores que...
def mayores_que(n):
fin = open("D:\\ES.txt")
for line in fin:
word = line.strip()
if len(line)>n+1:
print word,
un determinado valor, que no usen una determinada letra...
def has_no_e(palabra):
return (not 'e' in palabra)
o letras en general...
def avoids(letras,palabra):
for l in letras:
if l in palabra:
return False
return True
o que usen un conjunto de ellas...
def uses_all(letras,palabra):
for l in letras:
if not l in palabra:
return False
return True
que busquen palíndromos (palabras capicúas)...
def is_palyndrome(palabra):
return palabra==palabra[::-1]
o palabras cuyas letras estén en orden alfabético...
def is_abecedarian(palabra):
letra_anterior=''
for letra_nueva in palabra:
if letra_nueva<letra_anterior:
return False
letra_anterior=letra_nueva
return True

def is_abecedarian2(palabra):
letra_anterior='z'
for letra_nueva in palabra:
if letra_nueva>letra_anterior:
return False
letra_anterior=letra_nueva
return True

Una vez desarrolladas estas funciones he buscado un diccionario español en formato texto (en este enlace los hay para múltiples idiomas) y he creado la siguiente batería de pruebas para probar las funciones desarrolladas
def demo():
"Imprime todas las palabras de la lista"
fin = open("D:\\ES.txt")
for line in fin:
word = line.strip()
print word,

def demo2():
"Imprime palabras que no contienen la letra e"
fin = open("D:\\ES.txt")
for line in fin:
word = line.strip()
if has_no_e(word):
print word,

def demo3():
"Imprime palabras que evitan un conjunto de letras"
fin = open("D:\\ES.txt")
for line in fin:
word = line.strip()
if avoids('aeio',word): # "aents"
print word,

def demo4():
"Imprime palabras que usan un conjunto de letras"
fin = open("D:\\ES.txt")
for line in fin:
word = line.strip()
if uses_all('aeiouy',word):
print word,

def demo5():
"Imprime palabras cuyas letras están en orden alfabético"
from string import maketrans
fin = open("D:\\ES.txt")
intab = "áéíóúñ"
outtab = "aeioun"
trantab = maketrans(intab, outtab)
for line in fin:
word = line.strip()
word2=word.translate(trantab)
if is_abecedarian(word2):
print word,

def demo5_1():
"Imprime palabras cuyas letras están en orden alfabético inverso"
from string import maketrans
fin = open("D:\\ES.txt")
intab = "áéíóúñ"
outtab = "aeioun"
trantab = maketrans(intab, outtab)
for line in fin:
word = line.strip()
word2=word.translate(trantab)
if is_abecedarian2(word2):
print word,

def demo6():
"Imprime palabras capicúas"
fin = open("D:\\ES.txt")
for line in fin:
word = line.strip()
if is_palyndrome(word):
print word,
Y finalmente lo he ejecutado
print "\n\nPalabras de más de 21 caracteres"
mayores_que(21)
print "\n\nPalabras de 20 o más caracteres"
mayores_que(19)
print "\n\nPalabras capicúas"
demo6()
print "\n\nPalabras cuyas letras están en orden alfabético"
demo5()
print "\n\nPalabras cuyas letras están en orden alfabético inverso"
demo5_1()
print "\n\nPalabras que usan aeiouy"
demo4()
Siendo este el resultado:

Palabras de más de 21 caracteres
internacionalizaríamos internacionalizándolas internacionalizándoles internacionalizándolos

Palabras de 20 o más caracteres
anticonstitucionales antiproporcionalidad circunstanciadamente contrarreclamaciones descongestionaríamos extraterritorialidad inconstitucionalidad internacionalizabais internacionalizarais internacionalizarlas internacionalizarles internacionalizarlos internacionalizarnos internacionalizaréis internacionalizarían internacionalizarías internacionalizaseis malintencionadamente pentagonododecaedros precondicionamientos subdesarrolladamente bienintencionadamente desproporcionadamente electromagnéticamente intercontinentalmente internacionalizaremos internacionalizaríais internacionalizasteis internacionalizábamos internacionalizándola internacionalizándole internacionalizándolo internacionalizándome internacionalizándoos internacionalizándose internacionalizándote internacionalizáramos internacionalizásemos internacionalizaríamos internacionalizándolas internacionalizándoles internacionalizándolos

Palabras capicúas
a b c d e f g h i j k l m n o p q r s t u v w x y z ñ ó ll ada ala ama ana ara asa ata aya dad efe eje ele eme ene ese eñe non ojo oro oso sus erre alela aviva azuza dañad debed nadan radar rajar rapar rasar rayar rever rotor sacas sagas salas sanas sayas sañas sedes seres solos somos sosos narran rallar selles adamada adatada recocer reconocer sometemos

Palabras cuyas letras están en orden alfabético
a b c d e f g h i j k l m n o p q r s t u v w x y z ñ ó ad ah al as ay be ce ch cu de di dé el en es ex fi ir ll lo mu no nu os su tu tú él ñu aes ahí ajo amo ano año bel bes bis bit ces clo coz del den des dio dos doy fin fió fío gis hoy hoz huy los luz mor muy nos abel afmo afín agio ajos amor amos anos años befo cegó cejo cejó celo ceno cenó ceño ciño ciñó cruz deis dejo dejó dijo dilo dios délo ello fijo fijó film filo fino finó flor gimo hijo hilo hiló loor motu ágil achín adiós afijo afino afinó bello celos ceños chino dejos demos dilos dimos dinos délos dénos ellos fijos filos finos hijos hilos himno afijos bellos chillo chilló chinos defino dennos himnos

Palabras cuyas letras están en orden alfabético inverso
a b c d e f g h i j k l m n o p q r s t u v w x y z ñ ó da fe ge ha he id ji ka la le ll me mi mí ni oh oí pe pi ro se si so sé sí te ti té un va ve vi xi ya ye yo fea iba ida kif lea lee lid lié lía líe mea meé mía míe nea oca oda ola ole olé olí oía oíd pie pon pía píe rea red roa roe rol ron roo roí ría ríe sea sed sol son tea tic toa ton tía una une uní usa use uso usé usó uña vea ved vid vía yod yol zoo leed liba liga mica mida miga oiga ojea ojee ojeé oled olla olía onda oída peca pica pida poca poda pone rica rifa rife rifé rige roba roca roda roed roja roma roía roña seca seda sida siga soba soda sofá soga soja sola solí soma soné soñé teca toba toca toda toga tole toma tome tomé trié tría tríe unge unid unja unía urea urge urja urna usía veda vida viga volé yoga yola yuca yuta yute zeda zoca zona ojeda olida plica polca polea poned ponga ponla ponme ponía roiga rolla rolle rollé ronca ronda roída soled solía sonda tolla tonga troje unida volea volee voleé zumba zupia zurda zurra zurre zurro zurré zurró única úrica roñica solida sólida sónica tromba tronca tónica zurrón

Palabras que usan 'aeiouy'
atribuyendo atribuyeron neoyorquina ayuntamiento concluyerais constituyera contribuyera neoyorquinas obstruyerais reconstituya retribuyamos suprayectivo atribuyéndole atribuyéndome atribuyéndose atribuyéndote atribuyésemos ayuntamientos constituyeran constituyeras construyerais contribuyeran contribuyeras eyaculaciones reconstituyan reconstituyas suprayectivos yuxtaponiendo yuxtapusieron atribuyéndoles constituyerais contribuyerais reconstituyera retribuyéndola retribuyéramos multiproyectiva reconstituyamos reconstituyeran reconstituyeras reconstruyerais redistribuyamos retribuyéndolas yuxtaposiciones yuxtapusiésemos multiproyectivas reconstituyerais reconstituyéndola reconstituyéramos redistribuyéramos reconstituyéndolas

¡¡¡Que ustedes lo disfruten!!!





Fuente: Python for Software Design, versión impresa del conocido How to Think Like a Computer Scientist. Como siempre, gracias por venir. Si te gustó el post puedes apuntarte a través del correo electrónico o por medio del feed RSS (más información acerca del RSS). También puedes seguirme a través de mis elementos compartidos, y a partir de ahora desde Twitter o Friendfeed.

miércoles, 13 de enero de 2010

Explorando Divisores Potentes con Python

A través de los compartidos de Jose Antonio Prado Bassas me encontré ayer con este curioso reto del blog Espejo Lúdico en el que juega con los divisores propios de un número.

Los divisores propios de un número son sus divisores menos el propio número. Así, por ejemplo, los divisores propios de 12 son 1, 2, 3, 4 y 6. Pues bien, si tomamos los divisores propios de 24: 1, 2, 3, 4, 6, 8 y 12 y los multiplicamos

1 * 2 * 3 * 4 * 6 * 8 * 12 = 13824

obtenemos 13824, que es potencia del propio 24 (en concreto, 24 al cubo). El post planteaba el siguiente reto
hay hasta seis números más de dos cifras con esa propiedad (por supuesto el exponente no tiene por qué ser un cubo). ¿Sabrías descubrirlos?
Bueno. Aquí hay un problemilla para explorar con Python. Primero cree una función que devuelve una lista de los divisores propios de un número
def divisoresPropios(n):
lista=[]
for i in range(1,(n/2)+1):
if (n%i)==0:
lista.append(i)
return lista

>>> divisoresPropios(6)
[1, 2, 3]
>>> divisoresPropios(12)
[1, 2, 3, 4, 6]
>>> divisoresPropios(15)
[1, 3, 5]
>>> divisoresPropios(24)
[1, 2, 3, 4, 6, 8, 12]
Parece que funciona. Ahora transformamos un poco la función anterior para que en vez de devolver una lista de los divisores propios los vaya multiplicando y devuelva el resultado
def mulDivisoresPropios(n):
res=1
for i in range(1,(n/2)+1):
if (n%i)==0:
res*=i
return res

>>> mulDivisoresPropios(6)
6
>>> mulDivisoresPropios(12)
144
>>> mulDivisoresPropios(15)
15
>>> mulDivisoresPropios(24)
13824
Ya casi está. Definimos una función que toma un número y el múltiplo de sus divisores propios, y busca si se da algún caso en el que el número elevado a alguna potencia sea igual al múltiplo antes calculado.
def esDivisorPotente(num,mul):
for potencia in range(2,num):
res=pow(num,potencia)
if res==mul:
print num,'^',potencia,'=',res,
return True
if res>mul:
return False
Veamos cuales son los números de dos cifras que cumplen esta condición
>>> for i in range(1,101):
if esDivisorPotente(i,mulDivisoresPropios(i)):
print

12 ^ 2 = 144
18 ^ 2 = 324
20 ^ 2 = 400
24 ^ 3 = 13824
28 ^ 2 = 784
30 ^ 3 = 27000
32 ^ 2 = 1024
40 ^ 3 = 64000
42 ^ 3 = 74088
44 ^ 2 = 1936
45 ^ 2 = 2025
48 ^ 4 = 5308416
50 ^ 2 = 2500
52 ^ 2 = 2704
54 ^ 3 = 157464
56 ^ 3 = 175616
60 ^ 5 = 777600000
63 ^ 2 = 3969
66 ^ 3 = 287496
68 ^ 2 = 4624
70 ^ 3 = 343000
72 ^ 5 = 1934917632
75 ^ 2 = 5625
76 ^ 2 = 5776
78 ^ 3 = 474552
80 ^ 4 = 40960000
84 ^ 5 = 4182119424
88 ^ 3 = 681472
90 ^ 5 = 5904900000
92 ^ 2 = 8464
96 ^ 5 = 8153726976
98 ^ 2 = 9604
99 ^ 2 = 9801
Ummm, salen más de 6. Ahora podemos adornar un poco más la cosa:
for i in range(90,101):
if esDivisorPotente(i,mulDivisoresPropios(i)):
lista=divisoresPropios(i)
print ' = ',
for i in range(len(lista)-1):
print lista[i],'*',
print lista[len(lista)-1]

90 ^ 5 = 5904900000 = 1 * 2 * 3 * 5 * 6 * 9 * 10 * 15 * 18 * 30 * 45
92 ^ 2 = 8464 = 1 * 2 * 4 * 23 * 46
96 ^ 5 = 8153726976 = 1 * 2 * 3 * 4 * 6 * 8 * 12 * 16 * 24 * 32 * 48
98 ^ 2 = 9604 = 1 * 2 * 7 * 14 * 49
99 ^ 2 = 9801 = 1 * 3 * 9 * 11 * 33
De hecho estos números no parecen escasear, así por ejemplo en el entorno al millón tenemos muchos números que cumplen con la condición
1000076 ^ 23 = 1001749462105722003405829447631732777649010002466398328988709223525747312767402349848863851215950119508215957162865997753165741643557502976  =  1 * 2 * 4 * 7 * 11 * 14 * 17 * 22 * 28 * 34 * 44 * 68 * 77 * 119 * 154 * 187 * 191 * 238 * 308 * 374 * 382 * 476 * 748 * 764 * 1309 * 1337 * 2101 * 2618 * 2674 * 3247 * 4202 * 5236 * 5348 * 6494 * 8404 * 12988 * 14707 * 22729 * 29414 * 35717 * 45458 * 58828 * 71434 * 90916 * 142868 * 250019 * 500038





Fuente: Espejo Lúdico a través de los compartidos de Jose Antonio Prado Bassas. Como siempre, gracias por venir. Si te gustó el post puedes apuntarte a través del correo electrónico o por medio del feed RSS (más información acerca del RSS). También puedes seguirme a través de mis elementos compartidos, y a partir de ahora desde Twitter o Friendfeed.

jueves, 7 de enero de 2010

Richard Hammning - Códigos de Hamming

El ordenador en el que escribo este post tiene 8 gigabytes de RAM, esto son 68.719.476.736 bits (68.000 millones de unos y ceros). Por fuerza algunos han de fallar antes o después y una única instrucción de máquina errónea puede ocasionar cuelgues, pérdida de datos...

Sin embargo los ordenadores son extremadamente fiables, gracias en gran parte al genial Richard Hamming (11 Febrero 1915 – 7 Enero 1998) entre cuya extensísima lista de contribuciones a la informática destaca la invención de los denominados códigos de Hamming, un mecanismo conocido como SECDED ("single error correction, double error detection")

En efecto, muchas memorias llevan un sistema de detección y corrección de errores de Hamming que minimiza los problemas ocasionados por los fallos de los componentes individuales. Esto se logra mediante redundancia, almacenando 64 bits de datos en 72 bits de memoria física usando un código denominado de distancia 4. Si uno de esos 72 bits es golpeado por un rayo cósmico el sistema detectará y corregirá el error. En el improbable caso de que dos bits del mismo bloque fallen el sistema podrá al menos detectar el error y disparar un sistema de emergencia, por ejemplo bloqueando el ordenador en vez de permitir que los datos se corrompan.

Merece la pena dedicar unos minutos hoy a leer su genial "You and your research" (PDF, inglés, 16 páginas) que ya comentamos aquí hace un año.





Fuente: Wikipedia. Como siempre, gracias por venir. Si te gustó el post puedes apuntarte a través del correo electrónico o por medio del feed RSS (más información acerca del RSS). También puedes seguirme a través de mis elementos compartidos, y a partir de ahora desde Twitter o Friendfeed.

domingo, 25 de octubre de 2009

Peter Naur (la N de BNF) cumple 81 años

Hoy celebramos el 81 cumpleaños de Peter Naur (Copenhague, 25 de Octubre de 1928), la N de la notación BNF con la que se definen las gramáticas de los lenguajes de ordenador. Naur, astrónomo de formación, ha trabajado en el Regnecentralen (Instituto de Computación Danés), en el Instituto Niels Bohr y en la Universidad Técnica de Dinamarca, y entre 1968 y 1998 como profesor en la Universidad de Copenhague. En 2005 recibió el Premio Turing (el Nobel de la Informática), por sus contribuciones generales al diseño de los lenguajes de programacion y en concreto al diseño y especificación del lenguaje Algol 60.

Retrato de Peter Naur por Duo Duo Zhuang
1995, Oleo sobre lienzo, 65x45 cm.

En su artículo fundacional de 1960 "Report on the Algorithmic Language Algol 60" Naur introdujo su ya famosa notación BNF (Backus Naur Form, en honor a sus creadores). En este artículo Naur mejoraba la idea presentada por John Backus en un informe presentado a la UNESCO en 1958 sobre el lenguaje Algol 58. Hoy en día la notación BNF es usada para definir la gramática de todos los lenguajes de programación, aparte del hecho de que el Algol es el abuelo directo de todos los lenguajes de la familia C.

Los encargados de concederle el premio Turing destacaron el rigor y la elegancia del influyente informe de 1960 sobre Algol 60, su papel en el desarrollo del compilador GIER Algol, así como sus contribuciones a la ingeniería del software. Naur fue pionero en el uso de aserciones (que él llamaba "general snapshots") usadas para probar que un programa cumple sus especificaciones, y lideró el cambio de paradigma hacia la programación estructurada. Tillykke, Master Naur!





Fuente: Wikipedia sobre Naur, Notación BNF y Web Personal de Naur. En este enlace se pueden explorar las reglas sintácticas de lenguajes como SQL, ADA, JAVA, MODULA2 y PL/SQL en notación BNF. Como siempre, gracias por venir. Si te gustó el post puedes apuntarte a través del correo electrónico o por medio del feed RSS (más información acerca del RSS). También puedes seguirme a través de mis elementos compartidos.