Что нового

Получить числа и их количество совпадении

bigarN

Новичок
Сообщения
50
Репутация
0
Версия AutoIt: 3.3.12

Описание:
Думаю, так будет нагляднее и понятнее.
Имеется файл с диапазонами чисел.
1-5
1-3
2-4
3-6
3-10
1-8
2-6

В этих диапазонах имеется числа которые присутствуют во всех.

1-5 ( 1,2,3,4,5 )
1-3 ( 1,2,3 )
2-4 ( 2,3,4 )
3-6 ( 3,4,5,6 )
3-10 ( 3,4,5,6,7,8,9,10 )
1-8 ( 1,2,3,4,5,6,7,8 )
2-6 ( 2,3,4,5,6 )

Вопрос - какие эти числа и сколько раз они совпадают.
1-5 ( 1,2,3,4,5 )
1-3 ( 1,2,3 )
2-4 ( 2,3,4 )
3-6 ( 3,4,5,6 )
3-10 ( 3,4,5,6,7,8,9,10 )
1-8 ( 1,2,3,4,5,6,7,8 )
2-6 ( 2,3,4,5,6 )

Результат
1 - 3 совп
2 - 5 совп
3 - 7 совп
4 - 6 совп
5 - 5 совп
6 - 4 совп
7 - 2 совп
8 - 2 совп
9 - 1 совп
10 - 1 совп
Примечания:
На самом деле числа 6 значные типа 091434 - 131165
Вот фрагмент. При таких диапазонах получается большой файл. :stars:
132270 - 132915
130032 - 131318
124022 - 144036
091434 - 125165
 
A

Alofa

Гость
bigarN сказал(а):
Результат
...
10 - 0 совп
Вы уверены?

bigarN сказал(а):
На самом деле числа 6 значные типа 091434 - 131165
То есть может быть и так: 000001 - 999999?


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

А результат куда должен выводиться и в каком виде?
 
Автор
B

bigarN

Новичок
Сообщения
50
Репутация
0
То есть может быть и так: 000001 - 999999?
Чесгря не понял, что в файле то и будет.

А результат куда должен выводиться и в каком виде?
Я пробовал вот это - для подсчета и сохранения
http://autoit-script.ru/index.php?topic=2930.msg76921#msg76921
 
A

Alofa

Гость
bigarN сказал(а):
Я пробовал вот это...
Ну и каков результат?


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

bigarN сказал(а):
... Чесгря не понял...
Я про количество входящих в диапазон чисел. Ведь чем их больше, тем больше и работы.
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Файл с диапазонами чисел для теста дайте
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Код:
Global $dictionary = ObjCreate('scripting.dictionary')

Local $range_1 = '132270 - 132280'
Local $range_2 = '132270 - 132915'
Local $range_3 = '132910 - 132915'
Local $ranges = [$range_1, $range_2, $range_3]

For $range In $ranges
	count($range)
Next

For $key In $dictionary.keys()
	ConsoleWrite($key & ' ' & $dictionary.item($key) & ' совпадений' & @CRLF)
Next

Func count($range)
	Local $range_i = StringRegExp($range, '(\d+)', 3)[0]
	Local $range_j = StringRegExp($range, '(\d+)', 3)[1]
	For $i = $range_i To $range_j
		$dictionary.item($i) += 1
	Next
EndFunc
 
Автор
B

bigarN

Новичок
Сообщения
50
Репутация
0
Alofa
Ну и каков результат?
Результат есть но файл обрабатывается очень долго. В файле 8 строк - 20 сек
Код:
#include <Array.au3>
#include <File.au3>

Local $aArray, $stringG, $sOut

$Timer = TimerInit()
$sFile = @ScriptDir & '\test1.txt'
_FileReadToArray($sFile, $aArray, $FRTA_NOCOUNT)

ConsoleWrite('Число строк в Файле = ' & UBound($aArray) & @CRLF)

For $i = 0 To UBound($aArray) - 1

	$sPeriod = $aArray[$i]
	$sPerLeft6 = StringLeft($sPeriod, 6)
	$sPerRight6 = StringRight($sPeriod, 6)

	$dDiff6n = $sPerRight6 - $sPerLeft6
	$aPeriod = _A($sPerLeft6, $dDiff6n)
	$stringG &= $aPeriod & @CRLF

