Last active
December 27, 2015 03:59
-
-
Save majiang/7263699 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| module denko; | |
| import std.stdio; | |
| import std.typecons : Tuple, tuple; | |
| alias Tuple!(uint, uint) Input; | |
| alias tuple!(uint, uint) pair; | |
| /** Find single letter. */ | |
| auto isLetter(Input input) | |
| { | |
| auto dict = [ | |
| pair(2, 3): "L", pair(3, 2): "R", pair(1, 3): "J", pair(7, 2): "T", | |
| pair(5, 7): "U", pair(7, 5): "N", pair(3, 6): "S", pair(6, 3): "Z"]; | |
| if (auto key = input in dict) | |
| return *key; | |
| return ""; | |
| } | |
| /** Decode string. */ | |
| auto solve(Input input) | |
| { | |
| auto ret = ""; | |
| auto buf = Input(); | |
| foreach (i; 0..32) | |
| { | |
| // read to buffer and consume input | |
| buf[0] = (buf[0] << 1) | (input[0] & 1); input[0] >>= 1; | |
| buf[1] = (buf[1] << 1) | (input[1] & 1); input[1] >>= 1; | |
| if (input[0] & 1 & buf[0] || input[1] & 1 & buf[1]) | |
| continue; // connected component | |
| if (auto letter = buf.isLetter()) | |
| { | |
| ret ~= letter; | |
| buf = Input(); // clear buffer | |
| } | |
| } | |
| debug ret.writeln(); // conditional statement: compiled only with -debug option. | |
| return ret; | |
| } | |
| /** Parse a string to a tuple of uints. */ | |
| auto parse(string input) | |
| { | |
| import std.array : split; | |
| auto buf = input.split("/"); | |
| import std.conv : toImpl; // convert with radix | |
| import core.bitop : bitswap; // bit reversal | |
| return pair( | |
| buf[0].toImpl!uint(16).bitswap(), | |
| buf[1].toImpl!uint(16).bitswap() | |
| ); | |
| } | |
| unittest | |
| { | |
| /*0*/ assert("2ed8aeed/34b0ea5b".parse().solve() == "LTRSUNTSJ"); | |
| /*1*/ assert("00000200/00000300".parse().solve() == "L"); | |
| /*2*/ assert("00018000/00010000".parse().solve() == "R"); | |
| /*3*/ assert("00002000/00006000".parse().solve() == "J"); | |
| /*4*/ assert("00000700/00000200".parse().solve() == "T"); | |
| /*5*/ assert("01400000/01c00000".parse().solve() == "U"); | |
| /*6*/ assert("00003800/00002800".parse().solve() == "N"); | |
| /*7*/ assert("000c0000/00180000".parse().solve() == "S"); | |
| /*8*/ assert("00003000/00001800".parse().solve() == "Z"); | |
| /*9*/ assert("132eae6c/1a64eac6".parse().solve() == "LRJTUNSZ"); | |
| /*10*/ assert("637572d0/36572698".parse().solve() == "ZSNUTJRL"); | |
| /*11*/ assert("baddb607/d66b6c05".parse().solve() == "LTJZTSSSN"); | |
| /*12*/ assert("db74cd75/6dac6b57".parse().solve() == "ZZZTJZRJNU"); | |
| /*13*/ assert("3606c2e8/1b0d8358".parse().solve() == "ZZSSLTJ"); | |
| /*14*/ assert("ad98c306/e6cc6183".parse().solve() == "UZZZZZZ"); | |
| /*15*/ assert("4a4aaee3/db6eeaa6".parse().solve() == "JJLLUUNNS"); | |
| /*16*/ assert("ecd9bbb6/598cd124".parse().solve() == "TSSZZTTRR"); | |
| /*17*/ assert("e0000002/40000003".parse().solve() == "TL"); | |
| /*18*/ assert("a0000007/e0000005".parse().solve() == "UN"); | |
| /*19*/ assert("c0000003/80000006".parse().solve() == "RS"); | |
| /*20*/ assert("40000006/c0000003".parse().solve() == "JZ"); | |
| /*21*/ assert("01da94db/00b3b6b2".parse().solve() == "TSUJLRSR"); | |
| /*22*/ assert("76eeaaea/24aaeeae".parse().solve() == "TRNNUUNU"); | |
| /*23*/ assert("1dacaeee/1566e444".parse().solve() == "NRJZUTTT"); | |
| /*24*/ assert("26c9ac60/6c6d66c0".parse().solve() == "JSZLRJZS"); | |
| /*25*/ assert("6c977620/36da5360".parse().solve() == "ZZLLTNZJ"); | |
| /*26*/ assert("069aeae6/0db34eac".parse().solve() == "SJSLTUNS"); | |
| /*27*/ assert("06d53724/049da56c".parse().solve() == "RRULRNJJ"); | |
| /*28*/ assert("069b58b0/04d66da0".parse().solve() == "RLRSLZJR"); | |
| /*29*/ assert("1b6eced4/11b46a9c".parse().solve() == "RZZTZNRU"); | |
| /*30*/ assert("522e8b80/db6ad900".parse().solve() == "JLLJNLJT"); | |
| /*31*/ assert("6546cdd0/376c6898".parse().solve() == "ZULSZRTL"); | |
| /*32*/ assert("4e6d5b70/6ad9d620".parse().solve() == "LNSSURST"); | |
| /*33*/ assert("37367772/65635256".parse().solve() == "SNSZNTNJ"); | |
| /*34*/ assert("25535d58/377669cc".parse().solve() == "LUUSLTUZ"); | |
| /*35*/ assert("0ae6a55d/0eacedcb".parse().solve() == "UNSUJUTJ"); | |
| /*36*/ assert("76762edc/23536a88".parse().solve() == "TZNZJNRT"); | |
| debug "unittest passed!".writeln(); | |
| } // compiled with -unittest option. | |
| // to compile without main() function, add -main option. or simply uncomment the following line: | |
| // void main(){} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment