# HackyHolidays 2021 - MinesLazer
```
Use your laser to remotely detonate all the mines!
```
```nim=
import os
import random
import bitops
import strutils
import asyncnet, asyncdispatch
randomize()
proc minesGrid(mines: uint64, steps: uint64): string =
var grid = ""
for y in 0..7:
grid &= "["
for x in 0..7:
if steps.testBit(x+y*8):
grid &= "D"
elif mines.testBit(x+y*8):
grid &= "X"
else:
grid &= "_"
grid &= "]\c\L"
return grid
proc processClient(client: AsyncSocket) {.async.} =
await client.send("=====================\c\L")
await client.send("=== MINESLAZER 4000 \c\L")
await client.send("=====================\c\L")
await client.send("Use the laser to remotely detonate the mines. \c\L")
await client.send("Make sure you don't hit any crew members with the laser though! \c\L")
var mines = rand(uint64)
var steps = uint64(0)
while true:
await client.send("\c\L[?] Enter laser position: ")
var x, y: int
let line = await client.recvLine()
if line == "":
client.close()
break
try:
let xy = line.split(",", 1)
assert xy.len == 2
x = parseInt(xy[0])
y = parseInt(xy[1])
assert x >= 0 and x < 8 and y >= 0 and y < 8
except:
await client.send("Wrong input.\c\L")
continue
if not mines.testBit(x+y*8):
await client.send("Yikes, you hit something you weren't supposed to hit.\c\L")
await client.send("Hope you have good insurance, you're on your own.\c\L")
await client.send(minesGrid(mines, steps))
client.close()
break
steps.setBit(x+y*8)
mines.clearBit(x+y*8)
await client.send("Pew pew pew! Bomb successfully detonated!\c\L")
await client.send(minesGrid(uint64(0), steps))
if mines == 0:
await client.send("\c\LWOoOOohOOOO, you've gotten rid of all mines!\c\L")
await client.send("Here's your flag: " & getEnv("FLAG", "MagicFlag") & "\c\L")
client.close()
break
proc serve() {.async.} =
var server = newAsyncSocket()
server.setSockOpt(OptReuseAddr, true)
server.bindAddr(Port(1234))
server.listen()
while true:
let client = await server.accept()
asyncCheck processClient(client)
asyncCheck serve()
runForever()
```
## Analysis