| | |
| | | #include <string.h> |
| | | #include <math.h> |
| | | #include <assert.h> |
| | | #include <unistd.h> |
| | | #include <float.h> |
| | | #include <limits.h> |
| | | |
| | | #ifdef WIN32 |
| | | #include "unistd.h" |
| | | #else |
| | | #include <unistd.h> |
| | | #endif |
| | | #include "utils.h" |
| | | |
| | | #pragma warning(disable: 4996) |
| | | |
| | | int *read_map(char *filename) |
| | | { |
| | | int n = 0; |
| | | int *map = 0; |
| | | char *str; |
| | | FILE *file = fopen(filename, "r"); |
| | | if(!file) file_error(filename); |
| | | while((str=fgetl(file))){ |
| | | ++n; |
| | | map = realloc(map, n*sizeof(int)); |
| | | map[n-1] = atoi(str); |
| | | } |
| | | return map; |
| | | } |
| | | |
| | | void sorta_shuffle(void *arr, size_t n, size_t size, size_t sections) |
| | | { |
| | | size_t i; |
| | |
| | | size_t start = n*i/sections; |
| | | size_t end = n*(i+1)/sections; |
| | | size_t num = end-start; |
| | | shuffle(arr+(start*size), num, size); |
| | | shuffle((char*)arr+(start*size), num, size); |
| | | } |
| | | } |
| | | |
| | |
| | | void *swp = calloc(1, size); |
| | | for(i = 0; i < n-1; ++i){ |
| | | size_t j = i + rand()/(RAND_MAX / (n-i)+1); |
| | | memcpy(swp, arr+(j*size), size); |
| | | memcpy(arr+(j*size), arr+(i*size), size); |
| | | memcpy(arr+(i*size), swp, size); |
| | | memcpy(swp, (char*)arr+(j*size), size); |
| | | memcpy((char*)arr+(j*size), (char*)arr+(i*size), size); |
| | | memcpy((char*)arr+(i*size), swp, size); |
| | | } |
| | | } |
| | | |
| | |
| | | size_t offset = 0; |
| | | for(i = 0; i < len; ++i){ |
| | | char c = s[i]; |
| | | if(c==' '||c=='\t'||c=='\n') ++offset; |
| | | if(c==' '||c=='\t'||c=='\n'||c =='\r') ++offset; |
| | | else s[i-offset] = c; |
| | | } |
| | | s[len-offset] = '\0'; |