aboutsummaryrefslogtreecommitdiff
path: root/challenge-077
diff options
context:
space:
mode:
authorMyoungjin JEON <jeongoon@gmail.com>2020-09-11 01:19:26 +1000
committerMyoungjin JEON <jeongoon@gmail.com>2020-09-11 01:19:26 +1000
commitcee930fd1fd0a3f0fb9a2caf6aa578d569c37fce (patch)
treeb467bb1ef9efad41198811efaa7bd268686fe766 /challenge-077
parent20fc303d563e660dcd790ccb7baa894d77de5695 (diff)
parentbac73b38eb313b198a7a03e3199926737dca7277 (diff)
downloadperlweeklychallenge-club-cee930fd1fd0a3f0fb9a2caf6aa578d569c37fce.tar.gz
perlweeklychallenge-club-cee930fd1fd0a3f0fb9a2caf6aa578d569c37fce.tar.bz2
perlweeklychallenge-club-cee930fd1fd0a3f0fb9a2caf6aa578d569c37fce.zip
Merge remote-tracking branch 'upstream/master' into ch-077
Diffstat (limited to 'challenge-077')
-rw-r--r--challenge-077/ash/blog.txt1
-rw-r--r--challenge-077/ash/blog1.txt1
-rw-r--r--challenge-077/ash/cpp/ch-2.cpp60
-rw-r--r--challenge-077/ash/raku/ch-1.raku11
-rw-r--r--challenge-077/ash/raku/ch-2.raku36
-rw-r--r--challenge-077/ash/xslt/ch-2.xml25
-rw-r--r--challenge-077/ash/xslt/ch-2.xslt41
-rwxr-xr-xchallenge-077/dave-jacoby/perl/ch-1.pl63
-rwxr-xr-xchallenge-077/dave-jacoby/perl/ch-2.pl71
-rwxr-xr-xchallenge-077/e-choroba/perl/ch-1.pl82
-rwxr-xr-xchallenge-077/e-choroba/perl/ch-2.pl111
-rwxr-xr-xchallenge-077/feng-chang/raku/ch-1.raku29
-rwxr-xr-xchallenge-077/feng-chang/raku/ch-2.raku25
-rwxr-xr-xchallenge-077/jo-37/perl/ch-1.pl106
-rwxr-xr-xchallenge-077/jo-37/perl/ch-2.pl50
-rw-r--r--challenge-077/mark-anderson/raku/ch-1.raku11
-rw-r--r--challenge-077/mark-anderson/raku/ch-2.raku39
-rw-r--r--challenge-077/mohammad-anwar/perl/ch-1.pl58
-rw-r--r--challenge-077/mohammad-anwar/perl/ch-1.t56
-rw-r--r--challenge-077/mohammad-anwar/perl/ch-2.pl105
-rw-r--r--challenge-077/mohammad-anwar/perl/ch-2.t112
-rw-r--r--challenge-077/mohammad-anwar/raku/ch-1.raku44
-rw-r--r--challenge-077/mohammad-anwar/raku/ch-1.t45
-rw-r--r--challenge-077/mohammad-anwar/raku/ch-2.raku89
-rw-r--r--challenge-077/mohammad-anwar/raku/ch-2.t99
-rw-r--r--challenge-077/roger-bell-west/blog.txt1
-rwxr-xr-xchallenge-077/roger-bell-west/perl/ch-1.pl30
-rwxr-xr-xchallenge-077/roger-bell-west/perl/ch-2.pl45
-rwxr-xr-xchallenge-077/roger-bell-west/python/ch-1.py27
-rwxr-xr-xchallenge-077/roger-bell-west/python/ch-2.py33
-rwxr-xr-xchallenge-077/roger-bell-west/raku/ch-1.p618
-rwxr-xr-xchallenge-077/roger-bell-west/raku/ch-2.p643
-rw-r--r--challenge-077/simon-proctor/raku/ch-1.raku15
-rw-r--r--challenge-077/simon-proctor/raku/ch-2.raku30
-rw-r--r--challenge-077/tyler-wardhaugh/clojure/README.md8
-rw-r--r--challenge-077/tyler-wardhaugh/clojure/deps.edn8
-rw-r--r--challenge-077/tyler-wardhaugh/clojure/pom.xml16
-rw-r--r--challenge-077/tyler-wardhaugh/clojure/resources/matrix1.txt3
-rw-r--r--challenge-077/tyler-wardhaugh/clojure/resources/matrix2.txt4
-rw-r--r--challenge-077/tyler-wardhaugh/clojure/src/tw/weekly/c77.clj12
l---------challenge-077/tyler-wardhaugh/clojure/src/tw/weekly/ch-1.clj1
l---------challenge-077/tyler-wardhaugh/clojure/src/tw/weekly/ch-2.clj1
-rw-r--r--challenge-077/tyler-wardhaugh/clojure/src/tw/weekly/ch_1.clj39
-rw-r--r--challenge-077/tyler-wardhaugh/clojure/src/tw/weekly/ch_2.clj50
-rw-r--r--challenge-077/tyler-wardhaugh/clojure/test/tw/weekly/c77_test.clj18
-rw-r--r--challenge-077/ulrich-rieke/perl/ch-2.pl73
-rw-r--r--challenge-077/ulrich-rieke/raku/ch-1.raku15
-rw-r--r--challenge-077/walt-mankowski/blog.txt1
-rw-r--r--challenge-077/walt-mankowski/perl/ch-1.pl65
-rw-r--r--challenge-077/walt-mankowski/perl/ch-2.pl75
-rw-r--r--challenge-077/walt-mankowski/perl/test1.txt3
-rw-r--r--challenge-077/walt-mankowski/perl/test2.txt4
52 files changed, 1992 insertions, 16 deletions
diff --git a/challenge-077/ash/blog.txt b/challenge-077/ash/blog.txt
new file mode 100644
index 0000000000..f95ba9e75f
--- /dev/null
+++ b/challenge-077/ash/blog.txt
@@ -0,0 +1 @@
+https://andrewshitov.com/2020/09/07/add-up-fibonacci-numbers-the-weekly-challenge-77-task-1/
diff --git a/challenge-077/ash/blog1.txt b/challenge-077/ash/blog1.txt
new file mode 100644
index 0000000000..a81f60f4d3
--- /dev/null
+++ b/challenge-077/ash/blog1.txt
@@ -0,0 +1 @@
+https://andrewshitov.com/2020/09/08/lonely-x-the-weekly-challenge-77-task-2/
diff --git a/challenge-077/ash/cpp/ch-2.cpp b/challenge-077/ash/cpp/ch-2.cpp
new file mode 100644
index 0000000000..2c7aa19721
--- /dev/null
+++ b/challenge-077/ash/cpp/ch-2.cpp
@@ -0,0 +1,60 @@
+/*
+ Task 2 from
+ https://perlweeklychallenge.org/blog/perl-weekly-challenge-077/
+
+ Comments: https://andrewshitov.com/2020/09/08/lonely-x-the-weekly-challenge-77-task-2/
+
+ Compile as:
+ $ g++ -std=c++17 ch-2.cpp
+
+ Output for the given example of matrix:
+ $ ./a.out
+ 0, 3
+ 1, 1
+ 2, 3
+*/
+
+#include <iostream>
+#include <vector>
+
+using namespace std;
+
+vector<int> test_move(vector<vector<char>> matrix, vector<int> current, vector<int> shift) {
+ current[0] += shift[0];
+ current[1] += shift[1];
+
+ if (current[0] < 0 || current[0] >= matrix.size() ||
+ current[1] < 0 || current[1] >= matrix[0].size()) {
+ return vector<int>();
+ }
+ else {
+ return current;
+ }
+}
+
+int main() {
+ vector<vector<char>> matrix = {
+ {'O', 'O', 'O', 'X'},
+ {'O', 'X', 'O', 'O'},
+ {'O', 'O', 'O', 'X'}
+ };
+
+ vector<vector<int>> neighbours = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}, {1, 1}, {1, -1}, {-1, 1}, {-1, -1}};
+
+ for (auto row = 0; row != matrix.size(); row++) {
+ for (auto col = 0; col != matrix[0].size(); col++) {
+ if (matrix[row][col] == 'O') continue;
+
+ bool ok = true;
+ for (auto neighbour : neighbours) {
+ auto move = test_move(matrix, vector<int>{row, col}, neighbour);
+ if (move.empty()) continue;
+ if (matrix[move[0]][move[1]] == 'X') {
+ ok = false;
+ break;
+ }
+ }
+ if (ok) cout << row << ", " << col << endl;
+ }
+ }
+}
diff --git a/challenge-077/ash/raku/ch-1.raku b/challenge-077/ash/raku/ch-1.raku
new file mode 100644
index 0000000000..cdab8466cc
--- /dev/null
+++ b/challenge-077/ash/raku/ch-1.raku
@@ -0,0 +1,11 @@
+#!/usr/bin/env raku
+
+# Task 1 from
+# https://perlweeklychallenge.org/blog/perl-weekly-challenge-077/
+
+# Comments: https://andrewshitov.com/2020/09/07/add-up-fibonacci-numbers-the-weekly-challenge-77-task-1/
+
+my $n = @*ARGS[0] // 42;
+my @fib = 1, 2, * + * ...^ * > $n;
+
+"$_.join(' + ') = $n".put for @fib.combinations.grep(*.sum == $n);
diff --git a/challenge-077/ash/raku/ch-2.raku b/challenge-077/ash/raku/ch-2.raku
new file mode 100644
index 0000000000..47d8524eaa
--- /dev/null
+++ b/challenge-077/ash/raku/ch-2.raku
@@ -0,0 +1,36 @@
+#!/usr/bin/env raku
+
+# Task 2 from
+# https://perlweeklychallenge.org/blog/perl-weekly-challenge-077/
+
+# Comments: https://andrewshitov.com/2020/09/08/lonely-x-the-weekly-challenge-77-task-2/
+
+my @matrix =
+ < O O X >,
+ < X O O >,
+ < X O O >; # square matrix
+
+# my @matrix =
+# < O O X O >,
+# < X O O O >,
+# < X O O X >,
+# < O X O O >;
+
+my @neighbours = ([X] (-1, 0, 1) xx 2).grep(*.all != 0);
+
+for ^@matrix X ^@matrix -> @coord {
+ next if @matrix[@coord[0]][@coord[1]] eq 'O';
+
+ @coord.put if all((@neighbours.map(* <<+>> @coord)).grep(0 <= *.all <= @matrix.end).map({
+ @matrix[$_[0]][$_[1]] eq 'O';
+ }));
+}
+
+# Output:
+# $ raku ch-2.raku
+# 0 2
+
+# Or:
+# $ raku ch-2.raku
+# 0 2
+# 2 3
diff --git a/challenge-077/ash/xslt/ch-2.xml b/challenge-077/ash/xslt/ch-2.xml
new file mode 100644
index 0000000000..ce27ac5cdb
--- /dev/null
+++ b/challenge-077/ash/xslt/ch-2.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0"?>
+
+<!--
+ Task 2 from
+ https://perlweeklychallenge.org/blog/perl-weekly-challenge-077/
+
+ To get a solution, run:
+ $ xsltproc ch-2.xslt ch-2.xml
+
+ For the given example matrix, you get the following output (items count from 1):
+ 1, 2
+ 3, 1
+-->
+
+<matrix>
+ <row>
+ <item>O</item> <item>X</item> <item>O</item>
+ </row>
+ <row>
+ <item>O</item> <item>O</item> <item>O</item>
+ </row>
+ <row>
+ <item>X</item> <item>O</item> <item>O</item>
+ </row>
+</matrix>
diff --git a/challenge-077/ash/xslt/ch-2.xslt b/challenge-077/ash/xslt/ch-2.xslt
new file mode 100644
index 0000000000..3a1fb688da
--- /dev/null
+++ b/challenge-077/ash/xslt/ch-2.xslt
@@ -0,0 +1,41 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+
+<xsl:output omit-xml-declaration="yes"/>
+
+<xsl:template match="/matrix">
+ <xsl:apply-templates select="row"/>
+</xsl:template>
+
+<xsl:template match="row">
+ <xsl:apply-templates select="item"/>
+</xsl:template>
+
+<!-- catch 'O's -->
+<xsl:template match="item"/>
+
+<xsl:template match="item[text() = 'X']">
+ <xsl:variable name="row" select="count(../preceding-sibling::*) + 1"/> <!-- position of parent -->
+ <xsl:variable name="col" select="position()"/>
+
+ <xsl:variable name="lonely" select="
+ (not(/matrix/row[$row ]/item[$col - 1]) or /matrix/row[$row ]/item[$col - 1] = 'O') and
+ (not(/matrix/row[$row ]/item[$col + 1]) or /matrix/row[$row ]/item[$col + 1] = 'O') and
+ (not(/matrix/row[$row + 1]/item[$col ]) or /matrix/row[$row + 1]/item[$col ] = 'O') and
+ (not(/matrix/row[$row - 1]/item[$col ]) or /matrix/row[$row - 1]/item[$col ] = 'O') and
+ (not(/matrix/row[$row + 1]/item[$col + 1]) or /matrix/row[$row + 1]/item[$col + 1] = 'O') and
+ (not(/matrix/row[$row - 1]/item[$col - 1]) or /matrix/row[$row - 1]/item[$col - 1] = 'O') and
+ (not(/matrix/row[$row + 1]/item[$col - 1]) or /matrix/row[$row + 1]/item[$col - 1] = 'O') and
+ (not(/matrix/row[$row - 1]/item[$col + 1]) or /matrix/row[$row - 1]/item[$col + 1] = 'O')
+ "/>
+
+ <xsl:if test="$lonely">
+ <xsl:value-of select="$row"/>
+ <xsl:text>, </xsl:text>
+ <xsl:value-of select="$col"/>
+ <xsl:text disable-output-escaping="yes">&#10;</xsl:text>
+ </xsl:if>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/challenge-077/dave-jacoby/perl/ch-1.pl b/challenge-077/dave-jacoby/perl/ch-1.pl
new file mode 100755
index 0000000000..6dc2865d99
--- /dev/null
+++ b/challenge-077/dave-jacoby/perl/ch-1.pl
@@ -0,0 +1,63 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+use feature qw{ say signatures state };
+no warnings qw{ experimental };
+
+use Carp;
+use Getopt::Long;
+use List::Util qw{ max sum0 uniq };
+
+my $n = 9;
+GetOptions( 'n=i' => \$n );
+croak "n < 1" if $n < 1;
+
+fib_sum($n);
+
+#
+sub fib_sum ( $n ) {
+ my @fib = reverse fib_list($n);
+ my @list = ( [] );
+ my @sums;
+ my %no;
+
+ while (@list) {
+ my $entry = shift @list;
+ for my $fib (@fib) {
+ next if grep { $_ == $fib } $entry->@*;
+ my $new->@* = sort { $b <=> $a } $fib, $entry->@*;
+ my $sum = sum0 $new->@*;
+ my $join = join ',', $new->@*;
+ next if $no{$join}++;
+ push @list, $new if $sum < $n;
+ push @sums, $new if $sum == $n;
+ }
+ }
+
+ if ( scalar @sums ) {
+ for my $sum (@sums) {
+ my $s = scalar $sum->@*;
+ my $p = join ' + ', $sum->@*;
+ say qq{$s as ($n = $p)};
+ }
+ }
+ else { print 0 }
+}
+
+# creates a list of fibonacci values where each value is
+# less than n and greater than zero, because zero is useless
+# in summation
+sub fib_list( $n ) {
+ my @output = ( 0, 1 );
+ my $i = 2;
+
+ while ( max(@output) < $n ) {
+ $output[$i] = $output[ $i - 1 ] + $output[ $i - 2 ];
+ my $max = max(@output);
+ $i++;
+ }
+
+ @output = uniq grep { $_ } grep { $_ <= $n } @output;
+ return @output;
+}
diff --git a/challenge-077/dave-jacoby/perl/ch-2.pl b/challenge-077/dave-jacoby/perl/ch-2.pl
new file mode 100755
index 0000000000..f35435cb75
--- /dev/null
+++ b/challenge-077/dave-jacoby/perl/ch-2.pl
@@ -0,0 +1,71 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+use feature qw{ say signatures state };
+no warnings qw{ experimental };
+
+use List::Util qw{ first };
+
+my @input = (
+ [ [qw[ O O X ]], [qw[ X O O ]], [qw[ X O O ]], ],
+ [ [qw( O O X O)], [qw( X O O O)], [qw( X O O X)], [qw( O X O O)], ]
+);
+
+for my $input (@input) {
+ say join "\n ", '', map { join ' ', $_->@* } $input->@*;
+ say '';
+
+ my $c = lonely_x($input);
+ if ( $c == 0 ) { say "No lonely Xs were found" }
+ elsif ( $c == 1 ) { say "One lonely X was found" }
+ else { say "$c lonely Xs were found" }
+}
+
+# lonely_x takes an arrayref containing a two-dimensional array
+# representing an m x n matrix containing only X and O, and
+# returns a count of "lonely Xs", which are Xs without an
+# X in a bordering position. If none are found, it returns
+# zero
+
+sub lonely_x ( $input ) {
+
+ my $c = 0;
+ my $x = scalar $input->@*;
+ my $y = scalar $input->[0]->@*;
+
+ # X and y are the outer bounds of the matrix.
+ # i and j are the location within the matrix.
+ # p is the value in the current "center".
+ # ii and jj are the bordering locations to i and j
+ # pp is the value in the current border location
+
+ # if pp is X, we know that i,j is not lonely,
+ # and thus we used he named next to get to the
+ # next. If, instead, we get to the end of the ii,jj
+ # loops, it must be lonely and we increment our
+ # "lonely X" count.
+
+ for my $i ( 0 .. $x ) {
+ OUT: for my $j ( 0 .. $y ) {
+ my $p = $input->[$i][$j];
+ next unless defined $p;
+ my $ok = 'X' eq $p ? 1 : 0;
+ next unless $ok;
+
+ for my $ii ( $i - 1 .. $i + 1 ) {
+ next if $ii < 0;
+ for my $jj ( $j - 1 .. $j + 1 ) {
+ next if $jj < 0;
+ next if $i == $ii && $j == $jj;
+ my $pp = $input->[$ii][$jj];
+ next unless defined $pp;
+ next OUT if $pp eq 'X';
+ }
+ }
+ $c++;
+ }
+ }
+
+ return $c;
+}
diff --git a/challenge-077/e-choroba/perl/ch-1.pl b/challenge-077/e-choroba/perl/ch-1.pl
new file mode 100755
index 0000000000..35a6107b69
--- /dev/null
+++ b/challenge-077/e-choroba/perl/ch-1.pl
@@ -0,0 +1,82 @@
+#!/usr/bin/perl
+use warnings;
+use strict;
+use feature qw{ say };
+
+use Memoize;
+
+memoize('fibonacci');
+sub fibonacci {
+ my ($n) = @_;
+ my ($f1, $f2) = (1, 1);
+ for (1 .. $n) {
+ ($f1, $f2) = ($f2, $f1 + $f2);
+ }
+ return $f1
+}
+
+memoize('fibonacci_sum');
+sub fibonacci_sum {
+ my ($n) = @_;
+ return [[1]] if 1 == $n;
+
+ my @sum;
+ my $start_index = 1;
+ while ((my $start_f = fibonacci($start_index)) <= $n) {
+
+ push @sum, [$n]
+ and last
+ if $n == $start_f;
+
+ my $index = $start_index;
+ while ((my $f = fibonacci($index)) <= $n / 2) {
+ no warnings 'recursion';
+ my $s = fibonacci_sum($n - $f);
+
+ my @s = map [$f, @$_],
+ grep $f < $_->[0],
+ @$s
+ or last;
+
+ push @sum, @s;
+ ++$index;
+ }
+ ++$start_index;
+ }
+
+ return \@sum
+}
+
+sub pretty_print {
+ my ($n) = @_;
+ for my $s (@{ fibonacci_sum($n) }) {
+ say join(' + ', @$s), " = $n";
+ }
+}
+
+use Test::More;
+
+is fibonacci(0), 1;
+is fibonacci(1), 1;
+is fibonacci(2), 2;
+is fibonacci(3), 3;
+is fibonacci(4), 5;
+
+is_deeply fibonacci_sum(1), [[1]], 'one';
+is_deeply fibonacci_sum(2), [[2]], 'two';
+is_deeply fibonacci_sum(3), [[1, 2], [3]], 'three';
+is_deeply fibonacci_sum(4), [[1, 3]], 'four';
+is_deeply fibonacci_sum(5), [[2, 3], [5]], 'five';
+is_deeply fibonacci_sum(6), [[1, 2, 3], [1, 5]], 'six';
+is_deeply fibonacci_sum(7), [[2, 5]], 'seven';
+is_deeply fibonacci_sum(8), [[1, 2, 5], [3, 5], [8]], 'eight';
+is_deeply fibonacci_sum(9), [[1, 3, 5], [1, 8]], 'nine';
+is_deeply fibonacci_sum(10), [[2, 3, 5], [2, 8]], 'ten';
+is_deeply fibonacci_sum(11), [[1, 2, 3, 5], [1, 2, 8], [3, 8]], 'eleven';
+is_deeply fibonacci_sum(12), [[1, 3, 8]], 'twelve';
+is_deeply fibonacci_sum(13), [[2, 3, 8], [5, 8], [13]], 'thirteen';
+is_deeply fibonacci_sum(14), [[1, 2, 3, 8], [1, 5, 8], [1, 13]], 'fourteen';
+
+done_testing();
+
+pretty_print(18200); # Takes about 5s.
diff --git a/challenge-077/e-choroba/perl/ch-2.pl b/challenge-077/e-choroba/perl/ch-2.pl
new file mode 100755
index 0000000000..ebf221f3bc
--- /dev/null
+++ b/challenge-077/e-choroba/perl/ch-2.pl
@@ -0,0 +1,111 @@
+#!/usr/bin/perl
+use warnings;
+use strict;
+
+my $NO_X = qr/[^X] [^X] [^X]/;
+
+sub lonely_x {
+ my ($input) = @_;
+
+ my ($previous, @check);
+ my $count = 0;
+ my $verify = sub {
+ for my $ch (@check) {
+ $count += substr($_[0], $ch - 2, 5) =~ $NO_X;
+ }
+ };
+
+ open my $in, '<', \$input;
+ while (<$in>) {
+ $previous //= ' ' x length;
+ $verify->($_);
+ @check = ();
+
+ while (/(?=[^X] X [^X])/g) {
+ my $pos = pos;
+ push @check, $pos + 2 if substr($previous, $pos, 5) =~ $NO_X;
+ }
+ $previous = $_;
+ }
+ $verify->(' ' x length $previous);
+
+ return $count
+}
+
+use Test::More tests => 5;
+
+is lonely_x(<< '__'),
+[ O O X ]
+[ X O X ]
+[ X O O ]
+__
+0, 'None found';
+
+is lonely_x(<< '__'),
+[ O O X ]
+[ X O O ]
+[ X O O ]
+__
+1, 'Example 1';
+
+is lonely_x(<< '__'),
+[ O O X O ]
+[ X O O O ]
+[ X O O X ]
+[ O X O O ]
+__
+2, 'Example 2';
+
+is lonely_x(<< '__'),
+[ O O O X O X X ]
+[ X O O O O O O ]
+[ O O O O X O X ]
+[ O O X O O O O ]
+[ O X O O X O O ]
+[ X O O O X O X ]
+__
+5, 'Five';
+
+is lonely_x(<< '__'),
+[ X X X X O X O O O O O X X X X X O O O O O O X X X X O O X X X O O O O X O O ]
+[ O O O O O O X O X O X O O O O X O X X X X O O X X X X O X O X O O X O O X X ]
+[ O X O X X O O O O O O X X X O O O X O X O X X X O O X O O O O X O X X X O X ]
+[ O X O X X O O O O X O X O O X X X O X O O X O X O X O O O X X O X O X X X X ]
+[ O O X X X O O O X O X O O X O X O O X X O X O X X O X X O X X O O O O O O X ]
+[ O O O X X X O O O O O O O X O X X O X O O O O O X X X O X X O O O O X O O O ]
+[ O X X X X X O O X O X X O O X O X X X O X O O X O X O X X O X O O X X X X X ]
+[ O O O X O X X X O O X X O X X O X O O O O X O X X X O X X O O X O O O X O O ]
+[ X O X X X O O O O O X O X O O O O O O X X O X O O O O O X O O O X O X O O X ]
+[ X X X O O O X O O O O X O X O X O X O O X X X O X X O O X X X O O O O O O O ]
+[ X O X O X O X O X X O O X X X X X X X X X X X O X X O X O O O X O O O X O O ]
+[ X O X O O X O X X O X O X O X X O X X O O X O O O X X X O O O X X X O X O X ]
+[ O X O O X X X O X X O O O O O X O O O X O O O X X X X O X X O O X X O O X O ]
+[ X O O O X O X X O O X O O O X X O X O O O X X X O X O X O O O X O X O X X O ]
+[ X X X X X X X O X O X O O O X O O X O X X X X O O O O X X X O O O X X O X X ]
+[ O X X O O X X X O O X X O X O O O X O X O X X O O X O O X O O O O O O O O X ]
+[ O X O X O O O X O X O X O O O O X X X O X X O O X X O X X X O O X O X X O O ]
+[ O O X O X O O X X X X O O X O X O O X O X O X X X O X X O X X O O X X X O X ]
+[ O X X O O O O X O O O O O X X O O X X O X O X O X O O X O O X O X O X O X O ]
+[ O X X O X X X X O O X X X X O X O O X O X O X O O O X O X X X X O O X X X X ]
+[ O O O O O O O X X X X O O X O O X X O O O X O O X O X O X O O X X O O O O X ]
+[ O O X O X O O X X X O O X X X X O O X X X X X X X O O X O O O X O O O X O X ]
+[ X O X O X O O X O X O X X O X O X O X X X O O O O X X X X X X X O X O O X O ]
+[ O O X O O X O X O X O O O O O O O O X O X O O O O X X O X X X X O X X X O X ]
+[ X X X X X O O X O X X X O X X X O O X O X O X O O O O O O O O O O O O X O X ]
+[ X O O O O X X O O O O O O X X X O O O O X X O O O X X O O X O O X X O X X O ]
+[ O X O X X O O O X X X X X O X O X X X X O X O X O O O O X O O O O O O X O X ]
+[ X X O O O X O X X X O X X X O X O X O O O X X O O X X X O X O O O O O X O X ]
+[ O X X X X X X X O O O X O O X O O X O O X O X X O X X X X X X O O X O X O X ]
+[ O X X X X O O X O X O X X O X O X X O O O O O O X X O X X O O O O O X O O X ]
+[ X O O X O O X O X O X O O X X O X O X O X O X O O X O X X O X O O X O X O O ]
+[ O X O O X X X O X O X O O O O X O O X O X X X X O O X O O X X O O O O O X X ]
+[ X X O X X O O O X X X O X O O O X X O X X O X X O X O O X X X O O O O O X O ]
+[ O O X X X X X X X O X X X X O O X O X O X X X O O X X X X O O O X O O O O X ]
+[ O X O O X X X O X O X O O O O X X X O O O O O O X O X X X O X O X X X X O O ]
+[ X X X O O O O O X O O X X X O O O O X O O X X O O X O O X O X O X X X O X X ]
+[ X X O X O X X O O O X X X O X O X X X X X X X O X X X X X O O X O X O X X X ]
+[ X X O O O O X X X X O O X X X O O O O X O O X O X O O O X O O O O X O X X X ]
+[ X O O X O O O X X X X X X O O O X O O X X X O X O X X X X X O X O O X X X O ]
+[ O X O O O X O O O X O X O O X O O X O O O O X X X O X X X O X O O O O O X O ]
+__
+6, 'Six';
diff --git a/challenge-077/feng-chang/raku/ch-1.raku b/challenge-077/feng-chang/raku/ch-1.raku
new file mode 100755
index 0000000000..18676223f9
--- /dev/null
+++ b/challenge-077/feng-chang/raku/ch-1.raku
@@ -0,0 +1,29 @@
+#!/bin/env raku
+
+my Bool $found = False;
+my $Num;
+
+sub fib-sum(Int:D $N, @fibs, @num) {
+ if $N == 0 {
+ say "{ @num.join(' + ') } = $Num";
+ $found = True;
+ return;
+ }
+ return unless @fibs;
+ return if $N < @fibs[0];
+
+ my @F = @fibs;
+ my @N = @num;
+ @N.push(@F.shift);
+ fib-sum($N - @fibs[0], @F, @N);
+
+ fib-sum($N, @F, @num);
+}
+
+sub MAIN(Int:D $N) {
+ my Int @fibs = 1, 2, * + * ...^ * > $N;
+ $Num = $N;
+
+ fib-sum($N, @fibs, Array.new);
+ 0.say unless $found;
+}
diff --git a/challenge-077/feng-chang/raku/ch-2.raku b/challenge-077/feng-chang/raku/ch-2.raku
new file mode 100755
index 0000000000..b9fdf10332
--- /dev/null
+++ b/challenge-0