Jump to content

Retos de programacion


alucard2011

Recommended Posts

Buenos dias a todos hace mucho me acuerdo que un compañero del foro Digitalboy nos regalo un reto de programacion hace poco me encontre uno igual de un concurso solo que es de lenguaje PHP lo anexo igual que como el otro reto ver el tipo de programacion en VBA. saludos. anexo el codigo respuesta.

esto con el fin de salir de lo cotidiano un poco del foro.

Problema

Teclado de móvil

El alfabeto inglés contiene 26 caracteres y los teléfonos móviles sólo tienen diez dígitos en el teclado. Varias letras se mapean en cada tecla numérica, como se muestra en la imagen inferior, de forma que se pueda escribir un mensaje con pulsaciones repetitivas. Por ejemplo, para insertar el carácter B, se deberá presionar 22. 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).

Debe crear un programa que calcule la secuencia de teclas que hay que pulsar para escribir un cierto mensaje.

Entrada

La primera línea de entrada contiene un único entero N, el número de casos de prueba.Cada caso es una línea de texto con formato

mensaje_deseado

Cada mensaje consta sólo de minúsculas de la "a" la "z" y el carácter " " (espacio, que se emite presionando cero).

Salida

Para cada caso de prueba, la salida de una línea que contiene "Caso # x:", seguido por el mensaje traducido en la secuencia de pulsaciones de teclas.

Ejemplo

Entrada

4

hi

yes

foo bar

hello world

Salida

Caso #1: 44 444

Caso #2: 999337777

Caso #3: 333666 6660 022 2777

Caso #4: 4433555 555666096667775553

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]

P.D. espero sirva como entretenimiento para los que les gustan los retos saludos

Link to post
Share on other sites

que tal verzulsan no sabia de los retos de facebook buscare unos ya que hay veces que uno se aburre y busca cosas diferentes este era de un concurso de apenas mayo de este año y si tienes razon lleva 2 espacios, me parecio correcto compartir este reto por la emulacion de la escritura como un telefono celular, espero no faltar alguna regla del foro.

Saludos tambien me acuerdo que habia un tema hace mucho en los que macro antonio creo un reto para salir de la monotonia seria bueno retomarlo pero con las funciones nuevas de excel 2010 en adelante sirve que varios nos retroalimentamos.

Link to post
Share on other sites

Reto superado en excel, el main, (en el adjunto), es solo para llamar a la función. He tomado el rango (A1:AN) como entrada de datos al main y el rango (B2:BN) como salida de datos.

Public Function CadenaToTecladoMovil(Cadena As String) As String
Dim Res As String
Dim LastNum As Integer
For i = 1 To Len(Cadena)
If LastNum <> 0 And LastNum = CInt(Left(GetSequence(Mid(Cadena, i, 1)), 1)) Then Res = Res & " "
LastNum = CInt(Left(GetSequence(Mid(Cadena, i, 1)), 1))
Res = Res & GetSequence(Mid(Cadena, i, 1))
Next
CadenaToTecladoMovil = Res
End Function
Public Function GetSequence(Letra As Variant) As String
Dim Sequence() As String
Dim Posicion As String
Sequence = Split("2;22;222;3;33;333;4;44;444;5;55;555;6;66;666;7;77;777;7777;8;88;888;9;99;999;9999", ";", , vbTextCompare)
If Letra = " " Then
GetSequence = "0"
Else
Posicion = Asc(Letra) - 97
GetSequence = Sequence(Posicion)
End If
End Function[/CODE]

tambien me acuerdo que habia un tema hace mucho en los que macro antonio creo un reto para salir de la monotonia seria bueno retomarlo pero con las funciones nuevas de excel 2010 en adelante sirve que varios nos retroalimentamos.

Nada mejor que romper la monotonía; no uso el 2010 pero recuerdo ese post, yo me apunto, eso sí, mis aportes serán de versiones inferiores o iguales a 2007.

Saludos.

Teclado Numerico.xls

Link to post
Share on other sites

Me quito el sombrero vaya que en excel el codigo tiene una reduccion significante.

y claro lo que comentaba es que como sabemos excel es enorme en cuanto a codigos desde el office 2007 tubo cambios tanto para bien como para mal nos quito algunos codigos de programacion y anexo mas a sus bibliotecas buscare algunos y como comente sera para salir de la monotonia y al igual para muchos aprender de lo nuevo que tiene en cuanto a cambios desde el 2007 en adelante saludos y espero alguien tambien tome el reto del teclado es bueno aprender varios codigos.

