Submission d391b2e3...
/**
* 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 {
/**
* @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){
//v2.1
uint counter;
bool flagZero;
uint inputLen = input.length;
uint[256] memory firstTable;
uint[256] memory secondTable;
uint[] memory index = new uint[](inputLen);
if(inputLen < 2)
return input;
for(uint i = 0; i < inputLen; i++){
uint element = input[i];
uint indexTable = element & 255;
if(firstTable[indexTable]==0 && element != 0){
firstTable[indexTable] = element;
index[counter] = element;
counter++;
continue;
}
if(firstTable[indexTable]!=0 && element!=firstTable[indexTable]){
secondTable[indexTable] = element;
index[counter] = element;
counter++;
continue;
}
if(!flagZero && element == 0){
flagZero = true;
firstTable[indexTable] = 0;
index[counter] = 0;
counter++;
}
}
ret = new uint[](counter);
if(counter%2 == 1){
for(i = 0; i < counter; i++)
ret[i] = index[i];
}
else
{
for(i = 0; i < counter; i = i+2){
ret[i] = index[i];
ret[i+1] = index[i+1];
}
}
}
}