Что нового

[Математика] исключение из массива

yuran2

Хочу все уметь
Сообщения
38
Репутация
0
Версия AutoIt: 3.3.8.1

Описание: :scratch: Нужно исключить из массива не подходящие числа
массив чисел динамический (размерность может меняться )
к примеру :
Код:
dim $massiv[9] = [12,5,13,14,15,16,2,16,30]

нужно исключить "лишние" цифры т.е. - 5,2 и 30
или еще пример :
Код:
dim $massiv[12] = [1,5,15,14,13,12,2,11,11,18,45,12]

"лишние" цифры - 1,5,2,18 и 45
Примечания:
чисел в массиве может быть не меньше 2 или не больше 20. Числа в массиве не больше 50 и не меньше 0 .Небольшая подсказка- разность соседних чисел равна по модулю 1 или нулю
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Автор
Y

yuran2

Хочу все уметь
Сообщения
38
Репутация
0
разность любых соседних чисел равна по модулю 1 или нулю
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
yuran2 [?]
разность любых соседних чисел равна по модулю 1 или нулю
Я с математикой не очень, так что либо придётся разъяснить что значит «разница равна по модулю», либо дождаться тех кто знает о чём речь.
 
Автор
Y

yuran2

Хочу все уметь
Сообщения
38
Репутация
0
=) a- b =1 или a- b =-1 или a-b = 0
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Т.е если отминусовать число с левого края от числа с правого края, то должно получиться либо 1 либо 0, и это будет лишним числом?
Тогда что если слева или справа нет числа (начало/конец массива)?
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
375
Еще сократил
Код:
#include <Array.au3>

Dim $aArray[12] = [1,5,15,14,13,12,2,11,11,18,45,12]
Dim $aArray2[1]
$iCounter = 0
For $i = 0 To UBound($aArray) - 2
	If (Abs($aArray[$i] - $aArray[$i + 1]) <= 1) Or ($i > 0 And Abs($aArray[$i - 1] - $aArray[$i]) <= 1)Then
		ReDim $aArray2[$iCounter + 1]
		$aArray2[$iCounter] = $aArray[$i]
		$iCounter += 1
	EndIf
Next
_ArrayDisplay($aArray)
_ArrayDisplay($aArray2)
 
Автор
Y

yuran2

Хочу все уметь
Сообщения
38
Репутация
0
Redline :beer: но есть недостаток обрезает крайние числа с левого и правого края
Код:
#include <Array.au3>

Dim $aArray[12] = [16,5,15,14,13,12,2,11,11,18,45,12]
Dim $aArray2[1]
$iCounter = 0
For $i = 0 To UBound($aArray) - 2
    If (Abs($aArray[$i] - $aArray[$i + 1]) <= 1) Or ($i > 0 And Abs($aArray[$i - 1] - $aArray[$i]) <= 1)Then
        ReDim $aArray2[$iCounter + 1]
        $aArray2[$iCounter] = $aArray[$i]
        $iCounter += 1
    EndIf
Next
_ArrayDisplay($aArray)
_ArrayDisplay($aArray2)

16 и 12 исчезли
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Какова цель создания данной темы?
Это конкурс?

Код:
Dim $aArray[4] = [11,10,12,11]

Что здесь лишнее?
 
Автор
Y

yuran2

Хочу все уметь
Сообщения
38
Репутация
0
Dim $aArray[4] = [11,10,12,11]
Что здесь лишнее?
10 лишняя
или 12 не хватает данных )
принцип такой - бот ходит по координатной прямой может двигаться в право влево или стоять пример "5 4 3 3 2 1 2 3 4 " и так далее а вот ряд "6 7 8 7 6 5 3 2 4 3 " в этом ряду лишняя 3 и 2 идущие после 5 так как скакнуть он не может с 5ки на 3
но обычно "ошибки " резко отличаются от "правильных " значений не на единицу а на большее число 12 13 14 25 13 14 4 13 14 15 15 25 и 4 лишние
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
375
Вот так можно попробовать, но первая координата должна быть "верной", иначе вычислить правильный маршрут будет сложно.
Код:
#include <Array.au3>

Dim $aArray[12] = [16,5,15,14,13,12,2,11,11,18,45,12]
Dim $aArray2[1]
$iCounter = 0
$iLast = 0
For $i = 0 To UBound($aArray) - 1
	For $j = $i + 1 To UBound($aArray) - 1
		If Abs($aArray[$i] - $aArray[$j]) <= 1 Then
			ReDim $aArray2[$iCounter + 1]
			$aArray2[$iCounter] = $aArray[$i]
			$iLast = $aArray[$j]
			$iCounter += 1
			ExitLoop
		EndIf
	Next
Next
ReDim $aArray2[$iCounter + 1]
$aArray2[$iCounter] = $iLast
_ArrayDisplay($aArray2)
 
Автор
Y

yuran2

Хочу все уметь
Сообщения
38
Репутация
0
Redline [?] спасибо :smile: :ok:


Добавлено:
Сообщение автоматически объединено:

;D хотелось бы усложнить и плавно перейти в всвоеобразную двухмерную систему )) x и y
Код:
Dim $aArray[12][12] = [16,5,15,14,13,12,2,11,11,18,45,12],[16,15,15,14,25,12,2,11,11,18,45,12]

