diff options
| author | deadmarshal <adeadmarshal@gmail.com> | 2024-07-20 08:51:23 +0330 |
|---|---|---|
| committer | deadmarshal <adeadmarshal@gmail.com> | 2024-07-20 08:51:23 +0330 |
| commit | 83c26b915df95865c54062ab5c1a04a916ac217a (patch) | |
| tree | 01babe5709ac5289c13853e20cc52a487e0e1347 | |
| parent | 1e7c50d9232dcc1ca985e29ba4860aaf13725056 (diff) | |
| download | perlweeklychallenge-club-83c26b915df95865c54062ab5c1a04a916ac217a.tar.gz perlweeklychallenge-club-83c26b915df95865c54062ab5c1a04a916ac217a.tar.bz2 perlweeklychallenge-club-83c26b915df95865c54062ab5c1a04a916ac217a.zip | |
TWC278
24 files changed, 378 insertions, 0 deletions
diff --git a/challenge-278/deadmarshal/blog.txt b/challenge-278/deadmarshal/blog.txt new file mode 100644 index 0000000000..990c8c8dc3 --- /dev/null +++ b/challenge-278/deadmarshal/blog.txt @@ -0,0 +1 @@ +https://deadmarshal.blogspot.com/2024/07/twc278.html diff --git a/challenge-278/deadmarshal/java/Ch1.java b/challenge-278/deadmarshal/java/Ch1.java new file mode 100644 index 0000000000..9715d94bc7 --- /dev/null +++ b/challenge-278/deadmarshal/java/Ch1.java @@ -0,0 +1,36 @@ +import java.util.HashMap; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +public class Ch1 { + public static void main(String[] args) { + try { + System.out.println(sort_string("and2 Raku3 cousins5 Perl1 are4")); + System.out.println(sort_string("guest6 Python1 most4 the3 popular5 is2 " + + "language7")); + System.out.println(sort_string("Challenge3 The1 Weekly2")); + } catch (Exception e) { + System.err.println(e.getMessage()); + } + } + + private static String sort_string(String str) throws Exception { + Pattern pattern = Pattern.compile("(\\w+)(\\d+)"); + Map<String, Integer> m = new HashMap<>(); + for (String s : str.split(" ")) { + Matcher matcher = pattern.matcher(s); + if (matcher.find()) + m.put(matcher.group(1), Integer.parseInt(matcher.group(2))); + else + throw new Exception("Wrong format!"); + } + return m.entrySet() + .stream() + .sorted(Map.Entry.comparingByValue()) + .map(Map.Entry::getKey) + .collect(Collectors.joining(" ")); + } +} + diff --git a/challenge-278/deadmarshal/java/Ch2.java b/challenge-278/deadmarshal/java/Ch2.java new file mode 100644 index 0000000000..c8dde6453c --- /dev/null +++ b/challenge-278/deadmarshal/java/Ch2.java @@ -0,0 +1,20 @@ +import java.util.Arrays; + +public class Ch2 { + public static void main(String[] args) { + System.out.println(reverse_string("challenge", 'e')); + System.out.println(reverse_string("programming", 'a')); + System.out.println(reverse_string("champion", 'b')); + } + + private static String reverse_string(String str, char c) { + int idx = str.indexOf(c); + if (idx != -1) { + char[] arr = str.substring(0, idx + 1).toCharArray(); + Arrays.sort(arr); + return String.valueOf(arr) + str.substring(idx); + } + return str; + } +} + diff --git a/challenge-278/deadmarshal/lua/ch-1.lua b/challenge-278/deadmarshal/lua/ch-1.lua new file mode 100644 index 0000000000..df34e13834 --- /dev/null +++ b/challenge-278/deadmarshal/lua/ch-1.lua @@ -0,0 +1,22 @@ +#!/usr/bin/env lua + +local function sort_by(t,f) + assert(type(t) == 'table','t must be a table!') + local keys = {} + for k in pairs(t) do keys[#keys+1] = k end + table.sort(keys,function(a,b) return f(t[a],t[b]) end) + return keys +end + +local function sort_string(s) + assert(type(s) == 'string','s must be a string!') + local t = {} + for w in s:gmatch('%S+') do + for k,v in w:gmatch('(%a+)(%d+)') do t[k] = v end + end + return table.concat(sort_by(t,function(a,b) return a < b end),' ') +end + +print(sort_string'and2 Raku3 cousins5 Perl1 are4') +print(sort_string'guest6 Python1 most4 the3 popular5 is2 language7') +print(sort_string'Challenge3 The1 Weekly2') diff --git a/challenge-278/deadmarshal/lua/ch-2.lua b/challenge-278/deadmarshal/lua/ch-2.lua new file mode 100644 index 0000000000..d368132923 --- /dev/null +++ b/challenge-278/deadmarshal/lua/ch-2.lua @@ -0,0 +1,16 @@ +#!/usr/bin/env lua + +local function reverse_string(s,e) + assert(type(s) == 'string' and + type(e) == 'string','s and e must be strings!') + local t,idx = {},string.find(s,e,1,true) + if idx == nil then return s end + for i=1,idx do t[#t+1] = s:sub(i,i) end + table.sort(t) + return table.concat(t,'') .. s:sub(idx+1,#s) +end + +print(reverse_string('challenge','e')) +print(reverse_string('programming','a')) +print(reverse_string('champion','b')) + diff --git a/challenge-278/deadmarshal/modula-3/ch1/src/Ch1.m3 b/challenge-278/deadmarshal/modula-3/ch1/src/Ch1.m3 new file mode 100644 index 0000000000..0c26aa6617 --- /dev/null +++ b/challenge-278/deadmarshal/modula-3/ch1/src/Ch1.m3 @@ -0,0 +1,97 @@ +MODULE Ch1 EXPORTS Main; + +IMPORT SIO,Text,Scan,ASCII,FloatMode; +IMPORT Lex,TextConv,Integer; +IMPORT TextIntPair,TextIntPairArraySort; + +PROCEDURE ExtractAlphas(READONLY Str:TEXT):TEXT = + VAR Ret:TEXT := ""; + BEGIN + FOR I := 0 TO Text.Length(Str)-1 DO + WITH C = Text.GetChar(Str,I) DO + IF C IN ASCII.Letters THEN + Ret := Ret & Text.FromChar(C) + END + END + END; + RETURN Ret + END ExtractAlphas; + +PROCEDURE ExtractDigits(READONLY Str:TEXT):INTEGER + RAISES{Lex.Error,FloatMode.Trap} = + VAR + Acc:TEXT := ""; + Ret:INTEGER := 0; + BEGIN + FOR I := 0 TO Text.Length(Str)-1 DO + WITH C = Text.GetChar(Str,I) DO + IF C IN ASCII.Digits THEN + Acc := Acc & Text.FromChar(C) + END + END + END; + Ret := Scan.Int(Acc); + RETURN Ret + END ExtractDigits; + +PROCEDURE Compare(READONLY a,b:TextIntPair.T):[-1..1] = +VAR + X:INTEGER := TextIntPair.Second(a); + Y:INTEGER := TextIntPair.Second(b); +BEGIN + IF Integer.Compare(X,Y) < 0 THEN RETURN -1 + ELSIF Integer.Compare(X,Y) > 0 THEN RETURN 1 + ELSE RETURN 0 + END; +END Compare; + +PROCEDURE SortString(READONLY Str:TEXT):TEXT + RAISES{Lex.Error,FloatMode.Trap} = + VAR + Len:CARDINAL := TextConv.ExplodedSize(Str,SET OF CHAR{' '}); + Words:REF ARRAY OF TEXT := NEW(REF ARRAY OF TEXT,Len); + Pairs:REF ARRAY OF TextIntPair.T := + NEW(REF ARRAY OF TextIntPair.T,Len); + BEGIN + TextConv.Explode(Str,Words^,SET OF CHAR{' '}); + FOR I := FIRST(Words^) TO LAST(Words^) DO + Pairs[I] := TextIntPair.Create(ExtractAlphas(Words[I]), + ExtractDigits(Words[I])) + END; + TextIntPairArraySort.Sort(Pairs^,Compare); + FOR I := FIRST(Pairs^) TO LAST(Pairs^) DO + Words[I] := TextIntPair.First(Pairs[I]) + END; + RETURN TextConv.Implode(Words^,' ') + END SortString; + +BEGIN + TRY + SIO.PutText(SortString("and2 Raku3 cousins5 Perl1 are4") & "\n"); + SIO.PutText(SortString("guest6 Python1 most4 the3 popular5 is2 language7") + & "\n"); + SIO.PutText(SortString("Challenge3 The1 Weekly2") & "\n") + EXCEPT + Lex.Error => SIO.PutText("Lex.Error: malformed digit!\n") + | FloatMode.Trap(t) => + CASE t OF + FloatMode.Flag.Invalid => + SIO.PutText("FloatMode.Trap(Invalid)") + | FloatMode.Flag.Inexact => + SIO.PutText("FloatMode.Trap(Inexact)") + | FloatMode.Flag.Overflow => + SIO.PutText("FloatMode.Trap(Overflow)") + | FloatMode.Flag.Underflow => + SIO.PutText("FloatMode.Trap(Underflow)") + | FloatMode.Flag.DivByZero => + SIO.PutText("FloatMode.Trap(DivByZero)") + | FloatMode.Flag.IntOverflow => + SIO.PutText("FloatMode.Trap(IntOverflow)") + | FloatMode.Flag.IntDivByZero => + SIO.PutText("FloatMode.Trap(IntDivByZero)") + ELSE + SIO.PutText("Some other exception occurred!\n") + END + END; +END Ch1. + diff --git a/challenge-278/deadmarshal/modula-3/ch1/src/Pair.ig b/challenge-278/deadmarshal/modula-3/ch1/src/Pair.ig new file mode 100644 index 0000000000..1f0e017c4f --- /dev/null +++ b/challenge-278/deadmarshal/modula-3/ch1/src/Pair.ig @@ -0,0 +1,20 @@ +GENERIC INTERFACE Pair(E1,E2); + +IMPORT Word; + +CONST + Brand = "Pair(" & E1.Brand & "," & E2.Brand & ")"; + +TYPE + T <: REFANY; + +PROCEDURE Create(READONLY First:E1.T; + READONLY Second:E2.T):T; +PROCEDURE Equal(READONLY a,b:T):BOOLEAN; +PROCEDURE Hash(READONLY a:T):Word.T; +PROCEDURE Compare(READONLY a,b:T):[-1..1]; +PROCEDURE First(READONLY Pair:T):E1.T; +PROCEDURE Second(READONLY Pair:T):E2.T; + +END Pair. + diff --git a/challenge-278/deadmarshal/modula-3/ch1/src/Pair.mg b/challenge-278/deadmarshal/modula-3/ch1/src/Pair.mg new file mode 100644 index 0000000000..7902fa425c --- /dev/null +++ b/challenge-278/deadmarshal/modula-3/ch1/src/Pair.mg @@ -0,0 +1,48 @@ +GENERIC MODULE Pair(E1,E2); + +IMPORT Word; + +REVEAL T = BRANDED REF RECORD + First:E1.T; + Second:E2.T; +END; + +PROCEDURE Create(READONLY First:E1.T; + READONLY Second:E2.T):T = + BEGIN + RETURN NEW(T,First := First,Second := Second) + END Create; + +PROCEDURE First(READONLY Pair:T):E1.T = + BEGIN + RETURN Pair.First + END First; + +PROCEDURE Second(READONLY Pair:T):E2.T = + BEGIN + RETURN Pair.Second + END Second; + +PROCEDURE Equal(READONLY a,b:T):BOOLEAN = + BEGIN + RETURN E1.Equal(a.First,b.First) AND E2.Equal(a.Second,b.Second) + END Equal; + +PROCEDURE Hash(READONLY a:T):Word.T = + BEGIN + RETURN E1.Hash(a.First) + END Hash; + +PROCEDURE Compare(READONLY a,b:T):[-1..1] = +BEGIN + IF E1.Compare(a.First,b.First) = 0 AND + E2.Compare(a.Second,b.Second) = 0 THEN RETURN 0 + ELSIF E1.Compare(a.First,b.First) < 0 AND + E2.Compare(a.Second,b.Second) < 0 THEN RETURN -1 + ELSE RETURN 1 + END; + END Compare; + +BEGIN +END Pair. + diff --git a/challenge-278/deadmarshal/modula-3/ch1/src/m3makefile b/challenge-278/deadmarshal/modula-3/ch1/src/m3makefile new file mode 100644 index 0000000000..63baab2e7b --- /dev/null +++ b/challenge-278/deadmarshal/modula-3/ch1/src/m3makefile @@ -0,0 +1,11 @@ +import("libm3") +import("libsio") + +generic_module("Pair") + +module("specializations/TextIntPair") +module("specializations/TextIntPairArraySort") + +implementation("Ch1") +program("ch1") + diff --git a/challenge-278/deadmarshal/modula-3/ch1/src/specializations/TextIntPair.i3 b/challenge-278/deadmarshal/modula-3/ch1/src/specializations/TextIntPair.i3 new file mode 100644 index 0000000000..65a4d60dc5 --- /dev/null +++ b/challenge-278/deadmarshal/modula-3/ch1/src/specializations/TextIntPair.i3 @@ -0,0 +1,2 @@ +INTERFACE TextIntPair = Pair(Text,Integer) END TextIntPair. + diff --git a/challenge-278/deadmarshal/modula-3/ch1/src/specializations/TextIntPair.m3 b/challenge-278/deadmarshal/modula-3/ch1/src/specializations/TextIntPair.m3 new file mode 100644 index 0000000000..ecae7d6fbd --- /dev/null +++ b/challenge-278/deadmarshal/modula-3/ch1/src/specializations/TextIntPair.m3 @@ -0,0 +1 @@ +MODULE TextIntPair = Pair(Text,Integer) END TextIntPair. diff --git a/challenge-278/deadmarshal/modula-3/ch1/src/specializations/TextIntPairArraySort.i3 b/challenge-278/deadmarshal/modula-3/ch1/src/specializations/TextIntPairArraySort.i3 new file mode 100644 index 0000000000..d8a239276a --- /dev/null +++ b/challenge-278/deadmarshal/modula-3/ch1/src/specializations/TextIntPairArraySort.i3 @@ -0,0 +1,2 @@ +INTERFACE TextIntPairArraySort = ArraySort(TextIntPair) END TextIntPairArraySort. + diff --git a/challenge-278/deadmarshal/modula-3/ch1/src/specializations/TextIntPairArraySort.m3 b/challenge-278/deadmarshal/modula-3/ch1/src/specializations/TextIntPairArraySort.m3 new file mode 100644 index 0000000000..df092085c9 --- /dev/null +++ b/challenge-278/deadmarshal/modula-3/ch1/src/specializations/TextIntPairArraySort.m3 @@ -0,0 +1 @@ +MODULE TextIntPairArraySort = ArraySort(TextIntPair) END TextIntPairArraySort. diff --git a/challenge-278/deadmarshal/modula-3/ch1/src/specializations/TextIntPairSeq.i3 b/challenge-278/deadmarshal/modula-3/ch1/src/specializations/TextIntPairSeq.i3 new file mode 100644 index 0000000000..6839fd8db5 --- /dev/null +++ b/challenge-278/deadmarshal/modula-3/ch1/src/specializations/TextIntPairSeq.i3 @@ -0,0 +1,2 @@ +INTERFACE TextIntPairSeq = Sequence(TextIntPair) END TextIntPairSeq. + diff --git a/challenge-278/deadmarshal/modula-3/ch1/src/specializations/TextIntPairSeq.m3 b/challenge-278/deadmarshal/modula-3/ch1/src/specializations/TextIntPairSeq.m3 new file mode 100644 index 0000000000..c0b81c0a18 --- /dev/null +++ b/challenge-278/deadmarshal/modula-3/ch1/src/specializations/TextIntPairSeq.m3 @@ -0,0 +1,2 @@ +MODULE TextIntPairSeq = Sequence(TextIntPair,TextIntPairSeq,TextIntPairSeqRep) END TextIntPairSeq. + diff --git a/challenge-278/deadmarshal/modula-3/ch1/src/specializations/TextIntPairSeqRep.i3 b/challenge-278/deadmarshal/modula-3/ch1/src/specializations/TextIntPairSeqRep.i3 new file mode 100644 index 0000000000..39766fcec3 --- /dev/null +++ b/challenge-278/deadmarshal/modula-3/ch1/src/specializations/TextIntPairSeqRep.i3 @@ -0,0 +1,3 @@ +INTERFACE TextIntPairSeqRep = SequenceRep(TextIntPair,TextIntPairSeq) +END TextIntPairSeqRep. + diff --git a/challenge-278/deadmarshal/modula-3/ch2/src/Ch2.m3 b/challenge-278/deadmarshal/modula-3/ch2/src/Ch2.m3 new file mode 100644 index 0000000000..7af7e36cad --- /dev/null +++ b/challenge-278/deadmarshal/modula-3/ch2/src/Ch2.m3 @@ -0,0 +1,30 @@ +MODULE Ch2 EXPORTS Main; + +IMPORT SIO,Text,TextExtras,CharArraySort; + +PROCEDURE SortText(READONLY T:TEXT):TEXT = + VAR A:REF ARRAY OF CHAR := + NEW(REF ARRAY OF CHAR,Text.Length(T)); + BEGIN + Text.SetChars(A^,T); + CharArraySort.Sort(A^); + RETURN Text.FromChars(A^) + END SortText; + +PROCEDURE ReverseString(READONLY T:TEXT; + READONLY C:CHAR):TEXT = + VAR + I:CARDINAL := 0; + BEGIN + IF TextExtras.FindChar(T,C,I) THEN + RETURN SortText(Text.Sub(T,0,I+1)) & Text.Sub(T,I+1) + ELSE RETURN T + END; + END ReverseString; + +BEGIN + SIO.PutText(ReverseString("challenge",'e')); SIO.Nl(); + SIO.PutText(ReverseString("programming",'a')); SIO.Nl(); + SIO.PutText(ReverseString("champion",'b')); SIO.Nl() +END Ch2. + diff --git a/challenge-278/deadmarshal/modula-3/ch2/src/m3makefile b/challenge-278/deadmarshal/modula-3/ch2/src/m3makefile new file mode 100644 index 0000000000..72ae467753 --- /dev/null +++ b/challenge-278/deadmarshal/modula-3/ch2/src/m3makefile @@ -0,0 +1,6 @@ +import("libm3") +import("libsio") +module("specializations/CharArraySort") +implementation("Ch2") +program("ch2") + diff --git a/challenge-278/deadmarshal/modula-3/ch2/src/specializations/CharArraySort.i3 b/challenge-278/deadmarshal/modula-3/ch2/src/specializations/CharArraySort.i3 new file mode 100644 index 0000000000..fb75d48a90 --- /dev/null +++ b/challenge-278/deadmarshal/modula-3/ch2/src/specializations/CharArraySort.i3 @@ -0,0 +1 @@ +INTERFACE CharArraySort = ArraySort(Char) END CharArraySort. diff --git a/challenge-278/deadmarshal/modula-3/ch2/src/specializations/CharArraySort.m3 b/challenge-278/deadmarshal/modula-3/ch2/src/specializations/CharArraySort.m3 new file mode 100644 index 0000000000..cccaece34d --- /dev/null +++ b/challenge-278/deadmarshal/modula-3/ch2/src/specializations/CharArraySort.m3 @@ -0,0 +1 @@ +MODULE CharArraySort = ArraySort(Char) END CharArraySort. diff --git a/challenge-278/deadmarshal/perl/ch-1.pl b/challenge-278/deadmarshal/perl/ch-1.pl new file mode 100644 index 0000000000..e083fe6178 --- /dev/null +++ b/challenge-278/deadmarshal/perl/ch-1.pl @@ -0,0 +1,14 @@ +#!/usr/bin/env perl +use strict; +use warnings; + +sub sort_string{ + my %h = map{/(\w+)(\d+)/} split ' ',$_[0]; + join ' ',sort{$h{$a} <=> $h{$b}} keys %h +} + +printf "%s\n",sort_string('and2 Raku3 cousins5 Perl1 are4'); +printf "%s\n", + sort_string('guest6 Python1 most4 the3 popular5 is2 language7'); +printf "%s\n",sort_string('Challenge3 The1 Weekly2'); + diff --git a/challenge-278/deadmarshal/perl/ch-2.pl b/challenge-278/deadmarshal/perl/ch-2.pl new file mode 100644 index 0000000000..ba6e2aaf08 --- /dev/null +++ b/challenge-278/deadmarshal/perl/ch-2.pl @@ -0,0 +1,12 @@ +#!/usr/bin/env perl +use strict; +use warnings; + +sub reverse_string{ + $_[0] =~ s/(.*?$_[1])/join '',sort split '',$1/er +} + +printf "%s\n",reverse_string('challenge','e'); +printf "%s\n",reverse_string('programming','a'); +printf "%s\n",reverse_string('champion','b'); + diff --git a/challenge-278/deadmarshal/ruby/ch1.rb b/challenge-278/deadmarshal/ruby/ch1.rb new file mode 100644 index 0000000000..4f54d7539c --- /dev/null +++ b/challenge-278/deadmarshal/ruby/ch1.rb @@ -0,0 +1,15 @@ +#!/usr/bin/env ruby + +def sort_string(s) + h = Hash.new(0) + s.split(' ').each do |e| + e =~ /(\w+)(\d+)/ + h[$1] = $2 + end + (h.keys.sort{|a,b| h[a] <=> h[b]}).join(' ') +end + +puts sort_string('and2 Raku3 cousins5 Perl1 are4') +puts sort_string('guest6 Python1 most4 the3 popular5 is2 language7') +puts sort_string('Challenge3 The1 Weekly2') + diff --git a/challenge-278/deadmarshal/ruby/ch2.rb b/challenge-278/deadmarshal/ruby/ch2.rb new file mode 100644 index 0000000000..bcaf70f72a --- /dev/null +++ b/challenge-278/deadmarshal/ruby/ch2.rb @@ -0,0 +1,15 @@ +#!/usr/bin/env ruby + +def reverse_string(s,e) + idx = s.index(e) + if idx.nil? + return s + end + sub = s[0..idx] + return sub.chars.sort.join + s[idx+1..-1] +end + +puts reverse_string('challenge','e') +puts reverse_string('programming','a') +puts reverse_string('champion','b') + |
