У меня есть функция, которая принимает строку, содержащую три типа элементов: значение символа, которое может быть 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'))