Я хотел бы создать функцию для Google Таблиц, которая позволяет мне перечислять все возможные комбинации чисел от 1 до 8, объединенные 4 раза (от 1111 до 8888, я думаю, что это 8 ^ 4 = 4096).

(Скриншот добавляю для наглядности).

До сих пор я пробовал:

=ArrayFormula(transpose(split(concatenate(A2:A9&B2:B9&C2:C9&D2:D9& char(9)),char(9))))

... но это дает мне только 8 комбинаций: 1111, 2222, 3333, 4444, 5555, 6666, 7777, 8888.

Я немного плохо умею программировать, особенно с новыми языками, поэтому я очень благодарен за любую помощь!

enter image description here

1
Peanuts 2 Янв 2018 в 00:57

2 ответа

Лучший ответ

Вот небольшая настраиваемая функция, которая создает все комбинации строки (проще писать для строк):

function combinations(arr) {
  return arr.reduce(function(prod, row) {
    var out = [];
    for (i in row) {
      out = out.concat(prod.map(function(x) {
        return x.concat(row[i]);
      }));
    }
    return out;
  }, [[]]);
}

Использование его как =combinations(A2:D9) приведет к созданию 4 ^ 8 комбинаций, каждая длиной 8, и это не то, что вам нужно. Но достаточно легко транспонировать:

=combinations(transpose(A2:D9))

Вышеупомянутая функция возвращает комбинации в виде прямоугольного массива, поэтому в вашем примере вывод будет иметь ширину 4 столбца. Если вы хотите объединить комбинации в одну ячейку (чтобы вывод был одним столбцом), используйте эту измененную версию:

function joincombinations(arr) {
  return arr.reduce(function(prod, row) {
    var out = [];
    for (i in row) {
      out = out.concat(prod.map(function(x) {
        return x.concat(row[i]);
      }));
    }
    return out;
  }, [[]]).map(function(row) {
    return row.join("");
  });
}

Использование: =joincombinations(transpose(A2:D9))

2
1 Янв 2018 в 23:57

Пытаться

=arrayformula(if(row(A:A)>4096,"",int((row(A:A)-1)/512)+1&mod(int((row(A:A)-1)/64),8)+1&mod(int((row(A:A)-1)/8),8)+1&mod(int((row(A:A)-1)/1),8)+1))

(необходимо не менее 4096 строк в листе).

1
Tom Sharpe 1 Янв 2018 в 23:13