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

y programas personales para otros como tu, puede que te corrijan ;)
Responder
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

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

Mensaje 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
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Avatar de Usuario
BasicOs
Site Admin
Mensajes: 2091
Registrado: 21 Nov 2006, 19:24
Ubicación: El Internet - (Canarias, España)
Contactar:

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

Mensaje por BasicOs »

JAJA. Parecia un spam en RUSO a primera vista ....
Salu22:)
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

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

Mensaje 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.
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

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

Mensaje 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.
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Codex
Mensajes: 4
Registrado: 30 Oct 2012, 22:20

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

Mensaje por Codex »

Muui Buena y sensilla si señor ! :smt023
Avatar de Usuario
XPyro
Profesional del Autoit
Mensajes: 542
Registrado: 04 Mar 2007, 10:12
Ubicación: México
Contactar:

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

Mensaje por XPyro »

Muy bueno jajaja me paso lo que a BasicOs :smt005
Imagen
Avatar de Usuario
arkcrew
Profesional del Autoit
Mensajes: 506
Registrado: 28 Sep 2009, 19:17
Ubicación: Granada, España
Contactar:

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

Mensaje por arkcrew »

Joder casi borro el tema, menos mal que os he visto comentar!! JAJAJAJAJA Muy bueno!!
Responder