#!/usr/bin/env stack
-- stack --resolver=lts-8.2 --install-ghc runghc
{-
Knight's Metric
========
- https://r...content-available-to-author-only...d.it/6coqwk
- I tried to come up with something instead of using a search algorithm,
- but the end result is wrong.
-}
module Main where
import Data.List
import Text.Printf
euclideanDistance
:: Point
-> Point
-> FloateuclideanDistance (x1, y1) (x2, y2) =
potentialMoves =
[(-2, -1), (-2, 1), (-1, -2), (-1, 2), (1, -2), (1, 2), (2, -1), (2, 1)]
knightMoves :: Point -> Point -> [Point]
knightMoves s@(sx, sy) d@(dx, dy)
| s == d = []
where
((n, m):_) =
sortOn
(\(n@(nx, ny), _) ->
if (dx
- nx
, dy
- ny
) `
elem` potentialMoves
then 0
else euclideanDistance d n) $
[((sx + x, sy + y), (x, y)) | (x, y) <- potentialMoves]
where
input
(x:y:
[]) = knightMoves
(0, 0) ((read x
), (read y
)) output [] = "0"
output (points) =
printf
"%d\n%s"
(intercalate
"\n" $ map (\
(x
, y
) -> printf
"%d %d" x y
) $ points
)
IyEvdXNyL2Jpbi9lbnYgc3RhY2sKLS0gc3RhY2sgLS1yZXNvbHZlcj1sdHMtOC4yIC0taW5zdGFsbC1naGMgcnVuZ2hjCnstCktuaWdodCdzIE1ldHJpYwo9PT09PT09PQoKLSBodHRwczovL3IuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLmQuaXQvNmNvcXdrCi0gSSB0cmllZCB0byBjb21lIHVwIHdpdGggc29tZXRoaW5nIGluc3RlYWQgb2YgdXNpbmcgYSBzZWFyY2ggYWxnb3JpdGhtLAotIGJ1dCB0aGUgZW5kIHJlc3VsdCBpcyB3cm9uZy4KLX0KbW9kdWxlIE1haW4gd2hlcmUKCmltcG9ydCBEYXRhLkxpc3QKaW1wb3J0IFRleHQuUHJpbnRmCgp0eXBlIFBvaW50ID0gKEludCwgSW50KQoKZXVjbGlkZWFuRGlzdGFuY2UgOjogUG9pbnQgLT4gUG9pbnQgLT4gRmxvYXQKZXVjbGlkZWFuRGlzdGFuY2UgKHgxLCB5MSkgKHgyLCB5MikgPQogIHNxcnQgJCBmcm9tSW50ZWdyYWwgKCh4MiAtIHgxKSBeIDIgKyAoeTIgLSB5MSkgXiAyKQoKcG90ZW50aWFsTW92ZXMgPQogIFsoLTIsIC0xKSwgKC0yLCAxKSwgKC0xLCAtMiksICgtMSwgMiksICgxLCAtMiksICgxLCAyKSwgKDIsIC0xKSwgKDIsIDEpXQoKa25pZ2h0TW92ZXMgOjogUG9pbnQgLT4gUG9pbnQgLT4gW1BvaW50XQprbmlnaHRNb3ZlcyBzQChzeCwgc3kpIGRAKGR4LCBkeSkKICB8IHMgPT0gZCA9IFtdCiAgfCBvdGhlcndpc2UgPSBtIDoga25pZ2h0TW92ZXMgbiBkCiAgd2hlcmUKICAgICgobiwgbSk6XykgPQogICAgICBzb3J0T24KICAgICAgICAoXChuQChueCwgbnkpLCBfKSAtPgogICAgICAgICAgIGlmIChkeCAtIG54LCBkeSAtIG55KSBgZWxlbWAgcG90ZW50aWFsTW92ZXMKICAgICAgICAgICAgIHRoZW4gMAogICAgICAgICAgICAgZWxzZSBldWNsaWRlYW5EaXN0YW5jZSBkIG4pICQKICAgICAgWygoc3ggKyB4LCBzeSArIHkpLCAoeCwgeSkpIHwgKHgsIHkpIDwtIHBvdGVudGlhbE1vdmVzXQoKbWFpbiA6OiBJTyAoKQptYWluID0gaW50ZXJhY3QgKHVubGluZXMgLiBtYXAgKG91dHB1dCAuIGlucHV0IC4gd29yZHMpIC4gbGluZXMpCiAgd2hlcmUKICAgIGlucHV0ICh4Onk6W10pID0ga25pZ2h0TW92ZXMgKDAsIDApICgocmVhZCB4KSwgKHJlYWQgeSkpCiAgICBvdXRwdXQgW10gPSAiMCIKICAgIG91dHB1dCAocG9pbnRzKSA9CiAgICAgIHByaW50ZgogICAgICAgICIlZFxuJXMiCiAgICAgICAgKGxlbmd0aCBwb2ludHMpCiAgICAgICAgKGludGVyY2FsYXRlICJcbiIgJCBtYXAgKFwoeCwgeSkgLT4gcHJpbnRmICIlZCAlZCIgeCB5KSAkIHBvaW50cyk=