diff options
| -rw-r--r-- | challenge-180/polettix/blog.txt | 1 | ||||
| -rw-r--r-- | challenge-180/polettix/blog1.txt | 1 | ||||
| -rw-r--r-- | challenge-180/polettix/perl/ch-1.pl | 48 | ||||
| -rw-r--r-- | challenge-180/polettix/perl/ch-2.pl | 11 | ||||
| -rw-r--r-- | challenge-180/polettix/raku/ch-1.raku | 60 | ||||
| -rw-r--r-- | challenge-180/polettix/raku/ch-2.raku | 11 |
6 files changed, 132 insertions, 0 deletions
diff --git a/challenge-180/polettix/blog.txt b/challenge-180/polettix/blog.txt new file mode 100644 index 0000000000..e386b064dd --- /dev/null +++ b/challenge-180/polettix/blog.txt @@ -0,0 +1 @@ +https://etoobusy.polettix.it/2022/09/01/pwc180-first-unique-character/ diff --git a/challenge-180/polettix/blog1.txt b/challenge-180/polettix/blog1.txt new file mode 100644 index 0000000000..3eb5dabf55 --- /dev/null +++ b/challenge-180/polettix/blog1.txt @@ -0,0 +1 @@ +https://etoobusy.polettix.it/2022/09/02/pwc180-trim-list/ diff --git a/challenge-180/polettix/perl/ch-1.pl b/challenge-180/polettix/perl/ch-1.pl new file mode 100644 index 0000000000..c01b10f970 --- /dev/null +++ b/challenge-180/polettix/perl/ch-1.pl @@ -0,0 +1,48 @@ +#!/usr/bin/env perl +use v5.24; +use warnings; +use experimental 'signatures'; +no warnings 'experimental::signatures'; +use I18N::Langinfo qw(langinfo CODESET); +use Encode qw(decode); + +{ + package DoubleLinkedList; + sub new ($p) { return bless { head => undef, tail => undef }, $p } + sub push ($self, $value) { + my $e = { value => $value, pred => $self->{tail}, succ => undef }; + $self->{tail}{succ} = $e if defined $self->{tail}; + $self->{tail} = $e; + $self->{head} //= $e; + return $self; + } + sub remove ($self, $e) { + if (defined $e->{pred}) { $e->{pred}{succ} = $e->{succ} } + else { $self->{head} = $e->{succ} } + if (defined $e->{succ}) { $e->{succ}{pred} = $e->{pred} } + else { $self->{tail} = $e->{pred} } + return $self; + } +} + +my $codeset = langinfo(CODESET); +my $string = decode($codeset, shift(@ARGV) // 'Perl Weekly Challenge'); + +my $order = DoubleLinkedList->new; +my %dll_element_for; +my $i = 0; +for my $character (split m{}mxs, $string) { + if (exists $dll_element_for{$character}) { + if (defined $dll_element_for{$character}) { + $order->remove($dll_element_for{$character}); + $dll_element_for{$character} = undef; + } + } + else { + $dll_element_for{$character} = $order->push($i)->{tail}; + } + ++$i; +} + +die "no result, sorry!\n" unless defined $order->{head}; +say $order->{head}{value}; diff --git a/challenge-180/polettix/perl/ch-2.pl b/challenge-180/polettix/perl/ch-2.pl new file mode 100644 index 0000000000..30da5d46a0 --- /dev/null +++ b/challenge-180/polettix/perl/ch-2.pl @@ -0,0 +1,11 @@ +#!/usr/bin/env perl +use v5.24; +use warnings; + +sub trim (&@) { my $cond = shift; grep { ! $cond->($_) } @_ } +sub trim_le ($@) { my $i = shift; trim { $_ <= $i } @_ } + +my $i = shift // 3; +my @start = @ARGV ? @ARGV : (1, 4, 2, 3, 5); +my @trimmed = trim_le $i, @start; +{local $" = ','; say "(@trimmed)" } diff --git a/challenge-180/polettix/raku/ch-1.raku b/challenge-180/polettix/raku/ch-1.raku new file mode 100644 index 0000000000..23240d3d46 --- /dev/null +++ b/challenge-180/polettix/raku/ch-1.raku @@ -0,0 +1,60 @@ +#!/usr/bin/env raku +use v6; + +class DoubleLinkedList { ... } +sub MAIN ($string = 'Perl Weekly Challenge') { + my $order = DoubleLinkedList.new; + my %dll-element-for; + my $i = 0; + for $string.comb -> $character { + if %dll-element-for{$character}:exists { + if defined %dll-element-for{$character} { + $order.remove(%dll-element-for{$character}); + %dll-element-for{$character} = Nil; + } + } + else { + %dll-element-for{$character} = $order.push($i).tail; + } + ++$i; + } + + die 'no result, sorry!' unless defined $order.head; + put $order.head.value; +} + +class DoubleLinkedList { + class Element { + has $.value; + has $.pred is rw is built = Nil; + has $.succ is rw is built = Nil; + } + + has $.head is rw is built = Nil; + has $.tail is rw is built = Nil; + + method push ($value) { + my $element = Element.new( + value => $value, pred => $.tail, succ => Nil); + $.tail.succ = $element if defined $.tail; + $.tail = $element; + $.head //= $element; + return self; + } + + method remove ($element) { + if (defined $element.pred) { + $element.pred.succ = $element.succ; + } + else { + $.head = $element.succ; + } + if (defined $element.succ) { + $element.succ.pred = $element.pred; + } + else { + $.tail = $element.pred; + } + return self; + } +} diff --git a/challenge-180/polettix/raku/ch-2.raku b/challenge-180/polettix/raku/ch-2.raku new file mode 100644 index 0000000000..b89c21b857 --- /dev/null +++ b/challenge-180/polettix/raku/ch-2.raku @@ -0,0 +1,11 @@ +#!/usr/bin/env raku +use v6; + +sub trim (&cond, *@items) { grep {! &cond($_) }, @items } +sub trim_le ($i, *@items) { trim {$_ <= $i}, @items } + +sub MAIN ($i is copy = Nil, *@args) { + ($i, @args) = 3, 1, 4, 2, 3, 5 unless defined $i; + my @trimmed = trim_le($i, @args); + put '(' ~ @trimmed.join(',') ~ ')'; +} |
