ETOOBUSY 🚀 minimal blogging for the impatient
PWC184 - Split Array
TL;DR
On with TASK #2 from The Weekly Challenge #184. Enjoy!
The challenge
You are given list of strings containing
0-9
anda-z
separated byspace
only.Write a script to split the data into two arrays, one for integers and one for alphabets only.
Example 1
Input: @list = ( 'a 1 2 b 0', '3 c 4 d') Output: [[1,2,0], [3,4]] and [['a','b'], ['c','d']]
Example 2
Input: @list = ( '1 2', 'p q r', 's 3', '4 5 t') Output: [[1,2], [3], [4,5]] and [['p','q','r'], ['s'], ['t']]
The questions
The second example helped. I initially thought that we were supposed to include empty sub-arrays, but this does not seem to be the case.
I’ll also assume that it’s either digits or letters.
The solution
This will be done just plainly. Iterate through all input strings, split them on spaces and decide where to put the characters (digits or letters).
#!/usr/bin/env perl
use v5.24;
use warnings;
use experimental 'signatures';
no warnings 'experimental::signatures';
use Data::Dumper;
my @l = ('1 2', 'p q r', 's 3', '4 5 t');
say Dumper([split_array(@l)]);
sub split_array (@list) {
my (@digits, @letters);
for my $item (@list) {
my (@ds, @ls);
for my $char (split m{\s+}mxs, $item) {
if ($char =~ m{\d}mxs) { push @ds, $char }
else { push @ls, $char }
}
push @digits, \@ds if @ds;
push @letters, \@ls if @ls;
}
return (\@digits, \@letters);
}
We’re going for a straight translation in Raku:
#!/usr/bin/env raku
use v6;
sub MAIN {
my @l = '1 2', 'p q r', 's 3', '4 5 t';
my ($digits, $letters) = split-array(@l);
say $digits;
say $letters;
}
sub split-array (@list) {
my (@digits, @letters);
for @list -> $item {
my (@ds, @ls);
for $item.comb(/\S/) -> $char {
if ($char ~~ /\d/) { @ds.push: $char }
else { @ls.push: $char }
}
@digits.push: @ds if @ds;
@letters.push: @ls if @ls;
}
return (@digits, @letters);
}
Well… I guess this is everything, stay safe people!