Saltar al contenido

Retos de programacion


alucard2011

Recommended Posts

publicado

Bienvenido DigitalBoy un placer saludarte.

Anexo un nuevo reto:

Centro de masas

Se está estudiando un enjambre de N luciérnagas. Cada luciérnaga se mueve en línea recta a velocidad constante. Usted se encuentra en el centro del universo, en la posición (0, 0, 0). Todas las luciérnagas tienen la misma masa, y se desea saber a qué distancia mínima desde su ubicación (el origen de coordenadas) se llega a encontrar el centro del enjambre.

Se conoce la posición y la velocidad de cada luciérnaga en t = 0, y pero sólo se está interesados ​​en instantes t >= 0. Las luciérnagas tienen velocidad constante, y pueden moverse libremente a través de todo el espacio. Siendo M(t) la ubicación del centro de masa de las luciérnagas N en el momento t, d(t) la distancia entre su posición y M(t) en el instante t. Debe encontrar el valor mínimo de d(t), Dmin

Entrada

La primera línea de entrada contiene un único entero T, el número de casos de prueba. Cada caso de prueba se inicia con una línea que contiene un entero N, la cantidad de luciérnagas, seguido por N líneas de la forma

x y z vx vy vz

Cada una de estas líneas se describe una luciérnaga: (x, y, z) es su posición inicial en el instante t = 0, y (vx, vy, vz) es su velocidad.

Salida

Para cada caso de prueba, la salida será

Case #X: dmin tmín

donde X es el número de caso de prueba, a partir de 1. Cualquier respuesta con un error absoluto o relativo de un máximo de 10-5, serán aceptable.

Límites

Todos los números en la entrada serán enteros.

1 <= t <= 100

Los valores de x, y, z, vx, vy y vz será entre -5000 y 5000, ambos inclusive.

Conjunto de datos pequeño

3 <= n <= 10

Conjunto de datos grande

3 <= n <= 500

Entrada 3

3

3 -4 0 0 0 3

-3 -2 -1 3 0 0

-3 -1 2 0 3 0

3

-5 0 0 1 0 0

-7 0 0 1 0 0

-6 3 0 1 0 0

4

1 2 3 1 2 3

3 2 1 3 2 1

1 0 0 0 0 -1

0 10 0 0 -1 -10

Salida

Caso #1: 0.00000000 1.00000000

Caso #2: 1.00000000 6.00000000

Caso #3: 3.36340601 1.00000000

Notas

Teniendo en cuenta los puntos N (xi, yi, zi), su centro de masa es el punto (xc, yc, zc),que cumple:

xc = (x1 + x2 + ... + xn) / N

yc = (y1 + y2 + ... + yn) / N

zc = (z1 + z2 + ... + Zn) / N

espero y esta vez no tenga errores en los datos :culpability: saludos.

publicado

Solución en lenguaje PHP:

<?php

function teclado_movil($mensaje_deseado){

//Inicializar el teclado
$key = array();
$char = ord('a');

// Guardo las teclas que corresponden a cada letra
for($tecla = 2; $tecla <=9; $tecla++){
//Todas las teclas tienen 3 letras excepto la 7 y la 9 que tienen 4
$hasta = ($tecla == 7 || $tecla == 9)? 4 : 3 ;
for($pulsar = 1; $pulsar <= $hasta; $pulsar){
$key[$char++] = array('tecla' => $tecla, 'pulsar' => $pulsar++);
}
}

//Para el espacio (tecla 0)
$tecla = 0;
$pulsar = 1;
$key[ord(' ')] = array('tecla' => $tecla, 'pulsar' => $pulsar++);

//Transformar string en array
$letras = str_split ($mensaje_deseado);
foreach($letras as $letra){
//Obtengo la tecla que le corresponde y la cantidad de pulsaciones
$tecla = $key[ord($letra)]['tecla'];
$pulsar = $key[ord($letra)]['pulsar'];
//Si es la misma tecla que la anterior va espacio
if($tecla == $tecla_anterior)
$respuesta .= ' ';
//Presiono la tecla la cantidad de veces necesaria
for($i = 0; $i < $pulsar; $i++){
$respuesta .= $tecla;
}
//Antes de seguir recuerdo a esta tecla como la anterior
$tecla_anterior = $tecla;
}
return $respuesta;
}

