hpcc/README.md

49 lines
2.1 KiB
Markdown
Raw Normal View History

# Rust Tokens Coding Challenge
This coding challenge presents a tokenization/parsing scenario in which some
external system is accepting bytes in discrete packets representing a stream.
You will solve the challenge by modifying the method `process` of the struct `Parser`, without changing its function signature or the signature of the constructor, `new`. You can, however, modify the struct `Parser` itself however you feel is necessary.
## Packetization
These packets aren't consistent in their size or contents, so the stream
`"I am a stream of packets; synthesize me."` could just as easily be
`"I am ", "a stream ", "of packets; ", "synthesize me."`,
one packet per character (`"I", " ", "a", "m", ...`), or just one packet
containing the entire input.
## Input and Output
Your task is to implement a struct, called `Parser`, whose `process` method
adds a suffix after certain words. So, for instance, if given the token `"foo"` and the suffix `"bar"`, your `Parser` would take the following input:
- `"Does this foo look like a fooing bar to you?"`
and return this output:
- `"Does this foobar look like a foobaring bar to you?"`
This needs to work over the full range of possible packetizations,
from one packet for the whole input to one packet per character.
## Mechanics of I/O
The `process` function takes a mutable reference to the `Parser` (so you can
add some state into the `Parser` if you want),
a chunk of bytes to process,
and a `&mut dyn Write` sink for the output.
If you're not familiar with the `Write` trait, it's worth looking into.
The gist, however, is that you can send a buffer (like a `&[u8]`) to the
`Write`r with its `write_all` method.
This is actually what the default implementation of `process` does, as provided by the challenge, which is of course not a correct solution - but it does pass half of the tests!
## Non-functional Requirements
There are no constraints on speed, memory usage, or binary size. Go wild.
# This Repo
This Git repo has just two commits, on the branches `challenge` (and `main`) and `solution`.
Don't look at `solution` until you've solved the challenge!