2015-04-14 5 views
0

Это легко объяснить, поэтому я упрощу его. Предположим, у меня есть массив, который является результатом бросков кубиков. Как:Создание нового массива, который учитывает расстояние между конкретными номерами

1 2 4 6 1 2 6 6 2 4 и т.д.

Каждый раз, когда вы бросаете 6, вы выиграете. Я хочу создать новый массив, который содержит после того, сколько ходов вы выиграете на основе исходного массива. Таким образом, выше массив будет создать массив, который:

(она занимает 4 поворачивается, чтобы выиграть, то 3, то 1)

Так что я только хочу, чтобы подсчитать расстояние между 6-х. (Я также мог бы преобразовать результаты в кости в бинарный выигрыш/проиграть)

Как это сделать в Excel? (Или JavaScript, но на самом деле предпочитают первенствовать)

+0

я должен заметить, что массив более 100 000 пунктов, так что я не могу поставить его в JavaScript вручную. Мне также нужен способ сохранить массив (именно поэтому я предпочитаю excel). –

ответ

1

Создать Helper столбец (A из Excel). Поместите 1 в первую ячейку (A2) столбца Помощника. Следуйте за ним формулой (в A3) = IF (B3 = 6, A2 + 1, A2). Удалите ее до последней строки для данного массива.

Затем создайте столбец результатов (столбец C Excel). Введите формулу (в C2) = IF (ROW() - 1 = MAX (A: A), "", IF (IF (ROW() - 1 = 1, COUNTIF (A: A, ROW() - 1) + 1, СЧЕТЕСЛИ (А: А, СТРОКА() - 1)) = 0, "", ЕСЛИ (СТРОКА() - 1 = 1, СЧЕТЕСЛИ (А: А, СТРОКА() - 1) + 1, СЧЕТЕСЛИ (A: A, ROW() - 1))))

в первой ячейке столбца результата (столбец C Excel). Перетащите и получите требуемый результат.

Скрыть колонку помощника.

Примечание: массив данных начинается с ячейки B2

Excel Screenshot

0

Если первый массив B1: K1 второй может быть создан с помощью:

=IF(B1=6,COLUMN()-SUM(A2:$B2)-1,"") 

в B2 и скопированы в костюм.

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);

я принял попытку делать в 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 
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] 
0

Вы можете повторно найти Array.indexOf (6, lastmatch)

вар массива = [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 возвращаемое значение: (Array) [4,3,1]

Смежные вопросы