support using strings directly as level input and output data

This commit is contained in:
Crispy 2024-12-05 14:23:21 +01:00
parent ef01de9dae
commit 36b1b8672b
9 changed files with 35 additions and 38 deletions

View file

@ -51,8 +51,6 @@ blueprint rotation?
"init_board": null,
"inputs": [],
"outputs": [0, 0, 0, 0, 0, 0, 0, 0],
"input_is_text": false,
"output_is_text": false
}
```
### solution

View file

@ -4,8 +4,6 @@
"name": "Copy Cat",
"description": "read input and output the same thing",
"init_board": null,
"inputs": [72, 101, 108, 108, 111, 44, 32, 119, 111, 114, 108, 103, 33],
"outputs": [72, 101, 108, 108, 111, 44, 32, 119, 111, 114, 108, 103, 33],
"input_is_text": true,
"output_is_text": true
"inputs": "Hello, world!",
"outputs": "Hello, world!"
}

View file

@ -4,8 +4,6 @@
"name": "Null Separation",
"description": "output everything after the first zero in the input data",
"init_board": null,
"inputs": [199, 34, 71, 209, 4, 0, 72, 101, 108, 108, 111, 44, 32, 119, 111, 114, 108, 103, 33, 0],
"outputs": [72, 101, 108, 108, 111, 44, 32, 119, 111, 114, 108, 103, 33],
"input_is_text": true,
"output_is_text": true
"inputs": "9834726\u0000Hello, worlg!",
"outputs": "Hello, worlg!"
}

View file

@ -4,8 +4,6 @@
"name": "Reverse",
"description": "read input until zero and output the same thing in reverse",
"init_board": null,
"inputs": [116, 110, 114, 111, 112, 109, 105, 32, 121, 114, 101, 118, 0],
"outputs": [118, 101, 114, 121, 32, 105, 109, 112, 111, 114, 110, 116],
"input_is_text": true,
"output_is_text": true
"inputs": "tnropmi yrev\u0000",
"outputs": "very impornt"
}

View file

@ -4,8 +4,6 @@
"name": "Lowercase",
"description": "Convert text to lowercase",
"init_board": null,
"inputs": [73, 32, 67, 114, 97, 86, 101, 68, 32, 116, 72, 69, 32, 115, 116, 114, 69, 110, 71, 84, 72, 32, 65, 78, 68, 32, 67, 101, 114, 84, 65, 105, 110, 84, 121, 32, 111, 70, 32, 83, 84, 101, 101, 76],
"outputs": [105, 32, 99, 114, 97, 118, 101, 100, 32, 116, 104, 101, 32, 115, 116, 114, 101, 110, 103, 116, 104, 32, 97, 110, 100, 32, 99, 101, 114, 116, 97, 105, 110, 116, 121, 32, 111, 102, 32, 115, 116, 101, 101, 108],
"input_is_text": true,
"output_is_text": true
"inputs": "I CraVeD tHE strEnGTH AND CerTAinTy oF STeeL",
"outputs": "i craved the strength and certainty of steel"
}

View file

@ -5,7 +5,5 @@
"description": "Convert input numbers to text, separated by spaces (32)\n'0' = 48, '1' = 49, '2' = 50, and so on",
"init_board": null,
"inputs": [85, 114, 32, 103, 97, 121, 58, 51],
"outputs": [56, 53, 32, 49, 49, 52, 32, 51, 50, 32, 49, 48, 51, 32, 57, 55, 32, 49, 50, 49, 32, 53, 56, 32, 53, 49],
"input_is_text": false,
"output_is_text": true
"outputs": "85 114 32 103 97 121 58 51"
}

View file

@ -4,8 +4,6 @@
"name": "Numbers 2",
"description": "Convert input numbers from text, separated by spaces (32)\n'0' = 48, '1' = 49, '2' = 50, and so on",
"init_board": null,
"inputs": [56, 53, 32, 49, 49, 52, 32, 51, 50, 32, 49, 48, 51, 32, 57, 55, 32, 49, 50, 49, 32, 51, 50, 32, 53, 56, 32, 53, 49],
"outputs": [85, 114, 32, 103, 97, 121, 58, 51],
"input_is_text": true,
"output_is_text": false
"inputs": "85 114 32 103 97 121 58 51",
"outputs": [85, 114, 32, 103, 97, 121, 58, 51]
}

View file

@ -5,7 +5,6 @@
"description": "make whatever you want here",
"is_sandbox": true,
"init_board": null,
"inputs": [],
"outputs": [],
"input_is_text": true
"inputs": "",
"outputs": []
}

View file

@ -9,12 +9,24 @@ pub struct Level {
#[serde(default)]
is_sandbox: bool,
init_board: Option<String>,
inputs: Vec<u8>,
outputs: Vec<u8>,
#[serde(default)]
input_is_text: bool,
#[serde(default)]
output_is_text: bool,
inputs: IOData,
outputs: IOData,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(untagged)]
pub enum IOData {
Bytes(Vec<u8>),
Text(String),
}
impl IOData {
pub fn as_bytes(&self) -> &[u8] {
match self {
IOData::Bytes(b) => b,
IOData::Text(t) => t.as_bytes(),
}
}
}
impl Level {
@ -43,18 +55,18 @@ impl Level {
}
pub fn inputs(&self) -> &[u8] {
&self.inputs
self.inputs.as_bytes()
}
pub fn outputs(&self) -> &[u8] {
&self.outputs
self.outputs.as_bytes()
}
pub fn input_is_text(&self) -> bool {
self.input_is_text
matches!(self.inputs, IOData::Text(_))
}
pub fn output_is_text(&self) -> bool {
self.output_is_text
matches!(self.outputs, IOData::Text(_))
}
}