Javascript
 Computer >> コンピューター >  >> プログラミング >> Javascript

パーツの数と各パーツが2の累乗であり、パーツのサイズと数がJavaScriptで制限されているパーティションN


数値を取り込むJavaScript関数を作成する必要があります。関数は、次のルールに従って数値をチャンクに分割する必要があります-

  • チャンクの数は2の累乗である必要があります

  • 各チャンクには、2の累乗の数のアイテムも必要です(サイズは最大2の累乗になるため、1、2、4、8、16、32、32が最大になります)

したがって、たとえば、8つを1つのバケットに分割できます-

[8]

9は-

である可能性があります
[8, 1]

これは、両方の数値が2の累乗であり、配列のサイズが2(これも2の累乗)であるために機能します。

11を試してみましょう-

[8, 2, 1]

いいえ、機能しません。

配列のサイズは3であるため、11に追加されますが、2の累乗ではありません。

[4, 4, 2, 1]

それはうまくいきます! 2の累乗である4つの要素です。

このためのコードは-

になります
function permuteCombinations(n, maximum){
   const maxPowerOf2 = 1 << maximum;
   const m = ~~(n / maxPowerOf2);
   const A = new Array(maximum + 1).fill(0);
   A[maximum] = m;
   let num = n − m * maxPowerOf2;
   let p = 0;
   let bitCount = 0;
   while (num){
      if (num & 1){
         bitCount += 1;
         A[p] = 1;
      }
      num >>= 1;
      p += 1;
   }
   const min = m + bitCount;
   let target = 1;
   while (target < min)
   target *= 2;
   if (target > n)
   return −1;
   if (target == min)
   return A.map((c, p) => [1 << Number(p), c]);
   if (target == n)
   return [n];
   target = target − min;
   let i = m ? maximum : p;
   while (target && i > 0){
      if (!A[i]){
         i −= 1;
         continue;
      }
      const max = Math.min(target, A[i]);
      A[i] −= max;
      A[i−1] += 2*max;
      target −= max;
      i −= 1;
   }
   return target ? −1 : A.map((c, p) => [1 << Number(p), c]);
};
console.log(permuteCombinations(11, 5));

出力

そして、コンソールの出力は-

になります
[ [ 1, 1 ], [ 2, 1 ], [ 4, 2 ], [ 8, 0 ], [ 16, 0 ], [ 32, 0 ] ]

  1. JavaScriptで幅と画面サイズの比率(幅:高さ)に基づいて高さを見つける

    問題 画面の幅を最初の引数として、アスペクト比(w:h)を2番目の引数として受け取るJavaScript関数を作成する必要があります。これらの2つの入力に基づいて、関数は画面の高さを返す必要があります。 例 以下はコードです- const ratio = '18:11'; const width = 2417; const findHeight = (ratio = '', width = 1) => {    const [w, h] = ratio    .split(':')  

  2. JavaScriptで素数の累乗と積として数を表す

    問題 正の整数をとるJavaScript関数を作成する必要があります。私たちの関数は、この数を素数の累乗の合計として表す必要があります。 したがって、数値nの場合、関数は次のような文字列を返す必要があります- n = "(p1**n1)(p2**n2)...(pk**nk)" ここで、p1、p2、p3..pkは素数であり、n1、n2、.. nkはそれらの非負の累乗であり、**bは累乗bを表します。 例 以下はコードです- const isPrime = num => {     for(let i = 2; i < num; i++)