{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Números\n",
    "\n",
    "## Sistemas de Números"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Sistema decimal é o sistema numérico mais utilizado. Mas o computador entende apenas binário. \n",
    "\n",
    "Os sistemas de números **binários**, **octais** e **hexadecimais** estão intimamente relacionados e podemos exigir a conversão de decimal nesses sistemas. \n",
    "\n",
    "O sistema decimal é a base 10 (dez símbolos, 0-9, são usados para representar um número) e, da mesma forma: \n",
    "\n",
    "- binário é a base 2, \n",
    "- octal é a base 8  \n",
    "- hexadecimal é a base 16.\n",
    "\n",
    "Um número com o prefixo '0b' é considerado **binário**, '0o' é considerado **octal** e '0x' como **hexadecimal**. \n",
    "\n",
    "Por exemplo:\n",
    "\n",
    "- **Decimal** = `112` \n",
    "- **Binário** = `0b1110000`\n",
    "- **Octal** = `0o160`\n",
    "- **Hexadecimal** = `0x70`"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Vamos definir um número decimal para executarmos conversões"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Versão decimal: 8\n",
      "Versão binária: 0b1000\n",
      "Versão octal: 0o10\n",
      "Versão hexadecimal: 0x8\n"
     ]
    }
   ],
   "source": [
    "decimal = 8\n",
    "\n",
    "print(f'Versão decimal: {decimal}')\n",
    "print(f'Versão binária: {bin(decimal)}')\n",
    "print(f'Versão octal: {oct(decimal)}')\n",
    "print(f'Versão hexadecimal: {hex(decimal)}')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Utilizando F-Strings para Conversões \n",
    "\n",
    "Vamos novamente definir um número decimal e fazer conversões"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Decimal: 255.00\n",
      "Hexadecimal: ff\n",
      "Binário: 11111111\n",
      "Octal: 377\n",
      "Científico: 2.550000e+02\n"
     ]
    }
   ],
   "source": [
    "dec = 255\n",
    "\n",
    "print(f'Decimal: {dec:.2f}')\n",
    "print(f'Hexadecimal: {dec:x}')\n",
    "print(f'Binário: {dec:b}')\n",
    "print(f'Octal: {dec:o}')\n",
    "print(f'Científico: {dec:e}')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Manipulação de Binários\n",
    "\n",
    "Vejamos informações e objetivos relacionados à manipulação de bits em Python (manipulação binária).\n",
    "\n",
    "Algumas tarefas incluem:\n",
    "\n",
    "- Transformar \"11011000111101 ...\" em bytes (preenchido à esquerda ou à direita, 0 ou 1) e vice-versa.\n",
    "- Intervalos de fatia de bits\n",
    "- Gire os bits, endereçados pelo bit. Ou seja, digamos: \"gire os bits 13-17, envolvendo as bordas\" ou \"gire os bits 13-17, perca os bits de um lado, defina todos os novos bits como 0\".\n",
    "- Da mesma forma, reverta regiões de bits, aplique lógica a regiões de bits, etc.\n",
    "- Alterne Endianness, com diferentes tamanhos de bloco.\n",
    "- Aplique operações em agrupamentos de blocos: ex: aplique XOR 10101 (5 bits) repetidamente em um campo.\n",
    "\n",
    "### Manipulações\n",
    "\n",
    "#### Binário para Inteiro Decimal"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "33"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "int('00100001', 2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Binário para Hexadecimal"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "ff\n"
     ]
    }
   ],
   "source": [
    "print(f'{int(\"11111111\", 2):x}')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1b6\n"
     ]
    }
   ],
   "source": [
    "print(f'{int(\"0110110110\", 2):x}')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "7f\n"
     ]
    }
   ],
   "source": [
    "print(f'{int(\"01111111\", 2):x}')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Para character (máximo 8 bits)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "';'"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "chr(int('111011', 2))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'v'"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "chr(int('1110110', 2))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'w'"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "chr(int('1110111', 2))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'~'"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "chr(int('01111110', 2))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'?'"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "chr(int('111111', 2))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Character para inteiros"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "254"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "int('11111110', 2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'þ'"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "chr(int('11111110', 2))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "254"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ord('þ')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "112"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ord('p')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'p'"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "chr(int('1110000', 2))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Bits Individuais"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "1 << 0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "1 << 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "1 << 2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "8"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "1 << 3"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "16"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "1 << 4"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "256"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "1 << 8"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### String Hex para Inteiro Decimal"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "255"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "int('0xff', 16)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "16"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "int('0x10', 16)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### String Oct para Inteiro Decimal"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 98,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "112"
      ]
     },
     "execution_count": 98,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "int('0o160', 8)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 100,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "31"
      ]
     },
     "execution_count": 100,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "int('0o037', 8)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Inteiro para String Binária"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [],
   "source": [
    "def bin(s):\n",
    "    return str(s) if s<=1 else bin(s>>1) + str(s&1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'11'"
      ]
     },
     "execution_count": 48,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "bin(3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'1000110'"
      ]
     },
     "execution_count": 49,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "bin(70)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'11111111'"
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "bin(255)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Tabela de Números"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 114,
   "metadata": {},
   "outputs": [],
   "source": [
    "from prettytable import PrettyTable"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 115,
   "metadata": {},
   "outputs": [],
   "source": [
    "tabela = PrettyTable()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 116,
   "metadata": {},
   "outputs": [],
   "source": [
    "tabela.field_names = [\"Decimal\", \"Hexadecimal\", \"Octal\", \"Binário\"]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 117,
   "metadata": {},
   "outputs": [],
   "source": [
    "for n in range(128):\n",
    "    tabela.add_row([n, hex(n), oct(n), bin(n)])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 118,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "+---------+-------------+-------+---------+\n",
      "| Decimal | Hexadecimal | Octal | Binário |\n",
      "+---------+-------------+-------+---------+\n",
      "|    0    |     0x0     |  0o0  |    0    |\n",
      "|    1    |     0x1     |  0o1  |    1    |\n",
      "|    2    |     0x2     |  0o2  |    10   |\n",
      "|    3    |     0x3     |  0o3  |    11   |\n",
      "|    4    |     0x4     |  0o4  |   100   |\n",
      "|    5    |     0x5     |  0o5  |   101   |\n",
      "|    6    |     0x6     |  0o6  |   110   |\n",
      "|    7    |     0x7     |  0o7  |   111   |\n",
      "|    8    |     0x8     |  0o10 |   1000  |\n",
      "|    9    |     0x9     |  0o11 |   1001  |\n",
      "|    10   |     0xa     |  0o12 |   1010  |\n",
      "|    11   |     0xb     |  0o13 |   1011  |\n",
      "|    12   |     0xc     |  0o14 |   1100  |\n",
      "|    13   |     0xd     |  0o15 |   1101  |\n",
      "|    14   |     0xe     |  0o16 |   1110  |\n",
      "|    15   |     0xf     |  0o17 |   1111  |\n",
      "|    16   |     0x10    |  0o20 |  10000  |\n",
      "|    17   |     0x11    |  0o21 |  10001  |\n",
      "|    18   |     0x12    |  0o22 |  10010  |\n",
      "|    19   |     0x13    |  0o23 |  10011  |\n",
      "|    20   |     0x14    |  0o24 |  10100  |\n",
      "|    21   |     0x15    |  0o25 |  10101  |\n",
      "|    22   |     0x16    |  0o26 |  10110  |\n",
      "|    23   |     0x17    |  0o27 |  10111  |\n",
      "|    24   |     0x18    |  0o30 |  11000  |\n",
      "|    25   |     0x19    |  0o31 |  11001  |\n",
      "|    26   |     0x1a    |  0o32 |  11010  |\n",
      "|    27   |     0x1b    |  0o33 |  11011  |\n",
      "|    28   |     0x1c    |  0o34 |  11100  |\n",
      "|    29   |     0x1d    |  0o35 |  11101  |\n",
      "|    30   |     0x1e    |  0o36 |  11110  |\n",
      "|    31   |     0x1f    |  0o37 |  11111  |\n",
      "|    32   |     0x20    |  0o40 |  100000 |\n",
      "|    33   |     0x21    |  0o41 |  100001 |\n",
      "|    34   |     0x22    |  0o42 |  100010 |\n",
      "|    35   |     0x23    |  0o43 |  100011 |\n",
      "|    36   |     0x24    |  0o44 |  100100 |\n",
      "|    37   |     0x25    |  0o45 |  100101 |\n",
      "|    38   |     0x26    |  0o46 |  100110 |\n",
      "|    39   |     0x27    |  0o47 |  100111 |\n",
      "|    40   |     0x28    |  0o50 |  101000 |\n",
      "|    41   |     0x29    |  0o51 |  101001 |\n",
      "|    42   |     0x2a    |  0o52 |  101010 |\n",
      "|    43   |     0x2b    |  0o53 |  101011 |\n",
      "|    44   |     0x2c    |  0o54 |  101100 |\n",
      "|    45   |     0x2d    |  0o55 |  101101 |\n",
      "|    46   |     0x2e    |  0o56 |  101110 |\n",
      "|    47   |     0x2f    |  0o57 |  101111 |\n",
      "|    48   |     0x30    |  0o60 |  110000 |\n",
      "|    49   |     0x31    |  0o61 |  110001 |\n",
      "|    50   |     0x32    |  0o62 |  110010 |\n",
      "|    51   |     0x33    |  0o63 |  110011 |\n",
      "|    52   |     0x34    |  0o64 |  110100 |\n",
      "|    53   |     0x35    |  0o65 |  110101 |\n",
      "|    54   |     0x36    |  0o66 |  110110 |\n",
      "|    55   |     0x37    |  0o67 |  110111 |\n",
      "|    56   |     0x38    |  0o70 |  111000 |\n",
      "|    57   |     0x39    |  0o71 |  111001 |\n",
      "|    58   |     0x3a    |  0o72 |  111010 |\n",
      "|    59   |     0x3b    |  0o73 |  111011 |\n",
      "|    60   |     0x3c    |  0o74 |  111100 |\n",
      "|    61   |     0x3d    |  0o75 |  111101 |\n",
      "|    62   |     0x3e    |  0o76 |  111110 |\n",
      "|    63   |     0x3f    |  0o77 |  111111 |\n",
      "|    64   |     0x40    | 0o100 | 1000000 |\n",
      "|    65   |     0x41    | 0o101 | 1000001 |\n",
      "|    66   |     0x42    | 0o102 | 1000010 |\n",
      "|    67   |     0x43    | 0o103 | 1000011 |\n",
      "|    68   |     0x44    | 0o104 | 1000100 |\n",
      "|    69   |     0x45    | 0o105 | 1000101 |\n",
      "|    70   |     0x46    | 0o106 | 1000110 |\n",
      "|    71   |     0x47    | 0o107 | 1000111 |\n",
      "|    72   |     0x48    | 0o110 | 1001000 |\n",
      "|    73   |     0x49    | 0o111 | 1001001 |\n",
      "|    74   |     0x4a    | 0o112 | 1001010 |\n",
      "|    75   |     0x4b    | 0o113 | 1001011 |\n",
      "|    76   |     0x4c    | 0o114 | 1001100 |\n",
      "|    77   |     0x4d    | 0o115 | 1001101 |\n",
      "|    78   |     0x4e    | 0o116 | 1001110 |\n",
      "|    79   |     0x4f    | 0o117 | 1001111 |\n",
      "|    80   |     0x50    | 0o120 | 1010000 |\n",
      "|    81   |     0x51    | 0o121 | 1010001 |\n",
      "|    82   |     0x52    | 0o122 | 1010010 |\n",
      "|    83   |     0x53    | 0o123 | 1010011 |\n",
      "|    84   |     0x54    | 0o124 | 1010100 |\n",
      "|    85   |     0x55    | 0o125 | 1010101 |\n",
      "|    86   |     0x56    | 0o126 | 1010110 |\n",
      "|    87   |     0x57    | 0o127 | 1010111 |\n",
      "|    88   |     0x58    | 0o130 | 1011000 |\n",
      "|    89   |     0x59    | 0o131 | 1011001 |\n",
      "|    90   |     0x5a    | 0o132 | 1011010 |\n",
      "|    91   |     0x5b    | 0o133 | 1011011 |\n",
      "|    92   |     0x5c    | 0o134 | 1011100 |\n",
      "|    93   |     0x5d    | 0o135 | 1011101 |\n",
      "|    94   |     0x5e    | 0o136 | 1011110 |\n",
      "|    95   |     0x5f    | 0o137 | 1011111 |\n",
      "|    96   |     0x60    | 0o140 | 1100000 |\n",
      "|    97   |     0x61    | 0o141 | 1100001 |\n",
      "|    98   |     0x62    | 0o142 | 1100010 |\n",
      "|    99   |     0x63    | 0o143 | 1100011 |\n",
      "|   100   |     0x64    | 0o144 | 1100100 |\n",
      "|   101   |     0x65    | 0o145 | 1100101 |\n",
      "|   102   |     0x66    | 0o146 | 1100110 |\n",
      "|   103   |     0x67    | 0o147 | 1100111 |\n",
      "|   104   |     0x68    | 0o150 | 1101000 |\n",
      "|   105   |     0x69    | 0o151 | 1101001 |\n",
      "|   106   |     0x6a    | 0o152 | 1101010 |\n",
      "|   107   |     0x6b    | 0o153 | 1101011 |\n",
      "|   108   |     0x6c    | 0o154 | 1101100 |\n",
      "|   109   |     0x6d    | 0o155 | 1101101 |\n",
      "|   110   |     0x6e    | 0o156 | 1101110 |\n",
      "|   111   |     0x6f    | 0o157 | 1101111 |\n",
      "|   112   |     0x70    | 0o160 | 1110000 |\n",
      "|   113   |     0x71    | 0o161 | 1110001 |\n",
      "|   114   |     0x72    | 0o162 | 1110010 |\n",
      "|   115   |     0x73    | 0o163 | 1110011 |\n",
      "|   116   |     0x74    | 0o164 | 1110100 |\n",
      "|   117   |     0x75    | 0o165 | 1110101 |\n",
      "|   118   |     0x76    | 0o166 | 1110110 |\n",
      "|   119   |     0x77    | 0o167 | 1110111 |\n",
      "|   120   |     0x78    | 0o170 | 1111000 |\n",
      "|   121   |     0x79    | 0o171 | 1111001 |\n",
      "|   122   |     0x7a    | 0o172 | 1111010 |\n",
      "|   123   |     0x7b    | 0o173 | 1111011 |\n",
      "|   124   |     0x7c    | 0o174 | 1111100 |\n",
      "|   125   |     0x7d    | 0o175 | 1111101 |\n",
      "|   126   |     0x7e    | 0o176 | 1111110 |\n",
      "|   127   |     0x7f    | 0o177 | 1111111 |\n",
      "+---------+-------------+-------+---------+\n"
     ]
    }
   ],
   "source": [
    "print(tabela)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}