aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--challenge-180/polettix/blog.txt1
-rw-r--r--challenge-180/polettix/blog1.txt1
-rw-r--r--challenge-180/polettix/perl/ch-1.pl48
-rw-r--r--challenge-180/polettix/perl/ch-2.pl11
-rw-r--r--challenge-180/polettix/raku/ch-1.raku60
-rw-r--r--challenge-180/polettix/raku/ch-2.raku11
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(',') ~ ')';
+}