Как рассчитать требуемую ширину столбца для отображения многостолбцовых ls? - PullRequest
0 голосов
/ 23 декабря 2018

когда ls отображает список файлов, он отображает его в столбцах в соответствии с шириной терминала. Могу ли я узнать, каков размер каждого столбца?

1 Ответ

0 голосов
/ 23 декабря 2018

Имеет ширину W и N файлов для вывода.Вы можете выполнить бинарный поиск, чтобы найти максимальное количество столбцов.

Можно предположить, что 1 столбец всегда возможен (файл на строку), и что N столбцов невозможно (технически это так, когда всеможет быть напечатан в одной строке, но только для визуализации применимости двоичного поиска).

Пример кода:

#include <stdio.h>

#define N 12 // Number of files
#define W 80 // Terminal width

int can_be_printed(int *lengths, int columns)
{
    int lines = 1 + (N-1) / columns; // ceil(N / columns)
    for(int i=0; i<lines; i++)
    {
        int w = 0; // For the required line width
        w += lengths[i]; // First column
        for(int j=i+lines; j<N; j+=lines) // For each filename in the same line
            w += 2 + lengths[j]; // 2 is the space between filenames for the output
        if(w > W) // Required width is higher than terminal width
            return 0; // false
    }
    return 1; // true
}

int main()
{
    int file_lengths[N] = {7, 9, 9, 5, 6, 8, 9, 6, 7, 13, 6, 10};
    int low = 1; // Always possible
    int high = N; // Generally, not possible
    while(high - low > 1) // Perform binary search
    {
        int mid = (low + high)/2; // Cut in half
        int ans = can_be_printed(file_lengths, mid); // true or false
        if(ans) // If it's possible with the width mid
            low = mid;
        else
            high = mid;
    }
    int ans;
    if(can_be_printed(file_lengths, high)) // End BS picking the highest that is possible
        ans = high;
    else
        ans = low;
    printf("Maximum number of columns: %d\n", ans);
    return 0;
}
...