aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorarnesom <arne@bbop.org>2024-03-09 20:21:19 +0100
committerarnesom <arne@bbop.org>2024-03-09 20:21:19 +0100
commitad212991e19ac58a442e177d6bc34f94a6f16da1 (patch)
tree32c90de7f80396c873137acc17dd098d71004f55
parentf5f5d621ea288e667ae707543d2fc77b5c3f1ed1 (diff)
downloadperlweeklychallenge-club-ad212991e19ac58a442e177d6bc34f94a6f16da1.tar.gz
perlweeklychallenge-club-ad212991e19ac58a442e177d6bc34f94a6f16da1.tar.bz2
perlweeklychallenge-club-ad212991e19ac58a442e177d6bc34f94a6f16da1.zip
Arne Sommer
-rw-r--r--challenge-259/arne-sommer/blog.txt1
-rw-r--r--challenge-259/arne-sommer/examples/example1.txt1
-rw-r--r--challenge-259/arne-sommer/examples/example2.txt1
-rw-r--r--challenge-259/arne-sommer/examples/example3.txt1
-rw-r--r--challenge-259/arne-sommer/examples/example4.txt4
-rwxr-xr-xchallenge-259/arne-sommer/raku/banking-day-offset49
-rwxr-xr-xchallenge-259/arne-sommer/raku/ch-1.raku49
-rwxr-xr-xchallenge-259/arne-sommer/raku/ch-2.raku97
-rwxr-xr-xchallenge-259/arne-sommer/raku/line-parser52
-rwxr-xr-xchallenge-259/arne-sommer/raku/line-parser-quoted97
10 files changed, 352 insertions, 0 deletions
diff --git a/challenge-259/arne-sommer/blog.txt b/challenge-259/arne-sommer/blog.txt
new file mode 100644
index 0000000000..8011a93872
--- /dev/null
+++ b/challenge-259/arne-sommer/blog.txt
@@ -0,0 +1 @@
+https://raku-musings.com/day-parser.html
diff --git a/challenge-259/arne-sommer/examples/example1.txt b/challenge-259/arne-sommer/examples/example1.txt
new file mode 100644
index 0000000000..e9ca4e9861
--- /dev/null
+++ b/challenge-259/arne-sommer/examples/example1.txt
@@ -0,0 +1 @@
+{% id field1="value1" field2="value2" field3=42 %}
diff --git a/challenge-259/arne-sommer/examples/example2.txt b/challenge-259/arne-sommer/examples/example2.txt
new file mode 100644
index 0000000000..781f154700
--- /dev/null
+++ b/challenge-259/arne-sommer/examples/example2.txt
@@ -0,0 +1 @@
+{% youtube title="Title \"quoted\" done" %}
diff --git a/challenge-259/arne-sommer/examples/example3.txt b/challenge-259/arne-sommer/examples/example3.txt
new file mode 100644
index 0000000000..51304801fe
--- /dev/null
+++ b/challenge-259/arne-sommer/examples/example3.txt
@@ -0,0 +1 @@
+{% youtube title="Title with escaped backslash \\" %}
diff --git a/challenge-259/arne-sommer/examples/example4.txt b/challenge-259/arne-sommer/examples/example4.txt
new file mode 100644
index 0000000000..b748efd312
--- /dev/null
+++ b/challenge-259/arne-sommer/examples/example4.txt
@@ -0,0 +1,4 @@
+{% id filed1="value1" field1="valeu1" num=3.14 %}
+LINE, the first
+LINE, the second
+{% endid %}
diff --git a/challenge-259/arne-sommer/raku/banking-day-offset b/challenge-259/arne-sommer/raku/banking-day-offset
new file mode 100755
index 0000000000..a63cededf9
--- /dev/null
+++ b/challenge-259/arne-sommer/raku/banking-day-offset
@@ -0,0 +1,49 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (:s(:$start),
+ Int :o(:$offset) where $offset > 0 = 1,
+ :b(:$bank) = "",
+ :v(:$verbose));
+
+my $date = Date.new($start);
+
+my %is-bank;
+
+for $bank.words -> $bank
+{
+ %is-bank{Date.new($bank).Str} = True;
+}
+
+my $added = 0;
+my $todo = $offset;
+
+loop
+{
+ if $date.day-of-week == 6|7
+ {
+ say ": Date $date ({ $date.day-of-week == 6 ?? 'Saturday' !! 'Sunday' }) Add 1" if $verbose;
+ $date++;
+ $added++;
+ }
+ elsif %is-bank{$date.Str}
+ {
+ say ": Date $date (Bank Holiday) Add 1" if $verbose;
+ $date++;
+ $added++;
+ }
+ elsif $todo
+ {
+ say ": Date $date (Todo { $todo }) Add 1" if $verbose;
+ $date++;
+ $added++;
+ $todo--;
+ }
+ else
+ {
+ last;
+ }
+}
+
+say ": Added a total of $added days" if $verbose;
+
+say $date.Str;
diff --git a/challenge-259/arne-sommer/raku/ch-1.raku b/challenge-259/arne-sommer/raku/ch-1.raku
new file mode 100755
index 0000000000..a63cededf9
--- /dev/null
+++ b/challenge-259/arne-sommer/raku/ch-1.raku
@@ -0,0 +1,49 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (:s(:$start),
+ Int :o(:$offset) where $offset > 0 = 1,
+ :b(:$bank) = "",
+ :v(:$verbose));
+
+my $date = Date.new($start);
+
+my %is-bank;
+
+for $bank.words -> $bank
+{
+ %is-bank{Date.new($bank).Str} = True;
+}
+
+my $added = 0;
+my $todo = $offset;
+
+loop
+{
+ if $date.day-of-week == 6|7
+ {
+ say ": Date $date ({ $date.day-of-week == 6 ?? 'Saturday' !! 'Sunday' }) Add 1" if $verbose;
+ $date++;
+ $added++;
+ }
+ elsif %is-bank{$date.Str}
+ {
+ say ": Date $date (Bank Holiday) Add 1" if $verbose;
+ $date++;
+ $added++;
+ }
+ elsif $todo
+ {
+ say ": Date $date (Todo { $todo }) Add 1" if $verbose;
+ $date++;
+ $added++;
+ $todo--;
+ }
+ else
+ {
+ last;
+ }
+}
+
+say ": Added a total of $added days" if $verbose;
+
+say $date.Str;
diff --git a/challenge-259/arne-sommer/raku/ch-2.raku b/challenge-259/arne-sommer/raku/ch-2.raku
new file mode 100755
index 0000000000..2f6a9a12c9
--- /dev/null
+++ b/challenge-259/arne-sommer/raku/ch-2.raku
@@ -0,0 +1,97 @@
+#! /usr/bin/env raku
+
+use JSON::Fast;
+
+unit sub MAIN ($file = "example1.txt", :j(:$json), :v(:$verbose));
+
+my %hash;
+my $text;
+
+for (slurp $file).lines -> $line
+{
+ if $line ~~ /^\{\%(.*)\%\}$/ && ! %hash<name>
+ {
+ my $data = $0.Str;
+ my @data = do-parse($data);
+ %hash<name> = @data.shift;
+
+ my %fields;
+ for @data -> $data
+ {
+ my ($k,$v) = $data.split('=');
+ %fields{$k} = $v;
+ }
+
+ %hash<fields> = %fields;
+ }
+ elsif $line eq '{% end' ~ %hash<name> ~ ' %}'
+ {
+ %hash<text> = $text if $text;
+ last;
+ }
+ elsif %hash<name>
+ {
+ $text ~= "$line\n";
+ }
+ else
+ {
+ die "Illegal data in input: $line";
+ }
+}
+
+say $json
+ ?? to-json %hash, :sorted-keys
+ !! %hash.raku;
+
+sub do-parse ($string)
+{
+ my @done;
+ my $todo = $string.trim;
+
+ while $todo
+ {
+ $todo ~~ /^ \s* (\w+)(.*)/;
+ my $key = $0.Str;
+ my $val = "";
+ $todo = $1.Str;
+
+ if $todo.starts-with('="')
+ {
+ $todo ~~ /^\=\"(.*)/;
+
+ my @todo = $0.Str.comb;
+
+ while @todo
+ {
+ my $char = @todo.shift;
+ $char ~= @todo.shift if $char eq "\\";
+ $val ~= $char;
+ if @todo[0] eq '"'
+ {
+ $todo = @todo[1..*].join;
+ last;
+ }
+ }
+
+ # $val = $0.Str;
+ # $todo = $1.Str;
+ @done.push: "$key=$val";
+ }
+ elsif $todo.starts-with('=')
+ {
+ # say "=";
+ $todo ~~ /^\=(<[0..9.]>+)(.*)/;
+ $val = $0.Str;
+ $todo = $1.Str;
+ @done.push: "$key=$val";
+ }
+ else
+ {
+ # say "name only";
+ @done.push: $key;
+ }
+ }
+
+ say ": Parsed: { @done.raku }" if $verbose;
+ return @done;
+} \ No newline at end of file
diff --git a/challenge-259/arne-sommer/raku/line-parser b/challenge-259/arne-sommer/raku/line-parser
new file mode 100755
index 0000000000..47be0b272d
--- /dev/null
+++ b/challenge-259/arne-sommer/raku/line-parser
@@ -0,0 +1,52 @@
+#! /usr/bin/env raku
+
+unit sub MAIN ($file = "example1.txt", :v($verbose));
+
+my %hash;
+my $text;
+
+for (slurp $file).lines -> $line
+{
+ if $line ~~ /^\{\%(.*)\%\}$/ && ! %hash<name>
+ {
+ my $data = $0.Str;
+ say ": Data: $data" if $verbose;
+
+ my @data = $data.words;
+ %hash<name> = @data.shift;
+
+ my %fields;
+ for @data -> $data
+ {
+ my ($k,$v) = $data.split('=');
+
+ if $v.Numeric
+ {
+ %fields{$k} = $v.Numeric;
+ }
+ else
+ {
+ $v ~~ /^\"(.*)\"$/;
+ die "String $v must be quoted" unless $0;
+ %fields{$k} = $0.Str;
+ }
+ }
+
+ %hash<fields> = %fields;
+ }
+ elsif $line eq '{% end' ~ %hash<name> ~ ' %}'
+ {
+ %hash<text> = $text if $text;
+ last;
+ }
+ elsif %hash<name>
+ {
+ $text ~= "$line\n";
+ }
+ else
+ {
+ die "Illegal data in input: $line";
+ }
+}
+
+say %hash.raku;
diff --git a/challenge-259/arne-sommer/raku/line-parser-quoted b/challenge-259/arne-sommer/raku/line-parser-quoted
new file mode 100755
index 0000000000..2f6a9a12c9
--- /dev/null
+++ b/challenge-259/arne-sommer/raku/line-parser-quoted
@@ -0,0 +1,97 @@
+#! /usr/bin/env raku
+
+use JSON::Fast;
+
+unit sub MAIN ($file = "example1.txt", :j(:$json), :v(:$verbose));
+
+my %hash;
+my $text;
+
+for (slurp $file).lines -> $line
+{
+ if $line ~~ /^\{\%(.*)\%\}$/ && ! %hash<name>
+ {
+ my $data = $0.Str;
+ my @data = do-parse($data);
+ %hash<name> = @data.shift;
+
+ my %fields;
+ for @data -> $data
+ {
+ my ($k,$v) = $data.split('=');
+ %fields{$k} = $v;
+ }
+
+ %hash<fields> = %fields;
+ }
+ elsif $line eq '{% end' ~ %hash<name> ~ ' %}'
+ {
+ %hash<text> = $text if $text;
+ last;
+ }
+ elsif %hash<name>
+ {
+ $text ~= "$line\n";
+ }
+ else
+ {
+ die "Illegal data in input: $line";
+ }
+}
+
+say $json
+ ?? to-json %hash, :sorted-keys
+ !! %hash.raku;
+
+sub do-parse ($string)
+{
+ my @done;
+ my $todo = $string.trim;
+
+ while $todo
+ {
+ $todo ~~ /^ \s* (\w+)(.*)/;
+ my $key = $0.Str;
+ my $val = "";
+ $todo = $1.Str;
+
+ if $todo.starts-with('="')
+ {
+ $todo ~~ /^\=\"(.*)/;
+
+ my @todo = $0.Str.comb;
+
+ while @todo
+ {
+ my $char = @todo.shift;
+ $char ~= @todo.shift if $char eq "\\";
+ $val ~= $char;
+ if @todo[0] eq '"'
+ {
+ $todo = @todo[1..*].join;
+ last;
+ }
+ }
+
+ # $val = $0.Str;
+ # $todo = $1.Str;
+ @done.push: "$key=$val";
+ }
+ elsif $todo.starts-with('=')
+ {
+ # say "=";
+ $todo ~~ /^\=(<[0..9.]>+)(.*)/;
+ $val = $0.Str;
+ $todo = $1.Str;
+ @done.push: "$key=$val";
+ }
+ else
+ {
+ # say "name only";
+ @done.push: $key;
+ }
+ }
+
+ say ": Parsed: { @done.raku }" if $verbose;
+ return @done;
+} \ No newline at end of file