get_pieces_below Function

function get_pieces_below(i) result(ipieces)

get set of pieces directly below piece i

Arguments

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

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


Calls

proc~~get_pieces_below~~CallsGraph proc~get_pieces_below problem_22::get_pieces_below interface~unique~2 aoc_utilities::unique proc~get_pieces_below->interface~unique~2 proc~unique32 aoc_utilities::unique32 interface~unique~2->proc~unique32 proc~unique64 aoc_utilities::unique64 interface~unique~2->proc~unique64 interface~sort aoc_utilities::sort proc~unique32->interface~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~~get_pieces_below~~CalledByGraph proc~get_pieces_below problem_22::get_pieces_below proc~get_all_pieces_below problem_22::get_all_pieces_below proc~get_all_pieces_below->proc~get_pieces_below proc~get_all_pieces_below->proc~get_all_pieces_below 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_pieces_below program~problem_22->proc~get_all_pieces_below proc~initialize problem_22::initialize program~problem_22->proc~initialize proc~drop problem_22::drop proc~drop->proc~move_piece_down proc~initialize->proc~drop

Source Code

    function get_pieces_below(i) result(ipieces)
        !! get set of pieces directly below piece i
        integer(ip),intent(in) :: i
        integer(ip),dimension(:),allocatable :: ipieces
        integer(ip) :: x,y,z !! counter
        allocate(ipieces(0))
        do x = istart_array(i,1), iend_array(i,1)
            do y = istart_array(i,2), iend_array(i,2)
                do z = istart_array(i,3), iend_array(i,3)
                    if (z-1>0) then ! 0 is the floor
                        if (array(x,y,z-1)/=0) ipieces = [ipieces,array(x,y,z-1)] ! below this one
                    end if
                end do
            end do
        end do
        ipieces = unique(pack(ipieces, ipieces/=i)) ! exclude the ones in this piece
    end function get_pieces_below