Tema destacado: Últimos eventos sobre seguridad/inseguridad
Autor
|
Tema: [RETO] Matriz Bidimensional {FrogMatrix algorithm} (Leído 1,527 veces)
|
Psyke1
Wiki
Desconectado
Mensajes: 1.005
|
Bueno, aqui traigo un reto bastante fácil digo yo, la idea es armar una matriz de las dimensiones indicadas siguendo las explicaciones: Si introduzco 5 en la función: 0 1 2 3 4 1 3 5 7 4 9 15 16 7 4 47 42 16 7 4 116 42 16 7 4 Cada numero viene dado de la suma del que tenga arriba mas tantas columnas a la derecha como el numero fila actual. En caso de sobrepasar el limite de columnas es igual a el numero de arriba. Si no me explico bien postea o mándame un MP.  El reto ha sido pensado por mi...  Mucha suerte, yo me pongo ya a hacerlo!!  DoEvents! EDIT: Ya lo tengo, mañana posteo... 
|
|
|
|
« Última modificación: 29 Noviembre 2010, 02:44 por Mr. Frog © »
|
En línea
|
|
|
|
BlackZeroX (Astaroth)
Wiki
Desconectado
Mensajes: 2.832
I'Love...!¡.
|
* Cada numero viene dado de la suma del que tenga arriba mas tantas columnas a la derecha como el numero fila actual. * En caso de sobrepasar el limite de columnas es igual a el numero de arriba.
Describe mejor mas claro y mucho mas entendible (espesifica el que con el que por que asi no te entiendo... quizas entienda algo pero es muy pobre lo entendido asi y nadamas no me da con las pruebas de escritorio)... y aun que sea pon 1, 2 o mas ejemplos para ver un patron congruente, por que asi como lo expones nadamas no me da!¡.
Dulces Lunas!¡.
|
|
|
|
« Última modificación: 29 Noviembre 2010, 08:56 por BlackZeroX▓▓▒▒░░ »
|
En línea
|
|
|
|
Psyke1
Wiki
Desconectado
Mensajes: 1.005
|
Ook, lo siento tienes razón...  Es que me resulta dificil de explicar, dejo un ejemplo de 7: 0 1 2 3 4 5 6 1 3 5 7 9 11 6 9 15 21 27 26 11 6 72 89 85 70 26 11 6 342 281 198 70 26 11 6 928 592 198 70 26 11 6 1831 592 198 70 26 11 6 El Item (1,0) [el 1] = (0,0) [0] + (0,1) [1] El Item (1,1) [el 3] = (0,1) [1] + (0,2) [2] ... El Item (2,0) [el 9] = (1,0) [1] + (1,1) [3] + (1,2) [5] El Item (2,1) [el 15] = (1,1) [3] + (1,2) [5] + (1,3) [7] ... El Item (3,0) [el 72] = (2,0) [9] + (2,1) [15] + (2,2) [21] + (2,3) [27] El Item (3,1) [el 89] = (2,1) [15] + (2,2) [21] + (2,3) [27] + (2,4) [26] ... ¿Se entiende la lógica? Y si nos encontramos en casos en los que no tenemos más columnas a la derecha entonces se baja el número de arriba. Ej: El Item (2,5) [el 11] = (0,5) [11] ' Puesto que 5 + 2 se excede del número de columnas Espero haberme explicado bien...  Un Saludo y suerte...  DoEvents! 
|
|
|
|
|
En línea
|
|
|
|
BlackZeroX (Astaroth)
Wiki
Desconectado
Mensajes: 2.832
I'Love...!¡.
|
ya entendi me a costado Se tiene que hacer algo similar a esto: 0 1 2 3 4 5 6 1 3 5 7 9 11 6 9 15(|) 21(|) 27(|) 26(|) 11 6 72 89(X) 85 70 26 11 6 342 281 198 70 26 11 6 928 592 198 70 26 11 6 1831 592 198 70 26 11 6
Donde Solo se suman los que tienen el signo (|) y donde la cantidad y la posicion inicial de los mismos dependen del lugar Destinatario es decir es descripciones Simples X <-- esta en la la coordenada {1,3} (Fila,Columna) [Iniciando columna y filas en 0's], el origen de los (|) empiesan en la expresion {1,3-1}. es decir X = Sumatoria de Celdas (F+1) empesando en (F,C-1) , Solo si (F+1) es es menor o igual a (C+1) * El +1 es solo un auxiliar ya que las matrices empesarian desde 0's. Lo siento pero en BBcode no salen expresiones matematicas si no las ponia como deberia de ser ¬¬"... Sangriento Infienro Lunar!¡.
|
|
|
|
|
En línea
|
|
|
|
Psyke1
Wiki
Desconectado
Mensajes: 1.005
|
Exacto BlackZer0x, es exactamente eso!  Voy a esperar unas horas más para poner mi forma, que sino no tiene gracia (a parte que no estoy en mi pc ahora mismo)...  DoEvents! 
|
|
|
|
|
En línea
|
|
|
|
Psyke1
Wiki
Desconectado
Mensajes: 1.005
|
Mi solución: Option Explicit Option Base 1 Public Function FrogMatrix(ByVal lSize&) As Long() Dim lTempArr&() Dim lSum&, lRepeat& Dim lCol&, lRow& If lSize& > 0 Then ReDim lTempArr&(lSize&, lSize&) For lCol& = 0 To (lSize& - 1) lTempArr&(1, (lCol& + 1)) = lCol& Next lCol& lRepeat& = 1 For lRow& = 2 To lSize& For lCol& = 1 To lSize& lSum& = FrogSum&(lTempArr&(), (lRow& - 1), lCol&, lRepeat&, lSize&) lTempArr&(lRow&, lCol&) = IIf((lSum& > 0), lSum&, lTempArr&((lRow& - 1), lCol&)) Next lCol& lRepeat& = lRepeat& + 1 Next lRow& FrogMatrix = lTempArr&() End If End Function Private Function FrogSum&(ByRef lArray&(), ByVal lRow&, ByVal lCol&, ByVal lRepeat&, ByVal lLimit&) Dim Q& If Not (lCol& + lRepeat& > lLimit&) Then For Q& = 0 To lRepeat& FrogSum& = FrogSum& + lArray&(lRow&, lCol& + Q&) Next Q& End If End Function ' º Un ejemplo :
Private Sub Form_Load() Const vbBigSpace$ = " " Dim x&, y& Dim sRow$ Dim lSize& lSize& = 10 For x& = 1 To lSize& For y& = 1 To lSize& sRow$ = sRow$ & FrogMatrix(lSize)(x&, y&) & vbBigSpace$ Next y& Debug.Print sRow$ sRow$ = vbNullString Next x& End Sub Devuelve: 0 1 2 3 4 5 6 7 8 9 1 3 5 7 9 11 13 15 17 9 9 15 21 27 33 39 45 41 17 9 72 96 120 144 158 142 112 41 17 9 590 660 676 597 470 321 112 41 17 9 3314 2836 2217 1558 970 321 112 41 17 9 11328 8055 5236 3028 970 321 112 41 17 9 29091 17780 9734 3028 970 321 112 41 17 9 61094 32012 9734 3028 970 321 112 41 17 9 107338 32012 9734 3028 970 321 112 41 17 9 DoEvents! 
|
|
|
|
« Última modificación: 29 Noviembre 2010, 15:17 por Mr. Frog © »
|
En línea
|
|
|
|
|
LeandroA
|
hola no se puede poner valores grandes solo hasta 17 Option Explicit
Private Sub Form_Load() Dim M() As Long Dim lVal As Long, x As Long, y As Long lVal = 7 M = CreateMatrix(lVal) For y = 0 To lVal - 1 For x = 0 To lVal - 1 Debug.Print M(x, y), Next Debug.Print Next
End Sub
Private Function CreateMatrix(ByVal Val As Long) As Long() Dim M() As Long Dim x As Long, y As Long, i As Long Dim lSum As Long, lSize As Long If Val > 17 Or Val < 1 Then Exit Function lSize = Val - 1 ReDim M(lSize, lSize) For x = 0 To lSize M(x, 0) = x Next For y = 1 To lSize For x = 0 To lSize If x + y > lSize Then M(x, y) = M(x, y - 1) Else lSum = 0 For i = x To y + x lSum = lSum + M(i, y - 1) Next M(x, y) = lSum End If Next Next CreateMatrix = M
End Function saludos.
|
|
|
|
« Última modificación: 1 Diciembre 2010, 19:16 por Novlucker »
|
En línea
|
|
|
|
Psyke1
Wiki
Desconectado
Mensajes: 1.005
|
 El que faltaba...  hola no se puede poner valores grandes solo hasta 17 En el reto no hice ninguna referencia fálica creo yo  , queria poner algo con lo que pudierais competir conmigo  Encima en tu función solo se pueden meter valores menores de edad  Yo mirare a ver si hago más rapida la mia, que no la hice para correr...  DoEvents! 
|
|
|
|
« Última modificación: 1 Diciembre 2010, 19:17 por Novlucker »
|
En línea
|
|
|
|
Psyke1
Wiki
Desconectado
Mensajes: 1.005
|
Mi versión 2 : Option Explicit Option Base 1 Public Function FrogMatrix(ByVal lSize&) As Long() Dim lTempArr&() Dim lSum&, lRepeat&, Q& Dim lCol&, lRow& If lSize& > 1 And lSize& < 18 Then ReDim lTempArr&(lSize&, lSize&) For lCol& = 0 To (lSize& - 1) lTempArr&(1, (lCol& + 1)) = lCol& Next lCol& lRepeat& = 1 For lRow& = 2 To lSize& For lCol& = 1 To lSize& If Not ((lCol& + lRepeat&) > lSize&) Then For Q& = 0 To lRepeat& lSum& = lSum& + lTempArr&((lRow& - 1), (lCol& + Q&)) Next Q& End If 'lTempArr&(lRow&, lCol&) = IIf((lSum& > 0), lSum&, lTempArr&((lRow& - 1), lCol&)) If CBool(lSum&) Then lTempArr&(lRow&, lCol&) = lSum& lSum& = 0 Else lTempArr&(lRow&, lCol&) = lTempArr&((lRow& - 1), lCol&) End If Next lCol& lRepeat& = lRepeat& + 1 Next lRow& FrogMatrix = lTempArr&() End If End Function DoEvents! 
|
|
|
|
« Última modificación: 29 Noviembre 2010, 21:54 por Mr. Frog © »
|
En línea
|
|
|
|
BlackZeroX (Astaroth)
Wiki
Desconectado
Mensajes: 2.832
I'Love...!¡.
|
. Madre que codigos aqui dejo el mio es lo mas rapido que he podido hacerlo, y con la mejor velocidad posible (Solo calculo un triangulo). Option Explicit Private Declare Sub RtlMoveMemory Lib "kernel32" (pDst As Any, pSrc As Any, ByVal ByteLen As Long) Private Function CreateMatriXBZeroX(ByVal vNum&, ByRef OutArray&()) As Boolean Dim lng_f&, lng_c&, lng_fa& CreateMatriXBZeroX = vNum& > 0 And vNum& < 18 If CreateMatriXBZeroX Then vNum& = vNum& - 1 ReDim OutArray&(0 To vNum&, 0 To vNum&) For lng_f& = 0 To vNum& OutArray&(lng_f&, lng_c&) = lng_f& Next For lng_c& = 1 To vNum& For lng_f& = 0 To vNum& - lng_c& For lng_fa& = lng_f& To lng_c& + lng_f& OutArray&(lng_f&, lng_c&) = OutArray&(lng_f&, lng_c&) + OutArray&(lng_fa&, lng_c& - 1) Next Next RtlMoveMemory ByVal VarPtr(OutArray&(lng_f&, lng_c&)), ByVal VarPtr(OutArray&(lng_f&, lng_c& - 1)), 4 * lng_c& Next End If End Function Prueba: Private Sub Form_Load() Dim OutArray&() Dim lng_f&, lng_c&, lng_vNum& lng_vNum& = 5 If CreateMatriXBZeroX(lng_vNum&, OutArray&) Then For lng_f& = 0 To lng_vNum& - 1 For lng_c& = 0 To lng_vNum& - 1 Debug.Print OutArray&(lng_c&, lng_f&), Next Debug.Print Next End If End Sub Sangriento Infierno Lunar!¡.
|
|
|
|
|
En línea
|
|
|
|
Psyke1
Wiki
Desconectado
Mensajes: 1.005
|
. Muy buena Black, no se me había ocurrido!  mmmmmm Haces la función Boolean y introduces en los argumentos el array donde se guardara para no tener que hacer esto?  CreateMatriXBZeroX=OutArray& ' Es por ganar tiempo ?
Madre que codigos  ?¿ DoEvents! 
|
|
|
|
|
En línea
|
|
|
|
BlackZeroX (Astaroth)
Wiki
Desconectado
Mensajes: 2.832
I'Love...!¡.
|
. No se si influya en el tiempo o cosas similares solo se que lo hago directamente en la matrix indicada, lo hago como si fueran apis.
* Una de las ventajas que veo es que sabre si el array saliente esta inicializado, y no tendre que pedir otra variable extra como salida en el parametro de la funcion, solo utilizo lo de la funcion...
Dulces Lunas!¡.
|
|
|
|
|
En línea
|
|
|
|
Psyke1
Wiki
Desconectado
Mensajes: 1.005
|
. No se si influya en el tiempo o cosas similares solo se que lo hago directamente en la matrix indicada, lo hago como si fueran apis.
* Una de las ventajas que veo es que sabre si el array saliente esta inicializado, y no tendre que pedir otra variable extra como salida en el parametro de la funcion, solo utilizo lo de la funcion...
Dulces Lunas!¡. . mmmmmmmmm Ya veo, muchas gracias, esto lo aplicare de aqui en adelante!  DoEvents! 
|
|
|
|
|
En línea
|
|
|
|
79137913
Desconectado
Mensajes: 780
4 Esquinas
|
HOLA!!! ACA LES DEJO MI CODE, MEJORE EL DE LEANDRO A (10% mas rapido en promedio): (seguro que se puede mejorar la parte que agregue) si se continua expresando como funcion e imprimiendo las celdas negativas se toma menos tiempo. Private tmr As CTiming Private Function MatriX7913(ByVal N As Integer) As Long() Dim M() As Long Dim x As Integer, y As Integer, Z As Integer Dim AGRUP As Long, TAM As Integer If N < 1 Then Exit Function TAM = N - 1 ReDim M(TAM, TAM) For x = 0 To TAM M(x, 0) = x M(TAM, x) = TAM If TAM > 0 Then If Not x = TAM Then M(x, 1) = 1 + (x * 2) If x = TAM - 2 Then For a = 1 To TAM M(TAM - 1, a) = (TAM * 2) - 1 Next End If End If End If Next If TAM > 1 Then 'GRACIAS LEANDRO A For y = 2 To TAM For x = 0 To (TAM - 2) If x + y > TAM Then M(x, y) = M(x, y - 1) Else AGRUP = 0 For Z = x To y + x AGRUP = AGRUP + M(Z, y - 1) Next M(x, y) = AGRUP End If Next Next 'GRACIAS LEANDRO A End If MatriX7913 = M End Function Private Sub Form_Load() Dim M() As Long Dim TAMX As Integer, x As Integer, y As Integer Set tmr = New CTiming TAMX = 17 For FAF = 1 To 10 tmr.Reset M = MatriX7913(TAMX) MsgBox tmr.sElapsed Next For y = 0 To TAMX - 1 For x = 0 To TAMX - 1 Debug.Print M(x, y), Next Debug.Print Next End Sub MOD: lo baje a un 15%  GRACIAS POR LEER!!!
|
|
|
|
« Última modificación: 30 Noviembre 2010, 20:01 por 79137913 »
|
En línea
|
"Como no se puede igualar a Dios, ya he decidido que hacer, ¡SUPERARLO!" "La peor de las ignorancias es no saber corregirlas" 79137913 *Shadow Scouts Team* Resumenes Cs.Economicas
|
|
|
|
| Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Message Digest Algorithm 5 --> Chr0n05
Criptografía
|
Newbie´s
|
0
|
2,275
|
3 Septiembre 2008, 06:54
por Newbie´s
|
|
|
Problema con imprimir diagonales en matriz bidimensional
.NET
|
greenselves
|
2
|
2,282
|
19 Marzo 2010, 16:34
por greenselves
|
|
|
Duda - Buscar si existe una matriz dentro de otra matriz
Programación Visual Basic
|
EddyW
|
2
|
1,875
|
14 Agosto 2010, 06:18
por EddyW
|
|
|
Friendship Algorithm
Foro Libre
|
[D4N93R]
|
3
|
1,352
|
6 Noviembre 2010, 16:53
por KuraraGNU
|
|
|
[RETO] Matriz de Cuenta Circular 7913
« 1 2 »
Programación Visual Basic
|
79137913
|
15
|
1,793
|
13 Enero 2011, 15:30
por 79137913
|
|