Всем привет
Поставили мне задачу из файла вида:
Сделать файл вида:
Как я делал:
записал все строки в массив $arr
заменил все входы (.inputs a b c d) на x[0] и т.д.
заменил все выходы (.outputs e f g h i j k l m n) на z[0] и т.д.
Всё сделано было с помощью for to и StringRegExpReplace
Получился такой файл:
Начал делать замену всех не x[],z[] переменных на y[].
Для этого сделал новый массив $arr1 куда тем же for to поместил все индексы ( 103 115 104 100 101 и т.д.)
Здесь $max - максимальное значение индекса(задаётся руками, если поможете автоматизировать это, буду очень благодарен)
Далее идёт само преобразование ( в полном коде видно)
На выходе:
Проблема1 :
Если есть переменная y=[115], то при наличии индекса 1 получим что-то вроде y[18] 15]
Подскажите как исправить! Целый день сижу всё никак не придумать :(
Пример файла 123.txt:
Вот весь код:
Прошу прощения за его качество.
После этого планирую как-то с помощью If и того же StringRegExpReplace
привести к нужному виду.
UPD1. Первую проблему исправил, осталась вторая.
Придумал решение в 111.txt пишем не число, а [число]
и тогда RegExp будет 'y='&$arr1, но тогда он ничего не меняет. Варианты?
Поставили мне задачу из файла вида:
Код:
.inputs a b c d
.outputs e f g h i j k l m n
.gate nor1 a=d y=[103]
.gate nor2 a=c b=d y=[115]
.gate nor1 a=[115] y=[104]
и т.д.
Код:
y[0] = !x[2];
y[1] = !x[2];
y[2] = !x[0];
y[3] = !x[1];
y[4] = !(x[0] || x[1]);
y[5] = !(y[2] || y[3]);
y[6] = !(x[0] || x[1]);
Как я делал:
записал все строки в массив $arr
заменил все входы (.inputs a b c d) на x[0] и т.д.
заменил все выходы (.outputs e f g h i j k l m n) на z[0] и т.д.
Всё сделано было с помощью for to и StringRegExpReplace
Получился такой файл:
Код:
nor1 x[3] y=[103]
nor2 x[2] x[3] y=[115]
nor1 a=[115] y=[104]
nor1 x[0] y=[100]
nor1 x[1] y=[101]
nor3 a=[104] x[0] x[1] y=[0]
nor1 a=[0] z[0]
nor3 a=[104] x[1] c=[100] y=[1]
nor1 a=[1] z[1]
nor3 a=[104] x[0] c=[101] y=[2]
nor1 a=[2] z[2]
nor3 a=[104] b=[100] c=[101] y=[3]
nor1 a=[3] z[3]
nor2 a=[115] x[3] y=[116]
Для этого сделал новый массив $arr1 куда тем же for to поместил все индексы ( 103 115 104 100 101 и т.д.)
Код:
For $a= 0 To $max Step +1
$param=StringInStr($arr,'a=['&$a&']')
$param=StringInStr($arr,'b=['&$a&']')
$param=StringInStr($arr,'c=['&$a&']')
$param=StringInStr($arr,'d=['&$a&']')
$param=StringInStr($arr,'y=['&$a&']')
;----------------------------Запись их в вспомогательный массив arr1--
If $param>0 Then
$arr1=$a
$j1=$j1+1
FileWriteLine($y_var, $arr1 & @CRLF)
EndIf
Next
Далее идёт само преобразование ( в полном коде видно)
На выходе:
Код:
nor1 x[3] y[19]
nor2 x[2] x[3] y[18]
nor1 y[18] y[17]
nor1 x[0] y[16]
nor1 x[1] y[15]
nor3 y[17] x[0] x[1] y[14]
nor1 y[14] z[0]
nor3 y[17] x[1] y[16] y[13]
nor1 y[13] z[1]
nor3 y[17] x[0] y[15] y[12]
nor1 y[12] z[2]
nor3 y[17] y[16] y[15] y[11]
nor1 y[11] z[3]
nor2 y[18] x[3] y[13]6]
nor1 y[13]6] y[13]9]
nor3 y[13]9] x[0] x[1] y[8]
nor1 y[8] z[4]
nor3 y[13]9] x[1] y[16] y[7]
nor1 y[7] z[5]
nor3 y[13]9] x[0] y[15] y[6]
nor1 y[6] z[6]
nor3 y[13]9] y[16] y[15] y[5]
nor1 y[5] z[7]
nor3 y[19] x[1] x[2] y[13]7]
nor1 y[13]7] y[13]4]
nor2 x[0] y[13]4] y[2]
nor1 y[2] z[8]
nor2 y[16] y[13]4] y[1]
nor1 y[1] z[9]
.end
Если есть переменная y=[115], то при наличии индекса 1 получим что-то вроде y[18] 15]
Подскажите как исправить! Целый день сижу всё никак не придумать :(
Пример файла 123.txt:
Код:
.inputs a b c d
.outputs e f g h i j k l m n
.gate nor1 a=d y=[103]
.gate nor2 a=c b=d y=[115]
.gate nor1 a=[115] y=[104]
.gate nor1 a=a y=[100]
.gate nor1 a=b y=[101]
.gate nor3 a=[104] b=a c=b y=[0]
.gate nor1 a=[0] y=e
.gate nor3 a=[104] b=b c=[100] y=[1]
.gate nor1 a=[1] y=f
.gate nor3 a=[104] b=a c=[101] y=[2]
.gate nor1 a=[2] y=g
.gate nor3 a=[104] b=[100] c=[101] y=[3]
.gate nor1 a=[3] y=h
.gate nor2 a=[115] b=d y=[116]
.gate nor1 a=[116] y=[109]
.gate nor3 a=[109] b=a c=b y=[4]
.gate nor1 a=[4] y=i
.gate nor3 a=[109] b=b c=[100] y=[5]
.gate nor1 a=[5] y=j
.gate nor3 a=[109] b=a c=[101] y=[6]
.gate nor1 a=[6] y=k
.gate nor3 a=[109] b=[100] c=[101] y=[7]
.gate nor1 a=[7] y=l
.gate nor3 a=[103] b=b c=c y=[117]
.gate nor1 a=[117] y=[114]
.gate nor2 a=a b=[114] y=[8]
.gate nor1 a=[8] y=m
.gate nor2 a=[100] b=[114] y=[9]
.gate nor1 a=[9] y=n
.end
Код:
#include <Array.au3>
$input= FileOpen("123.txt",0)
$output= FileOpen("132.txt",2)
$y_var= FileOpen("111.txt",2)
$max=120 ; Максимальный индекс 3 переменной ( y[] )
$j=1 ; Вспомогательный массив
$j1=0 ; Вспомогательный массив
$n=0 ; Массив данных
$a=0 ; Переменная для 3 замены( у[])
$int=0 ; Счётчик для замены 3 переменной( у[])
;-----------Определение количества вх и вых переменных-------
$c1=FileReadLine($input,1)
$c1=StringReplace($c1,".inputs", "")
$l1=StringLen($c1)
$c2=FileReadLine($input,2)
$c2=StringReplace($c2,".outputs", "")
$l2=StringLen($c2)
$in= $l1/2 ; Количество входных переменных
$out=$l2/2 ; Количество выходных переменных
FileClose($input)
;------------------------------------------------------------
;-----------------------------Определение размера массива-----
$input= FileOpen("123.txt",0)
While 1
$line= FileReadLine($input)
If @error = -1 Then ExitLoop
$n=$n+1
WEnd
;--------------------------------------------------------------
Global $arr[$n] ; Массив данных
Global $arr1[$j] ;Вспомогательных массив
$input= FileOpen("123.txt",0)
FileReadLine($input,2) ; Пропуск лишней строки
;----------------------------Ввод массива--------
For $i = $n to 0 Step -1
$arr= FileReadLine($input)
$inp=0 ; Счётчик для замены 1 переменной( x[])
$outp=0 ; Счётчик для замены 2 переменной( z[])
$k=97 ; Восьмеричная запись числа a( Счётчик букв элементов)
;-----------------------------Замена 1 переменной( х[])---
For $in=$l1/2 To 1 Step -1
$s= Chr($k) ; Преобразование числа в букву алфавита( т.к. нельзя считать буквы)
$zam1='x['&$inp&'] '
$arr = StringRegExpReplace($arr,'a='&$s&' ',$zam1)
$arr = StringRegExpReplace($arr,'b='&$s&' ',$zam1)
$arr = StringRegExpReplace($arr,'c='&$s&' ',$zam1)
$arr = StringRegExpReplace($arr,'d='&$s&' ',$zam1)
$arr = StringReplace($arr,".gate ", "")
$k=$k+1
$inp=$inp+1
Next
;-----------------------------Замена 2 переменной( z[])---
For $out=$l2/2 To 1 Step -1
$s= Chr($k)
$zam2='z['&$outp&']'
$arr = StringRegExpReplace($arr,'y='&$s,$zam2)
$k=$k+1
$outp=$outp+1
Next
;----------------------------- Выбор индексов 3 переменной ( y[] )---
For $a= 0 To $max Step +1
$param=StringInStr($arr,'a=['&$a&']')
$param=StringInStr($arr,'b=['&$a&']')
$param=StringInStr($arr,'c=['&$a&']')
$param=StringInStr($arr,'d=['&$a&']')
$param=StringInStr($arr,'y=['&$a&']')
;----------------------------Запись их в вспомогательный массив arr1--
If $param>0 Then
$arr1=$a
$j1=$j1+1
FileWriteLine($y_var, $arr1 & @CRLF)
EndIf
Next
$int=$int+1
FileWriteLine($output, $arr & @CRLF)
Next
FileClose($y_var)
FileClose($output)
FileClose($input)
$output= FileOpen("132.txt",0)
$output2= FileOpen("000.txt",2)
;---------------------Замена 3 переменной ( y[] )-----
For $i=$n To 0 Step -1
$arr= FileReadLine($output) ; Заполнение массива заново из выходного файла
$y_var= FileOpen("111.txt",0) ; Открытие файла 3 переменной
For $m= $j1 To 1 Step -1 ; от $j1 строки до 0
$arr1 = FileReadLine($y_var) ; Заполнение массива заново из файла 3 переменной
$zam3='y['&$m&']'
$arr = StringRegExpReplace($arr,'y=.'&$arr1&'.',$zam3)
$arr = StringRegExpReplace($arr,'a=.'&$arr1&'.',$zam3)
$arr = StringRegExpReplace($arr,'b=.'&$arr1&'.',$zam3)
$arr = StringRegExpReplace($arr,'c=.'&$arr1&'.',$zam3)
$arr = StringRegExpReplace($arr,'d=.'&$arr1&'.',$zam3)
;MsgBox(0,"1",$arr&" "&$zam3&" "&$arr1&" "&$m)
Next
FileClose($y_var)
FileWriteLine($output2, $arr & @CRLF)
Next
После этого планирую как-то с помощью If и того же StringRegExpReplace
привести к нужному виду.
UPD1. Первую проблему исправил, осталась вторая.
Придумал решение в 111.txt пишем не число, а [число]
и тогда RegExp будет 'y='&$arr1, но тогда он ничего не меняет. Варианты?