In [1]:
module MyMatchingA
export my_deferred_acceptance

function my_deferred_acceptance(boys_prefs, girls_prefs)
    m = size(boys_prefs, 1)
    n = size(girls_prefs, 1)
    #その男性が婚約している女性(リストが尽きた独身=0,リストが尽きてない独身=-1)
    #boys_partners[1] = 2; 男性1は女性2と婚約している.
    boys_partners = fill(-1, m)
    
    boys_next_to_propose = ones(Int, m)
    
    girls_partners = zeros(Int, n)
    
    girls_rankings = (m+1)*ones(Int, m, n)    
    
    for j in 1:n
       for i in 1:length(girls_prefs[j])
           b = length(girls_prefs[j])
           a = girls_prefs[j][i]
           girls_rankings[a,j] = i
       end
    end
    
    
    while true
        i = get_single(boys_partners)
        if i == 0
            break
        end
        if boys_next_to_propose[i] > length(boys_prefs[i])
            boys_partners[i] = 0
            continue
        end        
            

        #男性iが好きな女性jを探す.
        j = boys_prefs[i][boys_next_to_propose[i]]

        #女性jが婚約している相手pを探す.
        p = girls_partners[j]
        
        if girls_rankings[i,j] >= m+1
            boys_next_to_propose[i] += 1
            continue
        end

        #女性jが独身なら婚約する.
        if p == 0
            girls_partners[j] = i
            boys_partners[i] = j

        #女性jが婚約している場合
        else
        #女性jがiの方が好きなら,婚約する.
            if girls_rankings[i,j] < girls_rankings[p,j]
                girls_partners[j] = i
                boys_partners[i] = j
                boys_partners[p] = -1

            end
        end
        boys_next_to_propose[i] += 1
    end
    
    return boys_partners, girls_partners    
end

#独身の男性を返す.(存在しなければ0)
function get_single(partners)
    m = size(partners, 1)
    for i in 1:m
        if partners[i] == -1
          return i
        end        
    end
    return 0   
end


end


Out[1]:
MyMatchingA

In [ ]: