unique64 Function

private function unique64(vec) result(vec_unique)

Return only the unique values from vec.

Arguments

Type IntentOptional Attributes Name
integer(kind=ip), intent(in), dimension(:) :: vec

Return Value integer(kind=ip), dimension(:), allocatable


Calls

proc~~unique64~~CallsGraph proc~unique64 aoc_utilities::unique64 interface~sort aoc_utilities::sort proc~unique64->interface~sort proc~sort_ascending aoc_utilities::sort_ascending interface~sort->proc~sort_ascending proc~sort_ascending_64 aoc_utilities::sort_ascending_64 interface~sort->proc~sort_ascending_64 interface~swap~2 aoc_utilities::swap proc~sort_ascending->interface~swap~2 proc~swap64 aoc_utilities::swap64 proc~sort_ascending_64->proc~swap64 interface~swap~2->proc~swap64 proc~swap32 aoc_utilities::swap32 interface~swap~2->proc~swap32 proc~swap_str aoc_utilities::swap_str interface~swap~2->proc~swap_str

Called by

proc~~unique64~~CalledByGraph proc~unique64 aoc_utilities::unique64 interface~unique~2 aoc_utilities::unique interface~unique~2->proc~unique64 proc~get_all_pieces_above problem_22::get_all_pieces_above proc~get_all_pieces_above->interface~unique~2 proc~get_all_pieces_above->proc~get_all_pieces_above proc~get_pieces_above problem_22::get_pieces_above proc~get_all_pieces_above->proc~get_pieces_above proc~get_all_pieces_below problem_22::get_all_pieces_below proc~get_all_pieces_below->interface~unique~2 proc~get_all_pieces_below->proc~get_all_pieces_below proc~get_pieces_below problem_22::get_pieces_below proc~get_all_pieces_below->proc~get_pieces_below proc~get_pieces_above->interface~unique~2 proc~get_pieces_below->interface~unique~2 proc~hand_type problem_7::hand_type proc~hand_type->interface~unique~2 program~problem_25 problem_25 program~problem_25->interface~unique~2 proc~beats problem_7::beats proc~beats->proc~hand_type proc~move_piece_down problem_22::move_piece_down proc~move_piece_down->proc~get_pieces_below program~problem_22 problem_22 program~problem_22->proc~get_all_pieces_above program~problem_22->proc~get_all_pieces_below program~problem_22->proc~get_pieces_above program~problem_22->proc~get_pieces_below proc~initialize problem_22::initialize program~problem_22->proc~initialize proc~drop problem_22::drop proc~drop->proc~move_piece_down program~problem_7 problem_7 program~problem_7->proc~beats proc~initialize->proc~drop

Source Code

    function unique64(vec) result(vec_unique)

        integer(ip),dimension(:),intent(in) :: vec
        integer(ip),dimension(:),allocatable :: vec_unique

        integer(ip) :: i,num
        logical,dimension(size(vec)) :: mask

        mask = .false.

        do i=1,size(vec)

            !count the number of occurrences of this element:
            num = count( vec(i)==vec )

            if (num==1) then
                !there is only one, flag it:
                mask(i) = .true.
            else
                !flag this value only if it hasn't already been flagged:
                if (.not. any(vec(i)==vec .and. mask) ) mask(i) = .true.
            end if

        end do

        !return only flagged elements:
        allocate( vec_unique(count(mask)) )
        vec_unique = pack( vec, mask )

        ! also sort it:
        call sort(vec_unique)

    end function unique64