oɾɐqɐ ɐɔoq oʇxǝʇ ʎ ʇıoʇnɐ
Publicado: 13 Dic 2012, 12:44
˙˙˙ǝʇuǝɯןɐɯɹou oʇxǝʇ ןǝ ɹɐıdoɔ ʎ ɹɐuoıɔɔǝןǝs ǝpǝnd ǝs 'uǝƃɐɯı ɐun sǝ ou sıǝʌ oɯoɔ ʎ
. . .así que podéis usarlo en comentarios en youtube, facebook, etc. ¡pero no abuséis!
La idea no es mía, simplemente me encontré un comentario así en youtube y pensé en hacer un programita en AutoIt que generara algo así.
El truco está en invertir los caracteres de derecha a izquierda y además cambiarlos por una versión "boca abajo".
El texto no está boca abajo realmente, sino que como digo cada carácter ha sido sustituido por otro. Por ejemplo la "p" se puede sustituir por la "d", y viceversa, así "dono" al revés es "ouop" pero fijaros que son letras "normales": o, u, o , pe.
Cuando estaba en ello me encontré una web que lo hacía, así que he tomado la tabla de conversión de ahí:
http://www.sevenwires.com/play/UpsideDownLetters.html
Bonus: el mapeo de caracteres se hace usando un diccionario (tabla hash)
De esta manera es muy rápido, el array del programa está para generar el diccionario, pero la búsqueda del carácter correspondiente a cada uno se hace con ese diccionario en vez de buscar por todo el array.
Bueno, dado el número de caracteres no es que el array hubiera sido muy lento, pero quería mostrar un uso del diccionario, que no se ve afectado por el número de elementos.
Para buscar caracteres "inversos" es necesario usar caracteres unicode, como el editor está en ANSI (modo por defecto de AutoIt) para asignar los caracteres no imprimibles uso sus códigos.
Limitaciones:
Sólo minúsculas (no todas las mayúsculas tienen inversa) y nada de acentos y cosas así. Cuando un carácter no está en la tabla simplemente no se cambia. Por supuesto podéis ampliar la tabla si vais encontrando más equivalencias. Tengo unas cuantas mayúsculas si queréis os lo paso, pero no está completo.
Lo mismo con los números.
No todos los caracteres tienen negrita (depende de la fuente), por eso por ejemplo el título del post queda un poco raro.
Cada fuente tiene un subconjunto de Unicode, así que no salen todos los caracteres invertidos en todas las fuentes. En particular en mi XP la fuente por defecto no tiene mucha cobertura, pero si copias el texto a otro sitio que usa otra fuente los caracteres aparecen.
También se puede cambiar la fuente en el programa, claro, está comentada la línea que lo hace con 3 fuentes que he encontrado significativas:
Microsoft Sans Serif (Windows por defecto, al menos en XP): 2303 caracteres
Lucida Sans Unicode: 1765 caracteres (algo menos pero más "bonitos")
DejaVu Sans: 5633 caracteres (muy buena cobertura)
No sé si Lucida o DejaVu son estándar o los he instalado yo, en cualquier caso podéis cambiar a la fuente que queráis. Eso sí, cuando peguéis en otro sitio comprobadlo porque depende de la fuente que se use en ese sitio.
Ale, sin más rollo aquí va el programa, es super simple la verdad, casi me ha costado más explicarlo que hacerlo
uǝʇnɹɟsıp oן sǝpǝʇsn ǝnb 'oɹɹoɯıx ɹod opɐɯɐɹƃoɹd
. . .así que podéis usarlo en comentarios en youtube, facebook, etc. ¡pero no abuséis!
La idea no es mía, simplemente me encontré un comentario así en youtube y pensé en hacer un programita en AutoIt que generara algo así.
El truco está en invertir los caracteres de derecha a izquierda y además cambiarlos por una versión "boca abajo".
El texto no está boca abajo realmente, sino que como digo cada carácter ha sido sustituido por otro. Por ejemplo la "p" se puede sustituir por la "d", y viceversa, así "dono" al revés es "ouop" pero fijaros que son letras "normales": o, u, o , pe.
Cuando estaba en ello me encontré una web que lo hacía, así que he tomado la tabla de conversión de ahí:
http://www.sevenwires.com/play/UpsideDownLetters.html
Bonus: el mapeo de caracteres se hace usando un diccionario (tabla hash)
De esta manera es muy rápido, el array del programa está para generar el diccionario, pero la búsqueda del carácter correspondiente a cada uno se hace con ese diccionario en vez de buscar por todo el array.
Bueno, dado el número de caracteres no es que el array hubiera sido muy lento, pero quería mostrar un uso del diccionario, que no se ve afectado por el número de elementos.
Para buscar caracteres "inversos" es necesario usar caracteres unicode, como el editor está en ANSI (modo por defecto de AutoIt) para asignar los caracteres no imprimibles uso sus códigos.
Limitaciones:
Sólo minúsculas (no todas las mayúsculas tienen inversa) y nada de acentos y cosas así. Cuando un carácter no está en la tabla simplemente no se cambia. Por supuesto podéis ampliar la tabla si vais encontrando más equivalencias. Tengo unas cuantas mayúsculas si queréis os lo paso, pero no está completo.
Lo mismo con los números.
No todos los caracteres tienen negrita (depende de la fuente), por eso por ejemplo el título del post queda un poco raro.
Cada fuente tiene un subconjunto de Unicode, así que no salen todos los caracteres invertidos en todas las fuentes. En particular en mi XP la fuente por defecto no tiene mucha cobertura, pero si copias el texto a otro sitio que usa otra fuente los caracteres aparecen.
También se puede cambiar la fuente en el programa, claro, está comentada la línea que lo hace con 3 fuentes que he encontrado significativas:
Microsoft Sans Serif (Windows por defecto, al menos en XP): 2303 caracteres
Lucida Sans Unicode: 1765 caracteres (algo menos pero más "bonitos")
DejaVu Sans: 5633 caracteres (muy buena cobertura)
No sé si Lucida o DejaVu son estándar o los he instalado yo, en cualquier caso podéis cambiar a la fuente que queráis. Eso sí, cuando peguéis en otro sitio comprobadlo porque depende de la fuente que se use en ese sitio.
Ale, sin más rollo aquí va el programa, es super simple la verdad, casi me ha costado más explicarlo que hacerlo
uǝʇnɹɟsıp oן sǝpǝʇsn ǝnb 'oɹɹoɯıx ɹod opɐɯɐɹƃoɹd
Código: Seleccionar todo
#include <GUIConstants.au3>
; Idea tomada de
; http://www.sevenwires.com/play/UpsideDownLetters.html
Opt("MustDeclareVars", 1)
Global $GuiConv, $Input_orig, $botTrans, $Input_salida, $botCopiar, $botSalir, $dictConv
$GuiConv = GUICreate("Boca Abajo", 400, 175)
GuiCtrlCreateLabel("Texto original:", 5, 5)
$Input_orig = GUICtrlCreateInput("", 10, 20, 377, 20)
$botTrans = GUICtrlCreateButton("Transformar", 150, 50, 100, 25)
GuiCtrlCreateLabel("Texto volteado:", 5, 75)
$Input_salida = GUICtrlCreateInput("", 10, 90, 377, 20)
;GUICtrlSetFont(-1, 8.5, 400, 0, "DejaVu Sans") ;Lucida Sans Unicode / DejaVu Sans / Microsoft Sans Serif (por defecto)
$botCopiar = GUICtrlCreateButton("Copiar", 150, 120, 100, 25)
$botSalir = GUICtrlCreateButton("SALIR", 335, 135, 50, 25)
GUISetState(@SW_SHOW)
$dictConv = _CreaDictConversion()
Global $nMsg, $txtorig, $char, $charCod, $txt_res
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $botCopiar
ClipPut(GUICtrlRead($Input_salida))
Case $GUI_EVENT_CLOSE, $botSalir
$dictConv.RemoveAll()
$dictConv = 0
Exit
Case $botTrans, $Input_orig
$txtorig = StringLower(GUICtrlRead($Input_orig))
$txt_res = ""
For $i = StringLen($txtorig) To 1 Step - 1
$char = StringMid($txtorig, $i, 1)
$charCod = AscW($char)
If $dictConv.Exists($charCod) Then $char = $dictConv.item($charCod)
$txt_res &= $char
Next
GUICtrlSetData($Input_salida, $txt_res)
EndSwitch
WEnd
Func _CreaDictConversion()
;La conversión es reversible así que sólo hay que poner cada par de correspondencia una vez
;El editor es ANSI por lo que los caracteres unicode no representables se insertan mediante su punto de código
Local $MaxChars = 62
Local $aConv[$MaxChars] = [ _
'a', ChrW(0x0250), 'b', 'q', _
'c', ChrW(0x0254), 'd', 'p', _
'e', ChrW(0x01DD), 'f', ChrW(0x025F), _
'g', ChrW(0x0183), 'h', ChrW(0x0447), _ ;h 0x0265/0x0447
'i', ChrW(0x0131), 'j', ChrW(0x027E), _ ;i 0x1D09/0x0131
'k', ChrW(0x029E), 'l', ChrW(0x05DF), _
'm', ChrW(0x026F), 'n', 'u', _
'r', ChrW(0x0279), 't', ChrW(0x0287), _
'v', ChrW(0x028C), 'w', ChrW(0x028D), _
'y', ChrW(0x028E), '.', ChrW(0x02D9), _
'[', ']', '(', ')', '{', '}', '¿', '?', _
'¡', '!', "'", ',', '<', '>', _
'_', ChrW(0x203E), '"', ChrW(0x201E), _
';', ChrW(0x061B), "&", ChrW(0x214B) ]
Local $dict = ObjCreate("Scripting.Dictionary")
If Not IsObj($dict) Then
MsgBox(48, "Error", "¡El Diccionario no se ha podido crear!")
Exit
EndIf
For $i = 0 To $MaxChars-1 Step 2
$dict.Add(AscW($aConv[$i]), $aConv[$i+1])
$dict.Add(AscW($aConv[$i+1]), $aConv[$i]) ; Conversión inversa
Next
Return $dict
EndFunc