Created
December 1, 2012 10:51
-
-
Save spellancer/4181489 to your computer and use it in GitHub Desktop.
Model-lab-3
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#encoding: utf-8 | |
# задаем вспомогательные функции | |
# функция с таблицами для сложения | |
def sum(len,a,b) | |
if len == 2 | |
asb = [[0,1],[1,1]] | |
elsif len == 3 | |
asb = [[0,1,2],[1,1,1],[2,1,2]] | |
elsif len == 5 | |
asb = [[0,1,2,3,4],[1,1,1,1,1],[2,1,2,2,2],[3,1,2,3,2],[4,1,2,2,4]] | |
end | |
res = asb[a][b] | |
return res | |
end | |
# функция с таблицами для умножения | |
def pr(len,a,b) | |
if len == 2 | |
apb = [[0,0],[0,1]] | |
elsif len == 3 | |
apb = [[0,0,0],[0,1,2],[0,2,2]] | |
elsif len == 5 | |
apb = [[0,0,0,0,0],[0,1,2,3,4],[0,2,2,2,2],[0,2,2,3,2],[0,4,2,2,4]] | |
end | |
res = apb[a][b] | |
return res | |
end | |
# функция для инверсии | |
def ne(len,a) | |
if len == 2 | |
ai = [1,0] | |
elsif len == 3 | |
ai = [1,0,2] | |
elsif len == 5 | |
ai = [1,0,2,4,3] | |
end | |
res = ai[a] | |
return res | |
end | |
# функция содержащая правила перехода в алфавитах | |
def per(len,a,b) | |
if len == 3 | |
aperb = [[0,2],[2,1]] | |
elsif len == 5 | |
aperb = [[0,4],[3,1]] | |
elsif len == 2 | |
aperb = [[0,0],[0,0]] | |
end | |
res = aperb[a][b] | |
return res | |
end | |
# функция вывода результатов | |
def printr(len,num,str,kk) | |
if num[0]==0 && num[1]==0 && num[2]==2 && len!=2 && kk==true | |
puts "#{str} #{num[0]} -> #{num[2]} -> #{num[1]} СРС (статический риск ошибки)" | |
elsif num[0]==0 && num[1]==1 && num[2]==2 && len==5 && kk==true | |
puts "#{str} #{num[0]} -> #{num[2]} -> #{num[1]} ДРС (динамический риск ошибки)" | |
elsif num[0]==1 && num[1]==0 && num[2]==2 && len==5 && kk==true | |
puts "#{str} #{num[0]} -> #{num[2]} -> #{num[1]} ДРС (динамический риск ошибки)" | |
else | |
puts "#{str} #{num[0]} -> #{num[2]} -> #{num[1]}" | |
end | |
end | |
#функция определяющая работу логического элемента & (умножение) | |
def umn(len,a,b,s,n) | |
res = [] | |
kk = true | |
if n == 0 | |
res << pr(len,a[0],b[0]) | |
res << pr(len,a[1],b[1]) | |
res << pr(len,a[2],b[2]) | |
printr(len,res,s,kk) | |
elsif n == 1 | |
res << ne(len,pr(len,a[0],b[0])) | |
res << ne(len,pr(len,a[1],b[1])) | |
res << ne(len,pr(len,a[2],b[2])) | |
printr(len,res,s,kk) | |
end | |
return res | |
end | |
kk = false | |
key = 0 | |
while key!=1 && key!=2 | |
puts "Введите 1 для работы с алфавитами, 2 для метода простой итерации:" | |
key = gets.to_i | |
end | |
if key == 1 | |
# определяем значения входов и тип алфавита | |
puts "Введите тип афлавита:" | |
len = gets.to_i | |
a = [0,0] | |
a << per(len,a[0],a[1]) | |
printr(len,a,"a: ",kk) | |
b = [1,0] | |
b << per(len,b[0],b[1]) | |
printr(len,b,"b: ",kk) | |
c = [1,1] | |
c << per(len,c[0],c[1]) | |
printr(len,c,"c: ",kk) | |
d = [0,1] | |
d << per(len,d[0],d[1]) | |
printr(len,d,"d: ",kk) | |
puts "--------------------" | |
# вычисляем значения соответствующих выходов | |
kk = true | |
g = umn(len,b,d,"g=b*d: ",0) | |
f = umn(len,a,g,"f=a*g: ",0) | |
h = umn(len,c,d,"h=c*d: ",1) | |
i = umn(len,f,h,"i=f*h: ",1) | |
j = umn(len,g,h,"j=g*h: ",1) | |
k = [] | |
k << sum(len,j[0],c[0]) | |
k << sum(len,j[1],c[1]) | |
k << sum(len,j[2],c[2]) | |
printr(len,k,"k=j+c: ",kk) | |
l = umn(len,k,f,"l=k*f: ",0) | |
z = [] | |
z << sum(len,l[0],i[0]) | |
z << sum(len,l[1],i[1]) | |
z << sum(len,l[2],i[2]) | |
printr(len,z,"z=l+i: ",kk) | |
elsif key == 2 | |
v = {"a"=>false, "b"=>true, "c"=>true, "d"=>false, "g"=>false, "f"=>false, "h"=>false, "j"=>false, "k"=>false, "i"=>false, "l"=>false, "z"=>false} | |
vv = Hash.new | |
i=0 | |
puts "Начальные значения:" | |
v.map do |key,val| | |
if val==false | |
puts "#{key}: 0" | |
elsif | |
val==true | |
puts "#{key}: 1" | |
end | |
end | |
loop do | |
i+=1 | |
if v != vv | |
vv = v | |
v["g"] = vv["b"] & vv["d"] | |
v["f"] = vv["a"] & vv["g"] | |
v["h"] = !(vv["c"] & vv["d"] & vv["k"]) | |
v["j"] = !(vv["g"] & vv["h"]) | |
v["k"] = vv["j"] | vv["c"] | |
v["i"] = !(vv["f"] & vv["h"]) | |
v["l"] = vv["k"] & vv["f"] | |
v["z"] = vv["l"] | vv["i"] | |
elsif vv == v | |
break | |
end | |
end | |
puts "Результат после #{i} итераций:" | |
v.map do |key,val| | |
if val==false | |
puts "#{key}: 0" | |
elsif | |
val==true | |
puts "#{key}: 1" | |
end | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment