import java.util.Arrays;
public class Main
{
public static void main
(String[] args
) { byte[] example = encodeRle(new byte[] { 15, 15, 15, 4, 4, 4, 4, 4, 4});
}
public static byte[] encodeRle(byte[] flatData) {
byte[] encodedData = new byte[countRuns(flatData)*2]; //the encoded array is twice the size of the number of runs
int runSize = 1;
for (int i = 0; i < encodedData.length; i+=2) { //iterates through the
for (int j = 1; j < flatData.length;j++) { //iterates through the flat data array
if (flatData[j] == flatData[j - 1]) {
runSize++;
if (runSize == 15) { //starts a new run when there are 15 elements in a given run
encodedData[i+1] = flatData[j]; //sets the value of the run in the odd positions of the encoded array
encodedData[i] = (byte) runSize;//sets the number of elements in a run in the even positions of the encoded array
runSize = 1;
}
}
else {
encodedData[i+1] = flatData[j]; //sets the value of the run in the odd positions of the encoded array
encodedData[i] = (byte) runSize; //sets the number of elements in a run in the even positions of the encoded array
}
}
}
return encodedData;
}
public static int countRuns(byte[] flatData) { //counts the number of runs in an array of flat data
int runSize = 1, numRuns = 1;
for (int i = 1; i < flatData.length; i++) {
if (flatData[i] == flatData[i-1]) { //if two adjacent elements are equal, keeps the same run going
runSize++;
if (runSize > 15) { //if there are more than 15 elements in a run, starts a new run
numRuns++;
runSize = 1;
}
}
else { //if two adjacent elements are not equal, starts a new run
numRuns++;
}
}
return numRuns;
}
}
aW1wb3J0IGphdmEudXRpbC5BcnJheXM7CnB1YmxpYyBjbGFzcyBNYWluCnsKCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKCSAgICBieXRlW10gZXhhbXBsZSA9IGVuY29kZVJsZShuZXcgYnl0ZVtdIHsgMTUsIDE1LCAxNSwgNCwgNCwgNCwgNCwgNCwgNH0pOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihBcnJheXMudG9TdHJpbmcoZXhhbXBsZSkpOwoJfQoJIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIGVuY29kZVJsZShieXRlW10gZmxhdERhdGEpIHsKICAgICAgICBieXRlW10gZW5jb2RlZERhdGEgPSBuZXcgYnl0ZVtjb3VudFJ1bnMoZmxhdERhdGEpKjJdOyAvL3RoZSBlbmNvZGVkIGFycmF5IGlzIHR3aWNlIHRoZSBzaXplIG9mIHRoZSBudW1iZXIgb2YgcnVucwogICAgICAgIGludCBydW5TaXplID0gMTsKICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbmNvZGVkRGF0YS5sZW5ndGg7IGkrPTIpIHsgLy9pdGVyYXRlcyB0aHJvdWdoIHRoZQogICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDE7IGogPCBmbGF0RGF0YS5sZW5ndGg7aisrKSB7IC8vaXRlcmF0ZXMgdGhyb3VnaCB0aGUgZmxhdCBkYXRhIGFycmF5CiAgICAgICAgICAgICAgICAgICAgaWYgKGZsYXREYXRhW2pdID09IGZsYXREYXRhW2ogLSAxXSkgewogICAgICAgICAgICAgICAgICAgICAgICBydW5TaXplKys7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydW5TaXplID09IDE1KSB7IC8vc3RhcnRzIGEgbmV3IHJ1biB3aGVuIHRoZXJlIGFyZSAxNSBlbGVtZW50cyBpbiBhIGdpdmVuIHJ1bgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlZERhdGFbaSsxXSA9IGZsYXREYXRhW2pdOyAvL3NldHMgdGhlIHZhbHVlIG9mIHRoZSBydW4gaW4gdGhlIG9kZCBwb3NpdGlvbnMgb2YgdGhlIGVuY29kZWQgYXJyYXkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZWREYXRhW2ldID0gKGJ5dGUpIHJ1blNpemU7Ly9zZXRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gYSBydW4gaW4gdGhlIGV2ZW4gcG9zaXRpb25zIG9mIHRoZSBlbmNvZGVkIGFycmF5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5TaXplID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlZERhdGFbaSsxXSA9IGZsYXREYXRhW2pdOyAvL3NldHMgdGhlIHZhbHVlIG9mIHRoZSBydW4gaW4gdGhlIG9kZCBwb3NpdGlvbnMgb2YgdGhlIGVuY29kZWQgYXJyYXkKICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlZERhdGFbaV0gPSAoYnl0ZSkgcnVuU2l6ZTsgLy9zZXRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gYSBydW4gaW4gdGhlIGV2ZW4gcG9zaXRpb25zIG9mIHRoZSBlbmNvZGVkIGFycmF5CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgcmV0dXJuIGVuY29kZWREYXRhOwogICAgfQogICAgcHVibGljIHN0YXRpYyBpbnQgY291bnRSdW5zKGJ5dGVbXSBmbGF0RGF0YSkgeyAvL2NvdW50cyB0aGUgbnVtYmVyIG9mIHJ1bnMgaW4gYW4gYXJyYXkgb2YgZmxhdCBkYXRhCiAgICAgICAgaW50IHJ1blNpemUgPSAxLCBudW1SdW5zID0gMTsKICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IGZsYXREYXRhLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGlmIChmbGF0RGF0YVtpXSA9PSBmbGF0RGF0YVtpLTFdKSB7IC8vaWYgdHdvIGFkamFjZW50IGVsZW1lbnRzIGFyZSBlcXVhbCwga2VlcHMgdGhlIHNhbWUgcnVuIGdvaW5nCiAgICAgICAgICAgICAgICBydW5TaXplKys7CiAgICAgICAgICAgICAgICBpZiAocnVuU2l6ZSA+IDE1KSB7IC8vaWYgdGhlcmUgYXJlIG1vcmUgdGhhbiAxNSBlbGVtZW50cyBpbiBhIHJ1biwgc3RhcnRzIGEgbmV3IHJ1bgogICAgICAgICAgICAgICAgICAgIG51bVJ1bnMrKzsKICAgICAgICAgICAgICAgICAgICBydW5TaXplID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsgLy9pZiB0d28gYWRqYWNlbnQgZWxlbWVudHMgYXJlIG5vdCBlcXVhbCwgc3RhcnRzIGEgbmV3IHJ1bgogICAgICAgICAgICAgICAgbnVtUnVucysrOwogICAgICAgICAgICB9CgogICAgICAgIH0KICAgICAgICByZXR1cm4gbnVtUnVuczsKICAgIH0KCn0KCiAgIA==