[Código-Python]Obtener dígito verificador del RUT en Chile - JaAViEr

Iniciado por 0x5d, 9 Febrero 2012, 21:03 PM

0 Miembros y 1 Visitante están viendo este tema.

0x5d

Hola, buen día !

Tras unas merecidas vacaciones vengo de vuelta con cosas para programar, con la cabeza ya más despejada :P.

Visitando el blog del colega <a href="http://twitter.com/isseu">@isseu</a>, me encuentro con un artículo llamado "Como sacar dígito verificador de rol único tributario (RUT)". Me pareció interesante y me puse a leer atentamente su explicación y me animé a pasarlo a Python, en su blog está en javascript, pero yo como buen amante de Python lo hice en él :)

Código (python) [Seleccionar]

# -*- coding: utf-8 -*-
rut = []
ingresar = [rut.append(numeros) for numeros in raw_input('RUT ::>')]
rut.reverse()
recorrido = 2
multiplicar = 0
for x in rut:
multiplicar+=int(x)*recorrido
if recorrido==7: recorrido = 1
recorrido+=1
modulo = multiplicar%11
resultado = 11-modulo
if resultado == 11: digito=0
elif resultado == 10: digito="K"
else: digito=resultado
print "Dígito verificador:",digito


Espero sea de su agrado ! :D

Fuente : http://rootcodes.com/pythonobtener-digito-verificador-del-rut-en-chile/

Saludos, Javier.
¡ SIGUEME EN TWITTER -> @JavierEsteban__ !

Karcrack

#1
Tenía un rato libre, así que he reformulado el algoritmo usando la información que hay en Wikipedia. Espero no te moleste :P
Código (python) [Seleccionar]
rut = reversed(map(int,raw_input('RUT ::>')))
m = [2,3,4,5,6,7]

d = sum([n*m[i%6] for i,n in enumerate(rut)])
d %= 11

if (d==1):
   d = 'K'
else:
   d = 11-d
   
print d


Y la versión reducida: (Me encanta reducir código Python :P)
Código (python) [Seleccionar]
d=sum([int(n)*(i%6+2)for i,n in enumerate(raw_input()[::-1])])%11
print'K'if(d==1)else 11-d

0x5d

Cita de: Karcrack en 10 Febrero 2012, 03:27 AM
Tenía un rato libre, así que he reformulado el algoritmo usando la información que hay en Wikipedia. Espero no te moleste :P
Código (python) [Seleccionar]
rut = reversed(map(int,raw_input('RUT ::>')))
m = [2,3,4,5,6,7]

d = sum([n*m[i%6] for i,n in enumerate(rut)])
d %= 11

if (d==1):
    d = 'K'
else:
    d = 11-d
   
print d


Y la versión reducida: (Me encanta reducir código Python :P)
Código (python) [Seleccionar]
d=sum([int(n)*(i%6+2)for i,n in enumerate(raw_input()[::-1])])%11
print'K'if(d==1)else 11-d

Para nada ! es genial saber que usas Python y tienes buen nivel ! :D
El primer código que has usado es también posible reducirlo :
Código (python) [Seleccionar]

# -*- coding: utf-8 -*-
rut = reversed(map(int,raw_input('RUT ::>')))
d = sum([n*range(2,8)[i%6] for i,n in enumerate(rut)])
d %= 11
if (d==1):
    d = 'K'
else:
    d = 11-d
print d

Pero sin duda el segundo está genial ! :D


EDIT:
Ahora en QT4 para matar el tiempo :P
Código (python) [Seleccionar]

# -*- coding: utf-8 -*-
from PyQt4 import QtCore, QtGui
import sys

class ventana_alerta(QtGui.QWidget):
  def __init__(self, parent=None):
    QtGui.QWidget.__init__(self, parent)
    self.resize(283, 31)
    self.setWindowTitle("ALERTA!")

  def message(self, txt):
    self.txt = txt
    self.respuesta = QtGui.QLabel(self.txt, self)
    self.respuesta.setGeometry(10, 10, 260, 17)

class formulario_rut(QtGui.QWidget):

  def __init__(self, parent=None):
    QtGui.QWidget.__init__(self, parent)
    self.setWindowTitle("Digito verificador")
    self.resize(279, 36)
    self.label_rut = QtGui.QLabel("RUT", self)
    self.label_rut.setGeometry(0, 11, 59, 17)
    self.rut = QtGui.QLineEdit(self)
    self.rut.setGeometry(30, 7, 101, 23)
    self.label_verificador = QtGui.QLabel("-", self)
    self.label_verificador.setGeometry(135, 11, 16, 17)
    self.digito = QtGui.QLineEdit(self)
    self.digito.setGeometry(147, 7, 21, 23)
    self.digito.setReadOnly(True)
    self.verificar = QtGui.QPushButton("Verificar", self)
    self.verificar.setGeometry(180, 7, 92, 23)
    self.connect(self.verificar, QtCore.SIGNAL("clicked()"), self.operacion)

  def operacion(self):
    self.rut_valor = str(self.rut.text())
    if len(self.rut_valor) < 8 and len(self.rut_valor) > 9:
      creacion_alerta.message("Ingresa un rut valido por favor")
      creacion_alerta.show()
    else:
      rut = []
      ingresar = [rut.append(numeros) for numeros in self.rut_valor]
      rut.reverse()
      recorrido = 2
      multiplicar = 0
      for x in rut:
        multiplicar+=int(x)*recorrido
        if recorrido==7: recorrido = 1
        recorrido+=1
      modulo = multiplicar%11
      resultado = 11-modulo
      if resultado == 11: digito=0
      elif resultado == 10: digito="K"
      else: digito=resultado
      self.digito.setText(str(digito))

run = QtGui.QApplication(sys.argv)
creacion_alerta = ventana_alerta()
creacion_formulario = formulario_rut()
creacion_formulario.show()
run.exec_()

¡ SIGUEME EN TWITTER -> @JavierEsteban__ !