все тоже самое отфильтровывать ненужные числа но уже из двумерного массива ? удаляется должно парами
если удаляется число x то удаляется число y ему соответствующее не смотря на то что y "правильное" .
сначала фильтруется по х а потом по y
 

DarWiM

Продвинутый
Сообщения
527
Репутация
90
OffTopic:
Хм, а почему Вы не используете это?
Код:
_ArrayDelete()
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
375
ОК, только двумерный массив с координатами описывается немного по другому ;):
Код:
Dim $aArray[2][12] = [[16,5,15,14,13,12,2,11,11,18,10,11],[16,15,15,14,25,12,2,11,11,18,45,11]]


Результат:
Код:
#include <Array.au3>

Dim $aArray[2][12] = [[16,5,15,14,13,12,2,11,11,18,10,11],[16,15,15,14,25,12,2,11,11,18,45,11]]
_ArrayDisplay($aArray, 'исходный массив')
Dim $aArray2[2][1]
$iCounter = 0
$iLastX = 0
$iLastY = 0
For $i = 0 To UBound($aArray, 2) - 1
	For $j = $i + 1 To UBound($aArray, 2) - 1
		If Abs($aArray[0][$i] - $aArray[0][$j]) <= 1 Then
			ReDim $aArray2[2][$iCounter + 1]
			$aArray2[0][$iCounter] = $aArray[0][$i]
			$aArray2[1][$iCounter] = $aArray[1][$i]
			$iLastX = $aArray[0][$j]
			$iLastY = $aArray[1][$j]
			$iCounter += 1
			ExitLoop
		EndIf
	Next
Next
ReDim $aArray2[2][$iCounter + 1]
$aArray2[0][$iCounter] = $iLastX
$aArray2[1][$iCounter] = $iLastY
_ArrayDisplay($aArray2, 'первый проход: по оси X')

Dim $aArray3[2][1]
$iCounter = 0
$iLastX = 0
$iLastY = 0
For $i = 0 To UBound($aArray2, 2) - 1
	For $j = $i + 1 To UBound($aArray2, 2) - 1
		If Abs($aArray2[1][$i] - $aArray2[1][$j]) <= 1 Then
			ReDim $aArray3[2][$iCounter + 1]
			$aArray3[0][$iCounter] = $aArray2[0][$i]
			$aArray3[1][$iCounter] = $aArray2[1][$i]
			$iLastX = $aArray2[0][$j]
			$iLastY = $aArray2[1][$j]
			$iCounter += 1
			ExitLoop
		EndIf
	Next
Next
ReDim $aArray3[2][$iCounter + 1]
$aArray3[0][$iCounter] = $iLastX
$aArray3[1][$iCounter] = $iLastY
_ArrayDisplay($aArray3, 'второй проход: по оси Y')
 
Автор
Y

yuran2

Хочу все уметь
Сообщения
38
Репутация
0
Redline [?] и еще раз спасибо :smile: тема закрыта :beer:
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
На мой взгляд ТС не хватает образования и опыта для того чтобы корректно сформулировать задачу или описать алгоритм.
Простой пример поставил ТС в тупик (Ответ #10) http://autoit-script.ru/index.php/topic,11371.msg74773.html#msg74773
А ведь можно и продолжить простые примеры
Что здесь лишнее?
Код:
Dim $aArray[4] = [11,10,12,13]

А здесь?
Код:
Dim $aArray[7] = [11,10,12,13,9,8,7]


Предлагаю переформулировать задачу и уже разрабатывать более соответствующий алгоритм.
В файле с массивом координат необходимо выделит подмассив НАИБОЛЬШЕЙ ДИННЫ, так чтобы в полученном масситве все координаты по отношению к предыдущимм координатам былли соседними по вертикали, горизонтали или диагонали, или совпадали с предыдущими координатами.
Код:
Dim $aArray[12][2] = [[16,16],[5,15],[15,15],[14,14],[13,25],[12,12],[2,2],[11,11],[11,11],[18,18],[10,45],[11,11]]

Остаётся ещё вопрос который уже звучал в этой теме:
Считать ли что первая координата всегда правильная?
 
Автор
Y

yuran2

Хочу все уметь
Сообщения
38
Репутация
0
C2H5OH [?] :mad: ну не знаю чего написать , взгляд наверное косой - диплом математика в кармане , опыта достаточно , все чего хотел я получил , вопрос закрыт !
и переформулировать ничего не надо , этот алгоритм работы с двумерный массивом только часть скрипта
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
yuran2,
то есть вот тот результат
Код:
[16,15,12,11,11,11]
[16,15,12,11,11,11]

который выдаёт скрипт Redline на заданном массиве
Код:
Dim $aArray[2][12] = [[16,5,15,14,13,12,2,11,11,18,10,11],[16,15,15,14,25,12,2,11,11,18,45,11]]


Он правильный?
 
Автор
Y

yuran2

Хочу все уметь
Сообщения
38
Репутация
0
для меня правильный так как такого сочетания правильных и неправильных чисел у меня не может быть . ну все хватит уже человек написал с крипт все работает спасибо ему , пишите свой как нравиться а мы его будем проверять и тыкать тут так а тут не так ;)
;D и условия для пар x-y ( сочетаний чисел в рядах и в строке ) я не давал
 
Верх