这很容易被误解,所以我会简化它。假设我有一个数组,这是掷骰子的结果。像:
1 2 4 6 1 2 6 6 2 4等
每次投掷6分,你就赢了。我想创建一个新的数组,其中包含基于原始数组获胜的转数。所以上面的数组会创建一个数组:
4 3 1
(获胜需要4个回合,然后是3个,然后是1个)
所以我只想计算6的距离。 (我也可以将骰子结果转换为二进制赢/输)
我如何在Excel中执行此操作? (或javascript,但真的更喜欢excel)
答案 0 :(得分:1)
创建辅助列(Excel A列)。将1放在Helper柱的第一个单元格(A2)中。跟随公式(在A3中)= IF(B3 = 6,A2 + 1,A2)。将它拖到给定数组的最后一行。
然后创建一个结果列(Excel的C列)。输入公式(在C2中) = IF(ROW() - 1 = MAX(A:A) “”,IF(IF(ROW() - 1 = 1,COUNTIF(A:A,ROW() - 1)+ 1,COUNTIF(A: A,ROW() - 1))= 0 “”,IF(ROW() - 1 = 1,COUNTIF(A:A,ROW() - 1)+ 1,COUNTIF(A:A,ROW() - 1))))
在结果列的第一个单元格中(Excel的C列)。拖动并获得所需的结果。
Hide Helper Column。
注意:阵列数据从单元格B2开始
答案 1 :(得分:0)
如果第一个数组是B1:K1,则可以使用:
创建第二个数组=IF(B1=6,COLUMN()-SUM(A2:$B2)-1,"")
在B2中并复制到西装。
答案 2 :(得分:0)
您需要做的是迭代数组并通过累积到收集器变量来计算空间。您可以在其下面找到刚刚弹出的警告窗口代码。(Javascript)
var array = [1, 2, 4, 6, 1, 2, 6, 6, 2, 4]
var resultArray = []
var i = 0;
var distance = 0;
for (i = 0; i < array.length; i++) {
distance++;
if (array[i] == 6) {
resultArray.push(distance);
distance = 0;
}
}
alert(resultArray);
&#13;
我试图在excel中做。
您可以放置一个命令按钮并定义如下的子功能,您将获得预期的结果。有关如何放置命令按钮http://www.excel-easy.com/vba/create-a-macro.html#command-button
的说明Sub DistanceOf6InString(x As String)
Size = Len(x)
distance = 0
result = ""
Dim i As Integer
For i = 1 To Size
distance = distance + 1
If (Mid(x, i, 1) = "6") Then
result = result & distance
distance = 0
End If
Next i
MsgBox result
End Sub
Private Sub CommandButton1_Click()
DistanceOf6InString ("1246126624")
End Sub
答案 3 :(得分:0)
这可能对您有用:
var rollsUntil6 = function(rolls) {
return rolls.reduce(function(indices, roll, idx) {
if (roll == 6) {indices.push(idx);} return indices;
}, [-1]).map(function(val, idx, arr) {
return val - arr[idx - 1];
}).slice(1);
};
rollsUntil6([1, 2, 4, 6, 1, 2, 6, 6, 2, 4]); //=> [4, 3, 1]
答案 4 :(得分:0)
您可以重复查找array.indexOf(6,lastmatch)
var array = [1,2,4,6,1,2,6,6,2,4];
var resultArray= [], i, incr= 0;
while((i= array.indexOf(6, incr))!= -1){
i+= 1;
resultArray.push(i-incr);
incr= i;
}
resultArray返回值:(数组)[4,3,1]