Cómo dar un paseo de diez minutos en C


El reto

Vives en la ciudad de Cartesia, donde todos los caminos están dispuestos en una cuadrícula perfecta. Llegaste diez minutos antes a una cita, por lo que decidiste aprovechar para dar un pequeño paseo. La ciudad proporciona a sus ciudadanos una aplicación de generación de caminatas en sus teléfonos: cada vez que presiona el botón, le envía una serie de cadenas de una letra que representan las direcciones para caminar (por ejemplo, (‘n’, ‘s’, ‘w’, ‘ mi’)). Siempre camina solo una cuadra por cada letra (dirección) y sabe que le toma un minuto atravesar una cuadra de la ciudad, así que cree una función que regrese verdadero si el paseo que te da la app te llevará exactamente diez minutos (¡no querrás llegar ni tarde ni temprano!) y, por supuesto, te devolverá al punto de partida. Retorno falso de lo contrario.

Nota: siempre recibirá una matriz válida que contiene una variedad aleatoria de letras de dirección (solo ‘n’, ‘s’, ‘e’ o ‘w’). Nunca le dará una matriz vacía (¡eso no es caminar, eso es quedarse quieto!).

La solución en C

Opción 1:

#embody <stdbool.h>

bool isValidWalk(const char *stroll) {
  if (strlen(stroll) != 10) return 0;
  
  int h = 0, v = 0;
  whereas(*stroll) {
    swap(*stroll) {
      case 'n': ++v; break;
      case 's': --v; break;
      case 'e': ++h; break;
      case 'w': --h; break;
    }
    ++stroll;
  }
  return h == 0 && v == 0;
}

Opcion 2:

#embody <stdbool.h>

bool isValidWalk(const char *stroll) {
     int i=0, north_south=0, vest_est=0; 
     for(; i< stroll(i); i++){
       if(stroll(i) == 'n' ) north_south++;
       if(stroll(i) == 's' ) north_south--;
       if(stroll(i) == 'e' ) vest_est++;
       if(stroll(i) == 'w' ) vest_est--;
        
     }
     if(i==10 && north_south==0 && vest_est==0) return true; else return false;
}

Opción 3:

#embody <stdbool.h>

bool isValidWalk(const char *stroll) {

   char* c = stroll;
   int up, proper, rely;
   up = proper = rely = 0;
   whereas( *c !='' ){
     swap(*c){
       case 'n':
         rely++;
         up++;
         break;
       case 's':
         rely++;
         up--;
         break;
       case 'e':
         rely++;
         proper++;
         break;
       case 'w':
         rely++;
         right--;
         break;
     
     }
     c++;    
   }
   return up == 0 && proper == 0 && rely == 10;
}

Casos de prueba para validar nuestra solución

#embody <criterion/criterion.h>
#embody <stdbool.h>
#embody <stdlib.h>
#embody <time.h>

void tester(char *twalk, bool anticipated);

Check(Fixed_Tests, should_return_true_for_a_valid_walk) {
  tester("nsnsnsnsns", true);
  tester("ewewnsnsew", true);
  tester("nsewnsewns", true);
  tester("sewnnsewns", true);
}

Check(Fixed_Tests, should_return_false_if_walk_is_too_short) {
  tester("n", false);
  tester("ns", false);
}

Check(Fixed_Tests, should_return_false_if_walk_is_too_long) {
  tester("nsnsnsnsnsns", false);
  tester("nsewnsewnsewnsew", false);
  tester("nsnsnsnsnsewewewewew", false);
}

Check(Fixed_Tests, should_return_false_if_walk_does_not_bring_you_back_to_start) {
  tester("nsnsnsnsnn", false);
  tester("eeewnsnsew", false);
}

static bool answer(const char *swalk) {
    int i=0, n=0, e=0, w=0, s=0;
    whereas(*swalk) {
        char present = *swalk++;
        if(present == 'n') n++; else
        if(present == 'e') e++; else
        if(present == 'w') w++; else
        if(present == 's') s++; i++;
    }
    return i == 10 && n == s && w == e;
}

static char* getWalk(size_t steps) {
    char *gwalk = (char*) malloc((steps + 1) * sizeof(char));
    if(steps == 10) {
        const char* legitimate(6) = {"nnnnnsssss", "nnnnewssss", "nnneewwsss",
                                "nneeewwwss", "neeeewwwws", "eeeeewwwww"};
        const char information(4) = {'n', 'e', 'w', 's'};
        strcpy(gwalk, legitimate(rand() % 6));
        if(rand() % 2) {
            gwalk(rand() % 10) = information(rand() % 4);
        }
    }
    else {
        size_t i = 0;
        char n_e(2) = {'n', 'e'};
        char w_s(2) = {'w', 's'};
        for(; i<steps; i++) {
            if(rand() % 2) {
                gwalk(i) = n_e(rand() % 2);
            }
            else {
                gwalk(i) = w_s(rand() % 2);
            }
        }
        gwalk(i) = '';
    }
    return gwalk;
}

Check(Random_Tests, should_pass_all_the_tests_provided) {
    srand(time(NULL));

    int rely = 100;
    whereas(count--) {
        int minutes(25) = {10,10,10,8,10,10,10,1,10,10,10,2,10,
                           10,10,9,10,10,10,11,10,10,10,100,10};
        int rand_mins = minutes(rand() % 25);
        char *rand_walk = getWalk(rand_mins);
        int reply = answer(rand_walk);
        tester(rand_walk, reply);
        free(rand_walk); rand_walk = NULL;
    }
}

Related Articles

Comments

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Same Category

spot_img

Stay in touch!

Follow our Instagram