using System.Collections.Generic;
public static Dictionary<string, string> data = new Dictionary<string, string>()
{"key2", "value2 - $PRP:\"key1\"" },
{"key3", "$PRP:\"key5\"$PRP:\"key6\"" },
{"key4", "$PRP:\"key1\"qwerty" },
{"key7", "$PRP:\"key6\"" },
{"key8", "$PRP:\"key3\" OY $PRP:\"key5\"$PRP:\"key7\"" },
{"key9", "$PRP:\"key1\" $PRP:\"key2\" $PRP:\"key3\" $PRP:\"key4\" $PRP:\"key5\" $PRP:\"key6\" $PRP:\"key7\" $PRP:\"key8\" $PRP:\"key9\"OMG" },
{"key10", "Foo $PRP:\"key12\" Hello" },
{"key11", "Bar $PRP:\"key10\" World" },
{"key12", "Baz $PRP:\"key11\" :)" },
public static Dictionary<string, string> answers = new Dictionary<string, string>()
{"key2", "value2 - value1" },
{"key4", "value1qwerty" },
{"key8", "ATR Soft OY ATR Soft" },
{"key9", "value1 value2 - value1 ATR Soft value1qwerty ATR Soft Soft ATR Soft OY ATR Soft OMG" },
{"key10", "Foo Baz Bar World :) Hello" },
{"key11", "Bar Foo Baz :) Hello World" },
{"key12", "Baz Bar Foo Hello World :)" },
public static void Main()
foreach (var key in data.Keys)
if (answers.ContainsKey(key))
string res = ResolveKey(key, data);
Console.WriteLine(string.Format("'{0}' -> '{1}'", key, res));
if (string.Compare(answers[key], res) != 0)
Console.WriteLine(string.Format("\nFAIL! Correct would be\n'{0}' -> '{1}'", key, answers[key]));
Console.WriteLine("Congratulations! :)");
public static string ResolveKey(string key, Dictionary<string, string> data)
List<string> keyMap = new List<string>();
string resolvedString = RecursiveReader(data[key], keyMap);
public static string RecursiveReader(string dataStr, List<string> keyList, string result="")
for(int i=0; i < dataStr.Length; i++)
if(i < (dataStr.Length - 5) && dataStr.Substring(i, 5) == "$PRP:")
if(data.ContainsKey(key) && !TestCircularity(key, keyList))
result += RecursiveReader(data[key], keyList);
public static List<string> GetKeys(string dataStr)
List<string> keys = new List<string>();
for (int i = 0; i < dataStr.Length; i++)
if (i < (dataStr.Length - 5) && dataStr.Substring(i, 5) == "$PRP:")
while (dataStr[i] != '"')
public static bool TestCircularity(string key, List<string> keyList)
if(!keyList.Contains(key)) {
else if(!data[key].Contains("$PRP:"))
List<string> keys = GetKeys(data[key]);
foreach(string tempKey in keys)
if(TestCircularTraverse(data[tempKey], tempKey))
public static bool TestCircularTraverse(string dataStr, string key)
List<string> keys = GetKeys(dataStr);
foreach(string tempKey in keys)
result = TestCircularTraverse(data[tempKey], key);