• 2 Posts
  • 43 Comments
Joined 11 months ago
cake
Cake day: August 2nd, 2023

help-circle







  • You’re not getting past this bouncer

    Prompt

    ChatGPT came up with the punny name on its own:

    A large, heavy animal, resembling a buffalo, dressed as a bouncer at a cyberpunk-themed nightclub in an all-animal world. The club, named ‘Byte the Dust’, showcases a grungy, cyberpunk aesthetic, with a neon sign that’s bold and futuristic. The buffalo bouncer is wearing high-tech, neon-lit glasses and a distinctive cyberpunk mohawk. The outfit is a rugged, cybernetic ensemble with metallic accents. It stands imposingly at the club entrance, which features rough textures, rusted metal, and dimly lit neon lights. The buffalo’s expression is tough and unwavering, in harmony with the gritty cyberpunk theme. The artwork should be in a realistic style, highlighting the formidable presence of the buffalo and the intense, neon-tinged atmosphere of ‘Byte the Dust’.



  • If you’re writing code that generic, why wouldn’t you want str to be passed in? For example, Counter('hello') is perfectly valid and useful. OTOH, average_length('hello') would always be 1 and not be useful. OTOOH, maybe there’s a valid reason for someone to do that. If I’ve got a list of items of various types and want to find the highest average length, I’d want to do max(map(average_length, items)) and not have that blow up just because there’s a string in there that I know will have an average length of 1.

    So this all depends on the specifics of the function you’re writing at the time. If you’re really sure that someone shouldn’t be passing in a str, I’d probably raise a ValueError or a warning, but only if you’re really sure. For the most part, I’d just use appropriate type hints and embrace the phrase “we’re all consenting adults here”.


  • The collect’s in the middle aren’t necessary, neither is splitting by ": ". Here’s a simpler version

    fn main() {
        let text = "seeds: 79 14 55 13\nwhatever";
        let seeds: Vec<_> = text
            .lines()
            .next()
            .unwrap()
            .split_whitespace()
            .skip(1)
            .map(|x| x.parse::<u32>().unwrap())
            .collect();
        println!("seeds: {:?}", seeds);
    }
    

    It is simpler to bang out a [int(num) for num in text.splitlines()[0].split(' ')[1:]] in Python, but that just shows the happy path with no error handling, and does a bunch of allocations that the Rust version doesn’t. You can also get slightly fancier in the Rust version by collecting into a Result for more succinct error handling if you’d like.

    EDIT: Here’s also a version using anyhow for error handling, and the aforementioned Result collecting:

    use anyhow::{anyhow, Result};
    
    fn main() -> Result<()> {
        let text = "seeds: 79 14 55 13\nwhatever";
        let seeds: Vec<u32> = text
            .lines()
            .next()
            .ok_or(anyhow!("No first line!"))?
            .split_whitespace()
            .skip(1)
            .map(str::parse)
            .collect::<Result<_, _>>()?;
        println!("seeds: {:?}", seeds);
        Ok(())
    }