함수 combinations list()

1 PHP[ | ]

<?php
# http://pyrus.syntaxhighlightforge.net/Math_Combinatorics.html
class Combinations {
    private static $_pointers = [];
    public static function get(array $set, $subset_size=null) {
        $set_size = count($set);
        if (is_null($subset_size)) $subset_size = $set_size;
        if ($subset_size >= $set_size) return array($set);
        if ($subset_size == 1) return array_chunk($set, 1);
        if ($subset_size == 0) return array();
        $combinations = [];
        $set_keys = array_keys($set);
        self::$_pointers = array_slice(array_keys($set_keys), 0, $subset_size);
        $combinations[] = self::_getCombination($set);
        while (self::_advancePointers($subset_size - 1, $set_size - 1)) {
            $combinations[] = self::_getCombination($set);
        }
        return $combinations;
    }
    private static function _getCombination($set) {
        $set_keys = array_keys($set);
        $combination = [];
        foreach (self::$_pointers as $pointer) $combination[$set_keys[$pointer]] = $set[$set_keys[$pointer]];
        return $combination;
    }
    private static function _advancePointers($pointer_number, $limit) {
        if ($pointer_number < 0) return false;
        if (self::$_pointers[$pointer_number] < $limit) {
            self::$_pointers[$pointer_number]++;
            return true;
        }
        if (self::_advancePointers($pointer_number - 1, $limit - 1)) {
            self::$_pointers[$pointer_number] = self::$_pointers[$pointer_number - 1] + 1;
            return true;
        }
        return false;
    }
}
$rows = Combinations::get([1,2,3],2);
foreach($rows as $row) echo implode(',', $row) . PHP_EOL;
# 1,2
# 1,3
# 2,3

2 Python[ | ]

import itertools
lst = list(itertools.combinations([1,2,3],2))
print( lst )
# [(1, 2), (1, 3), (2, 3)]

3 같이 보기[ | ]

문서 댓글 ({{ doc_comments.length }})
{{ comment.name }} {{ comment.created | snstime }}