There have been multiple accounts created with the sole purpose of posting advertisement posts or replies containing unsolicited advertising.

Accounts which solely post advertisements, or persistently post them may be terminated.

GeniusIsme ,

Show the alternative, I’ll have a good laugh.

janAkali , (edited )

It’s Nim, but I have no idea why you can’t do this in Rust:


<span style="color:#323232;">var seeds = lines[0].split(": ")[1].splitWhitespace().mapIt(it.parseInt)
</span>

Full solution: codeberg.org/Archargelod/…/solution.nim

GeniusIsme ,

Ahh, it is the same thing. Rust example surely has some cruft, but mostly for the better. I’m sure not all of it is needed.

chinstrap ,
@chinstrap@lemmy.ml avatar

Java 2. World is full of wonders

crispy_kilt ,

Java 2 didn’t have streams nor iterator combinatorics, not sure what you mean?

chinstrap ,
@chinstrap@lemmy.ml avatar

i didn’t mean as a version. I meant as overuse of streams

crispy_kilt ,

How would you have preferred to solve it? Using for loops?

AVincentInSpace ,

Python style iterator comprehension

(wonder if someone has made that into a macro. if no one has I will)

crispy_kilt ,

I don’t think it would be readable. Too much going on. You’d need an outer iter over lines, an inner over words, a check for number and a conversion. And there would be zero error handling.

AVincentInSpace ,

No less readable than half the Python comprehensions I’ve written.

zero error handling.

Not necessarily. The macro could look for a ? at the end of the final expression (the bit that comes first in a comprehension) and return a Result.

crispy_kilt ,

Right, of course, I meant no error handling in the Python impl

m_f , (edited )

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