//Cantidad de casos
$N = $_REQUEST['N'];

//Mensajes
$mensajes = $_REQUEST['mensajes'];

for($i = 1; $i <= $N; $i++){
$mensaje_deseado= $mensajes[$i];
$respuesta = teclado_movil($mensaje_deseado);
echo "Caso #$i: $respuesta <br/>";
}
?>
[/PHP]

Un codigo que tenga menos lineas... no necesariamente significa que se va a ejecutar mas rapidamente! A veces se requieren de mas lineas para optimizar una tarea...

Por ejemplo el codigo de [b][b]verzulsan[/b][/b] (muy bueno!) se ve mas compacto debido al anidamiento de funciones, cosa que si alguien va empezando en la programacion y ve ese codigo se quedara con la cara de what!

Esta es mi solucion en Python:

[CODE]
def msn(cad):
teclas = {'.':1, 'abc':2, 'def':3, 'ghi':4, 'jkl':5, 'mno':6, 'pqrs':7, 'tuv':8, 'wxyz':9, ' ':0}
texto = ""
for letra in cad:
for key, val in teclas.items():
if letra in key:
texto += str(val) * (key.find(letra)+1)
return texto
[/CODE]

Funciono, pense que no lo lograria! Me alegro de haber dejado de lado PHP, seguire con Python!

publicado

Funciono, pense que no lo lograria! Me alegro de haber dejado de lado PHP, seguire con Python!

Muy buena amigo el caso es que nos entretengamos un rato y porque no alegrarnos como en los tiempos de escuela de resolver este tipo de problemas un saludo.

publicado

Muy buena amigo el caso es que nos entretengamos un rato y porque no alegrarnos como en los tiempos de escuela de resolver este tipo de problemas un saludo.

jajaja! diablos intente resolverlo en vba con el mismo enfoque de python... y me quebre jajaja! mejor suerte para la proxima!

publicado
jajaja! diablos intente resolverlo en vba con el mismo enfoque de python... y me quebre jajaja! mejor suerte para la proxima!

Hola digitalboy,

me alegra ver que también eres un maestro en Python.

Estoy estudiando con cuidado tu función, impresionante. No sé si tuviste esto en cuenta:

Para introducir una secuencia de dos caracteres a partir de la misma tecla, el usuario debe hacer una pausa antes de pulsar el botón una segunda vez. Por ejemplo, 2 2 indica AA mientras que 22 indica B (se muestra un "carácter de espacio" para indicar una pausa).

hi = 44 444

yes = 999337777

foo bar = 333666 6660 022 2777

hello world = 4433555 555666096667775553

(No he podido entender el porque de 'foo bar' = '333666 6660 022 2777', ¿estará esto bien Alucard? ¿No debería ser '333666 666022 2777'?)

Y aprovechándome un poco del conocimiento de Digitalboy, dejo acá mi intento en Python:

def msn2(cad, p = ''):

cod = ('.abcdefghijklmnopqrstuvwxyz ',
'1222333444555666777788899990')

if cad:
pos = cod[0].index(cad[:1])
num = cod[1][pos]
return ' '*(num==p) + cod[1][cod[1].find(num):pos+1] + msn2(cad[1:],num)
else:
return ''[/CODE]

No sé si en VBA se pueda hacer algo similar, igual ahora no dispongo de un equipo con Windows/Office/Excel/VBA, así que no puedo hacer pruebas... en cuanto pueda hago unos borradores (si el tiempo lo permite), estoy seguro que también se podrá hacer algo con la magia de la recursividad en VBA, aunque no se si tan conciso como en Python.

