8 dump(const char *prefix
, int banks
, int *state
)
11 for (int i
= 0; i
< banks
; i
++)
12 printf(" %d", state
[i
]);
16 typedef struct entry entry
;
23 cycle(int banks
, entry
*in
)
27 for (i
= 0; i
< banks
; i
++)
28 if (in
->state
[i
] > in
->state
[max
])
30 int remaining
= in
->state
[max
];
31 entry
*out
= calloc(1, sizeof *out
);
32 out
->state
= malloc(banks
* sizeof *out
->state
);
33 memcpy(out
->state
, in
->state
, banks
* sizeof *out
->state
);
37 out
->state
[++max
% banks
]++;
42 main(int argc
, char **argv
)
46 int banks
= atoi(argv
[1]);
47 if (banks
!= argc
- 2)
49 head
.state
= malloc(banks
* sizeof *head
.state
);
51 for (i
= 0; i
< banks
; i
++)
52 head
.state
[i
] = atoi(argv
[i
+ 2]);
53 dump("starting with", banks
, head
.state
);
56 entry
*next
= cycle(banks
, e
);
57 // dump("next", banks, next->state);
59 while (memcmp(e
->state
, next
->state
, banks
* sizeof *e
->state
))
64 dump("repeat state", banks
, e
->state
);
68 msg
= "loop at cycle";
72 for (i
= 0; e
->next
; i
++, e
= e
->next
);
73 printf("%s %d\n", msg
, i
);