printf("%d ", arr[chosen[i]]);
chosen[i] evaluates to the value which is stored at the (i + 1) . element of array chosen.
But I need more data to illustrate the case. So, let´s assume the following initializations:
int i = 2;
int chosen[4] = {1,5,7,9}
int arr[9] = {6,2,7,23,9,16,11,44,2};
Assuming that i is 2, chosen[i] points to the third element of the array chosen and evaluates to the value 7. Another repetition for the sake of teaching: chosen[i] is evaluated to 7, if i is 2. Note that index counting start at 0, so chosen[2] means the third element of array chosen, not the second.
Thereafter, 7 would be used to determine the 8th element of the array arr, a[7]; a[7] = 8th element of arr.
Inside a[7] we have the value of 44. So we end up printing 44 by:
printf("%d ", arr[chosen[i]]);
So,
printf("%d ", arr[chosen[i]]);
is in our example equivalent to:
printf("%d ", arr[7]);
To demonstrate the relation another time:
chosen[i] = NUMBER;
buffer = chosen[i];
printf("%d ", arr[buffer]);
is equivalent to
buffer = NUMBER;
printf("%d ", arr[buffer]);
which is also equivalent to
count[i] = NUMBER;
printf("%d ", arr[count[i]);
and of course equivalent to:
printf("%d ", arr[NUMBER]);