Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: Karcrack en 16 Diciembre 2010, 17:14 pm



Título: [RETO+PYTHON] A ver quien la tiene mas corta...
Publicado por: Karcrack en 16 Diciembre 2010, 17:14 pm
... la funcion! :¬¬ :xD

Consiste en convertir de la forma mas corta posible un numero decimal a su version romana... por ejemplo:
Código:
200 -> CC
1337 -> MCCCXXXVII

Espero que al menos una persona se digne a participar.. si no sera un fiasco, y destrozara mi ilusion de crear retos en el futuro :-( :-( :laugh:

I saludo! ;)


Título: Re: [RETO+PYTHON] A ver quien la tiene mas corta...
Publicado por: Novlucker en 16 Diciembre 2010, 17:50 pm
Supongo que consideramos válido el resultado solo hasta 3999 no? porque no tengo manera de escribir una línea sobre la letra si me paso de eso :xD
Tengo que tener puesto el input()?

Saludos


Título: Re: [RETO+PYTHON] A ver quien la tiene mas corta...
Publicado por: Karcrack en 16 Diciembre 2010, 17:54 pm
Si, solo hasta el 3999... y si, tambien has de añadir un input() :)


Título: Re: [RETO+PYTHON] A ver quien la tiene mas corta...
Publicado por: Novlucker en 16 Diciembre 2010, 18:47 pm
No se por que, pero se me hace que tienes algo mucho más corto :¬¬
No he controlado es que los números no sean mayores a 3999, pero no creo que sea necesario mientras funcione para los de abajo :xD
Código
  1. n=input()
  2. s=1000,500,100,50,10,5,1
  3. l='MDCLXVI'
  4. r=''
  5. for i in range(7):
  6.    if n>s[i]:
  7.        r+=n/s[i]*l[i]
  8.        n%=s[i]
  9. print(r)
No sabía si contaban tabulaciones y saltos de línea, así que tal vez podría ahorrarme un par de caracteres :xD

Saludos


Título: Re: [RETO+PYTHON] A ver quien la tiene mas corta...
Publicado por: Karcrack en 16 Diciembre 2010, 22:07 pm
Muy bueno :)
Doy un par de dias y si nadie mas se anima a participar pongo mi super codigo :laugh: :laugh:

Un saludo :D


Título: Re: [RETO+PYTHON] A ver quien la tiene mas corta...
Publicado por: Novlucker en 16 Diciembre 2010, 22:31 pm
Eso quiere decir que tienes uno más corto? cuanto más corto?
Ese lo hice en un rato, ya vas a ver! >:D


Título: Re: [RETO+PYTHON] A ver quien la tiene mas corta...
Publicado por: SmartGenius en 16 Diciembre 2010, 23:40 pm
Lo hice en batch (ya saben, me gustan los retos  :rolleyes: )

Código:
@Echo Off
Setlocal enabledelayedexpansion
Title Number to Roman Conversion

::Coded by SmartGenius

Set "R=1"
Set "R_1=. M MM MMM"
Set "R_2=. C CC CCC CD D DC DCC DCCC CM"
Set "R_3=. X XX XXX XL L LX LXX LXXX XC"
Set "R_4=. I II III IV V VI VII VIII IX"

:Input
Set /p "N=Enter Number > "
If Not Defined N Cls & Goto :Input
If 0 GEQ %N% (Echo.Fuera de Rango&Goto :Input)
If 3999 LSS %N% (Echo.Fuera de Rango&Goto :Input)

:Split
Set /a "M_O=N%%10"
Set /a "M_T=(N%%100)-M_O"
Set /a "M_C=(N%%1000)-(M_T+M_O)"
Set /a "M_M=N-(M_C+M_T+M_O)"

:Convert
Set "Sp= %M_M:~0,1%%M_C:~0,1%%M_T:~0,1%%M_O:~0,1%"
:R_to_N
If 5 EQU %R% (Set "RF=!RF:.=!"&Goto :Show)
Set /a "T=!Sp:~%R%,1!+1"
For /f "tokens=%T%" %%b in ('Echo.!R_%R%!') do (Set "RF=!RF!%%b")
Set /a "R+=1"
Goto :R_to_N

:Show
Echo. Number = %N%
Echo. Roman  = %RF%
Echo.
Pause
Exit

Aunque obviamente con las capacidaddes de los otros lenguajes se hace mas corto el codigo xD

Saludos.


Título: Re: [RETO+PYTHON] A ver quien la tiene mas corta...
Publicado por: ghastlyX en 17 Diciembre 2010, 00:10 am
Pongo una versión recursiva un poco más corta:
Código
  1. x=1000,500,100,50,10,5,1
  2. c='MDCLXVI'
  3. def f(n,p):
  4. return n/x[p]*c[p]+f(n%x[p],p+1)if n else''
  5. print f(input(),0)
Son 113 carácteres según wc.


Título: Re: [RETO+PYTHON] A ver quien la tiene mas corta...
Publicado por: lucasfava en 17 Diciembre 2010, 16:02 pm
soy novato en python, pero una idea posible seria usar una base de datos, y que revise ahí  :huh:


