Matriz

Iniciado por Yoldy, 9 Mayo 2017, 03:06 AM

0 Miembros y 2 Visitantes están viendo este tema.

CalgaryCorpus

Es completamente posible que aparezca en la salida un patron como el del enunciado.
Hay que cambiar el arreglo de cartas para que incluya el "?" y sacar la "x" que puse yo sin fijarme.
Aqui mi perfil en LinkedIn, invitame un cafe aqui

MAFUS

No es por eso. En el ejemplo se toman los 4 primeros símbolos y se sitúan aleatoriamente en la primera línea. En la segunda línea se sitúan de nuevo los mismos símbolos pero con otra disposición. Después,  ya en la tercera línea se usa un juego de símbolos diferentes y se actúa como en el casp anterior.

En tu código se disponen los ocho signos a la ves y no vuelven a repetirse hasta que no hayan salido todos.

En verdad la solución es muy parecida a la que propones solo que hay que hacerlo a medio array de símbolos cada vez.

CalgaryCorpus

Solo por jugar, para poder repetir los valores antes de llegar al final del arreglo cartas, se puede hacer un truco: usar la matriz final como memoria adicional y aplicar la misma idea anterior, e.g.: http://goo.gl/mOF4jJ

Aun no es como lo descrito, pero la idea se puede aplicar de multiples formas para evitar o forzar repeticiones, sin requerir de estructuras de datos adicionales o contar, la solucion funciona por construccion, como se demuestra en el codigo del link, el que copio aqui:

Código (cpp) [Seleccionar]

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

char a[4][4];
char cartas[] = {'#','%','@','*','!','<','?', '+'};
int total=sizeof(cartas);

int main()
{
    for(int i = 0; i < total*2; i++) {
        a[i/4][i%4] = cartas[i%8];
    }

    srand(time(0));
    for (int mover_a = total*2-1; mover_a >=0; mover_a--) {
        int hacia = mover_a;
        int desde = rand() % (hacia + 1);

        char temp = a[hacia/4][hacia%4];
        a[hacia/4][hacia%4] = a[desde/4][desde%4];
        a[desde/4][desde%4] = temp;

        printf("\t%c ",a[hacia/4][hacia%4]);
        if(mover_a%4 == 0) printf("\n");

   }
   printf("\n\n");
}


Verlo ejecutando aqui; http://goo.gl/mOF4jJ
Aqui mi perfil en LinkedIn, invitame un cafe aqui

MAFUS

Yo decía algo más así:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

char cartas[] = {'#', '%', '@', '*', '!', '<', 'x', '+'};
int total = sizeof(cartas);

int main() {
    int inicio = 0;
   
    srand(time(NULL));
   
    for (int mitad=0; mitad<2; ++mitad) {
        for (int i=0; i<2; ++i) {
            int longitud = total/2;
           
            for (int j=0; j<4; ++j) {
                int deja = longitud - 1 + inicio;;
                int pilla;
               
                do {
                    pilla = rand() % longitud + inicio;
                } while(j < 3 && pilla == deja);
               
                printf(" %c", cartas[pilla]);
               
                char x = cartas[deja];
                cartas[deja] = cartas[pilla];
                cartas[pilla] = x;
                --longitud;
            }
            puts("");
        }
        inicio = total/2;
    }
}


Como puedes ver me he basado en tu idea.

Éste es el resultado:
# * @ %
@ % * #
! < + x
x + ! <

La primera fila y la segunda usan un conjunto de símbolo.
La tercera y la cuarta usan otro.

CalgaryCorpus

Super bueno.

Le falta la aritmetica para los indices de la matriz (y llenarla).
Sin embargo, agregarla diluye la magia de la simplicidad inicial.
Aqui mi perfil en LinkedIn, invitame un cafe aqui