From 888bb54c49223e753764e398e3e6f108ecc7638c Mon Sep 17 00:00:00 2001 From: Adam Russell Date: Sun, 28 Nov 2021 15:59:51 -0500 Subject: Prolog and C++ solutions for challenge 140 --- challenge-140/adam-russell/blog.txt | 1 + challenge-140/adam-russell/blog1.txt | 1 + challenge-140/adam-russell/cxx/ch-1.cxx | 115 +++++++++++++++++++++++++++++++ challenge-140/adam-russell/cxx/ch-2.cxx | 29 ++++++++ challenge-140/adam-russell/perl/ch-1.pl | 2 +- challenge-140/adam-russell/prolog/ch-1.p | 45 ++++++++++++ challenge-140/adam-russell/prolog/ch-2.p | 21 ++++++ 7 files changed, 213 insertions(+), 1 deletion(-) create mode 100644 challenge-140/adam-russell/blog.txt create mode 100644 challenge-140/adam-russell/blog1.txt create mode 100644 challenge-140/adam-russell/cxx/ch-1.cxx create mode 100644 challenge-140/adam-russell/cxx/ch-2.cxx create mode 100644 challenge-140/adam-russell/prolog/ch-1.p create mode 100644 challenge-140/adam-russell/prolog/ch-2.p diff --git a/challenge-140/adam-russell/blog.txt b/challenge-140/adam-russell/blog.txt new file mode 100644 index 0000000000..47d5a24fa2 --- /dev/null +++ b/challenge-140/adam-russell/blog.txt @@ -0,0 +1 @@ +http://www.rabbitfarm.com/cgi-bin/blosxom/2021/11/28/perl diff --git a/challenge-140/adam-russell/blog1.txt b/challenge-140/adam-russell/blog1.txt new file mode 100644 index 0000000000..8845345223 --- /dev/null +++ b/challenge-140/adam-russell/blog1.txt @@ -0,0 +1 @@ +http://www.rabbitfarm.com/cgi-bin/blosxom/2021/11/28/prolog diff --git a/challenge-140/adam-russell/cxx/ch-1.cxx b/challenge-140/adam-russell/cxx/ch-1.cxx new file mode 100644 index 0000000000..eabe809d8e --- /dev/null +++ b/challenge-140/adam-russell/cxx/ch-1.cxx @@ -0,0 +1,115 @@ +#include +#include +#include + +class AddBinary{ + public: + int add_binary(int, int); + private: + std::vector int2vector(int); + int vector2int(std::vector); +}; + +std::vector AddBinary::int2vector(int i){ + std::vector v; + while(i > 0){ + int m = i % 10; + i = i / 10; + v.push_back(m); + } + return v; +} + +int AddBinary::vector2int(std::vector v){ + int x = 1; + int r = 0; + for(int i: v){ + r = r + (i * x); + x = x * 10; + } + return r; +} + +int AddBinary::add_binary(int a, int b){ + std::vector va = this->int2vector(a); + std::vector vb = this->int2vector(b); + std::vector sum; + int carry = 0; + std::reverse(va.begin(), va.end()); + for(int i=va.size() - 1; i >=0; i--){ + int d0 = va.at(i); + if(!vb.empty()){ + int d1 = vb.back(); + vb.pop_back(); + if(carry == 0){ + if(d0 == 1 && d1 == 0){ + sum.push_back(1); + carry = 0; + } + if(d0 == 1 && d1 == 1){ + sum.push_back(0); + carry = 1; + } + if(d0 == 0 && d1 == 0){ + sum.push_back(0); + carry = 0; + } + if(d0 == 0 && d1 == 1){ + sum.push_back(1); + carry = 0; + } + } + else{ + if(d0 == 1 && d1 == 1){ + sum.push_back(0); + carry = 0; + } + if(d0 == 0 && d1 == 1){ + sum.push_back(0); + carry = 1; + } + if(d0 == 0 && d1 == 0){ + sum.push_back(1); + carry = 0; + } + if(d0 == 1 && d1 == 0){ + sum.push_back(0); + carry = 1; + } + } + } + else{ + if(d0 == 1 && carry == 1){ + sum.push_back(0); + carry = 1; + } + else if(d0 == 0 && carry == 1){ + sum.push_back(1); + carry = 0; + } + else if(d0 == 0 && carry == 0){ + sum.push_back(0); + carry = 0; + } + else if(d0 == 1 && carry == 0){ + sum.push_back(1); + carry = 0; + } + } + } + if(carry == 1) + sum.push_back(1); + return this->vector2int(sum); +} + + +int main(int argc, char** argv){ + int x; + AddBinary ab; + x = ab.add_binary(11, 1); + std::cout << x << std::endl; + x = ab.add_binary(101, 1); + std::cout << x << std::endl; + x = ab.add_binary(100, 11); + std::cout << x << std::endl; +} diff --git a/challenge-140/adam-russell/cxx/ch-2.cxx b/challenge-140/adam-russell/cxx/ch-2.cxx new file mode 100644 index 0000000000..b292e55dcd --- /dev/null +++ b/challenge-140/adam-russell/cxx/ch-2.cxx @@ -0,0 +1,29 @@ +#include +#include +#include + +class MultiplicationTable{ + public: + int nth_from_table(int, int, int); +}; + +int MultiplicationTable::nth_from_table(int i, int j, int k){ + std::vector table; + for(int x = 1; x <= i; x++){ + for(int y = 1; y <= j; y++){ + table.push_back(x * y); + } + } + std::sort(table.begin(), table.end()); + return table.at(k - 1); +} + + +int main(int argc, char** argv){ + int n; + MultiplicationTable mt; + n = mt.nth_from_table(2, 3, 4); + std::cout << n << std::endl; + n = mt.nth_from_table(3, 3, 6); + std::cout << n << std::endl; +} diff --git a/challenge-140/adam-russell/perl/ch-1.pl b/challenge-140/adam-russell/perl/ch-1.pl index 993fda172c..7b580226eb 100644 --- a/challenge-140/adam-russell/perl/ch-1.pl +++ b/challenge-140/adam-russell/perl/ch-1.pl @@ -18,7 +18,7 @@ sub add_binary{ my $carry = 0; for(my $d = 0; $d <= @a - 1; $d++){ my $d0 = $a[$d]; - my $d1 = $b[$d];# || 0; + my $d1 = $b[$d]; if($d1){ $sum = "0$sum", $carry = 0 if $d0 == 1 && $d1 == 1 && $carry == 1; $sum = "1$sum", $carry = 0 if $d0 == 1 && $d1 == 0 && $carry == 0; diff --git a/challenge-140/adam-russell/prolog/ch-1.p b/challenge-140/adam-russell/prolog/ch-1.p new file mode 100644 index 0000000000..2dd0cd5497 --- /dev/null +++ b/challenge-140/adam-russell/prolog/ch-1.p @@ -0,0 +1,45 @@ +:-initialization(main). + +sum_carry(0, 0, 1, 1, 1). +sum_carry(1, 0, 1, 0, 0). +sum_carry(0, 1, 1, 1, 0). +sum_carry(0, 1, 0, 1, 1). +sum_carry(0, 0, 0, 0, 0). +sum_carry(1, 0, 0, 0, 1). +sum_carry(0, 1, 1, 0, 1). +sum_carry(1, 0, 0, 1, 0). +sum_carry(0, 1, 1, 1). +sum_carry(1, 0, 0, 1). +sum_carry(0, 0, 0, 0). +sum_carry(1, 0, 1, 0). + +add_binary(A, B, Sum):- + number_chars(A, AChars), + number_chars(B, BChars), + reverse(AChars, ACharsReverse), + reverse(BChars, BCharsReverse), + add_binary(ACharsReverse, BCharsReverse, 0, [], Sum). +add_binary([], [], 0, SumAccum, Sum):- + number_chars(Sum, SumAccum). +add_binary([], [], 1, SumAccum, Sum):- + number_chars(Sum, ['1'|SumAccum]). +add_binary([H|T], [], Carry, SumAccum, Sum):- + number_chars(D, [H]), + sum_carry(S, C, D, Carry), + number_chars(S, [N]), + add_binary(T, [], C, [N | SumAccum], Sum). +add_binary([H0|T0], [H1|T1], Carry, SumAccum, Sum):- + number_chars(D0, [H0]), + number_chars(D1, [H1]), + sum_carry(S, C, D0, D1, Carry), + number_chars(S, [N]), + add_binary(T0, T1, C, [N | SumAccum], Sum). + +main:- + add_binary(11, 1, X0), + write(X0), nl, + add_binary(101, 1, X1), + write(X1), nl, + add_binary(100, 11, X2), + write(X2), nl, + halt. diff --git a/challenge-140/adam-russell/prolog/ch-2.p b/challenge-140/adam-russell/prolog/ch-2.p new file mode 100644 index 0000000000..c5f687566b --- /dev/null +++ b/challenge-140/adam-russell/prolog/ch-2.p @@ -0,0 +1,21 @@ +:-initialization(main). + +multiply(I, J, N):- + between(1, I, Ith), + between(1, J, Jth), + N is Ith * Jth. + +multiplication_table(I, J, Table):- + bagof(N, multiply(I, J, N), Table). + +nth_from_table(I, J, K, N):- + multiplication_table(I, J, Table), + msort(Table, SortedTable), + nth(K, SortedTable, N). + +main:- + nth_from_table(2, 3, 4, N0), + write(N0), nl, + nth_from_table(3, 3, 6, N1), + write(N1), nl, + halt. -- cgit