Título: Re: [RETO+PYTHON] A ver quien la tiene mas corta...
Publicado por: braulio-- en 17 Diciembre 2010, 16:22 pm
soy novato en python, pero una idea posible seria usar una base de datos, y que revise ahí  :huh:
No sé yo, probablemente uses mas carácteres creando la conexión y ejecutando la consulta que de otra forma.

De todas formas, no creo que eso valga.


Título: Re: [RETO+PYTHON] A ver quien la tiene mas corta...
Publicado por: ace332 en 17 Diciembre 2010, 20:20 pm
Muy buena, SmartGenius! y en batch  :o
Los codes que pusieron en Python no funcionan  :-X Para ciertos valores dan resultados erroneos. Por ejemplo, al introducir como dato 1999 devuelve como resultado MDCCCCLXXXXVIIII cuando la respuesta correcta es MCMXCIX.

Saludos y disculpen las molestias  >:D


Título: Re: [RETO+PYTHON] A ver quien la tiene mas corta...
Publicado por: Karcrack en 17 Diciembre 2010, 21:00 pm
Como dice BeetleJuice vuestros codigos dan resultados equivocados... el de Novlucker, por ejemplo, dice que 1000 es DD, siendo M en realidad...


Título: Re: [RETO+PYTHON] A ver quien la tiene mas corta...
Publicado por: Novlucker en 17 Diciembre 2010, 23:46 pm
Como dice BeetleJuice vuestros codigos dan resultados equivocados... el de Novlucker, por ejemplo, dice que 1000 es DD, siendo M en realidad...
Y por que no lo dijiste antes? :¬¬ lo probaste tanto como yo, vi que funcionaba para 1337 y listo :xD

Saludos


Título: Re: [RETO+PYTHON] A ver quien la tiene mas corta...
Publicado por: Karcrack en 18 Diciembre 2010, 00:24 am
 :laugh: Pues ale! A arreglarlo! Yo voy a ver si consigo acortar mi super codigo juasjuas >:D :xD


Título: Re: [RETO+PYTHON] A ver quien la tiene mas corta...
Publicado por: Novlucker en 18 Diciembre 2010, 00:48 am
Que nadie diga que no soy práctico :laugh:

Código
  1. n=input()
  2. s=1000,900,500,400,100,90,50,40,10,9,5,4,1
  3. l='M','CM','D','CD','C','XC','L','XL','X','IX','V','IV','I'
  4. r=''
  5. for i in range(13):
  6.    if n>=s[i]:
  7.        r+=n/s[i]*l[i]
  8.        n%=s[i]
  9. print(r)

También puedo ganar algunos caracteres haciendolo de manera recursiva como ghastlyX, pero la verdad pierde la gracia copiarle a los demás :¬¬

Saludos


Título: Re: [RETO+PYTHON] A ver quien la tiene mas corta...
Publicado por: [Izra76] en 19 Diciembre 2010, 22:40 pm
Entonces cuál es el super código más corto?


Título: Re: [RETO+PYTHON] A ver quien la tiene mas corta...
Publicado por: Karcrack en 20 Diciembre 2010, 22:37 pm
Perdon, se me murio el portatil, y he tenido que comprar otro... asi que bueno, hasta que vuelva a organizar el PC no sere capaz de reprogramar la funcioncita... Espero no olvidarme :laugh:

Por ahora gana Novlucker, ya que es el unico que ha presentado una version funcional (en Python)...


Título: Re: [RETO+PYTHON] A ver quien la tiene mas corta...
Publicado por: Gabriela en 21 Diciembre 2010, 05:48 am
Jope!!!!  :xD Con ese título quedo fuera de toda competencia!! :xD :xD :xD


Así que es Novlucker... el que va ganando, las cosas que se entera una  ;D  sobre las capacidades funcionales de los compis.  :P

Gabriela


Título: Re: [RETO+PYTHON] A ver quien la tiene mas corta...
Publicado por: Karcrack en 22 Diciembre 2010, 01:20 am
He aqui la super-version :xD
Código
  1. n=input()
  2. r=''
  3. for x,y in zip([1000,900,500,400,100,90,50,40,10,9,5,4,1],'M CM D CD C XC L XL X IX V IV I'.split()):
  4.    while n>=x:
  5.        r+=y
  6.        n-=x
  7. print r
:)


Título: Re: [RETO+PYTHON] A ver quien la tiene mas corta...
Publicado por: Novlucker en 22 Diciembre 2010, 11:03 am
Ahora si, no se me había ocurrido usar zip, ni que luego de modificar mi code para que estuviese correcto, me ahorraba 16 caracteres haciendolo con split ;D


Título: Re: [RETO+PYTHON] A ver quien la tiene mas corta...
Publicado por: ChicoMaravilla en 5 Enero 2011, 04:29 am
aquí va mi super corta verción ajajja

Código
  1. n=input()
  2. while n<11 and n>0:
  3.    if n==1:
  4.        print 'I'
  5.    if n==2:
  6.        print 'II'
  7.    if n==3:
  8.        print 'III'
  9.    if n==4:
  10.        print 'IV'
  11.    if n==5:
  12.        print 'V'
  13.    if n==6:
  14.        print 'VI'
  15.    if n==7:
  16.        print 'VII'
  17.    if n==8:
  18.        print 'VIII'
  19.    if n==9:
  20.        print 'IX'
  21.    if n==10:
  22.        print 'X'
  23.    n=input()

PD: solo funciona hasta 10 XD