saludos

P.D. Muy buena la implementacion de las pulsaciones me gusto para la identificacion del 7 y del 9 :encouragement:

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

Anexo un reto mas se que lo resolveras muy rapido amigo verzulsan este es de un concurso llamado tuenti y el reto era el siguiente:

Una suma difícil

Crea un programa capaz de calcular la suma de los números que se indicarán en la entrada estándar, separados por espacios, y mostrar los resultados en pantalla. Los números pueden ser negativos, grandes y las líneas pueden contener espacios adicionales, por lo que el programa debe ser robusto.

Ejemplo de entrada

123456789012 1

2 3

4 5 -1

Ejemplo de salida

123456789013

5

8

Solución en lenguaje PHP:

<?php

function formulario()
{
//Formulario
echo "<form name='frm' method='post'
action='".$_SERVER["SCRIPT_NAME"]."'>
<textarea name='numeros' rows='10' cols='40' /></textarea>
<br /><input type='submit' name='enviar' value='Enviar' /></form>";
}

function procesa()
{
$contenido=$_POST["numeros"];

$a_total=array();

$a_cont = explode("\n",$contenido);

for($i=0;$i<count($a_cont);$i++)
{
$a_numeros=explode(" ",$a_cont[$i]);
$n=count($a_numeros);
$total=0;
for($j=0;$j<$n;$j++)
{
$total+=$a_numeros[$j];
$todos=$j+1;
if($todos==$n)
{
$a_total[]=$total;
}
}
}

//Resultado
$html="Ejemplo de Salida: <br />";
for($i=0;$i<count($a_total);$i++)
{
$html.=$a_total[$i]."<br />";
}
echo $html;

}

$haydatos=count($_POST);
if(!$haydatos)
formulario();
else
procesa();
?>[/PHP]

Link to post
Share on other sites

Pues yo también quiero jugar.



Function TextoSMS(Celda As Range) As Variant

L = "1.....ABC2..DEF3..GHI4..JKL5..MNO6..PQRS7.TUV8..WXYZ9. 0...."
For x = 1 To Len(Celda)
c = InStr(L, UCase(Mid(Celda, x, 1)))
n = Int((c - 1) / 6) + 1
v = c Mod 6
If n = 10 Then n = 0
TextoSMS = TextoSMS & String(v, "" & n & "") & " · "
Next

End Function


[/CODE]

Link to post
Share on other sites
Una suma difícil

Crea un programa capaz de calcular la suma de los números que se indicarán en la entrada estándar, separados por espacios, y mostrar los resultados en pantalla. Los números pueden ser negativos, grandes y las líneas pueden contener espacios adicionales, por lo que el programa debe ser robusto.

Ejemplo de entrada

123456789012 1

2 3

4 5 -1

Ejemplo de salida

123456789013

5

8

Function SumaConEspacios(Valor As String) As Double
SumaConEspacios = Evaluate(Replace(Valor, " ", "+"))
End Function[/CODE]

Saludos (dos grandes) Macro Antonio y verzulsan

Link to post
Share on other sites

Uishh casi lo tienes bien Antoni, el código es impresionantemente ingenioso y corto, solo te ha faltado tener en cuenta los espacios, seguramente superarías fácilmente los 10 niveles en http://chevismo.com.

Aquí va otra versión usando solo mates y un circuito lógico, menos líneas, sin función auxiliar y sin usar plantilla de datos, eso sí, mas rebuscado jejeje.

Public Function TextoSMS_vzs(Cadena As String) As String
Dim TempChar As String, actChar As String, Res As Variant, TRes As String, LastNum As Integer
For r = 0 To Len(Cadena) - 1
actChar = Mid(Cadena, r + 1, 1)
TRes = Res
For i = 0 To 7
TempChar = ""
For j = 0 To 2 + CInt(Mid(Application.Dec2Bin(5, 8), (i + 1), 1))
TempChar = TempChar & i + 2
If CInt((i * 3) + j + Int(i / 6)) = CInt(Asc(actChar) - 97) Then
If LastNum <> 0 And LastNum = i + 2 Then Res = Res & " "
LastNum = i + 2
Res = Res & TempChar
End If
Next j
Next i
If TRes = Res Then Res = Res & "0"
Next r
TextoSMS_vzs = Res
End Function[/CODE]

Saludos para ti también tuve y alucard2011