Next

;~ $sFile = @ScriptDir & '\4_Comp.txt'
;~ $hFile = FileOpen($sFile, 2 + 8)
;~ FileWrite($hFile, $stringG)
;~ FileClose($hFile)

Func _A($sPerLef6, $dDif6n)
	For $i = 1 To $dDif6n
		$sOutput = $sPerLef6 + $i
		$sOut &= $sOutput & @CRLF
		;ConsoleWrite($sOut & @CRLF)
	Next
	Return $sOut
EndFunc   ;==>_A


;$aList = StringSplit(FileRead($sFile), @CRLF, 1)
$aList = StringSplit($stringG, @CRLF, 1)
$oDictionary = ObjCreate("Scripting.Dictionary")

;~ считаем, сколько раз повторяются уникальные строки
For $i = 1 To $aList[0]
    $oDictionary.Item ($aList[$i]) = $oDictionary.Item ($aList[$i]) + 1
Next

ConsoleWrite(TimerDiff($Timer) & @LF)

;~ выводим результат
$out = FileOpen(@ScriptDir & '\5_Kol2 .txt', 2+8)
For $vKey In $oDictionary
    if $vKey == "" Then
        ContinueLoop
    EndIf
	If $oDictionary.Item($vKey)>=2 Then
    FileWriteLine($out, $vKey & " = " & $oDictionary.Item($vKey))
	EndIf
Next

FileClose($out)
Alofa
Я про количество входящих в диапазон чисел. Ведь чем их больше, тем больше и работы.
В файле около 5000 строк. Да, скрипту потребуется большего времени.

ra4o
Файл с диапазонами чисел для теста дайте

132270 - 132915
130032 - 131318
124022 - 144036
091434 - 125165
119143 - 133116
104081 - 154102
151426 - 177778
080213 - 102000

Сохраните это под именем test1.txt

inververs
OK
Как мне прикрутить файл скрипту?
Так правильно будет?
Код:
For $key In $dictionary.keys()
  If $dictionary.item($key) >=2 Then
    ConsoleWrite($key & ' ' & $dictionary.item($key) & ' совпадений' & @CRLF)
  EndIf
Next
 
A

Alofa

Гость
inververs сказал(а):
bigarN [?]
Как мне прикрутить файл скрипту?Так правильно будет?
Да, только вместо consolewrite - filewrite

И лучше не в цикле это делать.
Код:
Local $sText

For $key In $dictionary.keys()
  $i = $dictionary.item($key)
  If $i >=2 Then $sText &= $key & ' ' & $i & ' совпадений' & @CRLF
Next
Filewrite(@Scriptdir & '\Result.txt', $sText)
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Можно и в цикле, если перед этим открыть файл и писать в хэндл
 
Автор
B

bigarN

Новичок
Сообщения
50
Репутация
0
Прикрутил :IL_AutoIt_1:
Код:
#include <Array.au3>
#include <File.au3>

Global $dictionary = ObjCreate('scripting.dictionary')
Local $aArray, $sText

$sFile = @ScriptDir & '\test1.txt'
_FileReadToArray($sFile, $aArray, $FRTA_NOCOUNT)

For $i = 0 To UBound($aArray) - 1
	$sPeriod = $aArray[$i]
	count($sPeriod)
Next

For $key In $dictionary.keys()
	$i = $dictionary.item($key)
	If $i >= 2 Then $sText &= $key & ' = ' & $i & ' совпадений' & @CRLF
Next

$sFile = @ScriptDir & '\Result.txt'
$hFile = FileOpen($sFile, 2 + 8)
FileWrite($hFile, $sText)
FileClose($hFile)

Func count($range)
	Local $range_i = StringRegExp($range, '(\d+)', 3)[0]
	Local $range_j = StringRegExp($range, '(\d+)', 3)[1]
	For $i = $range_i To $range_j
		$dictionary.item($i) += 1
	Next
EndFunc   ;==>count
 
Верх