git.iko.soy/ikoHSE/SolveAvdoshin
on master help sign in
solution output for ex. 4-9
commit10233d42f79a2d429a005d3a5961e987c6b10a3c authorIlya Gulkov <ifranked@gmail.com> dateSun 4 Oct 2015, 20:24 (11 years ago) parent066b721
2 files changed+141−48
SolveAvdoshin/BooleanFunctions.cs+114−47 SolveAvdoshin/SolveAvdoshin.cs+27−1
SolveAvdoshin/BooleanFunctions.cs+114−47
@@ -29,11 +29,12 @@ namespace SolveAvdoshin
2929 static readonly BooleanOperation[][] AvdoshinBases = {
3030 new BooleanOperation[] {
3131 BooleanOperation.Zero,
32+ BooleanOperation.One,
33+ BooleanOperation.NotA,
34+ BooleanOperation.NotB,
3235 BooleanOperation.NOR,
3336 BooleanOperation.CoImp,
34− BooleanOperation.NotA,
3537 BooleanOperation.BCoImp,
36− BooleanOperation.NotB,
3738 BooleanOperation.Xor,
3839 BooleanOperation.NAND,
3940 BooleanOperation.And,
@@ -43,7 +44,6 @@ namespace SolveAvdoshin
4344 BooleanOperation.A,
4445 BooleanOperation.Imp,
4546 BooleanOperation.Or,
46− BooleanOperation.One
4747 },
4848 new BooleanOperation[] { BooleanOperation.NOR, },
4949 new BooleanOperation[] { BooleanOperation.NAND, },
@@ -96,7 +96,7 @@ namespace SolveAvdoshin
9696 Console.Write("{0} — {1}", i.ToString("D2"), AvdoshinNames[i].PadRight(18));
9797
9898 try {
99− var ex = FindMininalExpressionInBasis(n, AvdoshinBases[i], AvdoshinVars[i]);
99+ var ex = BooleanExpression.FindMininalExpressionInBasis(n, AvdoshinBases[i], AvdoshinVars[i]);
100100
101101 Console.WriteLine(ex.ToString());
102102 }
@@ -106,71 +106,102 @@ namespace SolveAvdoshin
106106 }
107107 }
108108
109− static BooleanExpression FindMininalExpressionInBasis(int n, BooleanOperation[] ops, BooleanVariable[] vars)
109+ public static void PrintDerivatives(int n)
110110 {
111− var queue = new ImprovisedPriorityQueue<BooleanExpression>(20);
112− var knownTruthTables = new HashSet<byte>();
113− var knownExpressions = new HashSet<BooleanExpression>();
114−
115− foreach(var variable in vars) {
116− queue.TryEnqueue(new VarExpression(variable), 1);
117− }
118−
119− while(queue.Count != 0) {
120− var curExperession = queue.Dequeue();
111+ BooleanFunction f = new BooleanFunction((byte)n);
121112
122− byte truthTable = curExperession.Eval();
113+ Console.WriteLine((new BooleanFunction(0x0F)).ToString("A"));
114+ Console.WriteLine((new BooleanFunction(0x33)).ToString("B"));
115+ Console.WriteLine((new BooleanFunction(0x55)).ToString("C"));
123116
124− if(knownTruthTables.Contains(truthTable)) {
125− continue;
126− }
117+ Console.WriteLine(f.ToString("F"));
127118
128− if(curExperession.Eval() == n) {
129− return curExperession;
130− }
131−
132− knownExpressions.Add(curExperession);
133− knownTruthTables.Add(truthTable);
134−
135− foreach(var anotherExpression in knownExpressions) {
136− foreach(var neighbourExpression in curExperession.CombineWith(anotherExpression, ops)) {
137− queue.TryEnqueue(neighbourExpression, neighbourExpression.getSize());
138− }
139− }
140− }
141−
142− throw new CouldntFindExpressionException();
143− }
144−
145− public static void Main()
146− {
147− var f = new BooleanFunction(26);
148−
149− Console.WriteLine(f.ToString());
150−
151− Console.WriteLine();
152119 Console.WriteLine(f.Deriv(BooleanVariable.A).ToString("F'_A"));
153120 Console.WriteLine(f.Deriv(BooleanVariable.B).ToString("F'_B"));
154121 Console.WriteLine(f.Deriv(BooleanVariable.C).ToString("F'_C"));
155122
156− Console.WriteLine();
157123 Console.WriteLine(f.Deriv(BooleanVariable.A, BooleanVariable.B).ToString("F''_AB"));
158124 Console.WriteLine(f.Deriv(BooleanVariable.B, BooleanVariable.C).ToString("F''_BC"));
159125 Console.WriteLine(f.Deriv(BooleanVariable.A, BooleanVariable.C).ToString("F''_AC"));
160126
161− Console.WriteLine();
162127 Console.WriteLine(f.Deriv(BooleanVariable.A, BooleanVariable.B, BooleanVariable.C)
163128 .ToString("F'''_ABC"));
129+ }
130+
131+ public static void Print2DirectionalDerivatives(int n)
132+ {
133+ BooleanFunction f = new BooleanFunction((byte)n);
134+
135+ Console.WriteLine((new BooleanFunction(0x0F)).ToString("A"));
136+ Console.WriteLine((new BooleanFunction(0x33)).ToString("B"));
137+ Console.WriteLine((new BooleanFunction(0x55)).ToString("C"));
138+
139+ Console.WriteLine(f.ToString("F"));
164140
165− Console.WriteLine();
166141 Console.WriteLine(f.DirectionalDeriv(BooleanVariable.A, BooleanVariable.B).ToString("F'_(A,B)"));
167142 Console.WriteLine(f.DirectionalDeriv(BooleanVariable.B, BooleanVariable.C).ToString("F'_(B,C)"));
168143 Console.WriteLine(f.DirectionalDeriv(BooleanVariable.A, BooleanVariable.C).ToString("F'_(A,C)"));
144+ }
145+
146+ public static void Print3DirectionalDerivative(int n)
147+ {
148+ BooleanFunction f = new BooleanFunction((byte)n);
149+
150+ Console.WriteLine((new BooleanFunction(0x0F)).ToString("A"));
151+ Console.WriteLine((new BooleanFunction(0x33)).ToString("B"));
152+ Console.WriteLine((new BooleanFunction(0x55)).ToString("C"));
153+
154+ Console.WriteLine(f.ToString("F"));
169155
170− Console.WriteLine();
171156 Console.WriteLine(f.DirectionalDeriv(BooleanVariable.A, BooleanVariable.B, BooleanVariable.C)
172157 .ToString("F'_(A,B,C)"));
173158 }
159+
160+ public static void PrintExpressionsForDerivatives(int n)
161+ {
162+ BooleanFunction f = new BooleanFunction((byte)n);
163+
164+ Console.WriteLine("F'_A = " + BooleanExpression.FindMininalExpressionInBasis(
165+ f.Deriv(BooleanVariable.A).Eval(), AvdoshinBases[0], AvdoshinVars[0]).ToString());
166+ Console.WriteLine("F'_B = " + BooleanExpression.FindMininalExpressionInBasis(
167+ f.Deriv(BooleanVariable.B).Eval(), AvdoshinBases[0], AvdoshinVars[0]).ToString());
168+ Console.WriteLine("F'_C = " + BooleanExpression.FindMininalExpressionInBasis(
169+ f.Deriv(BooleanVariable.C).Eval(), AvdoshinBases[0], AvdoshinVars[0]).ToString());
170+
171+ Console.WriteLine("F''_AB = " + BooleanExpression.FindMininalExpressionInBasis(
172+ f.Deriv(BooleanVariable.A, BooleanVariable.B).Eval(), AvdoshinBases[0], AvdoshinVars[0]).ToString());
173+ Console.WriteLine("F''_BC = " + BooleanExpression.FindMininalExpressionInBasis(
174+ f.Deriv(BooleanVariable.B, BooleanVariable.C).Eval(), AvdoshinBases[0], AvdoshinVars[0]).ToString());
175+ Console.WriteLine("F''_AC = " + BooleanExpression.FindMininalExpressionInBasis(
176+ f.Deriv(BooleanVariable.A, BooleanVariable.C).Eval(), AvdoshinBases[0], AvdoshinVars[0]).ToString());
177+
178+ Console.WriteLine("F'''_ABC = " + BooleanExpression.FindMininalExpressionInBasis(
179+ f.Deriv(BooleanVariable.A, BooleanVariable.B, BooleanVariable.C).Eval(), AvdoshinBases[0], AvdoshinVars[0]).ToString());
180+ }
181+
182+ public static void PrintExpressionsFor2DirDerivatives(int n)
183+ {
184+ BooleanFunction f = new BooleanFunction((byte)n);
185+
186+ Console.WriteLine("F'_(A,B) = " + BooleanExpression.FindMininalExpressionInBasis(
187+ f.DirectionalDeriv(BooleanVariable.A, BooleanVariable.B).Eval(),
188+ AvdoshinBases[0], AvdoshinVars[0]).ToString());
189+ Console.WriteLine("F'_(B,C) = " + BooleanExpression.FindMininalExpressionInBasis(
190+ f.DirectionalDeriv(BooleanVariable.B, BooleanVariable.C).Eval(),
191+ AvdoshinBases[0], AvdoshinVars[0]).ToString());
192+ Console.WriteLine("F'_(A,C) = " + BooleanExpression.FindMininalExpressionInBasis(
193+ f.DirectionalDeriv(BooleanVariable.A, BooleanVariable.C).Eval(),
194+ AvdoshinBases[0], AvdoshinVars[0]).ToString());
195+ }
196+
197+ public static void PrintExpressionsFor3DirDerivatives(int n)
198+ {
199+ BooleanFunction f = new BooleanFunction((byte)n);
200+
201+ Console.WriteLine("F'_(A,B,C) = " + BooleanExpression.FindMininalExpressionInBasis(
202+ f.DirectionalDeriv(BooleanVariable.A, BooleanVariable.B, BooleanVariable.C).Eval(),
203+ AvdoshinBases[0], AvdoshinVars[0]).ToString());
204+ }
174205 }
175206
176207 class BooleanFunction
@@ -429,6 +460,42 @@ namespace SolveAvdoshin
429460 {
430461 return OpSymbols[(int)op];
431462 }
463+
464+ public static BooleanExpression FindMininalExpressionInBasis(int n, BooleanOperation[] ops, BooleanVariable[] vars)
465+ {
466+ var queue = new ImprovisedPriorityQueue<BooleanExpression>(20);
467+ var knownTruthTables = new HashSet<byte>();
468+ var knownExpressions = new HashSet<BooleanExpression>();
469+
470+ foreach(var variable in vars) {
471+ queue.TryEnqueue(new VarExpression(variable), 1);
472+ }
473+
474+ while(queue.Count != 0) {
475+ var curExperession = queue.Dequeue();
476+
477+ byte truthTable = curExperession.Eval();
478+
479+ if(knownTruthTables.Contains(truthTable)) {
480+ continue;
481+ }
482+
483+ if(curExperession.Eval() == n) {
484+ return curExperession;
485+ }
486+
487+ knownExpressions.Add(curExperession);
488+ knownTruthTables.Add(truthTable);
489+
490+ foreach(var anotherExpression in knownExpressions) {
491+ foreach(var neighbourExpression in curExperession.CombineWith(anotherExpression, ops)) {
492+ queue.TryEnqueue(neighbourExpression, neighbourExpression.getSize());
493+ }
494+ }
495+ }
496+
497+ throw new CouldntFindExpressionException();
498+ }
432499 }
433500
434501 class OpExpression : BooleanExpression
SolveAvdoshin/SolveAvdoshin.cs+27−1
@@ -88,7 +88,7 @@ namespace SolveAvdoshin
8888 return eqAnswer;
8989 }
9090
91− public static void Main1(string[] args)
91+ public static void Main(string[] args)
9292 {
9393 int[] coefs = { -1, -1, -1, -1, -1, -1, -1, -1, -1, };
9494
@@ -102,7 +102,33 @@ namespace SolveAvdoshin
102102
103103 int answer = Solve(coefs);
104104
105+ Console.WriteLine("\n\n2-3.");
106+
105107 BooleanFunctions.PrintMinimaInAvdoshinBases(answer);
108+
109+ Console.WriteLine("\n\n4.\n");
110+
111+ BooleanFunctions.PrintDerivatives(answer);
112+
113+ Console.WriteLine("\n\n5.\n");
114+
115+ BooleanFunctions.PrintExpressionsForDerivatives(answer);
116+
117+ Console.WriteLine("\n\n6.\n");
118+
119+ BooleanFunctions.Print2DirectionalDerivatives(answer);
120+
121+ Console.WriteLine("\n\n7.\n");
122+
123+ BooleanFunctions.PrintExpressionsFor2DirDerivatives(answer);
124+
125+ Console.WriteLine("\n\n8.\n");
126+
127+ BooleanFunctions.Print3DirectionalDerivative(answer);
128+
129+ Console.WriteLine("\n\n9.\n");
130+
131+ BooleanFunctions.PrintExpressionsFor3DirDerivatives(answer);
106132 }
107133 catch(FormatException e) {
108134 Console.WriteLine("Osheebka: " + e.Message);