Foros del Web » Programando para Internet » Python »

Desafíos 2014 - Semana 3

Estas en el tema de Desafíos 2014 - Semana 3 en el foro de Python en Foros del Web. Problema Ahora te encuentras programando una calculadora, pero te das cuenta que cuando haces divisiones con enteros por ejemplo 1 / 3. Te llena toda ...
  #1 (permalink)  
Antiguo 10/02/2014, 17:09
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Desafíos 2014 - Semana 3

Problema
Ahora te encuentras programando una calculadora, pero te das cuenta que cuando haces divisiones con enteros por ejemplo 1 / 3. Te llena toda la pantalla con 0.33333 y en algún momento pierdes precisión o tienes que truncar la entrada.

Después de varias de lectura te das cuenta que si tienes una división a / b donde a y b son enteros, solamente tienes 2 posibles salidas. O tienes una decimal cuyos decimales son finitos. Ejemplo 3 / 8 == 0.375 o tienes decimales que se repiten de manera indefinida ejemplo: 1 / 3 == 0.333333....

Tu tarea es dado una fracción (a / b) de enteros debes de regresar si equivalente en decimal. Pero con los paréntesis rodeando el patrón que se repite.

Entrada
Una lista con 2 enteros, donde el primer entero representa en numerador y el segundo el denominador. (numerador / denominador).

Salida
Una cadena con el numero decimal y con paréntesis en los dígitos que se repiten.


Plantilla para resolver el problema
Código Python:
Ver original
  1. def to_decimal(fraction):
  2.     numerator, denominator = fraction
  3.     return ""
  4.  
  5. #These "asserts" using only for self-checking and not necessary for auto-testing
  6. if __name__ == '__main__':
  7.     from time import time
  8.     t1 = time()
  9.     assert to_decimal([1, 3]) == "0.(3)"
  10.     assert to_decimal([3, 6]) == "0.5"
  11.     assert to_decimal([2, 6]) == "0.(3)"
  12.     assert to_decimal([5, 3]) == "1.(6)"
  13.     assert to_decimal([3, 8]) == "0.375"
  14.     assert to_decimal([7, 11]) == "0.(63)"
  15.     assert to_decimal([29, 12]) == "2.41(6)"
  16.     assert to_decimal([11, 7]) == "1.(571428)"
  17.     assert to_decimal([23, 2]) == "11.5"
  18.     assert to_decimal([2, 21]) == "0.(095238)"
  19.     assert to_decimal([1, 17]) == "0.(0588235294117647)"
  20.     assert to_decimal([58, 23]) == "2.(5217391304347826086956)"
  21.     assert to_decimal([2, 3]) == "0.(6)"
  22.     assert to_decimal([5, 2]) == "2.5"
  23.     assert to_decimal([6, 4]) == "1.5"
  24.     assert to_decimal([22, 4]) == "5.5"
  25.     assert to_decimal([1, 100]) == "0.01"
  26.     assert to_decimal([1, 20]) == "0.05"
  27.     assert to_decimal([1, 300]) == '0.00(3)'
  28.     assert to_decimal([700, 351]) == '1.(994301)'
  29.     assert to_decimal([999, 123]) == '8.(12195)'
  30.     assert to_decimal([20, 6]) == "3.(3)"
  31.     assert to_decimal([11, 13]) == "0.(846153)"
  32.     assert to_decimal([22, 13]) == "1.(692307)"
  33.     assert to_decimal([18, 23]) == "0.(7826086956521739130434)"
  34.     assert to_decimal([30, 23]) == "1.(3043478260869565217391)"
  35.     assert to_decimal([10, 12]) == "0.8(3)"
  36.     assert to_decimal([41, 12]) == "3.41(6)"
  37.     assert to_decimal([1, 97]) == '0.(010309278350515463917525773195876288659793814432989690721649484536082474226804123711340206185567)'
  38.     assert to_decimal([420, 294420]) == '0.(0014265335235378031383737517831669044222539229671897289586305278174037089871611982881597717546362339514978601997146932952924393723252496433666191155492154065620542082738944365192582025677603423680456490727532097004279600570613409415121255349500713266761768901569186875891583452211126961483594864479315263908701854493580599144079885877318116975748930099857346647646219686162624821683309557774607703281027104136947218259629101283880171184022824536376604850213980028530670470756062767475035663338088445078459343794579172610556348074179743223965763195435092724679029957203994293865905848787446504992867332382310984308131241084165477888730385164051355206847360912981455064194008559201141226818830242510699)'
  39.     t2 = time()
  40.     print("Tiempo de ejecucion %0.3fs" % (t2 - t1))
  41.     print("Todos los tests completados")
  #2 (permalink)  