Te dejo, amigo Digitalboy, una rutina que escribí para probar las funciones de acuerdo con los casos de prueba que nos presentó Alucard:

[CODE]def test(*msn):

testCases = {'hi':'44 444',
'yes':'999337777',
'foo bar':'333666 6660 022 2777',
'hello world':'4433555 555666096667775553'}

for case in testCases.items():
print '\n =\t'.join(case)
for f in msn:
r = f(case[0])
print ' %s\t%s\t%s' %(f.__name__, r, ':)' if r==case[1] else ':(')[/CODE]

Con ella he hecho las pruebas con las dos funciones (msn y msn2):

[CODE]test(msn, msn2)[/CODE]

(Espero no molestar a nadie ya que no he aportado nada ni de VBA ni de Excel, como dije justo ahora no cuento con la herramienta).

Un saludo para todos, me aprovecho de este tema para que me vean acá junto a tan ilustres maestros de Excel/VBA.

publicado

mjrofra bienvenido que bueno que te unes y creeme molestia no debe de haber los retos los subi para hacer algo diferente en el foro y fue recordando que ya lo habian hecho antes Macro Antonio y Digitalboy, mas que nada para salir de la monotonia del foro y lo que comentas del texto "foo bar" (si tiene doble espacio) es un tipo de confucion hecha para el programador para forsarlo a dejar el espacio (o pausa en la simulacion de escritura en el celular) y que muchos por las prisas de hacer el programa no se llegan a fijar.

Un saludo muy buena la plantilla de datos como dice digitalboy un poco mas entendible para los que apenas se inician en la programacion.

P.D. No se si sea el unico pero he tenido algunos problemas al intentar de ingresar al foro hay veces que no me aparece la paginaweb.

publicado

solucion en Python:


def msn(cad):
teclas = {'.':1, 'abc':2, 'def':3, 'ghi':4, 'jkl':5, 'mno':6, 'pqrs':7, 'tuv':8, 'wxyz':9, ' ':0}
texto = ""
for letra in cad:
for key, val in teclas.items():
if letra in key:
texto += str(val) * (key.find(letra)+1)
return texto
[/CODE]

!

jajaja! diablos intente resolverlo en vba con el mismo enfoque de python... y me quebre jajaja! mejor suerte para la proxima!

Hola digitalboy, he traducido tu función a VBA lo mejor que he podido, a ver si te convence. Le falta tomar en cuenta el espacio al repetir tecla.

[CODE]Function msn(cad As String) As String
Dim teclas() As String: teclas = Split("0 ;1.;2abc;3def;4ghi;5jkl;6mno;7pqrs;8tuv;9wxyz", ";", , 1)
For i = 1 To Len(cad)
For j = 0 To UBound(teclas) - 1
If InStr(1, teclas(j), Mid(cad, i, 1), 1) Then
Res = Res & String(InStr(1, teclas(j), Mid(cad, i, 1), 1) - 1, "" & j & "")
End If
Next j
Next i
msn = Res
End Function[/CODE]

Saludos.

PD-EDIT: Saludos para ti también Mauricio, hacía tiempo que no coincidíamos :rolleyes: :loyal:

publicado

Hola digitalboy, he traducido tu función a VBA lo mejor que he podido, a ver si te convence. Le falta tomar en cuenta el espacio al repetir tecla.

La verdad no hacia falta convencer a nadie! tu anterior codigo me parecio muy bueno, pero veo que en este no solo disminuiste la cantidad de lineas de codigo si no que queda mas claro su funcionamiento! Excelente!

La funcion String me tomo por sorpresa, no la conocia, similar a Space, me pregunto si habra alguna que repita la palabra completa? Si que hay muchas funciones que provee VBA, de las cuales solo se unas cuantas! Nunca se termina de aprender!

Una observacion en tu codigo:

Una vez que entres en el if y despues de concatenar a res, agrega un Exit For para salir del ciclo y empezar la evaluacion del siguiente caracter y no gastar tiempo en recorrer el resto de las opciones, aunque en este problema es casi indiferente, debido a la breve cantidad de elementos a evaluar!

