Página 1 de 1

oɾɐqɐ ɐɔoq oʇxǝʇ ʎ ʇıoʇnɐ

Publicado: 13 Dic 2012, 12:44
por Ximorro
˙˙˙ǝʇ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

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

Re: oɾɐqɐ ɐɔoq oʇxǝʇ ʎ ʇıoʇnɐ

Publicado: 13 Dic 2012, 13:09
por BasicOs
JAJA. Parecia un spam en RUSO a primera vista ....
Salu22:)

Re: oɾɐqɐ ɐɔoq oʇxǝʇ ʎ ʇıoʇnɐ

Publicado: 13 Dic 2012, 18:58
por Chefito
Jajajajaja.....yo pensaba lo que BasicOs: ya se le ha metido un spam a Ximorro!!!! :smt005 :smt005 .

Muy bueno el efecto, e interesante lo del objeto Dictionary. Sabía que existía, pero nunca lo he utilizado.

Saludos.

Re: oɾɐqɐ ɐɔoq oʇxǝʇ ʎ ʇıoʇnɐ

Publicado: 14 Dic 2012, 10:05
por Ximorro
Ja, ja, tranquilos que no hay virus ni spam, el único problema con este programa son los dolores de cuello que puede dar girar la cabeza para leerlo mejor ;-)

¡ɯɐds ןǝ oɾɐqɐ!

En este caso lo del diccionario lo he puesto para dar un ejemplo de uso. Aquí no hace falta por cuestiones de eficiencia al ser una tabla tan pequeña pero con miles de datos iría igual de rápido y un array iría cada vez más lento.

Re: oɾɐqɐ ɐɔoq oʇxǝʇ ʎ ʇıoʇnɐ

Publicado: 11 Ene 2013, 06:14
por Codex
Muui Buena y sensilla si señor ! :smt023

Re: oɾɐqɐ ɐɔoq oʇxǝʇ ʎ ʇıoʇnɐ

Publicado: 20 Nov 2014, 07:42
por XPyro
Muy bueno jajaja me paso lo que a BasicOs :smt005

Re: oɾɐqɐ ɐɔoq oʇxǝʇ ʎ ʇıoʇnɐ

Publicado: 20 Nov 2014, 22:20
por arkcrew
Joder casi borro el tema, menos mal que os he visto comentar!! JAJAJAJAJA Muy bueno!!