Skip to content

Instantly share code, notes, and snippets.

@majiang
Last active December 27, 2015 03:59
Show Gist options
  • Select an option

  • Save majiang/7263699 to your computer and use it in GitHub Desktop.

Select an option

Save majiang/7263699 to your computer and use it in GitHub Desktop.
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