publicado

Lo de convencerte era una expresión como diciendo “es lo que intentabas hacer?” y lo del Exit For lo suelo poner cuando quiero acelerar la velocidad como dices, solo que en este caso estaba intentando clonar tu función.

Realmente como mas se aprende es jugueteando con el código de otros y ayudando a la gente :very_drunk:

Me alegra que te haya gustado.

Saludos compañero.

publicado

Hola de nuevo,

como lo prometido es deuda (y si aún vale de algo), acá está la versión en VBA del código que escribí hace un rato en Python (en respuesta a mi amigo Digitalboy) para el primer reto:

Public Function msn2(ByVal strCad As String, Optional ByVal p As String) As String

Const L = ".abcdefghijklmnopqrstuvwxyz "
Const V = "1222333444555666777788899990"

Dim num As String

If Len(strCad) Then
num = Mid(V, InStr(L, Left(strCad, 1)), 1)
msn2 = IIf(num = p, " ", "") & _
Mid(V, InStr(V, num), InStr(L, Left(strCad, 1)) - InStr(V, num) + 1) & _
msn2(Mid(strCad, 2), num)
End If

End Function[/CODE]

En las constantes L (letras) y V (valores) se puede mapear el teclad según la disposición que se quiera.

Saludos a todos.

publicado

me alegra ver que también eres un maestro en Python.

Estoy estudiando con cuidado tu función, impresionante. No sé si tuviste esto en cuenta:

hi = 44 444

yes = 999337777

foo bar = 333666 6660 022 2777

hello world = 4433555 555666096667775553


def msn2(cad, p = ''):
cod = ('.abcdefghijklmnopqrstuvwxyz ',
'1222333444555666777788899990')

if cad:
pos = cod[0].index(cad[:1])
num = cod[1][pos]
return ' '*(num==p) + cod[1][cod[1].find(num):pos+1] + msn2(cad[1:],num)
else:
return ''
[/CODE]

No sé si en VBA se pueda hacer algo similar, igual ahora no dispongo de un equipo con Windows/Office/Excel/VBA, así que no puedo hacer pruebas... en cuanto pueda hago unos borradores (si el tiempo lo permite), estoy seguro que también se podrá hacer algo con la magia de la recursividad en VBA, aunque no se si tan conciso como en Python.

Primero que nada... gracias por lo de maestro! Pero aun estoy en principiante, aun asi aqui seguimos, haciendo nuestros pininos en python!

Veo que ya has estudiado python, desde aquella vez que me preguntaste sobre DataNitro me quede con la duda de si lo habias instalado o no y sobre todo si ya habias probado.... ya veo que si? Que te parece, cual es tu opinion sobre este lenguaje?

Pasando al codigo... si se me olvido lo del espacio, sorry! no lei bien! muy bueno tu enfoque recursivo, me tomo por sorpresa al igual que la intruccion:

[CODE]
' '*(num==p)
[/CODE]

Te dejo, amigo Digitalboy, una rutina que escribí para probar las funciones de acuerdo con los casos de prueba que nos presentó Alucard:

[CODE]
def test(*msn):
testCases = {'hi':'44 444',
'yes':'999337777',
'foo bar':'333666 6660 022 2777',
'hello world':'4433555 555666096667775553'}

for case in testCases.items():
print '\n =\t'.join(case)
for f in msn:
r = f(case[0])
print ' %s\t%s\t%s' %(f.__name__, r, ':)' if r==case[1] else ':(')[/CODE]

Con ella he hecho las pruebas con las dos funciones (msn y msn2):

[CODE]
test(msn, msn2)
[/CODE]

Me dejaste con el ojo cuadrado! Eso demuestra que todo en python es un objeto! interesante la forma en que llamaste a las funciones y mostraste las diferencia, eso me recuerda al operador ternario de C, es acaso esta la version Python, hace tiempo busque en internet y encontre que no existia, este aporte tuyo me servira de mucho!