PD: (Antoni, no he conseguido ponerlo como UDF adjunto a una celda, en TextoSMS_vzs = Res, Res tenía el valor correcto pero a la celda llegaba vacía)

Teclado Numerico_v2.xls

Link to post
Share on other sites

Hola Santi y demás gente de bien:

Uishh casi lo tienes bien Antoni, el código es impresionantemente ingenioso y corto, solo te ha faltado tener en cuenta los espacios

Yo en mi teléfono tengo el espacio en el y el punto en el 1.

Te subo el archivo para que no te "canses",...jeje

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

Algo no "pirula" en tu función.

Te adjunto comparativa.

Por cierto no puedo entrar en esa web que me indicas, que por cierto ni idea de lo que es.

De texto a sms.xls

Teclado Numerico_v2.xls

Link to post
Share on other sites

El enunciado dice que solo entran minúsculas, es por eso que no te coincidían. Lo del espacio me refiero a que el enunciado dice que si presionas mismo numero 2 veces seguidas, hay que dejar un espacio que representa pausa:

3355503666 6444664666022338444777708887777022 277722233555666 662
33555036666444664666022338444777708887777022277722233555666662

2233844477770426620333444566603355503666 6444664666
22338444777704266203334445666033555036666444664666[/CODE]

Ver adjunto

PD: Lo de la página chevismo.com ya es mala suerte, nunca la había visto caída, esta mañana iba, prueba más tarde a ver si te va. Tiene una prueba inicial escondida que si no la pasas no te deja registrarte y luego ya vienen los 10 niveles.

Teclado Numerico_v2_b.xls

Link to post
Share on other sites

Ya lo he "pillao", ahora van iguales.

Function TextoSMS(Celda As Range) As Variant

L = "1.....ABC2..DEF3..GHI4..JKL5..MNO6..PQRS7.TUV8..WXYZ9. 0...."
For x = 1 To Len(Celda)
c = InStr(L, UCase(Mid(Celda, x, 1)))
n = Int((c - 1) / 6) + 1
v = c Mod 6
If n = 10 Then n = 0
If n = nn Then TextoSMS = TextoSMS & " "
TextoSMS = TextoSMS & String(v, "" & n & "")
nn = n
Next


End Function


[/CODE]

Link to post
Share on other sites

Saludos a todos que bueno que el primer ejercicio logro el cometido y aparte nos hace ver las diferentes formas de programacion de 2 grandes, muy buena UDF macro antonio.

P.D. a mi tampoco me abrio el enlace, al rato subo otro reto matematico no se porque no me dejaba entrar al foro

Amigo "Tuve" excelente respuesta bienvenido al tema

Saludos

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

ahi va otro para serles sincero a este no le entendi nadita jajajajajajajajaja dejo el reto y como en la escuela a aprender de los buenos saludos.

Palíndromo primo

Un entero se dice que es un palíndromo si es igual a su inversa. Por ejemplo, 79.197 y 324.423 son palíndromos. En esta tarea se le dará un entero N, 1 <= N <= 1.000.000. Usted debe encontrar el menor entero M tal que M <= N que es primo y M es un palíndromo N.

Por ejemplo, si N es 31, entonces la respuesta es 101.

Formato de entrada:

Un solo entero N, (1 <= N <= 1.000.000), en una sola línea.

Formato de salida:

Su salida debe consistir en un solo número entero, el más pequeño palíndromo primo mayor que o igual a N.

Ejemplo de entrada:

31

Ejemplo de salida:

101

Link to post
Share on other sites
Formato de entrada:

Un solo entero N, (1 <= N <= 1.000.000), en una sola línea.

Formato de salida:

Su salida debe consistir en un solo número entero, el más pequeño palíndromo primo mayor que o igual a N.

Ejemplo de entrada:

31

Ejemplo de salida:

101

Una posible solución

Function MenorPrimo(N As Long) As Long
Dim M As Long
Dim EsPrimo As String
M = IIf(N Mod 2 = 0, N + 1, N)

Do
If M = StrReverse(M) Then
EsPrimo = "=SUMPRODUCT(--(MOD(" & M & ",ROW(3:" & Int(Sqr(M)) & "))=0))"
If Evaluate(EsPrimo) = 0 Then
MenorPrimo = M
Exit Do
End If
End If
M = M + 2
Loop

End Function
[/CODE]

Saludos

Link to post
Share on other sites

Hola tuve, lo primero, tu función es brillante, excesivamente ingeniosa y a la altura de las paranoyas de Macro Antonio, me quito el sombrero.

