summaryrefslogtreecommitdiff
path: root/protohackers/1-prime-test/main.go
diff options
context:
space:
mode:
Diffstat (limited to 'protohackers/1-prime-test/main.go')
-rw-r--r--protohackers/1-prime-test/main.go71
1 files changed, 71 insertions, 0 deletions
diff --git a/protohackers/1-prime-test/main.go b/protohackers/1-prime-test/main.go
new file mode 100644
index 0000000..66e7f16
--- /dev/null
+++ b/protohackers/1-prime-test/main.go
@@ -0,0 +1,71 @@
+package main
+
+import (
+ "bufio"
+ "encoding/json"
+ "log"
+ "math"
+ "net"
+)
+
+func main() {
+ listener, err := net.Listen("tcp", "0.0.0.0:7000")
+ if err != nil {
+ panic(err)
+ }
+
+ for {
+ go handle(listener.Accept())
+ }
+}
+
+func handle(conn net.Conn, err error) {
+ if err != nil {
+ log.Println(err)
+ return
+ }
+ defer conn.Close()
+
+ reader := bufio.NewScanner(conn)
+ writer := json.NewEncoder(conn)
+ for reader.Scan() {
+ log.Println("received ", reader.Text())
+ var req struct {
+ Method string `json:"method"`
+ Number *float64 `json:"number"`
+ }
+ if err := json.Unmarshal(reader.Bytes(), &req); err != nil {
+ log.Println(err)
+ return
+ }
+ if req.Method != "isPrime" || req.Number == nil {
+ _, err := conn.Write([]byte("you dingus"))
+ if err != nil {
+ log.Println(err)
+ }
+ return
+ }
+ res := struct {
+ Method string `json:"method"`
+ Prime bool `json:"prime"`
+ }{Method: "isPrime"}
+ n := int64(*req.Number)
+ if *req.Number == float64(n) {
+ res.Prime = isPrime(n)
+ }
+ if err := writer.Encode(res); err != nil {
+ log.Println(err)
+ return
+ }
+ }
+}
+
+func isPrime(n int64) bool {
+ max := int64(math.Sqrt(float64(n)))
+ for i := int64(2); i <= max; i++ {
+ if n%i == 0 {
+ return false
+ }
+ }
+ return n > 1
+}