diff options
Diffstat (limited to 'protohackers/1-prime-test')
-rw-r--r-- | protohackers/1-prime-test/flake.lock | 25 | ||||
-rw-r--r-- | protohackers/1-prime-test/flake.nix | 24 | ||||
-rw-r--r-- | protohackers/1-prime-test/go.mod | 3 | ||||
-rw-r--r-- | protohackers/1-prime-test/main.go | 71 |
4 files changed, 123 insertions, 0 deletions
diff --git a/protohackers/1-prime-test/flake.lock b/protohackers/1-prime-test/flake.lock new file mode 100644 index 0000000..6d89d83 --- /dev/null +++ b/protohackers/1-prime-test/flake.lock @@ -0,0 +1,25 @@ +{ + "nodes": { + "nixpkgs": { + "locked": { + "lastModified": 1661353537, + "narHash": "sha256-1E2IGPajOsrkR49mM5h55OtYnU0dGyre6gl60NXKITE=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "0e304ff0d9db453a4b230e9386418fd974d5804a", + "type": "github" + }, + "original": { + "id": "nixpkgs", + "type": "indirect" + } + }, + "root": { + "inputs": { + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/protohackers/1-prime-test/flake.nix b/protohackers/1-prime-test/flake.nix new file mode 100644 index 0000000..d8479b2 --- /dev/null +++ b/protohackers/1-prime-test/flake.nix @@ -0,0 +1,24 @@ +{ + description = "Protohackers 1: Prime test"; + + outputs = { self, nixpkgs }: + let + system = "x86_64-linux"; + pkgs = import nixpkgs { inherit system; }; + in rec + { + packages.x86_64-linux.docker-image = pkgs.dockerTools.buildImage { + name = "prime-test"; + config = { + Cmd = [ "${packages.x86_64-linux.binary}/bin/1-prime-test" ]; + }; + }; + packages.x86_64-linux.binary = pkgs.buildGoModule { + pname = "prime-test"; + version = "0.0.1"; + src = self; + + vendorSha256 = "pQpattmS9VmO3ZIQUFn66az8GSmB4IvYhTTCFn6SUmo="; + }; + }; +} diff --git a/protohackers/1-prime-test/go.mod b/protohackers/1-prime-test/go.mod new file mode 100644 index 0000000..78c74d2 --- /dev/null +++ b/protohackers/1-prime-test/go.mod @@ -0,0 +1,3 @@ +module 1-prime-test + +go 1.18 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 +} |