# Task
The function `fold_cube(number_list)` should return a boolean based on a net (given as a number list), if the net can fold into a cube. 
Your code must be effecient and complete the tests within 500ms. 
## Input
Imagine a net such as the one below.
```
@
@ @ @ @
    @
```
Then, put it on the table with each `@` being one cell.
```
--------------------------
|  1 |  2 |  3 |  4 |  5 |
--------------------------
|  6 |  7 |  8 |  9 | 10 |
--------------------------
| 11 | 12 | 13 | 14 | 15 |
--------------------------
| 16 | 17 | 18 | 19 | 20 |
--------------------------
| 21 | 22 | 23 | 24 | 25 |
--------------------------
```
The number list for a net will be the numbers the net falls on when placed on the table. Note that the numbers in the list won't always be in order. The position of the net can be anywhere on the table, it can also be rotated.
For the example above, a possible number list will be `[1, 7, 8, 6, 9, 13]`.
## Output
`fold_cube` should return `True` if the net can be folded into a cube. `False` if not.
---
# Examples
### Example 1:
`number_list` = `[24, 20, 14, 19, 18, 9]`
Shape and rotation of net:
```
  @
  @
@ @ @
  @
```
Displayed on the table:
```
--------------------------
|  1 |  2 |  3 |  4 |  5 |
--------------------------
|  6 |  7 |  8 |  @ | 10 |
--------------------------
| 11 | 12 | 13 |  @ | 15 |
--------------------------
| 16 | 17 |  @ |  @ |  @ |
--------------------------
| 21 | 22 | 23 |  @ | 25 |
--------------------------
```
So, `fold_cube([24, 20, 14, 19, 18, 9])` should return `True`.
### Example 2:
`number_list` = `[1, 7, 6, 17, 12, 16]`
Shape and rotation of net:
```
@
@ @
  @ 
@ @
```
Displayed on the table:
```
--------------------------
|  @ |  2 |  3 |  4 |  5 |
--------------------------
|  @ |  @ |  8 |  9 | 10 |
--------------------------
| 11 |  @ | 13 | 14 | 15 |
--------------------------
|  @ |  @ | 18 | 19 | 20 |
--------------------------
| 21 | 22 | 23 | 24 | 25 |
--------------------------
```
`fold_cube([1, 7, 6, 17, 12, 16])` should return `False`.
#### *Translations appreciated!!*
---
### If you liked this kata.... check out these!             
- [Folding a 4D Cube (Tesseract)](https://www.codewars.com/kata/5f3b561bc4a71f000f191ef7)  
- [Wraping a net around a cube](https://www.codewars.com/kata/5f4af9c169f1cd0001ae764d)
BASE = {'  x\nxxx\n x \n x ', ' x\n x\nxx\nx \nx ', ' x \n xx\nxx \n x ', 'xx \n xx\n x \n x ', ' x \n xx\nxx \nx  ', 'xxx\n x \n x \n x ', 'xx \n x \n xx\n x ', 'xx \n x \n xx\n  x', 'xx \n x \n x \n xx', '  xx\n xx \nxx  ', ' x \nxxx\n x \n x '}

def reflect(s):
    return '\n'.join(r[::-1] for r in s.split('\n'))

def rotate(s):
    return '\n'.join(''.join(c[::-1]) for c in zip(*s.split('\n')))

def fold_cube(arr):
    table = [[' '] * 5 for _ in range(5)]
    x0, y0, x1, y1 = 4, 4, 0, 0
    for p in arr:
        x, y = divmod(p - 1, 5)
        table[x][y] = 'x'
        x0, y0 = min(x, x0), min(y, y0)
        x1, y1 = max(x, x1), max(y, y1)
    net = '\n'.join(''.join(r[y0:y1 + 1]) for r in table[x0:x1 + 1])
    net2 = reflect(net)
    for i in range(4):
        if net in BASE or net2 in BASE:
            return True
        net, net2 = rotate(net), rotate(net2)
    return False
BASE = {'  x\nxxx\n x \n x ', ' x\n x\nxx\nx \nx ', ' x \n xx\nxx \n x ', 'xx \n xx\n x \n x ', ' x \n xx\nxx \nx  ', 'xxx\n x \n x \n x ', 'xx \n x \n xx\n x ', 'xx \n x \n xx\n  x', 'xx \n x \n x \n xx', '  xx\n xx \nxx  ', ' x \nxxx\n x \n x '}

def reflect(s):
    return '\n'.join(r[::-1] for r in s.split('\n'))

def rotate(s):
    return '\n'.join(''.join(c[::-1]) for c in zip(*s.split('\n')))

def fold_cube(arr):
    table = [[' '] * 5 for _ in range(5)]
    x0, y0, x1, y1 = 4, 4, 0, 0
    for p in arr:
        x, y = divmod(p - 1, 5)
        table[x][y] = 'x'
        x0, y0 = min(x, x0), min(y, y0)
        x1, y1 = max(x, x1), max(y, y1)
    net = '\n'.join(''.join(r[y0:y1 + 1]) for r in table[x0:x1 + 1])
    net2 = reflect(net)
    for i in range(4):
        if net in BASE or net2 in BASE:
            return True
        net, net2 = rotate(net), rotate(net2)
    return False