diff --git "a/GPT4_game.ipynb" "b/GPT4_game.ipynb" new file mode 100644--- /dev/null +++ "b/GPT4_game.ipynb" @@ -0,0 +1,983 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "view-in-github", + "colab_type": "text" + }, + "source": [ + "\"Open" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# GPTWorld Golf\n", + "\n", + "The goal of this exercise is to write a prompt that can solve the movement of an AI in a grid world using prompting. You need to avoid walls, pick up a key, and then reach the goal.\n", + "\n", + "You will need to use use OpenAI Key to run the exercise. You can get it here: \n", + "\n", + "https://platform.openai.com/account/api-keys" + ], + "metadata": { + "id": "jcICcfZw7KTt" + } + }, + { + "cell_type": "code", + "source": [ + "ai_key = \"TODO-FILL-IN\"" + ], + "metadata": { + "id": "OxdK7rk46MfM" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": { + "id": "gKzCE5A7aGWY" + }, + "outputs": [], + "source": [ + "%%capture\n", + "!sudo apt-get install libcairo2-dev\n", + "!pip install -U git+https://github.com/chalk-diagrams/chalk openai pycairo tiktoken" + ] + }, + { + "cell_type": "markdown", + "source": [ + "This cell can be ignored. It just imports the necessary libraries and sets up a prompt call. \n" + ], + "metadata": { + "id": "lCZ-Wfkn7x0C" + } + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "id": "RWUExPo7Y8-O" + }, + "outputs": [], + "source": [ + "\n", + "from dataclasses import dataclass\n", + "from chalk import *\n", + "from colour import Color\n", + "import inspect\n", + "import os\n", + "import openai\n", + "from typing import List, Tuple, Optional\n", + "from enum import Enum\n", + "import io\n", + "from IPython.display import Image\n", + "from contextlib import redirect_stdout\n", + "import imageio\n", + "import tiktoken\n", + "openai.api_key = ai_key\n", + "tab = \" \"\n", + "\n", + "def start(prompt):\n", + " out = \"\"\n", + " for chunk in openai.ChatCompletion.create(\n", + " model=\"gpt-4\",\n", + " messages=[{\n", + " \"role\": \"user\",\n", + " \"content\": prompt,\n", + " \n", + " }],\n", + " stream=True,\n", + " temperature= 0\n", + " ):\n", + "\n", + " content = chunk[\"choices\"][0].get(\"delta\", {}).get(\"content\")\n", + " if content is not None:\n", + " out += content\n", + " print(content, end=\"\")\n", + " yield out\n", + " yield out\n", + "\n", + "def num_tokens_from_string(string: str, encoding_name: str=\"gpt-4\") -> int:\n", + " \"\"\"Returns the number of tokens in a text string.\"\"\"\n", + " encoding = tiktoken.encoding_for_model(encoding_name)\n", + " num_tokens = len(encoding.encode(string))\n", + " return num_tokens" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Game Code\n", + "\n", + "This code creates a mini-game to play. It takes place on a hexagon. You are represented by a circle. You need to first pick up a key represented by a triangle. You finally need to make it to the cross to finish the game. The actions show each of the directions you can move.\n", + "\n" + ], + "metadata": { + "id": "LMTjwXdD7v-I" + } + }, + { + "cell_type": "markdown", + "source": [ + "![image.png](data:image/png;base64,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)" + ], + "metadata": { + "id": "YxeLc-oD8Y7V" + } + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": { + "id": "Fv3eTRKiV2ZB" + }, + "outputs": [], + "source": [ + "# Possible Actions\n", + "class Actions(Enum):\n", + " UPRIGHT = \"UR\"\n", + " RIGHT = \"R\"\n", + " DOWNRIGHT = \"DR\"\n", + " DOWNLEFT = \"DL\"\n", + " LEFT = \"L\"\n", + " UPLEFT = \"UL\"\n", + " PICKUP = \"Pickup\"\n", + "\n", + "# Movements\n", + "change = { \n", + " Actions.UPRIGHT : (-1, 1), \n", + " Actions.RIGHT : (0, 2), \n", + " Actions.DOWNRIGHT : (1, 1), \n", + " Actions.DOWNLEFT : (1, -1), \n", + " Actions.LEFT : (0, -2), \n", + " Actions.UPLEFT : (-1, -1), \n", + " Actions.PICKUP : (0, 0), \n", + "}\n", + "change_str = {action.value: change[action] for action in Actions}\n", + "def add(a, b):\n", + " return a[0] + b[0], a[1] + b[1]\n", + "\n", + "@dataclass\n", + "class Board:\n", + " grid: List[str]\n", + " player_pos: Tuple[int, int]\n", + " flag_pos: Tuple[int, int]\n", + " wall_pos:List[Tuple[int, int]]\n", + " key_pos:Optional[Tuple[int, int]]\n", + "\n", + " def move(self, action: Actions) -> 'Board':\n", + " \"Move by creating a new board.\"\n", + " d_m = change[action] \n", + " if action == Actions.PICKUP:\n", + " if self.player_pos == self.key_pos:\n", + " return Board(self.grid, self.player_pos, self.flag_pos, self.wall_pos, None)\n", + " else:\n", + " return self\n", + " \n", + " new_player_pos = add(self.player_pos, d_m)\n", + " # Out of bounds\n", + " if new_player_pos[0] < 0 or new_player_pos[0] >= len(self.grid):\n", + " return self\n", + " if new_player_pos[1] < 0 or new_player_pos[1] >= len(self.grid[0]):\n", + " return self\n", + " # Can't move through walls\n", + " if self.grid[new_player_pos[0]][new_player_pos[1]] == 'W':\n", + " return self\n", + " \n", + " new_grid = [row[:] for row in self.grid] # Create a copy of the grid\n", + " new_grid[self.player_pos[0]][self.player_pos[1]] = '.'\n", + " new_grid[new_player_pos[0]][new_player_pos[1]] = '@'\n", + " return Board(new_grid, new_player_pos, self.flag_pos, self.wall_pos, self.key_pos)\n", + " \n", + " def __str__(self) -> str:\n", + " return '\\n'.join(''.join(row) for i, row in enumerate(self.grid))\n", + "\n", + " @classmethod\n", + " def create_empty_board(cls, size: Tuple[int, int], key_pos, flag_pos, init, wall_pos) -> 'Board':\n", + " grid = [['.' if i % 2 == j % 2 else \" \" for i in range(size[1])] for j in range(size[0])]\n", + " player_pos = init\n", + " flag_pos = flag_pos\n", + " grid[player_pos[0]][player_pos[1]] = '@'\n", + " grid[flag_pos[0]][flag_pos[1]] = 'P'\n", + " grid[key_pos[0]][key_pos[1]] = 'K'\n", + " for pos in wall_pos:\n", + " grid[pos[0]][pos[1]] = 'W'\n", + " return cls(grid, player_pos, flag_pos, wall_pos, key_pos)\n", + "\n", + "class Game:\n", + " def __init__(self, init, flag, walls, key, boundary):\n", + " \"Create the version of the game that the AI sees.\"\n", + " self.boundary = boundary\n", + " self.board = Board.create_empty_board(boundary, key, flag, init, walls)\n", + " self.original = self.board\n", + " self.actions = []\n", + "\n", + " def move(self, action):\n", + " self.board = self.board.move(action)\n", + " self.actions.append(action)\n", + "\n", + " @property\n", + " def walls(self):\n", + " return self.board.wall_pos\n", + "\n", + " def __repr__(self) -> str:\n", + " walls = \",\".join(map(str, self.board.wall_pos))\n", + " return f\"Game(init={self.board.player_pos}, flag={self.board.flag_pos}, walls= {self.board.wall_pos}, boundary= {self.boundary}, key= {self.board.key_pos})\"\n", + "\n", + "# This is the version of move that the AI can see.\n", + "def move(game, action, old_pos):\n", + " # ACTIONS (must be legal)\n", + " game.move(Actions(action))\n", + " offset = change_str[action]\n", + " pos = (old_pos[0] + offset[0], old_pos[1] + offset[1])\n", + " assert 0 <= pos[0] < game.boundary[0]\n", + " assert 0 <= pos[1] < game.boundary[1]\n", + " assert pos not in game.walls\n", + " if action == \"PU\":\n", + " assert pos == game.key\n", + " return pos" + ] + }, + { + "cell_type": "markdown", + "source": [ + "We can look at the board by drawing it. " + ], + "metadata": { + "id": "PDOcPiQq8u_Y" + } + }, + { + "cell_type": "code", + "source": [ + "def draw_board(grid, num=0):\n", + " hex = regular_polygon(6, 1).rotate_by(1/12).line_width(0.5).fill_color(Color(\"white\"))\n", + " w = hex.get_envelope().width\n", + " canvas = empty()\n", + " for r, b in enumerate(grid):\n", + " def show(v):\n", + " if v == \".\":\n", + " return hex\n", + " if v == \"@\":\n", + " return hex + circle(0.35).fill_color(Color(\"red\")) \n", + " if v == \"P\":\n", + " x = rectangle(0.25, 0.7).fill_color(Color(\"blue\")).line_width(0)\n", + " return hex + (x.rotate_by(0.25/2) + x.rotate_by(-0.25/2))\n", + " if v == \"K\":\n", + " return hex + triangle(0.75).fill_color(Color(\"purple\"))\n", + " if v == \"W\":\n", + " return hex.fill_color(Color(\"black\"))\n", + " if v ==\" \":\n", + " return hex\n", + " row = hcat(show(v) for i, v in enumerate(b[1 if r %2 else 0::2]))\n", + " canvas += row.translate(w * 0.5 if r%2 else 0, 1.5 * r)\n", + " canvas = canvas.center_xy().frame(0.5)\n", + " canvas = rectangle(canvas.get_envelope().width, canvas.get_envelope().height).line_width(0.5).fill_color(Color(\"orange\")) + canvas\n", + " canvas.render(f\"pic{num}.png\", 256)\n", + " return canvas\n", + "\n" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 221 + }, + "id": "Ic7WgOTi8uF1", + "outputId": "4dc07cb9-9e5f-4d28-d4ea-470ad4b13141" + }, + "execution_count": 76, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "Compose(envelope=, diagram1=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(6.196152422706634, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.0, 9.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-6.196152422706634, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.0, -9.0), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(0.0, 0.0))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(1.0, 0.0, -3.098076211353317,\n", + " 0.0, 1.0, -4.5)), diagram2=Compose(envelope=, diagram1=ApplyTransform(transform=Affine(1.0, 0.0, -1.7320508075688776,\n", + " 0.0, 1.0, -3.0), diagram=Compose(envelope=, diagram1=Compose(envelope=, diagram1=Compose(envelope=, diagram1=Compose(envelope=, diagram1=Compose(envelope=, diagram1=Empty(), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 0.0,\n", + " 0.0, 1.0, 0.0), diagram=Compose(envelope=, diagram1=Compose(envelope=, diagram1=Compose(envelope=, diagram1=Compose(envelope=, diagram1=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, -0.8660254037844386), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.4999999999999998, -0.8660254037844387), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.5000000000000004, 0.8660254037844384), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, 0.8660254037844386), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(-0.5, 0.8660254037844387))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.8660254037844387, 0.49999999999999994, 0.0,\n", + " -0.49999999999999994, 0.8660254037844387, 0.0)), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 0.8660254037844388,\n", + " 0.0, 1.0, 0.0), diagram=ApplyTransform(transform=Affine(1.0, 0.0, 0.0,\n", + " -0.0, 1.0, 0.0), diagram=Empty()))), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 1.7320508075688779,\n", + " 0.0, 1.0, 0.0), diagram=Compose(envelope=, diagram1=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, -0.8660254037844386), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.4999999999999998, -0.8660254037844387), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.5000000000000004, 0.8660254037844384), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, 0.8660254037844386), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(-0.5, 0.8660254037844387))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.8660254037844387, 0.49999999999999994, 0.0,\n", + " -0.49999999999999994, 0.8660254037844387, 0.0)), diagram2=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[ArcSegment(angle=0, dangle=-90, t=Affine(1.0, 0.0, -1.0,\n", + " 0.0, 1.0, 0.0)), ArcSegment(angle=0, dangle=-90, t=Affine(0.0, 1.0, 0.0,\n", + " -1.0, 0.0, 1.0)), ArcSegment(angle=0, dangle=-90, t=Affine(-1.0, 0.0, 1.0,\n", + " 0.0, -1.0, 0.0)), ArcSegment(angle=0, dangle=-90, t=Affine(0.0, -1.0, 0.0,\n", + " 1.0, 0.0, -1.0))], closed=True), location=Vec2(0.0, 0.0))]), style=Style(line_width_=None, line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.35, 0.0, 0.35,\n", + " 0.0, 0.35, 0.0))))), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 2.598076211353317,\n", + " 0.0, 1.0, 0.0), diagram=ApplyTransform(transform=Affine(1.0, 0.0, 0.0,\n", + " -0.0, 1.0, 0.0), diagram=Empty()))), diagram2=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, -0.8660254037844386), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.4999999999999998, -0.8660254037844387), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.5000000000000004, 0.8660254037844384), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, 0.8660254037844386), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(-0.5, 0.8660254037844387))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.8660254037844387, 0.49999999999999994, 3.464101615137756,\n", + " -0.49999999999999994, 0.8660254037844387, 0.0))))), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 0.8660254037844389,\n", + " 0.0, 1.0, 1.5), diagram=Compose(envelope=, diagram1=Compose(envelope=, diagram1=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, -0.8660254037844386), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.4999999999999998, -0.8660254037844387), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.5000000000000004, 0.8660254037844384), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, 0.8660254037844386), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(-0.5, 0.8660254037844387))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.8660254037844387, 0.49999999999999994, 0.0,\n", + " -0.49999999999999994, 0.8660254037844387, 0.0)), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 0.8660254037844388,\n", + " 0.0, 1.0, 0.0), diagram=ApplyTransform(transform=Affine(1.0, 0.0, 0.0,\n", + " -0.0, 1.0, 0.0), diagram=Empty()))), diagram2=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, -0.8660254037844386), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.4999999999999998, -0.8660254037844387), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.5000000000000004, 0.8660254037844384), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, 0.8660254037844386), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(-0.5, 0.8660254037844387))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.8660254037844387, 0.49999999999999994, 1.7320508075688779,\n", + " -0.49999999999999994, 0.8660254037844387, 0.0))))), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 0.0,\n", + " 0.0, 1.0, 3.0), diagram=Compose(envelope=, diagram1=Compose(envelope=, diagram1=Compose(envelope=, diagram1=Compose(envelope=, diagram1=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, -0.8660254037844386), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.4999999999999998, -0.8660254037844387), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.5000000000000004, 0.8660254037844384), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, 0.8660254037844386), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(-0.5, 0.8660254037844387))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.8660254037844387, 0.49999999999999994, 0.0,\n", + " -0.49999999999999994, 0.8660254037844387, 0.0)), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 0.8660254037844388,\n", + " 0.0, 1.0, 0.0), diagram=ApplyTransform(transform=Affine(1.0, 0.0, 0.0,\n", + " -0.0, 1.0, 0.0), diagram=Empty()))), diagram2=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, -0.8660254037844386), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.4999999999999998, -0.8660254037844387), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.5000000000000004, 0.8660254037844384), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, 0.8660254037844386), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(-0.5, 0.8660254037844387))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.8660254037844387, 0.49999999999999994, 1.7320508075688779,\n", + " -0.49999999999999994, 0.8660254037844387, 0.0))), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 2.598076211353317,\n", + " 0.0, 1.0, 0.0), diagram=ApplyTransform(transform=Affine(1.0, 0.0, 0.0,\n", + " -0.0, 1.0, 0.0), diagram=Empty()))), diagram2=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, -0.8660254037844386), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.4999999999999998, -0.8660254037844387), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.5000000000000004, 0.8660254037844384), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, 0.8660254037844386), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(-0.5, 0.8660254037844387))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.8660254037844387, 0.49999999999999994, 3.464101615137756,\n", + " -0.49999999999999994, 0.8660254037844387, 0.0))))), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 0.8660254037844389,\n", + " 0.0, 1.0, 4.5), diagram=Compose(envelope=, diagram1=Compose(envelope=, diagram1=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, -0.8660254037844386), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.4999999999999998, -0.8660254037844387), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.5000000000000004, 0.8660254037844384), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, 0.8660254037844386), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(-0.5, 0.8660254037844387))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.8660254037844387, 0.49999999999999994, 0.0,\n", + " -0.49999999999999994, 0.8660254037844387, 0.0)), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 0.8660254037844388,\n", + " 0.0, 1.0, 0.0), diagram=ApplyTransform(transform=Affine(1.0, 0.0, 0.0,\n", + " -0.0, 1.0, 0.0), diagram=Empty()))), diagram2=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, -0.8660254037844386), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.4999999999999998, -0.8660254037844387), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.5000000000000004, 0.8660254037844384), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, 0.8660254037844386), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(-0.5, 0.8660254037844387))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.8660254037844387, 0.49999999999999994, 1.7320508075688779,\n", + " -0.49999999999999994, 0.8660254037844387, 0.0))))), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 0.0,\n", + " 0.0, 1.0, 6.0), diagram=Compose(envelope=, diagram1=Compose(envelope=, diagram1=Compose(envelope=, diagram1=Compose(envelope=, diagram1=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, -0.8660254037844386), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.4999999999999998, -0.8660254037844387), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.5000000000000004, 0.8660254037844384), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, 0.8660254037844386), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(-0.5, 0.8660254037844387))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.8660254037844387, 0.49999999999999994, 0.0,\n", + " -0.49999999999999994, 0.8660254037844387, 0.0)), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 0.8660254037844388,\n", + " 0.0, 1.0, 0.0), diagram=ApplyTransform(transform=Affine(1.0, 0.0, 0.0,\n", + " -0.0, 1.0, 0.0), diagram=Empty()))), diagram2=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, -0.8660254037844386), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.4999999999999998, -0.8660254037844387), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.5000000000000004, 0.8660254037844384), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, 0.8660254037844386), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(-0.5, 0.8660254037844387))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.8660254037844387, 0.49999999999999994, 1.7320508075688779,\n", + " -0.49999999999999994, 0.8660254037844387, 0.0))), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 2.598076211353317,\n", + " 0.0, 1.0, 0.0), diagram=ApplyTransform(transform=Affine(1.0, 0.0, 0.0,\n", + " -0.0, 1.0, 0.0), diagram=Empty()))), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 3.464101615137756,\n", + " 0.0, 1.0, 0.0), diagram=Compose(envelope=, diagram1=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, -0.8660254037844386), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.4999999999999998, -0.8660254037844387), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.5000000000000004, 0.8660254037844384), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, 0.8660254037844386), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(-0.5, 0.8660254037844387))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.8660254037844387, 0.49999999999999994, 0.0,\n", + " -0.49999999999999994, 0.8660254037844387, 0.0)), diagram2=Compose(envelope=, diagram1=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(0.25, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.0, 0.7), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.25, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.0, -0.7), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(0.0, 0.0))]), style=Style(line_width_=(, 0), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.7071067811865476, 0.7071067811865475, -0.33587572106361,\n", + " -0.7071067811865475, 0.7071067811865476, -0.1590990257669732)), diagram2=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(0.25, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.0, 0.7), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.25, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.0, -0.7), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(0.0, 0.0))]), style=Style(line_width_=(, 0), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.7071067811865474, -0.7071067811865477, 0.15909902576697327,\n", + " 0.7071067811865477, 0.7071067811865474, -0.33587572106361))))))))), diagram2=Empty()))" + ], + "image/svg+xml": "\n" + }, + "metadata": {}, + "execution_count": 76 + } + ] + }, + { + "cell_type": "code", + "source": [ + "game = Game(boundary=(5, 5), key=(0, 2), flag=(4, 4), init=(0, 0), walls=[(2, 2)])\n", + "display(draw_board(game.board.grid))\n", + "move(game, \"DR\", (0,0))\n", + "display(draw_board(game.board.grid))" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 424 + }, + "id": "nqgPKLu0AMhU", + "outputId": "19e4c6d0-b792-4a34-f4c4-81902974c346" + }, + "execution_count": 78, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "Compose(envelope=, diagram1=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(6.196152422706634, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.0, 9.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-6.196152422706634, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.0, -9.0), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(0.0, 0.0))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(1.0, 0.0, -3.098076211353317,\n", + " 0.0, 1.0, -4.5)), diagram2=Compose(envelope=, diagram1=ApplyTransform(transform=Affine(1.0, 0.0, -1.7320508075688776,\n", + " 0.0, 1.0, -3.0), diagram=Compose(envelope=, diagram1=Compose(envelope=, diagram1=Compose(envelope=, diagram1=Compose(envelope=, diagram1=Compose(envelope=, diagram1=Empty(), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 0.0,\n", + " 0.0, 1.0, 0.0), diagram=Compose(envelope=, diagram1=Compose(envelope=, diagram1=Compose(envelope=, diagram1=Compose(envelope=, diagram1=Compose(envelope=, diagram1=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, -0.8660254037844386), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.4999999999999998, -0.8660254037844387), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.5000000000000004, 0.8660254037844384), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, 0.8660254037844386), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(-0.5, 0.8660254037844387))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.8660254037844387, 0.49999999999999994, 0.0,\n", + " -0.49999999999999994, 0.8660254037844387, 0.0)), diagram2=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[ArcSegment(angle=0, dangle=-90, t=Affine(1.0, 0.0, -1.0,\n", + " 0.0, 1.0, 0.0)), ArcSegment(angle=0, dangle=-90, t=Affine(0.0, 1.0, 0.0,\n", + " -1.0, 0.0, 1.0)), ArcSegment(angle=0, dangle=-90, t=Affine(-1.0, 0.0, 1.0,\n", + " 0.0, -1.0, 0.0)), ArcSegment(angle=0, dangle=-90, t=Affine(0.0, -1.0, 0.0,\n", + " 1.0, 0.0, -1.0))], closed=True), location=Vec2(0.0, 0.0))]), style=Style(line_width_=None, line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.35, 0.0, 0.35,\n", + " 0.0, 0.35, 0.0))), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 0.8660254037844388,\n", + " 0.0, 1.0, 0.0), diagram=ApplyTransform(transform=Affine(1.0, 0.0, 0.0,\n", + " -0.0, 1.0, 0.0), diagram=Empty()))), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 1.7320508075688779,\n", + " 0.0, 1.0, 0.0), diagram=Compose(envelope=, diagram1=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, -0.8660254037844386), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.4999999999999998, -0.8660254037844387), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.5000000000000004, 0.8660254037844384), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, 0.8660254037844386), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(-0.5, 0.8660254037844387))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.8660254037844387, 0.49999999999999994, 0.0,\n", + " -0.49999999999999994, 0.8660254037844387, 0.0)), diagram2=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(0.75, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.37499999999999983, -0.649519052838329), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.37500000000000033, 0.6495190528383288), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(-0.375, 0.21650635094610973))]), style=Style(line_width_=None, line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(1.0, 0.0, 0.0,\n", + " 0.0, 1.0, 0.0))))), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 2.598076211353317,\n", + " 0.0, 1.0, 0.0), diagram=ApplyTransform(transform=Affine(1.0, 0.0, 0.0,\n", + " -0.0, 1.0, 0.0), diagram=Empty()))), diagram2=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, -0.8660254037844386), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.4999999999999998, -0.8660254037844387), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.5000000000000004, 0.8660254037844384), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, 0.8660254037844386), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(-0.5, 0.8660254037844387))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.8660254037844387, 0.49999999999999994, 3.464101615137756,\n", + " -0.49999999999999994, 0.8660254037844387, 0.0))))), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 0.8660254037844389,\n", + " 0.0, 1.0, 1.5), diagram=Compose(envelope=, diagram1=Compose(envelope=, diagram1=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, -0.8660254037844386), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.4999999999999998, -0.8660254037844387), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.5000000000000004, 0.8660254037844384), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, 0.8660254037844386), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(-0.5, 0.8660254037844387))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.8660254037844387, 0.49999999999999994, 0.0,\n", + " -0.49999999999999994, 0.8660254037844387, 0.0)), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 0.8660254037844388,\n", + " 0.0, 1.0, 0.0), diagram=ApplyTransform(transform=Affine(1.0, 0.0, 0.0,\n", + " -0.0, 1.0, 0.0), diagram=Empty()))), diagram2=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, -0.8660254037844386), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.4999999999999998, -0.8660254037844387), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.5000000000000004, 0.8660254037844384), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, 0.8660254037844386), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(-0.5, 0.8660254037844387))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.8660254037844387, 0.49999999999999994, 1.7320508075688779,\n", + " -0.49999999999999994, 0.8660254037844387, 0.0))))), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 0.0,\n", + " 0.0, 1.0, 3.0), diagram=Compose(envelope=, diagram1=Compose(envelope=, diagram1=Compose(envelope=, diagram1=Compose(envelope=, diagram1=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, -0.8660254037844386), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.4999999999999998, -0.8660254037844387), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.5000000000000004, 0.8660254037844384), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, 0.8660254037844386), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(-0.5, 0.8660254037844387))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.8660254037844387, 0.49999999999999994, 0.0,\n", + " -0.49999999999999994, 0.8660254037844387, 0.0)), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 0.8660254037844388,\n", + " 0.0, 1.0, 0.0), diagram=ApplyTransform(transform=Affine(1.0, 0.0, 0.0,\n", + " -0.0, 1.0, 0.0), diagram=Empty()))), diagram2=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, -0.8660254037844386), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.4999999999999998, -0.8660254037844387), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.5000000000000004, 0.8660254037844384), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, 0.8660254037844386), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(-0.5, 0.8660254037844387))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.8660254037844387, 0.49999999999999994, 1.7320508075688779,\n", + " -0.49999999999999994, 0.8660254037844387, 0.0))), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 2.598076211353317,\n", + " 0.0, 1.0, 0.0), diagram=ApplyTransform(transform=Affine(1.0, 0.0, 0.0,\n", + " -0.0, 1.0, 0.0), diagram=Empty()))), diagram2=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, -0.8660254037844386), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.4999999999999998, -0.8660254037844387), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.5000000000000004, 0.8660254037844384), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, 0.8660254037844386), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(-0.5, 0.8660254037844387))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.8660254037844387, 0.49999999999999994, 3.464101615137756,\n", + " -0.49999999999999994, 0.8660254037844387, 0.0))))), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 0.8660254037844389,\n", + " 0.0, 1.0, 4.5), diagram=Compose(envelope=, diagram1=Compose(envelope=, diagram1=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, -0.8660254037844386), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.4999999999999998, -0.8660254037844387), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.5000000000000004, 0.8660254037844384), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, 0.8660254037844386), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(-0.5, 0.8660254037844387))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.8660254037844387, 0.49999999999999994, 0.0,\n", + " -0.49999999999999994, 0.8660254037844387, 0.0)), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 0.8660254037844388,\n", + " 0.0, 1.0, 0.0), diagram=ApplyTransform(transform=Affine(1.0, 0.0, 0.0,\n", + " -0.0, 1.0, 0.0), diagram=Empty()))), diagram2=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, -0.8660254037844386), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.4999999999999998, -0.8660254037844387), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.5000000000000004, 0.8660254037844384), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, 0.8660254037844386), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(-0.5, 0.8660254037844387))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.8660254037844387, 0.49999999999999994, 1.7320508075688779,\n", + " -0.49999999999999994, 0.8660254037844387, 0.0))))), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 0.0,\n", + " 0.0, 1.0, 6.0), diagram=Compose(envelope=, diagram1=Compose(envelope=, diagram1=Compose(envelope=, diagram1=Compose(envelope=, diagram1=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, -0.8660254037844386), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.4999999999999998, -0.8660254037844387), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.5000000000000004, 0.8660254037844384), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, 0.8660254037844386), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(-0.5, 0.8660254037844387))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.8660254037844387, 0.49999999999999994, 0.0,\n", + " -0.49999999999999994, 0.8660254037844387, 0.0)), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 0.8660254037844388,\n", + " 0.0, 1.0, 0.0), diagram=ApplyTransform(transform=Affine(1.0, 0.0, 0.0,\n", + " -0.0, 1.0, 0.0), diagram=Empty()))), diagram2=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, -0.8660254037844386), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.4999999999999998, -0.8660254037844387), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.5000000000000004, 0.8660254037844384), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, 0.8660254037844386), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(-0.5, 0.8660254037844387))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.8660254037844387, 0.49999999999999994, 1.7320508075688779,\n", + " -0.49999999999999994, 0.8660254037844387, 0.0))), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 2.598076211353317,\n", + " 0.0, 1.0, 0.0), diagram=ApplyTransform(transform=Affine(1.0, 0.0, 0.0,\n", + " -0.0, 1.0, 0.0), diagram=Empty()))), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 3.464101615137756,\n", + " 0.0, 1.0, 0.0), diagram=Compose(envelope=, diagram1=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, -0.8660254037844386), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.4999999999999998, -0.8660254037844387), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.5000000000000004, 0.8660254037844384), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, 0.8660254037844386), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(-0.5, 0.8660254037844387))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.8660254037844387, 0.49999999999999994, 0.0,\n", + " -0.49999999999999994, 0.8660254037844387, 0.0)), diagram2=Compose(envelope=, diagram1=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(0.25, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.0, 0.7), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.25, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.0, -0.7), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(0.0, 0.0))]), style=Style(line_width_=(, 0), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.7071067811865476, 0.7071067811865475, -0.33587572106361,\n", + " -0.7071067811865475, 0.7071067811865476, -0.1590990257669732)), diagram2=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(0.25, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.0, 0.7), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.25, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.0, -0.7), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(0.0, 0.0))]), style=Style(line_width_=(, 0), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.7071067811865474, -0.7071067811865477, 0.15909902576697327,\n", + " 0.7071067811865477, 0.7071067811865474, -0.33587572106361))))))))), diagram2=Empty()))" + ], + "image/svg+xml": "\n" + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "Compose(envelope=, diagram1=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(6.196152422706634, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.0, 9.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-6.196152422706634, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.0, -9.0), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(0.0, 0.0))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(1.0, 0.0, -3.098076211353317,\n", + " 0.0, 1.0, -4.5)), diagram2=Compose(envelope=, diagram1=ApplyTransform(transform=Affine(1.0, 0.0, -1.7320508075688776,\n", + " 0.0, 1.0, -3.0), diagram=Compose(envelope=, diagram1=Compose(envelope=, diagram1=Compose(envelope=, diagram1=Compose(envelope=, diagram1=Compose(envelope=, diagram1=Empty(), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 0.0,\n", + " 0.0, 1.0, 0.0), diagram=Compose(envelope=, diagram1=Compose(envelope=, diagram1=Compose(envelope=, diagram1=Compose(envelope=, diagram1=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, -0.8660254037844386), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.4999999999999998, -0.8660254037844387), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.5000000000000004, 0.8660254037844384), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, 0.8660254037844386), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(-0.5, 0.8660254037844387))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.8660254037844387, 0.49999999999999994, 0.0,\n", + " -0.49999999999999994, 0.8660254037844387, 0.0)), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 0.8660254037844388,\n", + " 0.0, 1.0, 0.0), diagram=ApplyTransform(transform=Affine(1.0, 0.0, 0.0,\n", + " -0.0, 1.0, 0.0), diagram=Empty()))), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 1.7320508075688779,\n", + " 0.0, 1.0, 0.0), diagram=Compose(envelope=, diagram1=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, -0.8660254037844386), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.4999999999999998, -0.8660254037844387), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.5000000000000004, 0.8660254037844384), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, 0.8660254037844386), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(-0.5, 0.8660254037844387))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.8660254037844387, 0.49999999999999994, 0.0,\n", + " -0.49999999999999994, 0.8660254037844387, 0.0)), diagram2=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(0.75, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.37499999999999983, -0.649519052838329), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.37500000000000033, 0.6495190528383288), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(-0.375, 0.21650635094610973))]), style=Style(line_width_=None, line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(1.0, 0.0, 0.0,\n", + " 0.0, 1.0, 0.0))))), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 2.598076211353317,\n", + " 0.0, 1.0, 0.0), diagram=ApplyTransform(transform=Affine(1.0, 0.0, 0.0,\n", + " -0.0, 1.0, 0.0), diagram=Empty()))), diagram2=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, -0.8660254037844386), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.4999999999999998, -0.8660254037844387), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.5000000000000004, 0.8660254037844384), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, 0.8660254037844386), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(-0.5, 0.8660254037844387))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.8660254037844387, 0.49999999999999994, 3.464101615137756,\n", + " -0.49999999999999994, 0.8660254037844387, 0.0))))), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 0.8660254037844389,\n", + " 0.0, 1.0, 1.5), diagram=Compose(envelope=, diagram1=Compose(envelope=, diagram1=Compose(envelope=, diagram1=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, -0.8660254037844386), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.4999999999999998, -0.8660254037844387), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.5000000000000004, 0.8660254037844384), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, 0.8660254037844386), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(-0.5, 0.8660254037844387))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.8660254037844387, 0.49999999999999994, 0.0,\n", + " -0.49999999999999994, 0.8660254037844387, 0.0)), diagram2=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[ArcSegment(angle=0, dangle=-90, t=Affine(1.0, 0.0, -1.0,\n", + " 0.0, 1.0, 0.0)), ArcSegment(angle=0, dangle=-90, t=Affine(0.0, 1.0, 0.0,\n", + " -1.0, 0.0, 1.0)), ArcSegment(angle=0, dangle=-90, t=Affine(-1.0, 0.0, 1.0,\n", + " 0.0, -1.0, 0.0)), ArcSegment(angle=0, dangle=-90, t=Affine(0.0, -1.0, 0.0,\n", + " 1.0, 0.0, -1.0))], closed=True), location=Vec2(0.0, 0.0))]), style=Style(line_width_=None, line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.35, 0.0, 0.35,\n", + " 0.0, 0.35, 0.0))), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 0.8660254037844388,\n", + " 0.0, 1.0, 0.0), diagram=ApplyTransform(transform=Affine(1.0, 0.0, 0.0,\n", + " -0.0, 1.0, 0.0), diagram=Empty()))), diagram2=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, -0.8660254037844386), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.4999999999999998, -0.8660254037844387), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.5000000000000004, 0.8660254037844384), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, 0.8660254037844386), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(-0.5, 0.8660254037844387))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.8660254037844387, 0.49999999999999994, 1.7320508075688779,\n", + " -0.49999999999999994, 0.8660254037844387, 0.0))))), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 0.0,\n", + " 0.0, 1.0, 3.0), diagram=Compose(envelope=, diagram1=Compose(envelope=, diagram1=Compose(envelope=, diagram1=Compose(envelope=, diagram1=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, -0.8660254037844386), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.4999999999999998, -0.8660254037844387), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.5000000000000004, 0.8660254037844384), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, 0.8660254037844386), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(-0.5, 0.8660254037844387))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.8660254037844387, 0.49999999999999994, 0.0,\n", + " -0.49999999999999994, 0.8660254037844387, 0.0)), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 0.8660254037844388,\n", + " 0.0, 1.0, 0.0), diagram=ApplyTransform(transform=Affine(1.0, 0.0, 0.0,\n", + " -0.0, 1.0, 0.0), diagram=Empty()))), diagram2=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, -0.8660254037844386), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.4999999999999998, -0.8660254037844387), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.5000000000000004, 0.8660254037844384), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, 0.8660254037844386), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(-0.5, 0.8660254037844387))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.8660254037844387, 0.49999999999999994, 1.7320508075688779,\n", + " -0.49999999999999994, 0.8660254037844387, 0.0))), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 2.598076211353317,\n", + " 0.0, 1.0, 0.0), diagram=ApplyTransform(transform=Affine(1.0, 0.0, 0.0,\n", + " -0.0, 1.0, 0.0), diagram=Empty()))), diagram2=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, -0.8660254037844386), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.4999999999999998, -0.8660254037844387), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.5000000000000004, 0.8660254037844384), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, 0.8660254037844386), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(-0.5, 0.8660254037844387))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.8660254037844387, 0.49999999999999994, 3.464101615137756,\n", + " -0.49999999999999994, 0.8660254037844387, 0.0))))), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 0.8660254037844389,\n", + " 0.0, 1.0, 4.5), diagram=Compose(envelope=, diagram1=Compose(envelope=, diagram1=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, -0.8660254037844386), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.4999999999999998, -0.8660254037844387), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.5000000000000004, 0.8660254037844384), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, 0.8660254037844386), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(-0.5, 0.8660254037844387))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.8660254037844387, 0.49999999999999994, 0.0,\n", + " -0.49999999999999994, 0.8660254037844387, 0.0)), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 0.8660254037844388,\n", + " 0.0, 1.0, 0.0), diagram=ApplyTransform(transform=Affine(1.0, 0.0, 0.0,\n", + " -0.0, 1.0, 0.0), diagram=Empty()))), diagram2=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, -0.8660254037844386), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.4999999999999998, -0.8660254037844387), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.5000000000000004, 0.8660254037844384), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, 0.8660254037844386), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(-0.5, 0.8660254037844387))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.8660254037844387, 0.49999999999999994, 1.7320508075688779,\n", + " -0.49999999999999994, 0.8660254037844387, 0.0))))), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 0.0,\n", + " 0.0, 1.0, 6.0), diagram=Compose(envelope=, diagram1=Compose(envelope=, diagram1=Compose(envelope=, diagram1=Compose(envelope=, diagram1=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, -0.8660254037844386), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.4999999999999998, -0.8660254037844387), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.5000000000000004, 0.8660254037844384), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, 0.8660254037844386), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(-0.5, 0.8660254037844387))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.8660254037844387, 0.49999999999999994, 0.0,\n", + " -0.49999999999999994, 0.8660254037844387, 0.0)), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 0.8660254037844388,\n", + " 0.0, 1.0, 0.0), diagram=ApplyTransform(transform=Affine(1.0, 0.0, 0.0,\n", + " -0.0, 1.0, 0.0), diagram=Empty()))), diagram2=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, -0.8660254037844386), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.4999999999999998, -0.8660254037844387), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.5000000000000004, 0.8660254037844384), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, 0.8660254037844386), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(-0.5, 0.8660254037844387))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.8660254037844387, 0.49999999999999994, 1.7320508075688779,\n", + " -0.49999999999999994, 0.8660254037844387, 0.0))), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 2.598076211353317,\n", + " 0.0, 1.0, 0.0), diagram=ApplyTransform(transform=Affine(1.0, 0.0, 0.0,\n", + " -0.0, 1.0, 0.0), diagram=Empty()))), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 3.464101615137756,\n", + " 0.0, 1.0, 0.0), diagram=Compose(envelope=, diagram1=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, -0.8660254037844386), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.4999999999999998, -0.8660254037844387), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.5000000000000004, 0.8660254037844384), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, 0.8660254037844386), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(-0.5, 0.8660254037844387))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.8660254037844387, 0.49999999999999994, 0.0,\n", + " -0.49999999999999994, 0.8660254037844387, 0.0)), diagram2=Compose(envelope=, diagram1=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(0.25, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.0, 0.7), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.25, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.0, -0.7), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(0.0, 0.0))]), style=Style(line_width_=(, 0), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.7071067811865476, 0.7071067811865475, -0.33587572106361,\n", + " -0.7071067811865475, 0.7071067811865476, -0.1590990257669732)), diagram2=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(0.25, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.0, 0.7), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.25, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.0, -0.7), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(0.0, 0.0))]), style=Style(line_width_=(, 0), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.7071067811865474, -0.7071067811865477, 0.15909902576697327,\n", + " 0.7071067811865477, 0.7071067811865474, -0.33587572106361))))))))), diagram2=Empty()))" + ], + "image/svg+xml": "\n" + }, + "metadata": {} + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Prompt Code\n", + "\n", + "The puzzle is to write prompt code to make the model accomplish this task. We have provided some scaffolding code for you. The code creates:\n", + "\n", + "* A header for describing the game. \n", + "* A function `make_fun` that shows the AI how to move in code. \n", + "* A footer to describe the final game board that you want the mode to solve. \n", + "\n", + "You can fill this in a watch how the model moves around." + ], + "metadata": { + "id": "PhqF9af5_jvh" + } + }, + { + "cell_type": "code", + "execution_count": 102, + "metadata": { + "id": "jFf7TCOJaVHX" + }, + "outputs": [], + "source": [ + "\n", + "def make_fun(board, actions):\n", + " \"This function generates python code for few-shot examples\"\n", + " out = tab + \"p = \" + str(board.player_pos)\n", + " for i, action in enumerate(actions):\n", + " new_board = board.move(action)\n", + " out += f\"\"\"\n", + " # print(new_board) <- uncomment if you want to see the movement.\n", + " # TODO ADD CODE\n", + " p = move(b, \"{action.value}\", p) # TODO ADD CODE\"\"\"\n", + " board = new_board\n", + " return out\n", + "\n", + "ex = 0\n", + "def prompt(game):\n", + " \"\"\"\n", + " You should fill these sections out to teach the AI how to play the game.\n", + " \"\"\"\n", + " print(f\"\"\"\n", + "# TODO: DESCRIBE THE GAME\n", + "\n", + "# TODO: DESCRIBE THE ACTIONS\n", + "change_str = {change_str}\n", + "\n", + "{inspect.getsource(move)}\n", + "\"\"\")\n", + "\n", + " def example(game, actions):\n", + " \"\"\"\n", + " This code makes a few shot example. You don't need to edit it.\n", + " \"\"\"\n", + " global ex\n", + " ex += 1\n", + " print(f\"\"\"\n", + "#-------------\n", + "# EXAMPLE:\n", + "def example{ex}():\n", + " b = {repr(game)} \n", + "{make_fun(game.board, actions)}\n", + " return b\n", + "# ------------\n", + "\"\"\")\n", + "\n", + " # Create a few shot example \n", + " board = Game(boundary=(3, 3), key=(1, 1), flag=(2, 2), init=(0, 0), walls=[(2, 0)])\n", + " actions = [Actions.DOWNRIGHT, Actions.PICKUP, Actions.DOWNRIGHT]\n", + " example(board, actions)\n", + "\n", + " # Test case\n", + " print(f\"\"\"\n", + "# ----\n", + "# TODO: ADD any custom example code\n", + "#---\n", + "# TODO: FINAL description.\n", + "\n", + "# Contraints for this function:\", {repr(game)}\n", + "# Please fill this in with code like the examples above (do not provide a description):\n", + "# \n", + "# The following function `my_example` instantiates a GameBoard called b with these constraints.\n", + "\n", + "\"\"\") \n", + " " + ] + }, + { + "cell_type": "markdown", + "source": [ + "This code lets you make a game and see the output for a prompt for that game. There are easy, medium, and hard games. " + ], + "metadata": { + "id": "-iecyV7nAbFT" + } + }, + { + "cell_type": "code", + "source": [ + "# Easy\n", + "game = Game(boundary=(3, 3), key=(1, 1), flag=(2, 2), init=(0, 0), walls=[])\n", + "\n", + "# Medium\n", + "#game = Game(boundary=(5, 5), key=(3, 1), flag=(4, 4), init=(0, 0), walls=[(1, 1)])\n", + "\n", + "# Hard\n", + "#game = Game(boundary=(8, 15), key=(3, 1), flag=(7, 13), init=(0, 0), walls=[(2, 2), (1, 1), (5, 3), (1, 11), (5, 5), (6, 6), (6, 10), (2, 6), (4, 12)])\n", + "\n", + "f = io.StringIO()\n", + "with redirect_stdout(f):\n", + " ex = 0\n", + " prompt(game)\n", + "my_prompt = f.getvalue()\n", + "print(my_prompt)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "cOneYFok_OMe", + "outputId": "97080186-7322-4ba9-b500-095fb39071aa" + }, + "execution_count": 103, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\n", + "# TODO: DESCRIBE THE GAME\n", + "\n", + "# TODO: DESCRIBE THE ACTIONS\n", + "change_str = {'UR': (-1, 1), 'R': (0, 2), 'DR': (1, 1), 'DL': (1, -1), 'L': (0, -2), 'UL': (-1, -1), 'Pickup': (0, 0)}\n", + "\n", + "def move(game, action, old_pos):\n", + " # ACTIONS (must be legal)\n", + " game.move(Actions(action))\n", + " offset = change_str[action]\n", + " pos = (old_pos[0] + offset[0], old_pos[1] + offset[1])\n", + " assert 0 <= pos[0] < game.boundary[0]\n", + " assert 0 <= pos[1] < game.boundary[1]\n", + " assert pos not in game.walls\n", + " if action == \"PU\":\n", + " assert pos == game.key\n", + " return pos\n", + "\n", + "\n", + "\n", + "#-------------\n", + "# EXAMPLE:\n", + "def example1():\n", + " b = Game(init=(0, 0), flag=(2, 2), walls= [(2, 0)], boundary= (3, 3), key= (1, 1)) \n", + " p = (0, 0)\n", + " # print(new_board) <- uncomment if you want to see the movement.\n", + " # TODO ADD CODE\n", + " p = move(b, \"DR\", p) # TODO ADD CODE\n", + " # print(new_board) <- uncomment if you want to see the movement.\n", + " # TODO ADD CODE\n", + " p = move(b, \"Pickup\", p) # TODO ADD CODE\n", + " # print(new_board) <- uncomment if you want to see the movement.\n", + " # TODO ADD CODE\n", + " p = move(b, \"DR\", p) # TODO ADD CODE\n", + " return b\n", + "# ------------\n", + "\n", + "\n", + "# ----\n", + "# TODO: ADD any custom example code\n", + "#---\n", + "# TODO: FINAL description.\n", + "\n", + "# Contraints for this function:\", Game(init=(0, 0), flag=(2, 2), walls= [], boundary= (3, 3), key= (1, 1))\n", + "# Please fill this in with code like the examples above (do not provide a description):\n", + "# \n", + "# The following function `my_example` instantiates a GameBoard called b with these constraints.\n", + "\n", + "\n", + "\n" + ] + } + ] + }, + { + "cell_type": "code", + "execution_count": 105, + "metadata": { + "id": "LONWUsBLjOHo", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "outputId": "472afd19-48c1-4924-cabd-639b5e2ad298" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "def my_example():\n", + " b = Game(init=(0, 0), flag=(2, 2), walls=[], boundary=(3, 3), key=(1, 1))\n", + " p = (0, 0)\n", + "\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "Compose(envelope=, diagram1=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(4.464101615137756, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.0, 6.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-4.464101615137756, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.0, -6.0), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(0.0, 0.0))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(1.0, 0.0, -2.232050807568878,\n", + " 0.0, 1.0, -3.0)), diagram2=Compose(envelope=, diagram1=ApplyTransform(transform=Affine(1.0, 0.0, -0.8660254037844389,\n", + " 0.0, 1.0, -1.5), diagram=Compose(envelope=, diagram1=Compose(envelope=, diagram1=Compose(envelope=, diagram1=Empty(), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 0.0,\n", + " 0.0, 1.0, 0.0), diagram=Compose(envelope=, diagram1=Compose(envelope=, diagram1=Compose(envelope=, diagram1=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, -0.8660254037844386), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.4999999999999998, -0.8660254037844387), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.5000000000000004, 0.8660254037844384), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, 0.8660254037844386), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(-0.5, 0.8660254037844387))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.8660254037844387, 0.49999999999999994, 0.0,\n", + " -0.49999999999999994, 0.8660254037844387, 0.0)), diagram2=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[ArcSegment(angle=0, dangle=-90, t=Affine(1.0, 0.0, -1.0,\n", + " 0.0, 1.0, 0.0)), ArcSegment(angle=0, dangle=-90, t=Affine(0.0, 1.0, 0.0,\n", + " -1.0, 0.0, 1.0)), ArcSegment(angle=0, dangle=-90, t=Affine(-1.0, 0.0, 1.0,\n", + " 0.0, -1.0, 0.0)), ArcSegment(angle=0, dangle=-90, t=Affine(0.0, -1.0, 0.0,\n", + " 1.0, 0.0, -1.0))], closed=True), location=Vec2(0.0, 0.0))]), style=Style(line_width_=None, line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.35, 0.0, 0.35,\n", + " 0.0, 0.35, 0.0))), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 0.8660254037844388,\n", + " 0.0, 1.0, 0.0), diagram=ApplyTransform(transform=Affine(1.0, 0.0, 0.0,\n", + " -0.0, 1.0, 0.0), diagram=Empty()))), diagram2=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, -0.8660254037844386), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.4999999999999998, -0.8660254037844387), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.5000000000000004, 0.8660254037844384), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, 0.8660254037844386), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(-0.5, 0.8660254037844387))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.8660254037844387, 0.49999999999999994, 1.7320508075688779,\n", + " -0.49999999999999994, 0.8660254037844387, 0.0))))), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 0.8660254037844389,\n", + " 0.0, 1.0, 1.5), diagram=Compose(envelope=, diagram1=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, -0.8660254037844386), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.4999999999999998, -0.8660254037844387), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.5000000000000004, 0.8660254037844384), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, 0.8660254037844386), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(-0.5, 0.8660254037844387))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.8660254037844387, 0.49999999999999994, 0.0,\n", + " -0.49999999999999994, 0.8660254037844387, 0.0)), diagram2=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(0.75, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.37499999999999983, -0.649519052838329), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.37500000000000033, 0.6495190528383288), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(-0.375, 0.21650635094610973))]), style=Style(line_width_=None, line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(1.0, 0.0, 0.0,\n", + " 0.0, 1.0, 0.0))))), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 0.0,\n", + " 0.0, 1.0, 3.0), diagram=Compose(envelope=, diagram1=Compose(envelope=, diagram1=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, -0.8660254037844386), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.4999999999999998, -0.8660254037844387), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.5000000000000004, 0.8660254037844384), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, 0.8660254037844386), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(-0.5, 0.8660254037844387))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.8660254037844387, 0.49999999999999994, 0.0,\n", + " -0.49999999999999994, 0.8660254037844387, 0.0)), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 0.8660254037844388,\n", + " 0.0, 1.0, 0.0), diagram=ApplyTransform(transform=Affine(1.0, 0.0, 0.0,\n", + " -0.0, 1.0, 0.0), diagram=Empty()))), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 1.7320508075688779,\n", + " 0.0, 1.0, 0.0), diagram=Compose(envelope=, diagram1=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, -0.8660254037844386), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.4999999999999998, -0.8660254037844387), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.5000000000000004, 0.8660254037844384), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, 0.8660254037844386), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(-0.5, 0.8660254037844387))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.8660254037844387, 0.49999999999999994, 0.0,\n", + " -0.49999999999999994, 0.8660254037844387, 0.0)), diagram2=Compose(envelope=, diagram1=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(0.25, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.0, 0.7), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.25, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.0, -0.7), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(0.0, 0.0))]), style=Style(line_width_=(, 0), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.7071067811865476, 0.7071067811865475, -0.33587572106361,\n", + " -0.7071067811865475, 0.7071067811865476, -0.1590990257669732)), diagram2=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(0.25, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.0, 0.7), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.25, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.0, -0.7), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(0.0, 0.0))]), style=Style(line_width_=(, 0), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.7071067811865474, -0.7071067811865477, 0.15909902576697327,\n", + " 0.7071067811865477, 0.7071067811865474, -0.33587572106361))))))))), diagram2=Empty()))" + ], + "image/svg+xml": "\n" + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " p = move(b, \"DR\", p)\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "Compose(envelope=, diagram1=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(4.464101615137756, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.0, 6.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-4.464101615137756, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.0, -6.0), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(0.0, 0.0))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(1.0, 0.0, -2.232050807568878,\n", + " 0.0, 1.0, -3.0)), diagram2=Compose(envelope=, diagram1=ApplyTransform(transform=Affine(1.0, 0.0, -0.8660254037844389,\n", + " 0.0, 1.0, -1.5), diagram=Compose(envelope=, diagram1=Compose(envelope=, diagram1=Compose(envelope=, diagram1=Empty(), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 0.0,\n", + " 0.0, 1.0, 0.0), diagram=Compose(envelope=, diagram1=Compose(envelope=, diagram1=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, -0.8660254037844386), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.4999999999999998, -0.8660254037844387), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.5000000000000004, 0.8660254037844384), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, 0.8660254037844386), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(-0.5, 0.8660254037844387))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.8660254037844387, 0.49999999999999994, 0.0,\n", + " -0.49999999999999994, 0.8660254037844387, 0.0)), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 0.8660254037844388,\n", + " 0.0, 1.0, 0.0), diagram=ApplyTransform(transform=Affine(1.0, 0.0, 0.0,\n", + " -0.0, 1.0, 0.0), diagram=Empty()))), diagram2=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, -0.8660254037844386), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.4999999999999998, -0.8660254037844387), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.5000000000000004, 0.8660254037844384), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, 0.8660254037844386), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(-0.5, 0.8660254037844387))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.8660254037844387, 0.49999999999999994, 1.7320508075688779,\n", + " -0.49999999999999994, 0.8660254037844387, 0.0))))), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 0.8660254037844389,\n", + " 0.0, 1.0, 1.5), diagram=Compose(envelope=, diagram1=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, -0.8660254037844386), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.4999999999999998, -0.8660254037844387), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.5000000000000004, 0.8660254037844384), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, 0.8660254037844386), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(-0.5, 0.8660254037844387))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.8660254037844387, 0.49999999999999994, 0.0,\n", + " -0.49999999999999994, 0.8660254037844387, 0.0)), diagram2=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[ArcSegment(angle=0, dangle=-90, t=Affine(1.0, 0.0, -1.0,\n", + " 0.0, 1.0, 0.0)), ArcSegment(angle=0, dangle=-90, t=Affine(0.0, 1.0, 0.0,\n", + " -1.0, 0.0, 1.0)), ArcSegment(angle=0, dangle=-90, t=Affine(-1.0, 0.0, 1.0,\n", + " 0.0, -1.0, 0.0)), ArcSegment(angle=0, dangle=-90, t=Affine(0.0, -1.0, 0.0,\n", + " 1.0, 0.0, -1.0))], closed=True), location=Vec2(0.0, 0.0))]), style=Style(line_width_=None, line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.35, 0.0, 0.35,\n", + " 0.0, 0.35, 0.0))))), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 0.0,\n", + " 0.0, 1.0, 3.0), diagram=Compose(envelope=, diagram1=Compose(envelope=, diagram1=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, -0.8660254037844386), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.4999999999999998, -0.8660254037844387), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.5000000000000004, 0.8660254037844384), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, 0.8660254037844386), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(-0.5, 0.8660254037844387))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.8660254037844387, 0.49999999999999994, 0.0,\n", + " -0.49999999999999994, 0.8660254037844387, 0.0)), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 0.8660254037844388,\n", + " 0.0, 1.0, 0.0), diagram=ApplyTransform(transform=Affine(1.0, 0.0, 0.0,\n", + " -0.0, 1.0, 0.0), diagram=Empty()))), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 1.7320508075688779,\n", + " 0.0, 1.0, 0.0), diagram=Compose(envelope=, diagram1=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, -0.8660254037844386), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.4999999999999998, -0.8660254037844387), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.5000000000000004, 0.8660254037844384), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, 0.8660254037844386), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(-0.5, 0.8660254037844387))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.8660254037844387, 0.49999999999999994, 0.0,\n", + " -0.49999999999999994, 0.8660254037844387, 0.0)), diagram2=Compose(envelope=, diagram1=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(0.25, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.0, 0.7), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.25, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.0, -0.7), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(0.0, 0.0))]), style=Style(line_width_=(, 0), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.7071067811865476, 0.7071067811865475, -0.33587572106361,\n", + " -0.7071067811865475, 0.7071067811865476, -0.1590990257669732)), diagram2=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(0.25, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.0, 0.7), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.25, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.0, -0.7), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(0.0, 0.0))]), style=Style(line_width_=(, 0), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.7071067811865474, -0.7071067811865477, 0.15909902576697327,\n", + " 0.7071067811865477, 0.7071067811865474, -0.33587572106361))))))))), diagram2=Empty()))" + ], + "image/svg+xml": "\n" + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " p = move(b, \"Pickup\", p)\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "Compose(envelope=, diagram1=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(4.464101615137756, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.0, 6.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-4.464101615137756, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.0, -6.0), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(0.0, 0.0))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(1.0, 0.0, -2.232050807568878,\n", + " 0.0, 1.0, -3.0)), diagram2=Compose(envelope=, diagram1=ApplyTransform(transform=Affine(1.0, 0.0, -0.8660254037844389,\n", + " 0.0, 1.0, -1.5), diagram=Compose(envelope=, diagram1=Compose(envelope=, diagram1=Compose(envelope=, diagram1=Empty(), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 0.0,\n", + " 0.0, 1.0, 0.0), diagram=Compose(envelope=, diagram1=Compose(envelope=, diagram1=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, -0.8660254037844386), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.4999999999999998, -0.8660254037844387), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.5000000000000004, 0.8660254037844384), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, 0.8660254037844386), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(-0.5, 0.8660254037844387))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.8660254037844387, 0.49999999999999994, 0.0,\n", + " -0.49999999999999994, 0.8660254037844387, 0.0)), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 0.8660254037844388,\n", + " 0.0, 1.0, 0.0), diagram=ApplyTransform(transform=Affine(1.0, 0.0, 0.0,\n", + " -0.0, 1.0, 0.0), diagram=Empty()))), diagram2=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, -0.8660254037844386), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.4999999999999998, -0.8660254037844387), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.5000000000000004, 0.8660254037844384), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, 0.8660254037844386), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(-0.5, 0.8660254037844387))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.8660254037844387, 0.49999999999999994, 1.7320508075688779,\n", + " -0.49999999999999994, 0.8660254037844387, 0.0))))), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 0.8660254037844389,\n", + " 0.0, 1.0, 1.5), diagram=Compose(envelope=, diagram1=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, -0.8660254037844386), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.4999999999999998, -0.8660254037844387), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.5000000000000004, 0.8660254037844384), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, 0.8660254037844386), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(-0.5, 0.8660254037844387))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.8660254037844387, 0.49999999999999994, 0.0,\n", + " -0.49999999999999994, 0.8660254037844387, 0.0)), diagram2=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[ArcSegment(angle=0, dangle=-90, t=Affine(1.0, 0.0, -1.0,\n", + " 0.0, 1.0, 0.0)), ArcSegment(angle=0, dangle=-90, t=Affine(0.0, 1.0, 0.0,\n", + " -1.0, 0.0, 1.0)), ArcSegment(angle=0, dangle=-90, t=Affine(-1.0, 0.0, 1.0,\n", + " 0.0, -1.0, 0.0)), ArcSegment(angle=0, dangle=-90, t=Affine(0.0, -1.0, 0.0,\n", + " 1.0, 0.0, -1.0))], closed=True), location=Vec2(0.0, 0.0))]), style=Style(line_width_=None, line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.35, 0.0, 0.35,\n", + " 0.0, 0.35, 0.0))))), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 0.0,\n", + " 0.0, 1.0, 3.0), diagram=Compose(envelope=, diagram1=Compose(envelope=, diagram1=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, -0.8660254037844386), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.4999999999999998, -0.8660254037844387), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.5000000000000004, 0.8660254037844384), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, 0.8660254037844386), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(-0.5, 0.8660254037844387))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.8660254037844387, 0.49999999999999994, 0.0,\n", + " -0.49999999999999994, 0.8660254037844387, 0.0)), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 0.8660254037844388,\n", + " 0.0, 1.0, 0.0), diagram=ApplyTransform(transform=Affine(1.0, 0.0, 0.0,\n", + " -0.0, 1.0, 0.0), diagram=Empty()))), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 1.7320508075688779,\n", + " 0.0, 1.0, 0.0), diagram=Compose(envelope=, diagram1=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, -0.8660254037844386), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.4999999999999998, -0.8660254037844387), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.5000000000000004, 0.8660254037844384), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, 0.8660254037844386), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(-0.5, 0.8660254037844387))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.8660254037844387, 0.49999999999999994, 0.0,\n", + " -0.49999999999999994, 0.8660254037844387, 0.0)), diagram2=Compose(envelope=, diagram1=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(0.25, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.0, 0.7), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.25, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.0, -0.7), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(0.0, 0.0))]), style=Style(line_width_=(, 0), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.7071067811865476, 0.7071067811865475, -0.33587572106361,\n", + " -0.7071067811865475, 0.7071067811865476, -0.1590990257669732)), diagram2=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(0.25, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.0, 0.7), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.25, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.0, -0.7), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(0.0, 0.0))]), style=Style(line_width_=(, 0), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.7071067811865474, -0.7071067811865477, 0.15909902576697327,\n", + " 0.7071067811865477, 0.7071067811865474, -0.33587572106361))))))))), diagram2=Empty()))" + ], + "image/svg+xml": "\n" + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " p = move(b, \"DR\", p)\n", + "\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "Compose(envelope=, diagram1=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(4.464101615137756, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.0, 6.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-4.464101615137756, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.0, -6.0), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(0.0, 0.0))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(1.0, 0.0, -2.232050807568878,\n", + " 0.0, 1.0, -3.0)), diagram2=Compose(envelope=, diagram1=ApplyTransform(transform=Affine(1.0, 0.0, -0.8660254037844389,\n", + " 0.0, 1.0, -1.5), diagram=Compose(envelope=, diagram1=Compose(envelope=, diagram1=Compose(envelope=, diagram1=Empty(), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 0.0,\n", + " 0.0, 1.0, 0.0), diagram=Compose(envelope=, diagram1=Compose(envelope=, diagram1=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, -0.8660254037844386), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.4999999999999998, -0.8660254037844387), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.5000000000000004, 0.8660254037844384), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, 0.8660254037844386), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(-0.5, 0.8660254037844387))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.8660254037844387, 0.49999999999999994, 0.0,\n", + " -0.49999999999999994, 0.8660254037844387, 0.0)), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 0.8660254037844388,\n", + " 0.0, 1.0, 0.0), diagram=ApplyTransform(transform=Affine(1.0, 0.0, 0.0,\n", + " -0.0, 1.0, 0.0), diagram=Empty()))), diagram2=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, -0.8660254037844386), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.4999999999999998, -0.8660254037844387), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.5000000000000004, 0.8660254037844384), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, 0.8660254037844386), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(-0.5, 0.8660254037844387))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.8660254037844387, 0.49999999999999994, 1.7320508075688779,\n", + " -0.49999999999999994, 0.8660254037844387, 0.0))))), diagram2=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, -0.8660254037844386), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.4999999999999998, -0.8660254037844387), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.5000000000000004, 0.8660254037844384), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, 0.8660254037844386), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(-0.5, 0.8660254037844387))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.8660254037844387, 0.49999999999999994, 0.8660254037844389,\n", + " -0.49999999999999994, 0.8660254037844387, 1.5))), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 0.0,\n", + " 0.0, 1.0, 3.0), diagram=Compose(envelope=, diagram1=Compose(envelope=, diagram1=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, -0.8660254037844386), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.4999999999999998, -0.8660254037844387), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.5000000000000004, 0.8660254037844384), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, 0.8660254037844386), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(-0.5, 0.8660254037844387))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.8660254037844387, 0.49999999999999994, 0.0,\n", + " -0.49999999999999994, 0.8660254037844387, 0.0)), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 0.8660254037844388,\n", + " 0.0, 1.0, 0.0), diagram=ApplyTransform(transform=Affine(1.0, 0.0, 0.0,\n", + " -0.0, 1.0, 0.0), diagram=Empty()))), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 1.7320508075688779,\n", + " 0.0, 1.0, 0.0), diagram=Compose(envelope=, diagram1=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, -0.8660254037844386), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.4999999999999998, -0.8660254037844387), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.5000000000000004, 0.8660254037844384), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, 0.8660254037844386), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(-0.5, 0.8660254037844387))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.8660254037844387, 0.49999999999999994, 0.0,\n", + " -0.49999999999999994, 0.8660254037844387, 0.0)), diagram2=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[ArcSegment(angle=0, dangle=-90, t=Affine(1.0, 0.0, -1.0,\n", + " 0.0, 1.0, 0.0)), ArcSegment(angle=0, dangle=-90, t=Affine(0.0, 1.0, 0.0,\n", + " -1.0, 0.0, 1.0)), ArcSegment(angle=0, dangle=-90, t=Affine(-1.0, 0.0, 1.0,\n", + " 0.0, -1.0, 0.0)), ArcSegment(angle=0, dangle=-90, t=Affine(0.0, -1.0, 0.0,\n", + " 1.0, 0.0, -1.0))], closed=True), location=Vec2(0.0, 0.0))]), style=Style(line_width_=None, line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.35, 0.0, 0.35,\n", + " 0.0, 0.35, 0.0)))))))), diagram2=Empty()))" + ], + "image/svg+xml": "\n" + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " return b\n", + "\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "Compose(envelope=, diagram1=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(4.464101615137756, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.0, 6.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-4.464101615137756, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.0, -6.0), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(0.0, 0.0))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(1.0, 0.0, -2.232050807568878,\n", + " 0.0, 1.0, -3.0)), diagram2=Compose(envelope=, diagram1=ApplyTransform(transform=Affine(1.0, 0.0, -0.8660254037844389,\n", + " 0.0, 1.0, -1.5), diagram=Compose(envelope=, diagram1=Compose(envelope=, diagram1=Compose(envelope=, diagram1=Empty(), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 0.0,\n", + " 0.0, 1.0, 0.0), diagram=Compose(envelope=, diagram1=Compose(envelope=, diagram1=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, -0.8660254037844386), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.4999999999999998, -0.8660254037844387), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.5000000000000004, 0.8660254037844384), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, 0.8660254037844386), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(-0.5, 0.8660254037844387))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.8660254037844387, 0.49999999999999994, 0.0,\n", + " -0.49999999999999994, 0.8660254037844387, 0.0)), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 0.8660254037844388,\n", + " 0.0, 1.0, 0.0), diagram=ApplyTransform(transform=Affine(1.0, 0.0, 0.0,\n", + " -0.0, 1.0, 0.0), diagram=Empty()))), diagram2=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, -0.8660254037844386), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.4999999999999998, -0.8660254037844387), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.5000000000000004, 0.8660254037844384), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, 0.8660254037844386), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(-0.5, 0.8660254037844387))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.8660254037844387, 0.49999999999999994, 1.7320508075688779,\n", + " -0.49999999999999994, 0.8660254037844387, 0.0))))), diagram2=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, -0.8660254037844386), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.4999999999999998, -0.8660254037844387), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.5000000000000004, 0.8660254037844384), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, 0.8660254037844386), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(-0.5, 0.8660254037844387))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.8660254037844387, 0.49999999999999994, 0.8660254037844389,\n", + " -0.49999999999999994, 0.8660254037844387, 1.5))), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 0.0,\n", + " 0.0, 1.0, 3.0), diagram=Compose(envelope=, diagram1=Compose(envelope=, diagram1=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, -0.8660254037844386), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.4999999999999998, -0.8660254037844387), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.5000000000000004, 0.8660254037844384), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, 0.8660254037844386), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(-0.5, 0.8660254037844387))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.8660254037844387, 0.49999999999999994, 0.0,\n", + " -0.49999999999999994, 0.8660254037844387, 0.0)), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 0.8660254037844388,\n", + " 0.0, 1.0, 0.0), diagram=ApplyTransform(transform=Affine(1.0, 0.0, 0.0,\n", + " -0.0, 1.0, 0.0), diagram=Empty()))), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 1.7320508075688779,\n", + " 0.0, 1.0, 0.0), diagram=Compose(envelope=, diagram1=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, -0.8660254037844386), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.4999999999999998, -0.8660254037844387), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.5000000000000004, 0.8660254037844384), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, 0.8660254037844386), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(-0.5, 0.8660254037844387))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.8660254037844387, 0.49999999999999994, 0.0,\n", + " -0.49999999999999994, 0.8660254037844387, 0.0)), diagram2=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[ArcSegment(angle=0, dangle=-90, t=Affine(1.0, 0.0, -1.0,\n", + " 0.0, 1.0, 0.0)), ArcSegment(angle=0, dangle=-90, t=Affine(0.0, 1.0, 0.0,\n", + " -1.0, 0.0, 1.0)), ArcSegment(angle=0, dangle=-90, t=Affine(-1.0, 0.0, 1.0,\n", + " 0.0, -1.0, 0.0)), ArcSegment(angle=0, dangle=-90, t=Affine(0.0, -1.0, 0.0,\n", + " 1.0, 0.0, -1.0))], closed=True), location=Vec2(0.0, 0.0))]), style=Style(line_width_=None, line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.35, 0.0, 0.35,\n", + " 0.0, 0.35, 0.0)))))))), diagram2=Empty()))" + ], + "image/svg+xml": "\n" + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "# In this example, the player starts at position (0, 0) and the goal is to reach the flag at position (2, 2). There are no walls on the board, and the key is located at position (1, 1). The boundary of the game board is 3x3.\n", + "\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "Compose(envelope=, diagram1=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(4.464101615137756, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.0, 6.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-4.464101615137756, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.0, -6.0), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(0.0, 0.0))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(1.0, 0.0, -2.232050807568878,\n", + " 0.0, 1.0, -3.0)), diagram2=Compose(envelope=, diagram1=ApplyTransform(transform=Affine(1.0, 0.0, -0.8660254037844389,\n", + " 0.0, 1.0, -1.5), diagram=Compose(envelope=, diagram1=Compose(envelope=, diagram1=Compose(envelope=, diagram1=Empty(), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 0.0,\n", + " 0.0, 1.0, 0.0), diagram=Compose(envelope=, diagram1=Compose(envelope=, diagram1=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, -0.8660254037844386), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.4999999999999998, -0.8660254037844387), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.5000000000000004, 0.8660254037844384), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, 0.8660254037844386), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(-0.5, 0.8660254037844387))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.8660254037844387, 0.49999999999999994, 0.0,\n", + " -0.49999999999999994, 0.8660254037844387, 0.0)), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 0.8660254037844388,\n", + " 0.0, 1.0, 0.0), diagram=ApplyTransform(transform=Affine(1.0, 0.0, 0.0,\n", + " -0.0, 1.0, 0.0), diagram=Empty()))), diagram2=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, -0.8660254037844386), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.4999999999999998, -0.8660254037844387), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.5000000000000004, 0.8660254037844384), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, 0.8660254037844386), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(-0.5, 0.8660254037844387))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.8660254037844387, 0.49999999999999994, 1.7320508075688779,\n", + " -0.49999999999999994, 0.8660254037844387, 0.0))))), diagram2=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, -0.8660254037844386), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.4999999999999998, -0.8660254037844387), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.5000000000000004, 0.8660254037844384), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, 0.8660254037844386), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(-0.5, 0.8660254037844387))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.8660254037844387, 0.49999999999999994, 0.8660254037844389,\n", + " -0.49999999999999994, 0.8660254037844387, 1.5))), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 0.0,\n", + " 0.0, 1.0, 3.0), diagram=Compose(envelope=, diagram1=Compose(envelope=, diagram1=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, -0.8660254037844386), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.4999999999999998, -0.8660254037844387), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.5000000000000004, 0.8660254037844384), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, 0.8660254037844386), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(-0.5, 0.8660254037844387))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.8660254037844387, 0.49999999999999994, 0.0,\n", + " -0.49999999999999994, 0.8660254037844387, 0.0)), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 0.8660254037844388,\n", + " 0.0, 1.0, 0.0), diagram=ApplyTransform(transform=Affine(1.0, 0.0, 0.0,\n", + " -0.0, 1.0, 0.0), diagram=Empty()))), diagram2=ApplyTransform(transform=Affine(1.0, 0.0, 1.7320508075688779,\n", + " 0.0, 1.0, 0.0), diagram=Compose(envelope=, diagram1=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[Segment(offset=Vec2(1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, -0.8660254037844386), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.4999999999999998, -0.8660254037844387), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-1.0, 0.0), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(-0.5000000000000004, 0.8660254037844384), origin=Vec2(0.0, 0.0)), Segment(offset=Vec2(0.5000000000000001, 0.8660254037844386), origin=Vec2(0.0, 0.0))], closed=True), location=Vec2(-0.5, 0.8660254037844387))]), style=Style(line_width_=(, 0.5), line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.8660254037844387, 0.49999999999999994, 0.0,\n", + " -0.49999999999999994, 0.8660254037844387, 0.0)), diagram2=Primitive(shape=Path(loc_trails=[Located(trail=Trail(segments=[ArcSegment(angle=0, dangle=-90, t=Affine(1.0, 0.0, -1.0,\n", + " 0.0, 1.0, 0.0)), ArcSegment(angle=0, dangle=-90, t=Affine(0.0, 1.0, 0.0,\n", + " -1.0, 0.0, 1.0)), ArcSegment(angle=0, dangle=-90, t=Affine(-1.0, 0.0, 1.0,\n", + " 0.0, -1.0, 0.0)), ArcSegment(angle=0, dangle=-90, t=Affine(0.0, -1.0, 0.0,\n", + " 1.0, 0.0, -1.0))], closed=True), location=Vec2(0.0, 0.0))]), style=Style(line_width_=None, line_color_=None, fill_color_=, fill_opacity_=None, dashing_=None, output_size=None), transform=Affine(0.35, 0.0, 0.35,\n", + " 0.0, 0.35, 0.0)))))))), diagram2=Empty()))" + ], + "image/svg+xml": "\n" + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "# The player first moves diagonally right (DR) to position (1, 1), where they pick up the key (Pickup). Then, the player moves diagonally right (DR) again to reach the flag at position (2, 2)." + ] + }, + { + "output_type": "display_data", + "data": { + "image/gif": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Input Tokens: 484\n", + "Output Tokens: 203\n" + ] + } + ], + "source": [ + "# Run an LLM and execute it as it runs. \n", + "q = {}\n", + "i = 0\n", + "for prefix in start(my_prompt):\n", + " ps = prefix.split(\"\\n\")\n", + " if len(ps) > 3 and not ps[-2].strip().startswith(\"#\") and prefix.endswith(\"\\n\"):\n", + " exec(prefix + \"\\n return b\\nq['board'] = my_example()\")\n", + " display(draw_board(q[\"board\"].board.grid, i))\n", + " i += 1\n", + "\n", + "# Animate the outputs as a GIF\n", + "def animate(i):\n", + " images = []\n", + " for i in range(i):\n", + " images.append(imageio.v2.imread(f\"pic{i}.png\"))\n", + " return imageio.v2.mimsave('movie.gif', images, **{ 'duration': 0.5 })\n", + "animate(i)\n", + "display(Image(\"movie.gif\"))\n", + "\n", + "\n", + "# Print the number of tokens used\n", + "print(\"Input Tokens:\", num_tokens_from_string(my_prompt))\n", + "print(\"Output Tokens:\", num_tokens_from_string(prefix))" + ] + } + ], + "metadata": { + "colab": { + "provenance": [], + "authorship_tag": "ABX9TyMCVv6YyI0lCdACYaFERyNc", + "include_colab_link": true + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "name": "python" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} \ No newline at end of file