Skip to content

Instantly share code, notes, and snippets.

@spellancer
Created December 1, 2012 10:51
Show Gist options
  • Save spellancer/4181489 to your computer and use it in GitHub Desktop.
Save spellancer/4181489 to your computer and use it in GitHub Desktop.
Model-lab-3
#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