You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
49 lines
2.1 KiB
49 lines
2.1 KiB
2 years ago
|
# 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!
|