This is just another string compare challenge, but this time every nibble is checked rather than every byte. And all the checks are inside multiple functions making it harder to navigate in a decompiler/disassembler. Once the player figures out the the elements in the array represent the nibbles of the flag, you can automate the whole process by joining the nibbles to make out bytes, hence retrieving the flag.
pepega_xx() check does the same thing with a slight difference on their indexes, this is the template for all
The function basically takes in a byte like
0xab and checks if the first nibble is equal to the stored one and if the second nibble is equal to the stored on which is in the array
final, the two nibbles in this case are
This happens for every byte, write a python script to join all those nibbles together and u get your flag.