RogerBW's Blog

The Weekly Challenge 184: Split Sequence 29 September 2022

I’ve been doing the Weekly Challenges. The latest involved modifying and picking things out of sequences. (Note that this is open until 2 October 2022.)

Task 1: Sequence Number

You are given list of strings in the format aa9999 i.e. first 2 characters can be anything 'a-z' followed by 4 digits '0-9'.

Write a script to replace the first two characters with sequence starting with '00', '01', '02' etc.

Don't know why I'd want to, but it's easy enough…

Raku:

sub sequencenumber(@list) {
    my $nn = 0;
    my @out;
    for @list -> $ins {
        @out.push(sprintf('%02d',$nn) ~ substr($ins,2,4));
        $nn++;
    }
    return @out;
}

The other languages are basically the same, modulo details of how you format an integer into a leading-zero string. (In PostScript I push the characters directly into the string because I'm lazy.)

Task 2: Split Array

You are given list of strings containing 0-9 and a-z separated by space only.

Write a script to split the data into two arrays, one for integers and one for alphabets only.

So we're generating two lists: the first contains lists of digits, the second lists of letters. (From the examples I gather that if one of these sublists would be empty, e.g. one of the input strings contains no digits, that sublist is omitted.)

Kotlin and Rust care enough about types that I can't simply use an array for the outer container, because one element is a list of lists of integers and the other a list of lists of characters; in Rust I use a tuple, and in Kotlin the Pair type.

Rust:

fn splitarray(list: Vec<&str>) -> (Vec<Vec<u8>>, Vec<Vec<char>>) {

Initialise the output.

    let mut out = (Vec::new(), Vec::new());

For each input string:

    for ins in list {

Initialise the number and letter lists.

        let mut av: Vec<u8> = Vec::new();
        let mut bv: Vec<char> = Vec::new();

Then for each character:

        for c in ins.chars() {
            match c {

If it's a number, evaluate it and stick it on the number list.

                '0'..='9' => av.push(c.to_digit(10).unwrap() as u8),

If it's a letter, stick it on the letter list.

                'a'..='z' => bv.push(c),

Otherwise ignore it.

                _ => {}
            }
        }

(I think I'm finally getting the hang of match. I like it.)

If each list is non-empty, push it into the respective part of the output structure.

        if av.len() > 0 {
            out.0.push(av);
        }
        if bv.len() > 0 {
            out.1.push(bv);
        }
    }

And return that.

    out
}

The other languages are similar. Having two arrays to build up means I can't use my standard PostScript array-on-stack technique, but instead have to stick them in variables.

Full code on github.

Comments on this post are now closed. If you have particular grounds for adding a late comment, comment on a more recent post quoting the URL of this one.

Search
Archive
Tags 1920s 1930s 1940s 1950s 1960s 1970s 1980s 1990s 2000s 2010s 3d printing action advent of code aeronautics aikakirja anecdote animation anime army astronomy audio audio tech base commerce battletech beer boardgaming book of the week bookmonth chain of command children chris chronicle church of no redeeming virtues cold war comedy computing contemporary cornish smuggler cosmic encounter coup covid-19 crime crystal cthulhu eternal cycling dead of winter doctor who documentary drama driving drone ecchi economics en garde espionage essen 2015 essen 2016 essen 2017 essen 2018 essen 2019 essen 2022 essen 2023 existential risk falklands war fandom fanfic fantasy feminism film firefly first world war flash point flight simulation food garmin drive gazebo genesys geocaching geodata gin gkp gurps gurps 101 gus harpoon historical history horror hugo 2014 hugo 2015 hugo 2016 hugo 2017 hugo 2018 hugo 2019 hugo 2020 hugo 2021 hugo 2022 hugo 2023 hugo 2024 hugo-nebula reread in brief avoid instrumented life javascript julian simpson julie enfield kickstarter kotlin learn to play leaving earth linux liquor lovecraftiana lua mecha men with beards mpd museum music mystery naval noir non-fiction one for the brow opera parody paul temple perl perl weekly challenge photography podcast politics postscript powers prediction privacy project woolsack pyracantha python quantum rail raku ranting raspberry pi reading reading boardgames social real life restaurant reviews romance rpg a day rpgs ruby rust scala science fiction scythe second world war security shipwreck simutrans smartphone south atlantic war squaddies stationery steampunk stuarts suburbia superheroes suspense television the resistance the weekly challenge thirsty meeples thriller tin soldier torg toys trailers travel type 26 type 31 type 45 vietnam war war wargaming weather wives and sweethearts writing about writing x-wing young adult
Special All book reviews, All film reviews
Produced by aikakirja v0.1