Bueno aqui esta la version corregida de mi codigo Python, la cual agrega espacios (creo que debe haber alguna forma mas pythonica, pero aun estoy en curva de aprendizaje):

[CODE]
def msn(cad):
teclas = {'.':1, 'abc':2, 'def':3, 'ghi':4, 'jkl':5, 'mno':6, 'pqrs':7, 'tuv':8, 'wxyz':9, ' ':0}
texto = ""
for i, letra in enumerate(cad):
for key, val in teclas.items():
if letra in key:
if i and cad[i-1] in key:
texto += ' '
texto += str(val) * (key.find(letra)+1)
break
return texto
[/CODE]

(Espero no molestar a nadie ya que no he aportado nada ni de VBA ni de Excel, como dije justo ahora no cuento con la herramienta).

A mi no me molesta! al contrario, gracias por no dejarme solo y tambien me disculpo se que es el foro de Excel pero estos problemas me sirven para aplicar y profundizar en Python.

[color=blue]- - - - - Mensaje combinado - - - - -[/color]

Aqui! esta mi version simplificada en VBA, inpirandome en los codigos de [b][b]verzulsan[/b][/b] y [b][b][color=#0000FF]mjrofra[/color][/b][/b]:

[CODE]
Function to_msn(cad As String, code As String, Optional k As Integer = 1, Optional group As String) As String
If k > Len(cad) Then to_msn = vbNullString: Exit Function
If k > 1 Then If InStr(1, group, Mid(cad, k, 1)) > 0 And InStr(1, group, Mid(cad, k - 1, 1)) > 0 Then texto = texto & " "
For Each i In Split(code, "|")
pos = InStr(1, i, Mid(cad, k, 1))
If pos > 0 Then to_msn = texto & String(pos, Right(i, 1)) & to_msn(cad, code, k + 1, CStr(i)): Exit Function
Next i
End Function

Sub prueba()
Debug.Print to_msn("hello world", " 0|.1|abc2|def3|ghi4|jkl5|mno6|pqrs7|tuv8|wxyz9")
End Sub
[/CODE]

Logre hacer la funcion en 8 lineas! La verdad no me gusto, sacrifique comprension en el codigo. Me hizo sufrir lo de la recursion, no estoy muy habituado a ella... veo que se puede reducir codigo con ella, pero se sobrecarga la memoria en cada llamada...

Saludos!

publicado

hola de nuevo,

...veo que ya has estudiado python, desde aquella vez que me preguntaste sobre DataNitro me quede con la duda de si lo habias instalado o no y sobre todo si ya habias probado.... ya veo que si? Que te parece, cual es tu opinion sobre este lenguaje?

lamento no haber respondido en esa ocasión, cuando volví ya habían dado por solucionado el tema y lo habían cerrado.

Un poco tarde, te respondo sin mucho detalle: alguna vez instalé el DataNitro, pero la verdad no me gustó mucho (por eso te preguntaba). Cada vez trabajo menos con Excel, así que igual ya no tengo mucha necesidad y si es el caso, lo que he hecho siempre (no me gusta mucho tener el Excel cargado con complementos) es usar los módulos xlrd y xlwr o simplemente trabajo con archivos de texto (que puedo leer o guardar con Excel) y ya :). En realidad, no he visto aún la necesidad de hacer algo en Excel que no pueda hacer con VBA, así que no me complico y mi interacción Python-Excel es más bien poca, ya sea porque si uso Excel uso VBA o porque sencillamente no uso Excel.

Mi opinión sobre Python... bueno, con decirte que ya casi ni uso Excel :). Quizás lo que menos me gusta de Excel (y de Microsoft en general) es el costo. Muchas cosas antes las hacia sino con Excel, con R. Sin embargo, para usar Excel debo pagar por la licencia y para usar R la curva de aprendizaje es alta (aunque me gusta mucho ya casi tampoco lo uso).

