NumeracionAlfaromana.vb

  1. ' NumeracionAlfaromana.vb — ProInf.net — 26-feb-2012
  2. '
  3. ' Numeración inventada por mi.
  4. '
  5. ' Pronunciación vocálico-lógica de los números inspirado en la numeración romana
  6. '
  7. ' Características:
  8. ' * Es sencillo de recordar y fácil de contar.
  9. ' * Los impares llevan una i en la primera o segunda letra.
  10. ' * Se pueden escribir números colosales como yuñi (10^10^10)
  11. ' * Las combinaciones de vocales son los números del 0 al 9
  12. ' * Las potencias de 10 son las consonantes: b=10, z=100, d=1000, etc.
  13. ' * Se escribe de menos a más significativo (que no es lo habitual)
  14. ' * El cero es u y los decimales empiezan por u
  15. ' * Se puede traducir una palabra en un número
  16. '
  17. ' 0 u 10 bi 20 ba 30 bai 40 be
  18. ' 1 i 11 ibi 21 iba 31 ibai 41 ibe
  19. ' 2 a 12 abi 22 aba 32 abai 42 abe
  20. ' 3 ai 13 aibi 23 aiba 33 aibai 43 aibe
  21. ' 4 e 14 ebi 24 eba 34 ebai 44 ebe
  22. ' 5 ei 15 eibi 25 eiba 35 eibai 45 eibe
  23. ' 6 ea 16 eabi 26 eaba 36 eabai 46 eabe
  24. ' 7 io 17 iobi 27 ioba 37 iobai 47 iobe
  25. ' 8 o 18 obi 28 oba 38 obai 48 obe
  26. ' 9 oi 19 oibi 29 oiba 39 oibai 49 oibe
  27. '
  28. ' 10 bi 100 zi 1000 di
  29. ' 20 ba 200 za 2000 da
  30. ' 30 bai 300 zai 3000 dai
  31. ' 40 be 400 ze 4000 de
  32. ' 50 bei 500 zei 5000 dei
  33. ' 60 bea 600 zea 6000 dea
  34. ' 70 bio 700 zio 7000 dio
  35. ' 80 bo 800 zo 8000 do
  36. ' 90 boi 900 zoi 9000 doi
  37. '
  38. ' 0.1 u-i 0.01 u-u-i 0.11 u-ibi
  39. ' 0.2 u-a 0.02 u-u-a 0.12 u-abi
  40. ' 0.3 u-ai 0.03 u-u-ai 0.13 u-aibi
  41. ' 0.4 u-e 0.04 u-u-e 0.14 u-ebi
  42. ' 0.5 u-ei 0.05 u-u-ei 0.15 u-eibi
  43. ' 0.6 u-ea 0.06 u-u-ea 0.16 u-eabi
  44. ' 0.7 u-io 0.07 u-u-io 0.17 u-iobi
  45. ' 0.8 u-o 0.08 u-u-o 0.18 u-obi
  46. ' 0.9 u-oi 0.09 u-u-oi 0.19 u-oibi
  47. '
  48. ' 10 bi 10.000.000 li 10^13 si
  49. ' 100 zi 100.000.000 mi 10^14 ti
  50. ' 1.000 di 1.000.000.000 ni 10^15 wi
  51. ' 10.000 fi 10.000.000.000 ñi 10^16 xi
  52. ' 100.000 ji 100.000.000.000 pi 10^17 yiobi
  53. ' 1.000.000 ki 1.000.000.000.000 ri 10^18 yobi
  54. '
  55. ' 10^1 yi 10^7 yio 10^13 yaibi 10^19 yoibi 10^10^15 yuwi
  56. ' 10^2 ya 10^8 yo 10^14 yebi 10^20 yuba 10^10^16 yuxi
  57. ' 10^3 yai 10^9 yoi 10^15 yeibi 10^21 yiba 10^10^17 yu-yiobi
  58. ' 10^4 ye 10^10 yubi 10^16 yeabi 10^22 yaba 10^10^18 yu-yobi
  59. ' 10^5 yei 10^11 yibi 10^17 yiobi 10^23 yaiba 10^10^10^17 yu-yu-yiobi
  60. ' 10^6 yea 10^12 yabi 10^18 yobi 10^24 yeba 10^10^10^18 yu-yu-yobi
  61. '
  62. ' 10^-1 yui
  63. ' 10^-2 yua
  64. ' 10^-3 yuai
  65. ' 10^-4 yue
  66. ' 10^-5 yuei
  67. ' 10^-6 yuea
  68. '
  69. ' 4321 i-ba-zai-de eyai-aiya-ayi-i
  70. ' 5432 a-bai-ze-dei eiyai-eya-aiyi-a
  71. ' 6543 ai-be-zei-dea eayai-eiya-eyi-ai
  72. ' 7654 e-bei-zea-dio ioyai-eaya-eiyi-e
  73. ' 8765 ei-bea-zio-do oyai-ioya-eayi-ei
  74. ' 9876 ea-bio-zo-doi oiyai-oya-ioyi-ea
  75. ' 987 io-bo-zoi oiye-oye-io
  76. ' 1098 o-boi-di yai-oiyi-o
  77. ' 2109 oi-zi-da ayai-ya-oi
  78. '
  79. ' federico > federiko > de-fe-ko-ri > 1.000.008.044.000
  80. ' adela > a-de-la > 20.004.002
  81. ' antonio > atonio > a-nio-to > 800.007.000.000.002
  82. ' ignacio > inazio > i-zio-na > 2.000.000.701
  83. ' abecedario > a-be-ze-da-rio > 7.000.000.002.442
  84.  
  85. Public Class NumeracionAlfaromana
  86.  
  87. Private Shared unidades() = {
  88. "u", "i", "a", "ai", "e", "ei", "ea", "io", "o", "oi"}
  89. '----0----1----2----3-----4----5-----6-----7-----8----9----
  90.  
  91. Private Shared potencias As String = "ubzdfjklmnñprstwxy"
  92. '--------------------------------------vc--gc-----------
  93.  
  94. #If False Then
  95. 'Ej: 32768.14590 --> "o-bea-zio-da-fai-u-bio-cei-de-fi"
  96. Public Shared Function ObtenerPronunciacion(
  97. ByVal numero As Decimal,
  98. Optional ByVal separacion As String = ""
  99. ) As String
  100. Dim texto As String = numero.ToString().Replace(",", ".").Replace("-", "")
  101. Dim items As String() = Split(texto, ".")
  102. Dim parteEntera As Integer = items(0)
  103. Dim parteDecimal As Integer = If(items.Length >= 2, items(0), 0)
  104. Dim resultado As New System.Text.StringBuilder()
  105. Dim espacio As String = If(separacion = "", " ", separacion)
  106.  
  107. If numero < 0 Then
  108. resultado.Append("menos")
  109. resultado.Append(espacio)
  110. End If
  111. resultado.Append(ObtenerPronunciacion(parteEntera, separacion))
  112. If parteDecimal Then
  113. resultado.Append(espacio)
  114. resultado.Append("u")
  115. resultado.Append(separacion)
  116. resultado.Append(ObtenerPronunciacion(parteDecimal, separacion))
  117. End If
  118.  
  119. Return resultado.ToString()
  120. End Function
  121. #End If
  122.  
  123. 'Ej: 32768 --> "o-bea-zio-da-fai"
  124. 'Ej: 14590 --> "bio-zei-de-fi"
  125. Public Shared Function Obtener(
  126. ByVal numero As Integer,
  127. Optional ByVal separacion As String = ""
  128. ) As String
  129. If numero = 0 Then Return unidades(0)
  130.  
  131. Dim resultado As New System.Text.StringBuilder()
  132. Dim potencia As Integer = 0
  133.  
  134. Do While numero > 0
  135. Dim digitoDecimal = numero Mod 10
  136.  
  137. If digitoDecimal > 0 Then
  138. Dim pronunciacion =
  139. ObtenerPotencia(potencia) & ObtenerUnidad(digitoDecimal)
  140.  
  141. If resultado.Length > 0 Then resultado.Append(separacion)
  142. resultado.Append(pronunciacion)
  143. End If
  144.  
  145. numero \= 10
  146. potencia += 1
  147. Loop
  148. Return resultado.ToString()
  149. End Function
  150.  
  151. Private Shared Function ObtenerUnidad(ByVal digito As Integer) As String
  152. If digito >= 1 And digito <= 9 Then
  153. Return unidades(digito)
  154. Else
  155. Return ""
  156. End If
  157. End Function
  158.  
  159. Private Shared Function ObtenerPotencia(ByVal potencia As Integer) As String
  160. If potencia = 0 Then
  161. Return ""
  162. ElseIf potencia >= 1 And potencia < potencias.Length Then
  163. Return potencias(potencia) 'Return Char.ToUpper(_potencias(potencia))
  164. Else
  165. Return "?"
  166. End If
  167. End Function
  168.  
  169. #If False Then
  170. 'Ej: "o-bea-zio-da-fai" --> 32768
  171. 'Ej: "bio-zei-de-fi" --> 14590
  172. Public Shared Function ObtenerNumero(ByVal pronunciacion As String) As Integer
  173. 'TODO: Obtener número desde pronunciación alfaromana
  174. Dim numero As Integer = 0
  175. Dim items() = ObtenerItems(pronunciacion.ToLower())
  176. For i = items.Length - 1 To 0 Step -1
  177. Dim item = items(i)
  178. If "aeiou".Contains(item(0)) Then
  179. Dim digito = Array.IndexOf(_unidades, item)
  180. If digito > 0 Then numero += digito
  181. Else
  182. Dim potencia = _potencias.IndexOf(item(0))
  183. If potencia > 0 Then numero *= 10 ^ potencia
  184. End If
  185. Next
  186. Return numero
  187. End Function
  188.  
  189. 'TODO: Probar esta función
  190. Private Shared Function ObtenerItems(ByVal pronunciacion As String) As String()
  191. If pronunciacion.Contains("-") Then Return Split(pronunciacion, "-")
  192. Dim lista As New List(Of String)
  193. Dim inicio As Integer = 0
  194. Dim item As String
  195. For i = 0 To pronunciacion.Length - 1
  196. Dim caracter As Char = pronunciacion(i)
  197. If Not "aeiou".Contains(caracter) Then
  198. lista.Add(pronunciacion.Substring(inicio, i))
  199. lista.Add(pronunciacion(i))
  200. inicio = i + 1
  201. End If
  202. Next
  203. item = pronunciacion.Substring(inicio)
  204. lista.Add(item)
  205. Return lista.ToArray()
  206. End Function
  207. #End If
  208. End Class
  209.  

Proinf.net