Submission 9479746e...

ChallengeRemove duplicate elements
Submittersggc.yuetloo.eth
Submitted at2018-38-08
Gas used2942731
/**
 * This is a modified version of the original contract from
 *   https://github.com/arachnid/sggc.git
 * 
 * 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 Unique {
    function isUnique(uint[] input, uint len, uint value) private pure returns(bool) {
        for(uint i = 0; i < len; i++) {
            if(input[i] == value) return false;
        }
        return true;
    }

    /**
     * @dev Removes all but the first occurrence of each element from a list of
     *      integers, preserving the order of original elements, and returns the list.
     *
     * The input list may be of any length.
     *
     * @param input The list of integers to uniquify.
     * @return The input list, with any duplicate elements removed.
     */
    function uniquify(uint[] input) public pure returns(uint[] ret) {
        uint len = input.length;
        if( len < 2 ) return input;

        uint ptr = 1;
        uint  hash;
        uint  filter  =  1 << (input[0]%256);
        for(uint i = ptr; i < len; ++i) {
            hash =  1 << (input[i]%256);
            if( ( filter & (hash) ) == 0x0 ) {
               input[ptr++] = input[i];
               filter |= hash;
               continue;
            }

            if( isUnique(input, ptr, input[i]))
            {
               input[ptr++] = input[i];
            } 
        }

        ret = new uint[](ptr);
        for(i = 0; i < ptr; ++i) {
            ret[i] = input[i];
        }

        return ret;
    }
}