publicado

Impresionante los dos códigos:

Mauricio, muy bien usada la recursividad y muy elegante la solución. Digitalboy, el tuyo me ha dado dolor de cabeza entenderlo, parecía un galimatías inicialmente jajaja, muy bien usada también la recursividad.

Ambos podéis llevar con honor el título de maestro.

Saludos.

publicado

Un poco tarde, te respondo sin mucho detalle: alguna vez instalé el DataNitro, pero la verdad no me gustó mucho (por eso te preguntaba). Cada vez trabajo menos con Excel, así que igual ya no tengo mucha necesidad y si es el caso, lo que he hecho siempre (no me gusta mucho tener el Excel cargado con complementos) es usar los módulos xlrd y xlwr o simplemente trabajo con archivos de texto (que puedo leer o guardar con Excel) y ya :). En realidad, no he visto aún la necesidad de hacer algo en Excel que no pueda hacer con VBA, así que no me complico y mi interacción Python-Excel es más bien poca, ya sea porque si uso Excel uso VBA o porque sencillamente no uso Excel.

Mi opinión sobre Python... bueno, con decirte que ya casi ni uso Excel :). Quizás lo que menos me gusta de Excel (y de Microsoft en general) es el costo. Muchas cosas antes las hacia sino con Excel, con R. Sin embargo, para usar Excel debo pagar por la licencia y para usar R la curva de aprendizaje es alta (aunque me gusta mucho ya casi tampoco lo uso).

Si ese datanitro era muy pesado y no senti que tuviera una buena interaccion con el modelo de objetos de Excel! asi que ya has usado los modulos xlrd y xlwr solo los use una vez, realmente funcionan aunque no con archivos .xlsx

Asi que sabes R! osea que eres un maestro en la estadistica, un amigo me lo recomendo para introducirme en el mundo de la estadistica pero aun no he tenido la oportunidad de probarlo, de echo hace poco me tope con una pagina, la escuela del codigo, donde viene un curso interactivo de R:

Try R

No pase de la primera leccion! jajaj por el momento estoy concentrado en Python y quiero terminar de leer un libro de VBA/Excel que no heterminado y despues de ahi a seguirme con uno de graficos en Excel... el caso es que tengo una biblioteca entera por leer!

Tambien Ruby me ha gustado su sintasix, me parece que te da mas opciones que python, segun su inventor va mas enfocado a hacer la programacion mas divertida para el programador... tendra que esperar por el momento!

Saludos!

- - - - - Mensaje combinado - - - - -

Mauricio, muy bien usada la recursividad y muy elegante la solución. Digitalboy, el tuyo me ha dado dolor de cabeza entenderlo, parecía un galimatías inicialmente jajaja, muy bien usada también la recursividad.

Ambos podéis llevar con honor el título de maestro.

Saludos.

Concuerdo contigo:

Muy elegante la soluicion de mauricio, el mio... jajaja, si parece un galimatias! Esto de reducir codigo sin que pierda comprension y se ejecute de manera optima es todo un arte!

Creo que por el momento me conformare con conseguir que mi codigo sea comprensible y lo mas optimo posible, lo demas sera ganancia!

Aplicare los primeros 9 puntos del Zen de Python:

  1. Hermoso es mejor que feo.
  2. Explícito es mejor que implícito.
  3. Simple es mejor que complejo.
  4. Complejo es mejor que complicado.
  5. Plano es mejor que anidado.
  6. Disperso es mejor que denso.
  7. La legibilidad cuenta.
  8. Los casos especiales no son suficientemente especiales como para romper las reglas.
  9. Aunque lo pragmático gana a la pureza.

Archivado

Este tema está ahora archivado y está cerrado a más respuestas.

×
×
  • Crear nuevo...

Información importante

Echa un vistazo a nuestra política de cookies para ayudarte a tener una mejor experiencia de navegación. Puedes ajustar aquí la configuración. Pulsa el botón Aceptar, si estás de acuerdo.