diff options
| author | arnesom <arne@bbop.org> | 2024-03-09 20:21:19 +0100 |
|---|---|---|
| committer | arnesom <arne@bbop.org> | 2024-03-09 20:21:19 +0100 |
| commit | ad212991e19ac58a442e177d6bc34f94a6f16da1 (patch) | |
| tree | 32c90de7f80396c873137acc17dd098d71004f55 | |
| parent | f5f5d621ea288e667ae707543d2fc77b5c3f1ed1 (diff) | |
| download | perlweeklychallenge-club-ad212991e19ac58a442e177d6bc34f94a6f16da1.tar.gz perlweeklychallenge-club-ad212991e19ac58a442e177d6bc34f94a6f16da1.tar.bz2 perlweeklychallenge-club-ad212991e19ac58a442e177d6bc34f94a6f16da1.zip | |
Arne Sommer
| -rw-r--r-- | challenge-259/arne-sommer/blog.txt | 1 | ||||
| -rw-r--r-- | challenge-259/arne-sommer/examples/example1.txt | 1 | ||||
| -rw-r--r-- | challenge-259/arne-sommer/examples/example2.txt | 1 | ||||
| -rw-r--r-- | challenge-259/arne-sommer/examples/example3.txt | 1 | ||||
| -rw-r--r-- | challenge-259/arne-sommer/examples/example4.txt | 4 | ||||
| -rwxr-xr-x | challenge-259/arne-sommer/raku/banking-day-offset | 49 | ||||
| -rwxr-xr-x | challenge-259/arne-sommer/raku/ch-1.raku | 49 | ||||
| -rwxr-xr-x | challenge-259/arne-sommer/raku/ch-2.raku | 97 | ||||
| -rwxr-xr-x | challenge-259/arne-sommer/raku/line-parser | 52 | ||||
| -rwxr-xr-x | challenge-259/arne-sommer/raku/line-parser-quoted | 97 |
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 |
