Итерация ограниченного числа элементов из массива - PullRequest
0 голосов
/ 01 октября 2019

У меня есть функция, которая принимает строку, содержащую три типа элементов: значение символа, которое может быть F или B, за которым следует целое число, представляющее день, и другое целое число, представляющее продажи или платежи, сделанные в зависимостиесли перед значением дня стоит буква F или B, функция должна возвращать все дни, в которые значение sales не равно сумме до 4 платежей, совершенных в день или в день. дни после (например, F 1 100 F 2 50 B 2 25 B 3 25 возвращает 1). Поскольку я не могу использовать равные значения оплаты для разных значений продаж, я сделал, чтобы поместить числа из sales в один массив и числа из payments в другой, а затем сравнить их с использованием циклов for, поэтому яЯ должен был сравнить стоимость продажи со значением платежа (сначала проверяя, равен ли день платежа или больше, чем день продажи), если он не равен, я добавляю к значению платежа значение следующего дня и т. д.,до тех пор, пока не будут получены следующие 3 значения платежа, как только сумма продажи соответствует сумме одного, двух, трех или четырех значений платежа, я заменяю их на ноль в обоих массивах, в конце я фильтрую все дни, которые не имеют ноль в качестве значения вмассив sales и возвращает их, но проблема в том, что он учитывает только элементы рядом друг с другом в массиве payments. Поэтому я не знаю, как ограничить количество элементов из массива платежей, которое можно суммировать, чтобы сравнить его со значениями массива продаж.

const bakery = (input) => {
    const table = input.split(' ')
    const sales = []
    const payments = []
    //I separate the numbers into two arrays
    for(i=0;i<table.length/3;i++){
        table[3*i]==='F'?
        sales.push([table[3*i+1],Number(table[3*i+2])]):
        payments.push([table[3*i+1],Number(table[3*i+2])])
    }
    for(i=0;i<sales.length;i++){
        for(j=0;j<payments.length;j++){
            //here I compare every value of the sales array with one, two, three or four
            //values of the payments array, the problem is that they don't have to necessarily consecutive
           //If the 4 first elements don't match I can also use the 5th or 6th element
          //as long as I use only 4 elements in the comparison so I'm not sure how to limit that
            const second = payments[j+1]?payments[j+1][1]:0
            const third = payments[j+2]?payments[j+2][1]:0
            const fourth = payments[j+3]?payments[j+3][1]:0

           if(payments[j][0]>=sales[i][0]){
            if(sales[i][1]===payments[j][1]){
                sales[i][1]=0
                payments[j][1]=0
           }else{
           if(sales[i][1]===payments[j][1]+second){
                sales[i][1]=0
                payments[j][1]=0
                payments[j+1][1]=0
            }else{
                if(sales[i][1]===payments[j][1]+third){
                    sales[i][1]=0
                    payments[j][1]=0
                    payments[j+2][1]=0
                }else{
                    if(sales[i][1]===payments[j][1]+fourth){
                        sales[i][1]=0
                        payments[j][1]=0
                        payments[j+3][1]=0
                    }else{
                        if(sales[i][1]===payments[j][1]+second+fourth){
                            sales[i][1]=0
                            payments[j+1][1]=0
                            payments[j+3][1]=0
                        }else{
                            if(sales[i][1]===payments[j][1]+third+fourth){
                                sales[i][1]=0
                                payments[j+2][1]=0
                                payments[j+3][1]=0
                            }else{
                                if(sales[i][1]===payments[j][1]+second+third+fourth){
                                    sales[i][1]=0
                                    payments[j+1][1]=0
                                    payments[j+2][1]=0
                                    payments[j+3][1]=0
                                }
                             }
                        }
                    }
                }
            }
           }
           }
        }
    }
    //at the end i filter all the days that have zero as values in the sales array
    const missing = sales.filter(sale => sale[1]!==0)
    return missing.map(day=>day[0]).join(' ')

}

Функция работает с

console.log(bakery('F 1 209 F 2 254 F 3 895 F 4 439 B 1 104 B 2 127 B 3 74 B 3 447 B 4 127 B 4 219 B 5 448 B 6 220'))
console.log(bakery('F 1 367 F 2 38 F 3 602 F 4 624 B 1 183 B 2 19 B 3 184 B 3 301 B 4 19 B 4 312 B 5 64 B 6 312'))
console.log(bakery('F 1 995 F 2 884 F 3 749 F 4 866 B 1 497 B 2 442 B 3 319 B 3 374 B 4 239 B 4 433 B 5 375 B 6 177'))

Функция не работает с

console.log(bakery('F 1 123395 F 2 488034 F 3 78861 F 4 200882 F 5 102517 F 6 49658 F 7 201804 F 8 247860 F 9 356333 F 10 163982 F 11 351283 F 12 305592 F 13 443860 F 14 111094 F 15 216152 F 17 220897 F 16 184823 F 19 438974 F 18 464208 B 1 61697 B 2 9577 B 2 244017 B 3 30849 B 3 39430 B 4 244017 B 4 19716 B 4 100441 B 5 19715 B 5 51258 B 6 100441 B 6 25630 B 6 24829 B 7 25629 B 7 100902 B 8 24829 B 8 123930 B 9 100902 B 9 61965 B 9 178166 B 10 61965 B 10 89084 B 10 81991 B 11 89083 B 11 175641 B 12 81991 B 12 152796 B 13 175642 B 13 76398 B 13 221930 B 14 76398 B 14 110965 B 14 55547 B 15 110965 B 15 27774 B 15 108076 B 17 73709 B 17 46206 B 17 110448 B 16 27773 B 16 92411 B 19 110449 B 19 116052 B 19 219487 B 18 46206 B 18 232104 B 21 219487 B 20 116052'))
...