<span style="font-weight:bold;color:#a71d5d;">fn </span><span style="font-weight:bold;color:#795da3;">main</span><span style="color:#323232;">() {
</span><span style="color:#323232;">    </span><span style="font-weight:bold;color:#a71d5d;">let</span><span style="color:#323232;"> text </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#183691;">"seeds: 79 14 55 13</span><span style="color:#0086b3;">n</span><span style="color:#183691;">whatever"</span><span style="color:#323232;">;
</span><span style="color:#323232;">    </span><span style="font-weight:bold;color:#a71d5d;">let</span><span style="color:#323232;"> seeds: Vec<</span><span style="font-weight:bold;color:#a71d5d;">_</span><span style="color:#323232;">> </span><span style="font-weight:bold;color:#a71d5d;">=</span><span style="color:#323232;"> text
</span><span style="color:#323232;">        .</span><span style="color:#62a35c;">lines</span><span style="color:#323232;">()
</span><span style="color:#323232;">        .</span><span style="color:#62a35c;">next</span><span style="color:#323232;">()
</span><span style="color:#323232;">        .</span><span style="color:#62a35c;">unwrap</span><span style="color:#323232;">()
</span><span style="color:#323232;">        .</span><span style="color:#62a35c;">split_whitespace</span><span style="color:#323232;">()
</span><span style="color:#323232;">        .</span><span style="color:#62a35c;">skip</span><span style="color:#323232;">(</span><span style="color:#0086b3;">1</span><span style="color:#323232;">)
</span><span style="color:#323232;">        .</span><span style="color:#62a35c;">map</span><span style="color:#323232;">(|x| x.parse::<</span><span style="font-weight:bold;color:#a71d5d;">u32</span><span style="color:#323232;">>().</span><span style="color:#62a35c;">unwrap</span><span style="color:#323232;">())
</span><span style="color:#323232;">        .</span><span style="color:#62a35c;">collect</span><span style="color:#323232;">();
</span><span style="color:#323232;">    println!(</span><span style="color:#183691;">"seeds: </span><span style="color:#0086b3;">{:?}</span><span style="color:#183691;">"</span><span style="color:#323232;">, seeds);
</span><span style="color:#323232;">}
</span>

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:


<span style="font-weight:bold;color:#a71d5d;">use </span><span style="color:#323232;">anyhow::{anyhow, </span><span style="color:#0086b3;">Result</span><span style="color:#323232;">};
</span><span style="color:#323232;">
</span><span style="font-weight:bold;color:#a71d5d;">fn </span><span style="font-weight:bold;color:#795da3;">main</span><span style="color:#323232;">() -> Result<()> {
</span><span style="color:#323232;">    </span><span style="font-weight:bold;color:#a71d5d;">let</span><span style="color:#323232;"> text </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#183691;">"seeds: 79 14 55 13</span><span style="color:#0086b3;">n</span><span style="color:#183691;">whatever"</span><span style="color:#323232;">;
</span><span style="color:#323232;">    </span><span style="font-weight:bold;color:#a71d5d;">let</span><span style="color:#323232;"> seeds: Vec<</span><span style="font-weight:bold;color:#a71d5d;">u32</span><span style="color:#323232;">> </span><span style="font-weight:bold;color:#a71d5d;">=</span><span style="color:#323232;"> text
</span><span style="color:#323232;">        .</span><span style="color:#62a35c;">lines</span><span style="color:#323232;">()
</span><span style="color:#323232;">        .</span><span style="color:#62a35c;">next</span><span style="color:#323232;">()
</span><span style="color:#323232;">        .</span><span style="color:#62a35c;">ok_or</span><span style="color:#323232;">(anyhow!(</span><span style="color:#183691;">"No first line!"</span><span style="color:#323232;">))</span><span style="font-weight:bold;color:#a71d5d;">?
</span><span style="color:#323232;">        .</span><span style="color:#62a35c;">split_whitespace</span><span style="color:#323232;">()
</span><span style="color:#323232;">        .</span><span style="color:#62a35c;">skip</span><span style="color:#323232;">(</span><span style="color:#0086b3;">1</span><span style="color:#323232;">)
</span><span style="color:#323232;">        .</span><span style="color:#62a35c;">map</span><span style="color:#323232;">(</span><span style="font-weight:bold;color:#a71d5d;">str</span><span style="color:#323232;">::parse)
</span><span style="color:#323232;">        .collect::<Result<</span><span style="font-weight:bold;color:#a71d5d;">_</span><span style="color:#323232;">, </span><span style="font-weight:bold;color:#a71d5d;">_</span><span style="color:#323232;">>>()</span><span style="font-weight:bold;color:#a71d5d;">?</span><span style="color:#323232;">;
</span><span style="color:#323232;">    println!(</span><span style="color:#183691;">"seeds: </span><span style="color:#0086b3;">{:?}</span><span style="color:#183691;">"</span><span style="color:#323232;">, seeds);
</span><span style="color:#323232;">    </span><span style="color:#0086b3;">Ok</span><span style="color:#323232;">(())
</span><span style="color:#323232;">}
</span>
MaliciousKebab OP ,

Yeah I was trying to do something like reading the first line by getting an iterator and just looping through the other lines normally, since first line was kind of a special case but it got messy quick. I realized halfway that my collects were redundant but couldn’t really simplify it. Thanks

sukhmel ,

Also, anyhow::Context provides a convenient way to turn Option<T> and Result<T, Into<anyhow::Error>> into anyhow::Result<T>

Like this:


<span style="font-weight:bold;color:#a71d5d;">use </span><span style="color:#323232;">anyhow::Context;
</span><span style="color:#323232;">
</span><span style="font-style:italic;color:#969896;">// to my understanding it's better to 
</span><span style="font-style:italic;color:#969896;">// specify the types when their names 
</span><span style="font-style:italic;color:#969896;">// are the same as in prelude to improve
</span><span style="font-style:italic;color:#969896;">// readability and reduce name clashing
</span><span style="font-weight:bold;color:#a71d5d;">fn </span><span style="font-weight:bold;color:#795da3;">main</span><span style="color:#323232;">() -> anyhow::Result<()> {
</span><span style="color:#323232;">    </span><span style="font-weight:bold;color:#a71d5d;">let</span><span style="color:#323232;"> text </span><span style="font-weight:bold;color:#a71d5d;">= </span><span style="color:#183691;">"seeds: 79 14 55 13</span><span style="color:#0086b3;">n</span><span style="color:#183691;">whatever"</span><span style="color:#323232;">;
</span><span style="color:#323232;">    </span><span style="font-weight:bold;color:#a71d5d;">let</span><span style="color:#323232;"> seeds: Vec<</span><span style="font-weight:bold;color:#a71d5d;">u32</span><span style="color:#323232;">> </span><span style="font-weight:bold;color:#a71d5d;">=</span><span style="color:#323232;"> text
</span><span style="color:#323232;">        .</span><span style="color:#62a35c;">lines</span><span style="color:#323232;">()
</span><span style="color:#323232;">        .</span><span style="color:#62a35c;">next</span><span style="color:#323232;">()
</span><span style="color:#323232;">        .</span><span style="color:#62a35c;">context</span><span style="color:#323232;">(</span><span style="color:#183691;">"No first line!"</span><span style="color:#323232;">)</span><span style="font-weight:bold;color:#a71d5d;">?     </span><span style="font-style:italic;color:#969896;">// This line has changed
</span><span style="color:#323232;">        .</span><span style="color:#62a35c;">split_whitespace</span><span style="color:#323232;">()
</span><span style="color:#323232;">        .</span><span style="color:#62a35c;">skip</span><span style="color:#323232;">(</span><span style="color:#0086b3;">1</span><span style="color:#323232;">)
</span><span style="color:#323232;">        .</span><span style="color:#62a35c;">map</span><span style="color:#323232;">(</span><span style="font-weight:bold;color:#a71d5d;">str</span><span style="color:#323232;">::parse)
</span><span style="color:#323232;">        .collect::<Result<</span><span style="font-weight:bold;color:#a71d5d;">_</span><span style="color:#323232;">, </span><span style="font-weight:bold;color:#a71d5d;">_</span><span style="color:#323232;">>>()</span><span style="font-weight:bold;color:#a71d5d;">?</span><span style="color:#323232;">;
</span><span style="color:#323232;">    println!(</span><span style="color:#183691;">"seeds: </span><span style="color:#0086b3;">{:?}</span><span style="color:#183691;">"</span><span style="color:#323232;">, seeds);
</span><span style="color:#323232;">    </span><span style="color:#0086b3;">Ok</span><span style="color:#323232;">(())
</span><span style="color:#323232;">}
</span>

Edit: line breaks

Schmeckinger ,

You can’t really blame that on rust.

MaliciousKebab OP ,

Yeah ngl it’s very ugly. But hey as long as it works it’s not stupid amirite?

xlash123 ,
@xlash123@sh.itjust.works avatar

Rust borrows a lot of it’s design from functional programming languages like Haskell, which has its good and bad. You could also choose to implement this behavior iteratively like typical C programs, but that tends to be ugly in other ways.

Personally, I’ve grown fond of the functional style. You see it in other places too, like the higher order functions in JavaScript. What’s good about them in Rust is you still get amazing performance due to zero-cost abstraction. Trying to implement it yourself would likely be slower, so use them any chance you get.

  • All
  • Subscribed
  • Moderated
  • Favorites
  • [email protected]
  • random
  • lifeLocal
  • goranko
  • All magazines