Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* This is a C port of digitcount.py, proving that in the hands
- * of a capable programmer, C can be just as high level as Python.
- */
- #include <stdio.h>
- void
- aswap(int *array, int a, int b)
- {
- int temp = array[a];
- array[a] = array[b];
- array[b] = temp;
- }
- void
- sync_sort(int *array1, int *array2)
- {
- int alen = *array1,
- *list1 = array1 + 1,
- *list2 = array2 + 1,
- i, j, swapped;
- for(i = 0; i < alen; i++){
- swapped = 0;
- for(j = alen - 1; j > i; j--){
- if(list1[j] < list1[j - 1]){
- aswap(list1, j, j - 1);
- aswap(list2, j, j - 1);
- swapped = 1;
- }
- }
- if(!swapped)
- break;
- }
- }
- int *
- count(char *str)
- {
- static int digits[11] = {0};
- digits[0] = 10;
- while(*str){
- digits[1 + (*str) - '0'] += 1;
- str++;
- }
- return digits;
- }
- void
- report(int *digits, int *digit_nums)
- {
- int alen = *digits,
- i;
- for(i = 0; i < alen; i++){
- printf("%i: %i\n", digit_nums[1 + i], digits[1 + i]);
- }
- }
- void
- init_digit_nums(int *digit_nums)
- {
- int i;
- for(i = 0; i < 10; i++)
- digit_nums[1 + i] = i;
- digit_nums[0] = i;
- }
- void
- areverse(int *array)
- {
- int array2[11] = {0},
- *list1 = array + 1,
- *list2 = array2 + 1,
- i;
- for(i = (*array) - 1; i >= 0; i--){
- *list2 = list1[i];
- list2++;
- }
- list2 = array2 + 1;
- for(i = 0; i < *array; i++){
- list1[i] = *list2;
- list2++;
- }
- }
- int
- main(int argc, char **argv)
- {
- int *digits = count(argv[1]),
- digit_nums[11];
- init_digit_nums(digit_nums);
- printf("By digit:\n");
- report(digits, digit_nums);
- printf("By frequency:\n");
- sync_sort(digits, digit_nums);
- areverse(digit_nums);
- areverse(digits);
- report(digits, digit_nums);
- }
Advertisement
Add Comment
Please, Sign In to add comment