Me ha tenido atrapado un buen rato para poder entenderla ya que nunca había trabajado de esta manera en VBA con las funciones nativas del Excel usando evaluate, que por cierto es la primera vez que la uso también y es simplemente genial.

Lo que me ha tenido en jaque un rato ha sido el por qué esto me funcionaba:

MsgBox Evaluate("MOD(3,ROW(3:1))")[/CODE]

Y sin embargo esto no

[CODE]MsgBox Evaluate("ROW(3:11)")[/CODE]

Eso sí, en cualquier celda, [b]=FILA(3:11)[/b], sí que funciona.

Terminé de entenderlo en el siguiente enlace donde lo explica bastante bien:

Formula Forensics looks at Is my number a Prime Number? | Chandoo.org - Learn Microsoft Excel Online

Tampoco sabía, como indican en el enlace a chandoo , que la formula Row devuelve una colección de objetos (además del numero de fila) que pensaba que era lo único para lo que servía la función =FILA(), empiezo a pensar seriamente que debería tomar unas clases de Excel.

Ya por último, el iif de una sola línea IIf(N Mod 2 = 0, N + 1, N), nunca antes lo había visto en VBA o al menos hasta hoy no me había fijado, solo lo había usado en javascript y pensé que era exclusivo de otros lenguajes, Expresión = (A ==100) ? true : false;. Con el if de una línea se puede ahorrar mucho en código, muy útil.

Un saludo.

Link to post
Share on other sites

Buen dia a todos dejo otro reto del mismo concurso Tuenti para que se desaburran este fin de semana saludos a todos

La abuela binaria

Yuki es una chica con suerte. Su abuela Chika es una encantadora anciona, propietaria de una granja de ovejas, experta repostera y ninja de la costura, y tiene un avellanero detrás de casa. Yuki pide avellanas continuamente, pero su sabia abuela no permite que Yuki coma demasiadas para que no caiga enferma.

Chika es aficionada a los números binarios, así que propuso este juego a Yuki: ella diría un número N y Yuki escogería dos números, x e y, tales que x + y = N. Entonces, Chika daría a Yuki tantas avellanas como la cantidad de unos que tengan x e y en base 2. Por ejemplo, si Chika propone 7 y Yuki escoge 3 y 4, recibiría 2 (porque 3 en base 2 es 11) y 1 (porque 4 en base 2 es 100): 3 avellanas.

Yuki quiere saber la máxima cantidad de avellanas que podría obtener de Chika.

Entrada: La primera línea es el número de casos, y a continuación, cada caso en una nueva línea (un número entero, entre 0 y 10^19, que puede no caber en un entero de 32 bits).

Salida: Para cada caso, una línea conteniendo "Caso #x: M", donde x es el número de caso (desde 1) y M es el número máximo de avellanas.

Ejemplo de entrada:

3

1

6

Salida correspondiente:

Caso #1: 1

Caso #2: 4

Caso #3: 14

Les dejo el link del concurso Tuenti

https://contest.tuenti.net/Questions

o si aun quieren los sigo subiendo traducidos saludos

Link to post
Share on other sites

Hola Alucard2011, te falta el caso 3 en el enunciado

3 = Número de casos de entrada

1 : Caso 1

6 : Caso 2

2135 : Caso 3

