feat: add compose and decompose numbers problem
This commit is contained in:
42
app/problems/grade_1/compose_and_decompose_numbers.py
Normal file
42
app/problems/grade_1/compose_and_decompose_numbers.py
Normal file
@@ -0,0 +1,42 @@
|
||||
import random
|
||||
|
||||
from app.schemas.grade_1.compose_and_decompose_numbers import (
|
||||
ComposeAndDecomposeNumbersProblem,
|
||||
DecompositionRow,
|
||||
PictureAsset,
|
||||
)
|
||||
|
||||
|
||||
def compose_and_decompose_numbers(
|
||||
picture: dict,
|
||||
whole: int = 10,
|
||||
randomize_rows: bool = False,
|
||||
seed: int | None = None,
|
||||
) -> dict:
|
||||
"""Generate number decomposition rows for one picture asset."""
|
||||
if whole < 2:
|
||||
raise ValueError("whole must be at least 2")
|
||||
|
||||
selected_picture = PictureAsset.model_validate(picture)
|
||||
pairs = [(first_part, whole - first_part) for first_part in range(whole - 1, 0, -1)]
|
||||
|
||||
if randomize_rows:
|
||||
rng = random.Random(seed)
|
||||
rng.shuffle(pairs)
|
||||
|
||||
problem = ComposeAndDecomposeNumbersProblem(
|
||||
whole=whole,
|
||||
picture=selected_picture,
|
||||
rows=[
|
||||
DecompositionRow(
|
||||
position=index + 1,
|
||||
whole=whole,
|
||||
first_part=first_part,
|
||||
second_part=second_part,
|
||||
picture=selected_picture,
|
||||
)
|
||||
for index, (first_part, second_part) in enumerate(pairs)
|
||||
],
|
||||
)
|
||||
|
||||
return problem.model_dump()
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 63 KiB |
@@ -1,9 +1,16 @@
|
||||
from fastapi import APIRouter, HTTPException
|
||||
|
||||
from app.problems.grade_1.compose_and_decompose_numbers import (
|
||||
compose_and_decompose_numbers,
|
||||
)
|
||||
from app.problems.grade_1.join_pictures_with_quantity import (
|
||||
join_pictures_with_quantity,
|
||||
)
|
||||
from app.problems.grade_1.where_are_more_items import where_are_more_items
|
||||
from app.schemas.grade_1.compose_and_decompose_numbers import (
|
||||
ComposeAndDecomposeNumbersProblem,
|
||||
ComposeAndDecomposeNumbersRequest,
|
||||
)
|
||||
from app.schemas.grade_1.join_pictures_with_quantity import (
|
||||
JoinPicturesWithQuantityProblem,
|
||||
JoinPicturesWithQuantityRequest,
|
||||
@@ -16,6 +23,24 @@ from app.schemas.grade_1.where_are_more_items import (
|
||||
router = APIRouter(prefix="/grade_1", tags=["Grade 1"])
|
||||
|
||||
|
||||
@router.post(
|
||||
"/compose_and_decompose_numbers",
|
||||
response_model=ComposeAndDecomposeNumbersProblem,
|
||||
)
|
||||
def create_compose_and_decompose_numbers_problem(
|
||||
request: ComposeAndDecomposeNumbersRequest,
|
||||
) -> dict:
|
||||
try:
|
||||
return compose_and_decompose_numbers(
|
||||
picture=request.picture.model_dump(),
|
||||
whole=request.whole,
|
||||
randomize_rows=request.randomize_rows,
|
||||
seed=request.seed,
|
||||
)
|
||||
except ValueError as exc:
|
||||
raise HTTPException(status_code=400, detail=str(exc)) from exc
|
||||
|
||||
|
||||
@router.post(
|
||||
"/join_pictures_with_quantity",
|
||||
response_model=JoinPicturesWithQuantityProblem,
|
||||
|
||||
30
app/schemas/grade_1/compose_and_decompose_numbers.py
Normal file
30
app/schemas/grade_1/compose_and_decompose_numbers.py
Normal file
@@ -0,0 +1,30 @@
|
||||
from pydantic import BaseModel, Field, PositiveInt
|
||||
|
||||
|
||||
class PictureAsset(BaseModel):
|
||||
id: str = Field(min_length=1)
|
||||
name: str = Field(min_length=1)
|
||||
image_path: str = Field(min_length=1)
|
||||
|
||||
|
||||
class DecompositionRow(BaseModel):
|
||||
position: PositiveInt
|
||||
whole: PositiveInt
|
||||
first_part: PositiveInt
|
||||
second_part: PositiveInt
|
||||
picture: PictureAsset
|
||||
has_answer_boxes: bool = True
|
||||
|
||||
|
||||
class ComposeAndDecomposeNumbersProblem(BaseModel):
|
||||
instructions: str = "Compón y descompón el número."
|
||||
whole: PositiveInt
|
||||
picture: PictureAsset
|
||||
rows: list[DecompositionRow]
|
||||
|
||||
|
||||
class ComposeAndDecomposeNumbersRequest(BaseModel):
|
||||
picture: PictureAsset
|
||||
whole: PositiveInt = 10
|
||||
randomize_rows: bool = False
|
||||
seed: int | None = None
|
||||
Reference in New Issue
Block a user