Skip to content

lancatlin/combine_generator

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

19 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

排列組合計算機

排列組合計算機會依照設定條件去窮舉所有可能性,並可自訂 JavaScript 篩選器來篩選複雜條件。

使用說明

元素數量:填入一個自然數,設定有多少元素,會對應到 0 ~ n-1

取出幾個項目:填入一個自然數,設定要取出多少個數字做排列

重複:元素是否可重複

組合:是否只計算組合

首項非零:第一項是否要避開 0,主要用於數字問題

自訂篩選器:在其中填入一個 JavaScript 函式:

(array) => {
	return true
}

array 是所有結果中的其中一項,例如 [0, 2, 3] 或 [2, 3, 1] 等,回傳 true 代表納入此結果,false 則是排除此結果。array 是一個長度為排列數量的自然數陣列。可以在函式中使用所有的 JavaScript 語法。

範例一:數字問題

題目:由 0~5 組成的所有三位數,且為 3 的倍數

從 6 個元素,取出 3 個項目,首項非零,以及以下篩選器:

(array) => {
    let sum = 0
    for (let value of array) sum += value
    return sum % 3 == 0
}

可得到總共有 40 個結果:102 105 120 123 132 135 150 153 201 204 210 213 231 234 240 243 312 315 321 324 342 345 351 354 402 405 420 423 432 435 450 453 501 504 510 513 531 534 540 543

範例二:舞伴問題

題目:有五對夫婦跳舞,若夫婦彼此不共舞,舞伴為一男一女組合,舞伴的配法總數

從 5 個元素,取出 5 個項目,加上以下篩選器:

(array) => {
    for (let i in array) if (array[i] == i) return false
    return true
}

可得到答案為 44 種。

範例三:搭船問題

題目:有 3 艘不同的小船,每傳最多載 5 人,若有 8 人同時要搭船,有多少種搭法

從 3 個元素(三艘船),取出 8 個項目(每個人選擇一艘船),可重複,加上以下篩選器:

(array) => {
    let total = new Array(3).fill(0)	// 儲存每艘船載了多少人
    for (let value of array) {
        total[value]++
        if (total[value] > 5) return false
    }
    return true
}

可得到答案為 6174 種。

範例四:排列問題

題目:A, B, C, D, E, F, G, H, I 共 9 人排成一列,若 E 必居中,A, B, C, D 不得在首,D, G, F, 不得在尾,排法有多少?

由於 E 不影響排列,將其忽視。從 8 個元素中取出 8 個,加入以下篩選器:

(array) => {
    let l = array.length - 1 // 末項索引
    return array[0] > 3 && (array[l] < 3 || array[l] > 5)
}

答案為 12960。