Para obtener la mayor cantidad de unos' date=' uno de los sumandos debe tener la mayor cantidad de bits posibles y todos a 1 (he llegado a esta conclusion por el cuento de la vieja, y no me refiero al cuento de Chika xD), el otro sumando tan solo ha de restar este número con el [b']N[/b]úmero Inicial (NI). La mayor cantidad de bits posibles es la mayor potencia de los números naturales a la que se puede elevar 2 sin que sobrepase el (NI) y esto se obtiene sacando la parte entera del logaritmo en base dos de (NI).

Para numeros menores de 1022

Public Function MaxAvellanas_1022(Num As Integer) As Integer
Dim sum1 As Long, sum2 As Long, Cadena As String
sum1 = (2 ^ (Int(Log(Num) / Log(2)))) - 1
sum2 = Num - sum1
Cadena = Application.Dec2Bin(sum1, 10) & Application.Dec2Bin(sum2, 10)
MaxAvellanas_1022 = Len(Replace(Cadena, "0", "", , , vbTextCompare))
End Function[/CODE]

Para números mayores que 1022, he usado una función conversor dec2bin extraída de esta web

[CODE]Function d2b(numero As Long) As String
While numero >= 2
d2b = CStr(numero Mod 2) & d2b
numero = numero \ 2
Wend
d2b = CStr(numero Mod 2) & d2b
End Function[/CODE]

[CODE]Public Function MaxAvellanas(Num As Long) As Integer
Dim sum1 As Long, sum2 As Long, Cadena As String
sum1 = (2 ^ (Int(Log(Num) / Log(2)))) - 1
sum2 = Num - sum1
Cadena = d2b(sum1) & d2b(sum2)
MaxAvellanas = Len(Replace(Cadena, "0", "", , , vbTextCompare))
End Function[/CODE]

Saludos.

Link to post
Share on other sites

Verzulan antes que nada que buena explicacion nos acabas de regalar, la otra perdon al pasar la traduccion yo pense que habia apretado esos numeros sin querer al revisar como excusa tengo al pequeño beltmon cazando vampiros en el patio :witless:, jajajaja ya hablando en serio que grandes paginas nos has regalado y yo la verdad estoy aprendiendo bastante ya vieron que los codigos que anexe en los primeros retos casi eran un libro comparado con sus codigos que la verdad tienen una reduccion memorable, mañana subo otro reto ya que mis vecinos vampiros quieren dar una vuelta.

Saludos.

P.D. Maestro Macro tambien seria bueno si nos regalas un reto como los de antaño, quiero descargar mi furia al no poder resolverlo con la gente de transilvania jajajaja :snowman:

Link to post
Share on other sites

Hola "pipol":

No solo no lo he conseguido con una línea si no que además la he hecho mas larga.

Si he entendido lo que hay que hacer, en ocasiones hay mas de una solución válida, por ejemplo el Nº 7.

Mi macro las muestra todas,....:ghost::ghost::ghost::joyous:

Sub Calcular()

Sumandos 7 'Número de la abuela

End Sub
[/CODE]

[CODE]
Private Sub Sumandos(N As Integer)

For x = 1 To Int(N / 2)
Range("A" & x) = UBound(Split(Application.Dec2Bin(x), 1)) + _
UBound(Split(Application.Dec2Bin(N - x), 1))
Range("B" & x) = x
Range("C" & x) = N - x
Next

Range("A1:C" & x - 1).Sort Key1:=Columns(1), Order1:=xlDescending

Range("A1").Select
Do Until ActiveCell <> Range("A1")
Parejas = Parejas & ", " & ActiveCell.Offset(0, 1) & " y " & ActiveCell.Offset(0, 2)
ActiveCell.Offset(1, 0).Select
Loop

MsgBox Mid(Parejas, 3)
Cells.Clear

End Sub
[/CODE]

Santi, compara resultados con tu primera propuesta porqué creo que no dan lo mismo.

Link to post
Share on other sites

Archived

This topic is now archived and is closed to further replies.



  • Posts

    • Hola! Necesito hacer una columna donde cada celda sea un combobox, y que aparezca la opción de autocompletar. Encontré algo similar en este post:  Sin embargo, la macro que comentan no me está funcionando. Me aparece el error 1004: "No se puede activar la aplicación de origen de este objeto." Alguien podría ayudarme? Gracias!
    • La verdad es que con ese enlace no me entero de lo que hay que hacer. Gracias
    • ikani siento molestarte, me diste este código para que si modificaba la columna "a" se rellenaran la celda E, pero como no tengo ni idea he cambiado la tabla y ahora necesito que cuando la columna "C16" se modifique se incluya en la columna "b16" la fecha y así es las siguientes celdas.
    • Hola a todos Soy Gonzalo, autodidacta en Excel y con gran interés  en macros. Pensionado hace tres años, pero continúo activo. Vivo en zona rural con mis esposa, y ahora en la pandemia con mi hija, disfrutando del campo. En ocasiones se presentan dudas que los libros no solucionan y por esta razón entré al foro.
    • Buenos días,  Soy principiante y tengo mil dudas. Agradezco en primer lugar toda la ayuda. He creado un conbobox y lo he rellenado con una lista utilizando las propiedades indicando el nombre de la lista en listfillrange y funciona. Pero si quisiera realizarlo con código teniendo en cuenta que la lista va aumentando y no quiero que incluya espacios vacíos de la columna F que es donde tengo la lista, ¿me podríais decir como puedo hacerlo? Gracias
  • Recently Browsing

    No registered users viewing this page.

×
×
  • Create New...

Important Information

Privacy Policy