Grouping a sequence into ranges
This is relatively easy to do, you just need to add some analytic values to your original data set to get it:

with grps as (
select t1.* 
     , trunc((row_number() over (partition by Center_Code, PaperCode order by Roll_No)-1)/4) grp_id
     , roll_no - row_number() over (partition by Center_Code, PaperCode order by Roll_No) rng_id
  from your_data t1
), rngs as (
select center_code
     , papercode
     , to_char(min(roll_no))||'-'||to_char(max(roll_no)) roll_nos
     , min(roll_no) ord
     , count(*) students
     , grp_id
  from grps
 group by center_code, papercode, grp_id, rng_id
)
select center_code
     , papercode
     , LISTAGG(roll_nos, ', ') WITHIN GROUP (ORDER BY ord) roll_nos
     , sum(students) students
  from rngs
  group by center_code, papercode, grp_id;


In the first subfactored query (grps) I'm calculating a grouping id (grp_id) to put the roll_nos into groups of 4, and range id (rng_id) so that each group of 4 roll_nos can be grouped into contiguous ranges.

In the second subfactored query (rngs) the sub ranges of roll_nos are consolidated and counted and an ordering column (ord) is generated.

In the final output query the sub ranges are accumulated with listagg and the final group size is calculated.