Antiguo 11/02/2014, 10:15
 
Fecha de Ingreso: febrero-2011
Mensajes: 54
Antigüedad: 13 años, 8 meses
Puntos: 18
Respuesta: Desafíos 2014 - Semana 3

Ahí va:

Código Python:
Ver original
  1. def to_decimal(fraction):
  2.  
  3.     numerator, denominator = fraction
  4.     x = numerator // denominator
  5.     numerator = 10 * (numerator - x * denominator)
  6.     solucion = str(x)
  7.     solucion += '.'
  8.  
  9.     pasos = {}
  10.  
  11.     while numerator > 0:
  12.         previo = pasos.get(numerator, None)
  13.         if previo is not None:
  14.             indice_repe = previo
  15.             no_repe = solucion[:indice_repe]
  16.             repe = solucion[indice_repe:]
  17.             return no_repe + '(' + repe + ')'
  18.         pasos[numerator] = len(solucion)
  19.         v = numerator // denominator
  20.         solucion += str(v)
  21.         numerator -= v * denominator
  22.         numerator *= 10
  23.     return solucion
  24.    
  25.  
  26.  
  27. #These "asserts" using only for self-checking and not necessary for auto-testing
  28. if __name__ == '__main__':
  29.     from time import time
  30.     t1 = time()
  31.     assert to_decimal([1, 3]) == "0.(3)"
  32.     assert to_decimal([3, 6]) == "0.5"
  33.     assert to_decimal([2, 6]) == "0.(3)"
  34.     assert to_decimal([5, 3]) == "1.(6)"
  35.     assert to_decimal([3, 8]) == "0.375"
  36.     assert to_decimal([7, 11]) == "0.(63)"
  37.     assert to_decimal([29, 12]) == "2.41(6)"
  38.     assert to_decimal([11, 7]) == "1.(571428)"
  39.     assert to_decimal([23, 2]) == "11.5"
  40.     assert to_decimal([2, 21]) == "0.(095238)"
  41.     assert to_decimal([1, 17]) == "0.(0588235294117647)"
  42.     assert to_decimal([58, 23]) == "2.(5217391304347826086956)"
  43.     assert to_decimal([2, 3]) == "0.(6)"
  44.     assert to_decimal([5, 2]) == "2.5"
  45.     assert to_decimal([6, 4]) == "1.5"
  46.     assert to_decimal([22, 4]) == "5.5"
  47.     assert to_decimal([1, 100]) == "0.01"
  48.     assert to_decimal([1, 20]) == "0.05"
  49.     assert to_decimal([1, 300]) == '0.00(3)'
  50.     assert to_decimal([700, 351]) == '1.(994301)'
  51.     assert to_decimal([999, 123]) == '8.(12195)'
  52.     assert to_decimal([20, 6]) == "3.(3)"
  53.     assert to_decimal([11, 13]) == "0.(846153)"
  54.     assert to_decimal([22, 13]) == "1.(692307)"
  55.     assert to_decimal([18, 23]) == "0.(7826086956521739130434)"
  56.     assert to_decimal([30, 23]) == "1.(3043478260869565217391)"
  57.     assert to_decimal([10, 12]) == "0.8(3)"
  58.     assert to_decimal([41, 12]) == "3.41(6)"
  59.     assert to_decimal([1, 97]) == '0.(010309278350515463917525773195876288659793814432989690721649484536082474226804123711340206185567)'
  60.     assert to_decimal([420, 294420]) == '0.(0014265335235378031383737517831669044222539229671897289586305278174037089871611982881597717546362339514978601997146932952924393723252496433666191155492154065620542082738944365192582025677603423680456490727532097004279600570613409415121255349500713266761768901569186875891583452211126961483594864479315263908701854493580599144079885877318116975748930099857346647646219686162624821683309557774607703281027104136947218259629101283880171184022824536376604850213980028530670470756062767475035663338088445078459343794579172610556348074179743223965763195435092724679029957203994293865905848787446504992867332382310984308131241084165477888730385164051355206847360912981455064194008559201141226818830242510699)'
  61.     t2 = time()
  62.     print("Tiempo de ejecucion %0.3fs" % (t2 - t1))
  63.     print("Todos los tests completados")

Gracias.

Etiquetas: semana
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 09:11.