Created
September 1, 2021 02:52
-
-
Save csferrie/c991721dd452cabcae6e3e6b243bb1a2 to your computer and use it in GitHub Desktop.
Quantum tic-tac-toe
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"nbformat": 4, | |
"nbformat_minor": 0, | |
"metadata": { | |
"colab": { | |
"name": "Quantum tic-tac-toe", | |
"provenance": [], | |
"collapsed_sections": [ | |
"gyEJrV2sCI2Z", | |
"IgpFKof_CpMy" | |
], | |
"include_colab_link": true | |
}, | |
"kernelspec": { | |
"name": "python3", | |
"display_name": "Python 3" | |
}, | |
"language_info": { | |
"name": "python" | |
}, | |
"widgets": { | |
"application/vnd.jupyter.widget-state+json": { | |
"0ebdc9c344f047c8957ea76e690fe2b5": { | |
"model_module": "@jupyter-widgets/controls", | |
"model_name": "ButtonModel", | |
"model_module_version": "1.5.0", | |
"state": { | |
"_view_name": "ButtonView", | |
"style": "IPY_MODEL_da094b428c3c420d95ff4e818c68d5f8", | |
"_dom_classes": [], | |
"description": "Measure", | |
"_model_name": "ButtonModel", | |
"button_style": "", | |
"_view_module": "@jupyter-widgets/controls", | |
"_model_module_version": "1.5.0", | |
"tooltip": "", | |
"_view_count": null, | |
"disabled": false, | |
"_view_module_version": "1.5.0", | |
"layout": "IPY_MODEL_9b8e387da82b4f5f87f9d42f4a79714f", | |
"_model_module": "@jupyter-widgets/controls", | |
"icon": "" | |
} | |
}, | |
"da094b428c3c420d95ff4e818c68d5f8": { | |
"model_module": "@jupyter-widgets/controls", | |
"model_name": "ButtonStyleModel", | |
"model_module_version": "1.5.0", | |
"state": { | |
"_view_name": "StyleView", | |
"_model_name": "ButtonStyleModel", | |
"_view_module": "@jupyter-widgets/base", | |
"_model_module_version": "1.5.0", | |
"_view_count": null, | |
"button_color": null, | |
"font_weight": "", | |
"_view_module_version": "1.2.0", | |
"_model_module": "@jupyter-widgets/controls" | |
} | |
}, | |
"9b8e387da82b4f5f87f9d42f4a79714f": { | |
"model_module": "@jupyter-widgets/base", | |
"model_name": "LayoutModel", | |
"model_module_version": "1.2.0", | |
"state": { | |
"_view_name": "LayoutView", | |
"grid_template_rows": null, | |
"right": null, | |
"justify_content": null, | |
"_view_module": "@jupyter-widgets/base", | |
"overflow": null, | |
"_model_module_version": "1.2.0", | |
"_view_count": null, | |
"flex_flow": null, | |
"width": "86px", | |
"min_width": null, | |
"border": null, | |
"align_items": null, | |
"bottom": null, | |
"_model_module": "@jupyter-widgets/base", | |
"top": null, | |
"grid_column": null, | |
"overflow_y": null, | |
"overflow_x": null, | |
"grid_auto_flow": null, | |
"grid_area": null, | |
"grid_template_columns": null, | |
"flex": null, | |
"_model_name": "LayoutModel", | |
"justify_items": null, | |
"grid_row": null, | |
"max_height": null, | |
"align_content": null, | |
"visibility": null, | |
"align_self": null, | |
"height": "30px", | |
"min_height": null, | |
"padding": null, | |
"grid_auto_rows": null, | |
"grid_gap": null, | |
"max_width": null, | |
"order": null, | |
"_view_module_version": "1.2.0", | |
"grid_template_areas": null, | |
"object_position": null, | |
"object_fit": null, | |
"grid_auto_columns": null, | |
"margin": null, | |
"display": null, | |
"left": null | |
} | |
}, | |
"e4e5f00f24b84853a94b538b0912f92d": { | |
"model_module": "@jupyter-widgets/controls", | |
"model_name": "ButtonModel", | |
"model_module_version": "1.5.0", | |
"state": { | |
"_view_name": "ButtonView", | |
"style": "IPY_MODEL_fe8a3c73ec8b437690166893b77e2b5f", | |
"_dom_classes": [], | |
"description": "Not", | |
"_model_name": "ButtonModel", | |
"button_style": "", | |
"_view_module": "@jupyter-widgets/controls", | |
"_model_module_version": "1.5.0", | |
"tooltip": "", | |
"_view_count": null, | |
"disabled": false, | |
"_view_module_version": "1.5.0", | |
"layout": "IPY_MODEL_a6884d6cebbe49c19252f096a151cc76", | |
"_model_module": "@jupyter-widgets/controls", | |
"icon": "" | |
} | |
}, | |
"fe8a3c73ec8b437690166893b77e2b5f": { | |
"model_module": "@jupyter-widgets/controls", | |
"model_name": "ButtonStyleModel", | |
"model_module_version": "1.5.0", | |
"state": { | |
"_view_name": "StyleView", | |
"_model_name": "ButtonStyleModel", | |
"_view_module": "@jupyter-widgets/base", | |
"_model_module_version": "1.5.0", | |
"_view_count": null, | |
"button_color": null, | |
"font_weight": "", | |
"_view_module_version": "1.2.0", | |
"_model_module": "@jupyter-widgets/controls" | |
} | |
}, | |
"a6884d6cebbe49c19252f096a151cc76": { | |
"model_module": "@jupyter-widgets/base", | |
"model_name": "LayoutModel", | |
"model_module_version": "1.2.0", | |
"state": { | |
"_view_name": "LayoutView", | |
"grid_template_rows": null, | |
"right": null, | |
"justify_content": null, | |
"_view_module": "@jupyter-widgets/base", | |
"overflow": null, | |
"_model_module_version": "1.2.0", | |
"_view_count": null, | |
"flex_flow": null, | |
"width": "86px", | |
"min_width": null, | |
"border": null, | |
"align_items": null, | |
"bottom": null, | |
"_model_module": "@jupyter-widgets/base", | |
"top": null, | |
"grid_column": null, | |
"overflow_y": null, | |
"overflow_x": null, | |
"grid_auto_flow": null, | |
"grid_area": null, | |
"grid_template_columns": null, | |
"flex": null, | |
"_model_name": "LayoutModel", | |
"justify_items": null, | |
"grid_row": null, | |
"max_height": null, | |
"align_content": null, | |
"visibility": null, | |
"align_self": null, | |
"height": "30px", | |
"min_height": null, | |
"padding": null, | |
"grid_auto_rows": null, | |
"grid_gap": null, | |
"max_width": null, | |
"order": null, | |
"_view_module_version": "1.2.0", | |
"grid_template_areas": null, | |
"object_position": null, | |
"object_fit": null, | |
"grid_auto_columns": null, | |
"margin": null, | |
"display": null, | |
"left": null | |
} | |
}, | |
"d00f85b64cc04198a76e54b1922d1c23": { | |
"model_module": "@jupyter-widgets/controls", | |
"model_name": "ButtonModel", | |
"model_module_version": "1.5.0", | |
"state": { | |
"_view_name": "ButtonView", | |
"style": "IPY_MODEL_6856d155ca6d4bccba58d22785c3842f", | |
"_dom_classes": [], | |
"description": "O", | |
"_model_name": "ButtonModel", | |
"button_style": "", | |
"_view_module": "@jupyter-widgets/controls", | |
"_model_module_version": "1.5.0", | |
"tooltip": "", | |
"_view_count": null, | |
"disabled": false, | |
"_view_module_version": "1.5.0", | |
"layout": "IPY_MODEL_a5f8db8b5afc45dab3add7dcc550074f", | |
"_model_module": "@jupyter-widgets/controls", | |
"icon": "" | |
} | |
}, | |
"6856d155ca6d4bccba58d22785c3842f": { | |
"model_module": "@jupyter-widgets/controls", | |
"model_name": "ButtonStyleModel", | |
"model_module_version": "1.5.0", | |
"state": { | |
"_view_name": "StyleView", | |
"_model_name": "ButtonStyleModel", | |
"_view_module": "@jupyter-widgets/base", | |
"_model_module_version": "1.5.0", | |
"_view_count": null, | |
"button_color": null, | |
"font_weight": "", | |
"_view_module_version": "1.2.0", | |
"_model_module": "@jupyter-widgets/controls" | |
} | |
}, | |
"a5f8db8b5afc45dab3add7dcc550074f": { | |
"model_module": "@jupyter-widgets/base", | |
"model_name": "LayoutModel", | |
"model_module_version": "1.2.0", | |
"state": { | |
"_view_name": "LayoutView", | |
"grid_template_rows": null, | |
"right": null, | |
"justify_content": null, | |
"_view_module": "@jupyter-widgets/base", | |
"overflow": null, | |
"_model_module_version": "1.2.0", | |
"_view_count": null, | |
"flex_flow": null, | |
"width": "86px", | |
"min_width": null, | |
"border": null, | |
"align_items": null, | |
"bottom": null, | |
"_model_module": "@jupyter-widgets/base", | |
"top": null, | |
"grid_column": null, | |
"overflow_y": null, | |
"overflow_x": null, | |
"grid_auto_flow": null, | |
"grid_area": null, | |
"grid_template_columns": null, | |
"flex": null, | |
"_model_name": "LayoutModel", | |
"justify_items": null, | |
"grid_row": null, | |
"max_height": null, | |
"align_content": null, | |
"visibility": null, | |
"align_self": null, | |
"height": "30px", | |
"min_height": null, | |
"padding": null, | |
"grid_auto_rows": null, | |
"grid_gap": null, | |
"max_width": null, | |
"order": null, | |
"_view_module_version": "1.2.0", | |
"grid_template_areas": null, | |
"object_position": null, | |
"object_fit": null, | |
"grid_auto_columns": null, | |
"margin": null, | |
"display": null, | |
"left": null | |
} | |
}, | |
"a34d212dab71411192f00daf2b107436": { | |
"model_module": "@jupyter-widgets/controls", | |
"model_name": "ButtonModel", | |
"model_module_version": "1.5.0", | |
"state": { | |
"_view_name": "ButtonView", | |
"style": "IPY_MODEL_d0acc497af144d328c93023b3786e4cc", | |
"_dom_classes": [], | |
"description": "X", | |
"_model_name": "ButtonModel", | |
"button_style": "", | |
"_view_module": "@jupyter-widgets/controls", | |
"_model_module_version": "1.5.0", | |
"tooltip": "", | |
"_view_count": null, | |
"disabled": false, | |
"_view_module_version": "1.5.0", | |
"layout": "IPY_MODEL_c6ba9563f1a0492ba9d333ec016ed118", | |
"_model_module": "@jupyter-widgets/controls", | |
"icon": "" | |
} | |
}, | |
"d0acc497af144d328c93023b3786e4cc": { | |
"model_module": "@jupyter-widgets/controls", | |
"model_name": "ButtonStyleModel", | |
"model_module_version": "1.5.0", | |
"state": { | |
"_view_name": "StyleView", | |
"_model_name": "ButtonStyleModel", | |
"_view_module": "@jupyter-widgets/base", | |
"_model_module_version": "1.5.0", | |
"_view_count": null, | |
"button_color": null, | |
"font_weight": "", | |
"_view_module_version": "1.2.0", | |
"_model_module": "@jupyter-widgets/controls" | |
} | |
}, | |
"c6ba9563f1a0492ba9d333ec016ed118": { | |
"model_module": "@jupyter-widgets/base", | |
"model_name": "LayoutModel", | |
"model_module_version": "1.2.0", | |
"state": { | |
"_view_name": "LayoutView", | |
"grid_template_rows": null, | |
"right": null, | |
"justify_content": null, | |
"_view_module": "@jupyter-widgets/base", | |
"overflow": null, | |
"_model_module_version": "1.2.0", | |
"_view_count": null, | |
"flex_flow": null, | |
"width": "86px", | |
"min_width": null, | |
"border": null, | |
"align_items": null, | |
"bottom": null, | |
"_model_module": "@jupyter-widgets/base", | |
"top": null, | |
"grid_column": null, | |
"overflow_y": null, | |
"overflow_x": null, | |
"grid_auto_flow": null, | |
"grid_area": null, | |
"grid_template_columns": null, | |
"flex": null, | |
"_model_name": "LayoutModel", | |
"justify_items": null, | |
"grid_row": null, | |
"max_height": null, | |
"align_content": null, | |
"visibility": null, | |
"align_self": null, | |
"height": "30px", | |
"min_height": null, | |
"padding": null, | |
"grid_auto_rows": null, | |
"grid_gap": null, | |
"max_width": null, | |
"order": null, | |
"_view_module_version": "1.2.0", | |
"grid_template_areas": null, | |
"object_position": null, | |
"object_fit": null, | |
"grid_auto_columns": null, | |
"margin": null, | |
"display": null, | |
"left": null | |
} | |
}, | |
"f86635733bdd4c808ec71e36132ff21d": { | |
"model_module": "@jupyter-widgets/controls", | |
"model_name": "ButtonModel", | |
"model_module_version": "1.5.0", | |
"state": { | |
"_view_name": "ButtonView", | |
"style": "IPY_MODEL_ddc629a1bf094dac9024aff362a9f43b", | |
"_dom_classes": [], | |
"description": "SWAP", | |
"_model_name": "ButtonModel", | |
"button_style": "", | |
"_view_module": "@jupyter-widgets/controls", | |
"_model_module_version": "1.5.0", | |
"tooltip": "", | |
"_view_count": null, | |
"disabled": false, | |
"_view_module_version": "1.5.0", | |
"layout": "IPY_MODEL_f2e7cf3d13674c4696d542593fed7527", | |
"_model_module": "@jupyter-widgets/controls", | |
"icon": "" | |
} | |
}, | |
"ddc629a1bf094dac9024aff362a9f43b": { | |
"model_module": "@jupyter-widgets/controls", | |
"model_name": "ButtonStyleModel", | |
"model_module_version": "1.5.0", | |
"state": { | |
"_view_name": "StyleView", | |
"_model_name": "ButtonStyleModel", | |
"_view_module": "@jupyter-widgets/base", | |
"_model_module_version": "1.5.0", | |
"_view_count": null, | |
"button_color": null, | |
"font_weight": "", | |
"_view_module_version": "1.2.0", | |
"_model_module": "@jupyter-widgets/controls" | |
} | |
}, | |
"f2e7cf3d13674c4696d542593fed7527": { | |
"model_module": "@jupyter-widgets/base", | |
"model_name": "LayoutModel", | |
"model_module_version": "1.2.0", | |
"state": { | |
"_view_name": "LayoutView", | |
"grid_template_rows": null, | |
"right": null, | |
"justify_content": null, | |
"_view_module": "@jupyter-widgets/base", | |
"overflow": null, | |
"_model_module_version": "1.2.0", | |
"_view_count": null, | |
"flex_flow": null, | |
"width": "86px", | |
"min_width": null, | |
"border": null, | |
"align_items": null, | |
"bottom": null, | |
"_model_module": "@jupyter-widgets/base", | |
"top": null, | |
"grid_column": null, | |
"overflow_y": null, | |
"overflow_x": null, | |
"grid_auto_flow": null, | |
"grid_area": null, | |
"grid_template_columns": null, | |
"flex": null, | |
"_model_name": "LayoutModel", | |
"justify_items": null, | |
"grid_row": null, | |
"max_height": null, | |
"align_content": null, | |
"visibility": null, | |
"align_self": null, | |
"height": "30px", | |
"min_height": null, | |
"padding": null, | |
"grid_auto_rows": null, | |
"grid_gap": null, | |
"max_width": null, | |
"order": null, | |
"_view_module_version": "1.2.0", | |
"grid_template_areas": null, | |
"object_position": null, | |
"object_fit": null, | |
"grid_auto_columns": null, | |
"margin": null, | |
"display": null, | |
"left": null | |
} | |
}, | |
"58f5af7d21d04dffad3eafc11e7c8e8b": { | |
"model_module": "@jupyter-widgets/controls", | |
"model_name": "ButtonModel", | |
"model_module_version": "1.5.0", | |
"state": { | |
"_view_name": "ButtonView", | |
"style": "IPY_MODEL_34b0815f861b4b03a3be0016bb7ec8a1", | |
"_dom_classes": [], | |
"description": "0", | |
"_model_name": "ButtonModel", | |
"button_style": "", | |
"_view_module": "@jupyter-widgets/controls", | |
"_model_module_version": "1.5.0", | |
"tooltip": "", | |
"_view_count": null, | |
"disabled": false, | |
"_view_module_version": "1.5.0", | |
"layout": "IPY_MODEL_15d9926e8b414f6f8790d08ffd597f6a", | |
"_model_module": "@jupyter-widgets/controls", | |
"icon": "" | |
} | |
}, | |
"34b0815f861b4b03a3be0016bb7ec8a1": { | |
"model_module": "@jupyter-widgets/controls", | |
"model_name": "ButtonStyleModel", | |
"model_module_version": "1.5.0", | |
"state": { | |
"_view_name": "StyleView", | |
"_model_name": "ButtonStyleModel", | |
"_view_module": "@jupyter-widgets/base", | |
"_model_module_version": "1.5.0", | |
"_view_count": null, | |
"button_color": null, | |
"font_weight": "", | |
"_view_module_version": "1.2.0", | |
"_model_module": "@jupyter-widgets/controls" | |
} | |
}, | |
"15d9926e8b414f6f8790d08ffd597f6a": { | |
"model_module": "@jupyter-widgets/base", | |
"model_name": "LayoutModel", | |
"model_module_version": "1.2.0", | |
"state": { | |
"_view_name": "LayoutView", | |
"grid_template_rows": null, | |
"right": null, | |
"justify_content": null, | |
"_view_module": "@jupyter-widgets/base", | |
"overflow": null, | |
"_model_module_version": "1.2.0", | |
"_view_count": null, | |
"flex_flow": null, | |
"width": null, | |
"min_width": null, | |
"border": null, | |
"align_items": null, | |
"bottom": null, | |
"_model_module": "@jupyter-widgets/base", | |
"top": null, | |
"grid_column": null, | |
"overflow_y": null, | |
"overflow_x": null, | |
"grid_auto_flow": null, | |
"grid_area": null, | |
"grid_template_columns": null, | |
"flex": null, | |
"_model_name": "LayoutModel", | |
"justify_items": null, | |
"grid_row": null, | |
"max_height": null, | |
"align_content": null, | |
"visibility": null, | |
"align_self": null, | |
"height": null, | |
"min_height": null, | |
"padding": null, | |
"grid_auto_rows": null, | |
"grid_gap": null, | |
"max_width": null, | |
"order": null, | |
"_view_module_version": "1.2.0", | |
"grid_template_areas": null, | |
"object_position": null, | |
"object_fit": null, | |
"grid_auto_columns": null, | |
"margin": null, | |
"display": null, | |
"left": null | |
} | |
}, | |
"d6eb0b38e3b84650a6600c30a9c3e3a7": { | |
"model_module": "@jupyter-widgets/controls", | |
"model_name": "ButtonModel", | |
"model_module_version": "1.5.0", | |
"state": { | |
"_view_name": "ButtonView", | |
"style": "IPY_MODEL_5c3f514da3d64986a579317d1bfe2ae8", | |
"_dom_classes": [], | |
"description": "1", | |
"_model_name": "ButtonModel", | |
"button_style": "", | |
"_view_module": "@jupyter-widgets/controls", | |
"_model_module_version": "1.5.0", | |
"tooltip": "", | |
"_view_count": null, | |
"disabled": false, | |
"_view_module_version": "1.5.0", | |
"layout": "IPY_MODEL_5f2055e953f841dfbb52136eb93790c7", | |
"_model_module": "@jupyter-widgets/controls", | |
"icon": "" | |
} | |
}, | |
"5c3f514da3d64986a579317d1bfe2ae8": { | |
"model_module": "@jupyter-widgets/controls", | |
"model_name": "ButtonStyleModel", | |
"model_module_version": "1.5.0", | |
"state": { | |
"_view_name": "StyleView", | |
"_model_name": "ButtonStyleModel", | |
"_view_module": "@jupyter-widgets/base", | |
"_model_module_version": "1.5.0", | |
"_view_count": null, | |
"button_color": null, | |
"font_weight": "", | |
"_view_module_version": "1.2.0", | |
"_model_module": "@jupyter-widgets/controls" | |
} | |
}, | |
"5f2055e953f841dfbb52136eb93790c7": { | |
"model_module": "@jupyter-widgets/base", | |
"model_name": "LayoutModel", | |
"model_module_version": "1.2.0", | |
"state": { | |
"_view_name": "LayoutView", | |
"grid_template_rows": null, | |
"right": null, | |
"justify_content": null, | |
"_view_module": "@jupyter-widgets/base", | |
"overflow": null, | |
"_model_module_version": "1.2.0", | |
"_view_count": null, | |
"flex_flow": null, | |
"width": null, | |
"min_width": null, | |
"border": null, | |
"align_items": null, | |
"bottom": null, | |
"_model_module": "@jupyter-widgets/base", | |
"top": null, | |
"grid_column": null, | |
"overflow_y": null, | |
"overflow_x": null, | |
"grid_auto_flow": null, | |
"grid_area": null, | |
"grid_template_columns": null, | |
"flex": null, | |
"_model_name": "LayoutModel", | |
"justify_items": null, | |
"grid_row": null, | |
"max_height": null, | |
"align_content": null, | |
"visibility": null, | |
"align_self": null, | |
"height": null, | |
"min_height": null, | |
"padding": null, | |
"grid_auto_rows": null, | |
"grid_gap": null, | |
"max_width": null, | |
"order": null, | |
"_view_module_version": "1.2.0", | |
"grid_template_areas": null, | |
"object_position": null, | |
"object_fit": null, | |
"grid_auto_columns": null, | |
"margin": null, | |
"display": null, | |
"left": null | |
} | |
}, | |
"91df9f52f4cb4821aa99c3c3331f5ea4": { | |
"model_module": "@jupyter-widgets/controls", | |
"model_name": "ButtonModel", | |
"model_module_version": "1.5.0", | |
"state": { | |
"_view_name": "ButtonView", | |
"style": "IPY_MODEL_38c1fb319e524669b2568b4ec2a61e28", | |
"_dom_classes": [], | |
"description": "2", | |
"_model_name": "ButtonModel", | |
"button_style": "", | |
"_view_module": "@jupyter-widgets/controls", | |
"_model_module_version": "1.5.0", | |
"tooltip": "", | |
"_view_count": null, | |
"disabled": false, | |
"_view_module_version": "1.5.0", | |
"layout": "IPY_MODEL_064fb9ad039b406e9935dd4ab5c52c65", | |
"_model_module": "@jupyter-widgets/controls", | |
"icon": "" | |
} | |
}, | |
"38c1fb319e524669b2568b4ec2a61e28": { | |
"model_module": "@jupyter-widgets/controls", | |
"model_name": "ButtonStyleModel", | |
"model_module_version": "1.5.0", | |
"state": { | |
"_view_name": "StyleView", | |
"_model_name": "ButtonStyleModel", | |
"_view_module": "@jupyter-widgets/base", | |
"_model_module_version": "1.5.0", | |
"_view_count": null, | |
"button_color": null, | |
"font_weight": "", | |
"_view_module_version": "1.2.0", | |
"_model_module": "@jupyter-widgets/controls" | |
} | |
}, | |
"064fb9ad039b406e9935dd4ab5c52c65": { | |
"model_module": "@jupyter-widgets/base", | |
"model_name": "LayoutModel", | |
"model_module_version": "1.2.0", | |
"state": { | |
"_view_name": "LayoutView", | |
"grid_template_rows": null, | |
"right": null, | |
"justify_content": null, | |
"_view_module": "@jupyter-widgets/base", | |
"overflow": null, | |
"_model_module_version": "1.2.0", | |
"_view_count": null, | |
"flex_flow": null, | |
"width": null, | |
"min_width": null, | |
"border": null, | |
"align_items": null, | |
"bottom": null, | |
"_model_module": "@jupyter-widgets/base", | |
"top": null, | |
"grid_column": null, | |
"overflow_y": null, | |
"overflow_x": null, | |
"grid_auto_flow": null, | |
"grid_area": null, | |
"grid_template_columns": null, | |
"flex": null, | |
"_model_name": "LayoutModel", | |
"justify_items": null, | |
"grid_row": null, | |
"max_height": null, | |
"align_content": null, | |
"visibility": null, | |
"align_self": null, | |
"height": null, | |
"min_height": null, | |
"padding": null, | |
"grid_auto_rows": null, | |
"grid_gap": null, | |
"max_width": null, | |
"order": null, | |
"_view_module_version": "1.2.0", | |
"grid_template_areas": null, | |
"object_position": null, | |
"object_fit": null, | |
"grid_auto_columns": null, | |
"margin": null, | |
"display": null, | |
"left": null | |
} | |
}, | |
"ab8eee491e06467ca7ba925007931cbf": { | |
"model_module": "@jupyter-widgets/controls", | |
"model_name": "ButtonModel", | |
"model_module_version": "1.5.0", | |
"state": { | |
"_view_name": "ButtonView", | |
"style": "IPY_MODEL_fee9ede3c5b14298993b17a8c5e9859d", | |
"_dom_classes": [], | |
"description": "3", | |
"_model_name": "ButtonModel", | |
"button_style": "", | |
"_view_module": "@jupyter-widgets/controls", | |
"_model_module_version": "1.5.0", | |
"tooltip": "", | |
"_view_count": null, | |
"disabled": false, | |
"_view_module_version": "1.5.0", | |
"layout": "IPY_MODEL_43a6e0c6e837415ab1dd4b42f84957f3", | |
"_model_module": "@jupyter-widgets/controls", | |
"icon": "" | |
} | |
}, | |
"fee9ede3c5b14298993b17a8c5e9859d": { | |
"model_module": "@jupyter-widgets/controls", | |
"model_name": "ButtonStyleModel", | |
"model_module_version": "1.5.0", | |
"state": { | |
"_view_name": "StyleView", | |
"_model_name": "ButtonStyleModel", | |
"_view_module": "@jupyter-widgets/base", | |
"_model_module_version": "1.5.0", | |
"_view_count": null, | |
"button_color": null, | |
"font_weight": "", | |
"_view_module_version": "1.2.0", | |
"_model_module": "@jupyter-widgets/controls" | |
} | |
}, | |
"43a6e0c6e837415ab1dd4b42f84957f3": { | |
"model_module": "@jupyter-widgets/base", | |
"model_name": "LayoutModel", | |
"model_module_version": "1.2.0", | |
"state": { | |
"_view_name": "LayoutView", | |
"grid_template_rows": null, | |
"right": null, | |
"justify_content": null, | |
"_view_module": "@jupyter-widgets/base", | |
"overflow": null, | |
"_model_module_version": "1.2.0", | |
"_view_count": null, | |
"flex_flow": null, | |
"width": null, | |
"min_width": null, | |
"border": null, | |
"align_items": null, | |
"bottom": null, | |
"_model_module": "@jupyter-widgets/base", | |
"top": null, | |
"grid_column": null, | |
"overflow_y": null, | |
"overflow_x": null, | |
"grid_auto_flow": null, | |
"grid_area": null, | |
"grid_template_columns": null, | |
"flex": null, | |
"_model_name": "LayoutModel", | |
"justify_items": null, | |
"grid_row": null, | |
"max_height": null, | |
"align_content": null, | |
"visibility": null, | |
"align_self": null, | |
"height": null, | |
"min_height": null, | |
"padding": null, | |
"grid_auto_rows": null, | |
"grid_gap": null, | |
"max_width": null, | |
"order": null, | |
"_view_module_version": "1.2.0", | |
"grid_template_areas": null, | |
"object_position": null, | |
"object_fit": null, | |
"grid_auto_columns": null, | |
"margin": null, | |
"display": null, | |
"left": null | |
} | |
}, | |
"8ae381e6a57e4dd5b7af9273e2a99706": { | |
"model_module": "@jupyter-widgets/controls", | |
"model_name": "ButtonModel", | |
"model_module_version": "1.5.0", | |
"state": { | |
"_view_name": "ButtonView", | |
"style": "IPY_MODEL_8d1b8f69967c4df69a2191f2eb419a48", | |
"_dom_classes": [], | |
"description": "Replay", | |
"_model_name": "ButtonModel", | |
"button_style": "", | |
"_view_module": "@jupyter-widgets/controls", | |
"_model_module_version": "1.5.0", | |
"tooltip": "", | |
"_view_count": null, | |
"disabled": false, | |
"_view_module_version": "1.5.0", | |
"layout": "IPY_MODEL_f9d9e7706d9a4221aefaf03bb775e1f2", | |
"_model_module": "@jupyter-widgets/controls", | |
"icon": "" | |
} | |
}, | |
"8d1b8f69967c4df69a2191f2eb419a48": { | |
"model_module": "@jupyter-widgets/controls", | |
"model_name": "ButtonStyleModel", | |
"model_module_version": "1.5.0", | |
"state": { | |
"_view_name": "StyleView", | |
"_model_name": "ButtonStyleModel", | |
"_view_module": "@jupyter-widgets/base", | |
"_model_module_version": "1.5.0", | |
"_view_count": null, | |
"button_color": null, | |
"font_weight": "", | |
"_view_module_version": "1.2.0", | |
"_model_module": "@jupyter-widgets/controls" | |
} | |
}, | |
"f9d9e7706d9a4221aefaf03bb775e1f2": { | |
"model_module": "@jupyter-widgets/base", | |
"model_name": "LayoutModel", | |
"model_module_version": "1.2.0", | |
"state": { | |
"_view_name": "LayoutView", | |
"grid_template_rows": null, | |
"right": null, | |
"justify_content": null, | |
"_view_module": "@jupyter-widgets/base", | |
"overflow": null, | |
"_model_module_version": "1.2.0", | |
"_view_count": null, | |
"flex_flow": null, | |
"width": null, | |
"min_width": null, | |
"border": null, | |
"align_items": null, | |
"bottom": null, | |
"_model_module": "@jupyter-widgets/base", | |
"top": null, | |
"grid_column": null, | |
"overflow_y": null, | |
"overflow_x": null, | |
"grid_auto_flow": null, | |
"grid_area": null, | |
"grid_template_columns": null, | |
"flex": null, | |
"_model_name": "LayoutModel", | |
"justify_items": null, | |
"grid_row": null, | |
"max_height": null, | |
"align_content": null, | |
"visibility": null, | |
"align_self": null, | |
"height": null, | |
"min_height": null, | |
"padding": null, | |
"grid_auto_rows": null, | |
"grid_gap": null, | |
"max_width": null, | |
"order": null, | |
"_view_module_version": "1.2.0", | |
"grid_template_areas": null, | |
"object_position": null, | |
"object_fit": null, | |
"grid_auto_columns": null, | |
"margin": null, | |
"display": null, | |
"left": null | |
} | |
} | |
} | |
} | |
}, | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "view-in-github", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"<a href=\"https://colab.research.google.com/gist/csferrie/c991721dd452cabcae6e3e6b243bb1a2/quantum-tic-tac-toe.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "uIao4U_JvD8J" | |
}, | |
"source": [ | |
"# Quantum Tic-tac-toe on a quantum computer\n", | |
"\n", | |
"**Chris Ferrie** ([Centre for Quantum Software and Information](https://twitter.com/uts_qsi), UTS)\n", | |
"\n", | |
"Twitter: [@csferrie](https://twitter.com/csferrie) | Web: [csferrie.com](https://csferrie.com/)\n", | |
"\n", | |
"*Special thanks to UTS Software Engineering student interns Derek Ma, Sacha Gilchrist, Renz Sinchongco, and Josh McMillan for creating the interactive elements of the game.*\n", | |
"\n", | |
"\n" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "gyEJrV2sCI2Z" | |
}, | |
"source": [ | |
"## Preamble\n", | |
"\n", | |
"Run this cell to import all the necessary libraries and set up the game logic." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "l63wjYY_oKij", | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"outputId": "35095b8a-a506-4048-d022-b4574e2624b7" | |
}, | |
"source": [ | |
"!pip install qiskit --quiet\n", | |
"!pip install pylatexenc --quiet\n", | |
"\n", | |
"from qiskit import *\n", | |
"from qiskit.visualization import plot_histogram\n", | |
"from google.colab import widgets\n", | |
"from __future__ import print_function\n", | |
"from ipywidgets import interact, interactive, fixed, interact_manual, Button, Layout\n", | |
"import ipywidgets\n", | |
"import pandas as pd\n", | |
"import math\n", | |
"import numpy as np\n", | |
"import random\n", | |
"from IPython.display import clear_output" | |
], | |
"execution_count": 1, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"text": [ | |
"\u001b[K |████████████████████████████████| 6.1 MB 20.3 MB/s \n", | |
"\u001b[K |████████████████████████████████| 18.0 MB 129 kB/s \n", | |
"\u001b[K |████████████████████████████████| 235 kB 60.4 MB/s \n", | |
"\u001b[K |████████████████████████████████| 207 kB 66.1 MB/s \n", | |
"\u001b[K |████████████████████████████████| 2.1 MB 33.0 MB/s \n", | |
"\u001b[K |████████████████████████████████| 200 kB 62.5 MB/s \n", | |
"\u001b[K |████████████████████████████████| 1.4 MB 27.7 MB/s \n", | |
"\u001b[K |████████████████████████████████| 635 kB 50.3 MB/s \n", | |
"\u001b[K |████████████████████████████████| 52 kB 1.7 MB/s \n", | |
"\u001b[K |████████████████████████████████| 33.9 MB 14 kB/s \n", | |
"\u001b[K |████████████████████████████████| 943 kB 13.7 MB/s \n", | |
"\u001b[K |████████████████████████████████| 49 kB 3.4 MB/s \n", | |
"\u001b[K |████████████████████████████████| 3.0 MB 22.5 MB/s \n", | |
"\u001b[K |████████████████████████████████| 6.3 MB 73.8 MB/s \n", | |
"\u001b[?25h Building wheel for qiskit (setup.py) ... \u001b[?25l\u001b[?25hdone\n", | |
" Building wheel for dlx (setup.py) ... \u001b[?25l\u001b[?25hdone\n", | |
" Building wheel for docplex (setup.py) ... \u001b[?25l\u001b[?25hdone\n", | |
" Building wheel for python-constraint (setup.py) ... \u001b[?25l\u001b[?25hdone\n", | |
" Building wheel for yfinance (setup.py) ... \u001b[?25l\u001b[?25hdone\n", | |
"\u001b[K |████████████████████████████████| 162 kB 28.4 MB/s \n", | |
"\u001b[?25h Building wheel for pylatexenc (setup.py) ... \u001b[?25l\u001b[?25hdone\n" | |
], | |
"name": "stdout" | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "k4UU2QqeDEQ-" | |
}, | |
"source": [ | |
"The code for the game comprises the two classes below. Edit at your peril. But, also, edit if you want to change the rules of the game!" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "n_wIVCJbB7Zb" | |
}, | |
"source": [ | |
"class Board:\n", | |
" def __init__(self):\n", | |
" self.qc = QuantumCircuit(game_size, game_size)\n", | |
" self.function = ''\n", | |
" self.target = -1\n", | |
" self.tab = []\n", | |
" self.winsX = 0\n", | |
" self.winsO = 0\n", | |
" \n", | |
" for idx in range(0, game_size):\n", | |
" self.tab.append({'default':str(idx), 'player':' '})\n", | |
" self.qc.reset(idx)\n", | |
" self.qc.h(idx)\n", | |
" self.qc.barrier()\n", | |
" \n", | |
" def make_move(self, cell):\n", | |
" if self.function == 'Not':\n", | |
" self.qc.x(cell)\n", | |
" self.tab[int(cell)]['player'] += 'N - ' \n", | |
" elif self.function == 'O':\n", | |
" self.qc.ry(1*np.pi/2, cell)\n", | |
" self.tab[int(cell)]['player'] += \"O - \"\n", | |
" elif self.function == 'X':\n", | |
" self.qc.ry(1*-np.pi/2, cell)\n", | |
" self.tab[int(cell)]['player'] += \"X - \" \n", | |
" elif self.function == 'SWAP' and self.target != cell:\n", | |
" if self.target == cell:\n", | |
" self.target = -1\n", | |
" else:\n", | |
" self.qc.swap(cell, self.target)\n", | |
" self.tab[int(cell)]['player'] += \"S - \" \n", | |
" self.tab[int(self.target)]['player'] += \"S - \"\n", | |
" \n", | |
" def results(self):\n", | |
" display(self.qc.draw('mpl'))\n", | |
" self.qc = QuantumCircuit(game_size, game_size)\n", | |
"\n", | |
" def display(self):\n", | |
" display(self.qc.draw('mpl'))\n", | |
" \n", | |
" def measure(self):\n", | |
" self.qc.barrier()\n", | |
" for i in range(0,game_size):\n", | |
" self.qc.measure(i, i)\n", | |
" \n", | |
" job = qiskit.execute(self.qc, backend, shots=1, memory=True)\n", | |
" output = job.result().get_memory()[0]\n", | |
" \n", | |
" for i in range(0,game_size):\n", | |
" if output[game_size-1-i] == '0':\n", | |
" self.tab[i]['player'] = 'X'\n", | |
" else:\n", | |
" self.tab[i]['player'] = 'O'\n", | |
" self.winsX = self.countWinners('X')\n", | |
" self.winsO = self.countWinners('O')\n", | |
"\n", | |
" def countWinners(self, player):\n", | |
" if game_size == 9:\n", | |
" winners = ((0,1,2),(3,4,5),(6,7,8),(0,3,6),(1,4,7),(2,5,8),(0,4,8),(2,4,6))\n", | |
" else:\n", | |
" winners = ((0,1),(2,3),(0,2),(1,3),(0,3),(1,2))\n", | |
" wins = 0\n", | |
" for i in range(len(winners)):\n", | |
" won = True\n", | |
" for j in range(len(winners[0])):\n", | |
" if not self.tab[winners[i][j]]['player'] == player:\n", | |
" won = False\n", | |
" if won:\n", | |
" wins = wins + 1\n", | |
" return wins\n", | |
" \n", | |
" def new(self):\n", | |
" self.tab.clear()\n", | |
" for idx in range(0,game_size):\n", | |
" self.tab.append({'default':str(idx), 'player':''})\n", | |
" self.qc.reset(idx)\n", | |
" self.qc.h(idx)\n", | |
" self.qc.barrier() " | |
], | |
"execution_count": 47, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "gNu5vJThoLIY" | |
}, | |
"source": [ | |
"class Game:\n", | |
" def __init__(self):\n", | |
" self.selecting = False\n", | |
" self.board = Board()\n", | |
" self.boardbutton_list = []\n", | |
" for i in range(0,game_size):\n", | |
" button = Button(description=str(i))\n", | |
" button.on_click(self.handle_game)\n", | |
" self.boardbutton_list.append(button)\n", | |
" \n", | |
" self.funcbutton_list = []\n", | |
" self.newButton('Measure')\n", | |
" self.newButton('Not')\n", | |
" self.newButton('O')\n", | |
" self.newButton('X')\n", | |
" self.newButton('SWAP')\n", | |
" self.printmenu()\n", | |
" self.printBoard()\n", | |
"\n", | |
" def newButton(self, name):\n", | |
" function = Button(description=name, layout=Layout(width='86px', height='30px'))\n", | |
" function.on_click(self.handle_game)\n", | |
" self.funcbutton_list.append(function)\n", | |
"\n", | |
" def handle_game(self, b):\n", | |
" try:\n", | |
" if b.description == 'Measure':\n", | |
" clear_output()\n", | |
" self.replay()\n", | |
" self.board.measure()\n", | |
" self.scoreboard()\n", | |
" self.printBoard() \n", | |
" self.board.results()\n", | |
" \n", | |
"\n", | |
" if b.description == 'Replay':\n", | |
" clear_output()\n", | |
" self.board.new()\n", | |
" self.printmenu()\n", | |
" self.printBoard()\n", | |
" \n", | |
" if int(b.description) >= 0:\n", | |
" if self.selecting:\n", | |
" self.board.target = int(b.description)\n", | |
" else:\n", | |
" clear_output()\n", | |
" self.printmenu()\n", | |
" self.board.make_move(int(b.description))\n", | |
" self.printBoard()\n", | |
" self.board.display()\n", | |
" self.selecting = False\n", | |
" except ValueError:\n", | |
" self.board.function = b.description\n", | |
" self.selecting = False\n", | |
" if self.board.function == 'SWAP':\n", | |
" self.selecting = True\n", | |
"\n", | |
" def printmenu(self):\n", | |
" grid = widgets.Grid(1, 5)\n", | |
" for (row, col) in grid:\n", | |
" display(self.funcbutton_list[col])\n", | |
"\n", | |
" def scoreboard(self):\n", | |
" print(\"X wins: \" + str(self.board.winsX) + \" O wins: \" + str(self.board.winsO))\n", | |
"\n", | |
" def replay(self):\n", | |
" rep = Button(description=\"Replay\")\n", | |
" rep.on_click(self.handle_game)\n", | |
" display(rep)\n", | |
"\n", | |
" def printBoard(self):\n", | |
" grid = widgets.Grid(1, int(np.sqrt(game_size)), header_row=True, header_column=True)\n", | |
" for row in range(int(np.sqrt(game_size))):\n", | |
" for (useless, col) in grid:\n", | |
" print(\"\\n\"+self.board.tab[col + row * int(np.sqrt(game_size))]['player']+\"\\n\")\n", | |
" display(self.boardbutton_list[col + row * int(np.sqrt(game_size))])" | |
], | |
"execution_count": 38, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "mEq7wBwTCRGz" | |
}, | |
"source": [ | |
"## Real Quantum Devices\n", | |
"\n", | |
"You'll need an account on [IBMQ](https://quantum-computing.ibm.com/) to play the game on a real quantum device.\n", | |
"\n", | |
"Ignore these cells if you don't want to run the game on a real quantum computer. " | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "wUG0Ly9hwh3C" | |
}, | |
"source": [ | |
"# Enable your account on Qiskit, replace 'My_API_Token' with your newly generated token\n", | |
"qiskit.IBMQ.save_account('My_API_Token', overwrite=True)\n", | |
"qiskit.IBMQ.load_account()\n", | |
"# After loading credentials we query the backends\n", | |
"qiskit.IBMQ.ibmq.providers()" | |
], | |
"execution_count": null, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "G7JIE0rlwlwC", | |
"outputId": "d6fba43e-f24b-4c0e-9641-ea66a07a114c" | |
}, | |
"source": [ | |
"provider = qiskit.IBMQ.get_provider(hub='ibm-q', group='open', project='main')\n", | |
"provider.backends()" | |
], | |
"execution_count": 50, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": [ | |
"[<IBMQSimulator('ibmq_qasm_simulator') from IBMQ(hub='ibm-q', group='open', project='main')>,\n", | |
" <IBMQBackend('ibmq_armonk') from IBMQ(hub='ibm-q', group='open', project='main')>,\n", | |
" <IBMQBackend('ibmq_santiago') from IBMQ(hub='ibm-q', group='open', project='main')>,\n", | |
" <IBMQBackend('ibmq_bogota') from IBMQ(hub='ibm-q', group='open', project='main')>,\n", | |
" <IBMQBackend('ibmq_lima') from IBMQ(hub='ibm-q', group='open', project='main')>,\n", | |
" <IBMQBackend('ibmq_belem') from IBMQ(hub='ibm-q', group='open', project='main')>,\n", | |
" <IBMQBackend('ibmq_quito') from IBMQ(hub='ibm-q', group='open', project='main')>,\n", | |
" <IBMQSimulator('simulator_statevector') from IBMQ(hub='ibm-q', group='open', project='main')>,\n", | |
" <IBMQSimulator('simulator_mps') from IBMQ(hub='ibm-q', group='open', project='main')>,\n", | |
" <IBMQSimulator('simulator_extended_stabilizer') from IBMQ(hub='ibm-q', group='open', project='main')>,\n", | |
" <IBMQSimulator('simulator_stabilizer') from IBMQ(hub='ibm-q', group='open', project='main')>,\n", | |
" <IBMQBackend('ibmq_manila') from IBMQ(hub='ibm-q', group='open', project='main')>]" | |
] | |
}, | |
"metadata": {}, | |
"execution_count": 50 | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "sIv6mPRmwq9F" | |
}, | |
"source": [ | |
"backend = provider.get_backend('ibmq_quito')\n", | |
"\n", | |
"if backend.configuration().n_qubits < 9:\n", | |
" game_size = 4" | |
], | |
"execution_count": 51, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "IgpFKof_CpMy" | |
}, | |
"source": [ | |
"## Simulated Quantum Computer\n", | |
"\n", | |
"If you chose to run the game on a simulator, run this cell. If you already set up you IBMQ backend, don't run this cell." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "-twHM3Uzzjjq" | |
}, | |
"source": [ | |
"backend = Aer.get_backend('aer_simulator')\n", | |
"\n", | |
"game_size = 9" | |
], | |
"execution_count": 45, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "vIr27QXfwldC" | |
}, | |
"source": [ | |
"## The game!\n", | |
"\n", | |
"To make a move, click one of the 5 options above the board and then click the location where you want to make that move. To play \"SWAP,\" you need to click two board locations.\n", | |
"\n", | |
"Each move adds a gate to the game circuit. They do the following:\n", | |
"\n", | |
"* **Measure** ends the round and execute the game circuit on the quantum device. The win conditions will be counted and displayed.\n", | |
"* **Not** flips an \"owned\" tile to the other player. If the tile is not currently owned, this does nothing.\n", | |
"* **O** turns the intial tile toward a tile owned by \"O.\"\n", | |
"* **X** turns the intial tile toward a tile owned by \"X.\"\n", | |
"* **SWAP** swaps the location of two tiles.\n", | |
"\n", | |
"As you play, you will see the game circuit and the board. The board shows the sequence of moves, but is not 100% accurate. The game circuit is true state of the game. " | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 495, | |
"referenced_widgets": [ | |
"0ebdc9c344f047c8957ea76e690fe2b5", | |
"da094b428c3c420d95ff4e818c68d5f8", | |
"9b8e387da82b4f5f87f9d42f4a79714f", | |
"e4e5f00f24b84853a94b538b0912f92d", | |
"fe8a3c73ec8b437690166893b77e2b5f", | |
"a6884d6cebbe49c19252f096a151cc76", | |
"d00f85b64cc04198a76e54b1922d1c23", | |
"6856d155ca6d4bccba58d22785c3842f", | |
"a5f8db8b5afc45dab3add7dcc550074f", | |
"a34d212dab71411192f00daf2b107436", | |
"d0acc497af144d328c93023b3786e4cc", | |
"c6ba9563f1a0492ba9d333ec016ed118", | |
"f86635733bdd4c808ec71e36132ff21d", | |
"ddc629a1bf094dac9024aff362a9f43b", | |
"f2e7cf3d13674c4696d542593fed7527", | |
"58f5af7d21d04dffad3eafc11e7c8e8b", | |
"34b0815f861b4b03a3be0016bb7ec8a1", | |
"15d9926e8b414f6f8790d08ffd597f6a", | |
"d6eb0b38e3b84650a6600c30a9c3e3a7", | |
"5c3f514da3d64986a579317d1bfe2ae8", | |
"5f2055e953f841dfbb52136eb93790c7", | |
"91df9f52f4cb4821aa99c3c3331f5ea4", | |
"38c1fb319e524669b2568b4ec2a61e28", | |
"064fb9ad039b406e9935dd4ab5c52c65", | |
"ab8eee491e06467ca7ba925007931cbf", | |
"fee9ede3c5b14298993b17a8c5e9859d", | |
"43a6e0c6e837415ab1dd4b42f84957f3", | |
"8ae381e6a57e4dd5b7af9273e2a99706", | |
"8d1b8f69967c4df69a2191f2eb419a48", | |
"f9d9e7706d9a4221aefaf03bb775e1f2" | |
] | |
}, | |
"id": "GkGzpgfIBUjT", | |
"outputId": "6ad251f0-8fab-4529-9c7e-11afd5ab23e5" | |
}, | |
"source": [ | |
"game = Game()" | |
], | |
"execution_count": 52, | |
"outputs": [ | |
{ | |
"output_type": "display_data", | |
"data": { | |
"application/vnd.jupyter.widget-view+json": { | |
"model_id": "8ae381e6a57e4dd5b7af9273e2a99706", | |
"version_minor": 0, | |
"version_major": 2 | |
}, | |
"text/plain": [ | |
"Button(description='Replay', style=ButtonStyle())" | |
] | |
}, | |
"metadata": {} | |
}, | |
{ | |
"output_type": "stream", | |
"text": [ | |
"X wins: 3 O wins: 0\n" | |
], | |
"name": "stdout" | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"text/html": [ | |
"<style>\n", | |
" table#id308, #id308 > tbody > tr > th, #id308 > tbody > tr > td {\n", | |
" border: 1px solid lightgray;\n", | |
" border-collapse:collapse;\n", | |
" \n", | |
" }</style>" | |
], | |
"text/plain": [ | |
"<IPython.core.display.HTML object>" | |
] | |
}, | |
"metadata": {} | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"text/html": [ | |
"<table id=id308><tr><th id=id308-0-0></th><th id=id308-0-1></th></tr></table>" | |
], | |
"text/plain": [ | |
"<IPython.core.display.HTML object>" | |
] | |
}, | |
"metadata": {} | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"application/javascript": [ | |
"window[\"fadd6e48-0acd-11ec-ba68-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", | |
"//# sourceURL=js_79ea4ff3f4" | |
], | |
"text/plain": [ | |
"<IPython.core.display.Javascript object>" | |
] | |
}, | |
"metadata": {} | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"application/javascript": [ | |
"window[\"fade0c40-0acd-11ec-ba68-0242ac1c0002\"] = document.querySelector(\"#id308-0-0\");\n", | |
"//# sourceURL=js_99191dcdb1" | |
], | |
"text/plain": [ | |
"<IPython.core.display.Javascript object>" | |
] | |
}, | |
"metadata": {} | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"application/javascript": [ | |
"window[\"fadea452-0acd-11ec-ba68-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"fade0c40-0acd-11ec-ba68-0242ac1c0002\"]);\n", | |
"//# sourceURL=js_df4feb303f" | |
], | |
"text/plain": [ | |
"<IPython.core.display.Javascript object>" | |
] | |
}, | |
"metadata": {} | |
}, | |
{ | |
"output_type": "stream", | |
"text": [ | |
"\n", | |
"X\n", | |
"\n" | |
], | |
"name": "stdout" | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"application/vnd.jupyter.widget-view+json": { | |
"model_id": "58f5af7d21d04dffad3eafc11e7c8e8b", | |
"version_minor": 0, | |
"version_major": 2 | |
}, | |
"text/plain": [ | |
"Button(description='0', style=ButtonStyle())" | |
] | |
}, | |
"metadata": {} | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"application/javascript": [ | |
"window[\"fae1f3aa-0acd-11ec-ba68-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"fadd6e48-0acd-11ec-ba68-0242ac1c0002\"]);\n", | |
"//# sourceURL=js_03243dc4a6" | |
], | |
"text/plain": [ | |
"<IPython.core.display.Javascript object>" | |
] | |
}, | |
"metadata": {} | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"application/javascript": [ | |
"window[\"fae59abe-0acd-11ec-ba68-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", | |
"//# sourceURL=js_ccf27d52e9" | |
], | |
"text/plain": [ | |
"<IPython.core.display.Javascript object>" | |
] | |
}, | |
"metadata": {} | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"application/javascript": [ | |
"window[\"fae5f798-0acd-11ec-ba68-0242ac1c0002\"] = document.querySelector(\"#id308-0-1\");\n", | |
"//# sourceURL=js_27a8c7e280" | |
], | |
"text/plain": [ | |
"<IPython.core.display.Javascript object>" | |
] | |
}, | |
"metadata": {} | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"application/javascript": [ | |
"window[\"fae65724-0acd-11ec-ba68-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"fae5f798-0acd-11ec-ba68-0242ac1c0002\"]);\n", | |
"//# sourceURL=js_a3211109ab" | |
], | |
"text/plain": [ | |
"<IPython.core.display.Javascript object>" | |
] | |
}, | |
"metadata": {} | |
}, | |
{ | |
"output_type": "stream", | |
"text": [ | |
"\n", | |
"X\n", | |
"\n" | |
], | |
"name": "stdout" | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"application/vnd.jupyter.widget-view+json": { | |
"model_id": "d6eb0b38e3b84650a6600c30a9c3e3a7", | |
"version_minor": 0, | |
"version_major": 2 | |
}, | |
"text/plain": [ | |
"Button(description='1', style=ButtonStyle())" | |
] | |
}, | |
"metadata": {} | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"application/javascript": [ | |
"window[\"fae91a86-0acd-11ec-ba68-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"fae59abe-0acd-11ec-ba68-0242ac1c0002\"]);\n", | |
"//# sourceURL=js_c0a17c26a5" | |
], | |
"text/plain": [ | |
"<IPython.core.display.Javascript object>" | |
] | |
}, | |
"metadata": {} | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"application/javascript": [ | |
"window[\"faeb3082-0acd-11ec-ba68-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", | |
"//# sourceURL=js_b911e1dca6" | |
], | |
"text/plain": [ | |
"<IPython.core.display.Javascript object>" | |
] | |
}, | |
"metadata": {} | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"application/javascript": [ | |
"window[\"faeb8bc2-0acd-11ec-ba68-0242ac1c0002\"] = document.querySelector(\"#id308-0-0\");\n", | |
"//# sourceURL=js_40d6498d19" | |
], | |
"text/plain": [ | |
"<IPython.core.display.Javascript object>" | |
] | |
}, | |
"metadata": {} | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"application/javascript": [ | |
"window[\"faebe554-0acd-11ec-ba68-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"faeb8bc2-0acd-11ec-ba68-0242ac1c0002\"]);\n", | |
"//# sourceURL=js_57548099d4" | |
], | |
"text/plain": [ | |
"<IPython.core.display.Javascript object>" | |
] | |
}, | |
"metadata": {} | |
}, | |
{ | |
"output_type": "stream", | |
"text": [ | |
"\n", | |
"X\n", | |
"\n" | |
], | |
"name": "stdout" | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"application/vnd.jupyter.widget-view+json": { | |
"model_id": "91df9f52f4cb4821aa99c3c3331f5ea4", | |
"version_minor": 0, | |
"version_major": 2 | |
}, | |
"text/plain": [ | |
"Button(description='2', style=ButtonStyle())" | |
] | |
}, | |
"metadata": {} | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"application/javascript": [ | |
"window[\"faedc3b0-0acd-11ec-ba68-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"faeb3082-0acd-11ec-ba68-0242ac1c0002\"]);\n", | |
"//# sourceURL=js_4d1bd5ba67" | |
], | |
"text/plain": [ | |
"<IPython.core.display.Javascript object>" | |
] | |
}, | |
"metadata": {} | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"application/javascript": [ | |
"window[\"faeff162-0acd-11ec-ba68-0242ac1c0002\"] = google.colab.output.getActiveOutputArea();\n", | |
"//# sourceURL=js_5cc91a4b84" | |
], | |
"text/plain": [ | |
"<IPython.core.display.Javascript object>" | |
] | |
}, | |
"metadata": {} | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"application/javascript": [ | |
"window[\"faf05198-0acd-11ec-ba68-0242ac1c0002\"] = document.querySelector(\"#id308-0-1\");\n", | |
"//# sourceURL=js_115062c241" | |
], | |
"text/plain": [ | |
"<IPython.core.display.Javascript object>" | |
] | |
}, | |
"metadata": {} | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"application/javascript": [ | |
"window[\"faf0af62-0acd-11ec-ba68-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"faf05198-0acd-11ec-ba68-0242ac1c0002\"]);\n", | |
"//# sourceURL=js_6bab80a630" | |
], | |
"text/plain": [ | |
"<IPython.core.display.Javascript object>" | |
] | |
}, | |
"metadata": {} | |
}, | |
{ | |
"output_type": "stream", | |
"text": [ | |
"\n", | |
"O\n", | |
"\n" | |
], | |
"name": "stdout" | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"application/vnd.jupyter.widget-view+json": { | |
"model_id": "ab8eee491e06467ca7ba925007931cbf", | |
"version_minor": 0, | |
"version_major": 2 | |
}, | |
"text/plain": [ | |
"Button(description='3', style=ButtonStyle())" | |
] | |
}, | |
"metadata": {} | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"application/javascript": [ | |
"window[\"faf2a18c-0acd-11ec-ba68-0242ac1c0002\"] = google.colab.output.setActiveOutputArea(window[\"faeff162-0acd-11ec-ba68-0242ac1c0002\"]);\n", | |
"//# sourceURL=js_7b81d9cbb7" | |
], | |
"text/plain": [ | |
"<IPython.core.display.Javascript object>" | |
] | |
}, | |
"metadata": {} | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"image/png": "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\n", | |
"text/plain": [ | |
"<Figure size 748.797x325.08 with 1 Axes>" | |
] | |
}, | |
"metadata": {} | |
} | |
] | |
} | |
] | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment