Submission 8a7c25bb...

ChallengeHex decoder
Submitter0xabcdef0db461f2f...
Submitted at2018-40-28
Gas used1359970
/**
 * This file is part of the 1st Solidity Gas Golfing Contest.
 *
 * This work is licensed under Creative Commons Attribution ShareAlike 3.0.
 * https://creativecommons.org/licenses/by-sa/3.0/
 */

pragma solidity 0.4.24;

contract HexDecoder {
    /**
     * @dev Decodes a hex-encoded input string, returning it in binary.
     *
     * Input strings may be of any length, but will always be a multiple of two
     * bytes long, and will not contain any non-hexadecimal characters.
     *
     * @param input The hex-encoded input.
     * @return The decoded output.
     */
    function decode(string input) public pure returns(bytes output) {
        /*
         * Python:
         *  dict = [0 for x in range(1, 104)]
         *  keys = '0123456789ABCDEFabcdef'
         *  for x, y in [(ord(x), int('0x'+x, 16)) for x in keys]:
         *      dict[x] = y
         */
        uint[103] memory dict = [
            uint(0),
             0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
             0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
             0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
             1,  2,  3,  4,  5,  6,  7,  8,  9,  0,  0,  0,  0,  0,  0,  0,
            10, 11, 12, 13, 14, 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
             0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
            10, 11, 12, 13, 14, 15];
        bytes memory input_bytes = bytes(input);
        uint output_length = input_bytes.length / 2;
        bytes memory output_bytes = new bytes(output_length);
        for (uint i = 0; i< output_length; i++) {
            output_bytes[i] = byte((dict[uint(input_bytes[i*2])] << 4) + dict[uint(input_bytes[i*2+1])]);
        }
        return output_bytes;
    }
}