using System;
public class Test
{
const string PINC = "たのしー!";
const string PDEC = "たーのしー!";
const string INC = "すごーい!";
const string DEC = "すっごーい!";
const string PUT = "なにこれなにこれ!";
const string GET = "おもしろーい!";
const string START = "うわー!";
const string END = "おもしろーい!";
/*
const string PINC = ">";
const string PDEC = "<";
const string INC = "+";
const string DEC = "-";
const string PUT = ".";
const string GET = ",";
const string START = "[";
const string END = "]";
*/
public static void Main()
{
Print("Friends");
}
private static int Put(char c, int cur = 0)
{
var diff = c - cur;
var ope = (diff > 0) ? INC : DEC;
var
sqrt = (int)Math.
Sqrt(Math.
Abs(diff
)); var offset = diff - x * y;
if (offset < 0) { offset += y; x--; }
// optimize
for (var i = 1; i < x - 1; ++i)
{
var tmp
= diff
- (sqrt + i
) * (sqrt + i
); if (0 <= tmp && tmp < offset)
{
offset = tmp;
}
}
if (diff < (x + y + 3))
{
Console.Write(PINC);
for (var i = 0; i < Math.Abs(diff); ++i)
Console.Write(ope);
Console.Write(PUT);
Console.Write(PDEC);
return c;
}
// set a repeat number
for (var i = 0; i < x; ++i)
Console.Write(INC);
// loop start
Console.Write(START);
Console.Write(PINC);
for (var i = 0; i < y; ++i)
Console.Write(ope);
// loop decriment
Console.Write(PDEC);
Console.Write(DEC);
// loop end
Console.Write(END);
Console.Write(PINC);
for (var i = 0; i < offset; ++i)
Console.Write(ope);
// output
Console.Write(PUT);
Console.Write(PDEC);
return c;
}
private static int Print(string str, int cur = 0)
{
foreach (var c in str)
cur = Put(c, cur);
return cur;
}
}
dXNpbmcgU3lzdGVtOwoKcHVibGljIGNsYXNzIFRlc3QKewoJY29uc3Qgc3RyaW5nIFBJTkMgID0gIuOBn+OBruOBl+ODvO+8gSI7Cgljb25zdCBzdHJpbmcgUERFQyAgPSAi44Gf44O844Gu44GX44O877yBIjsKCWNvbnN0IHN0cmluZyBJTkMgICA9ICLjgZnjgZTjg7zjgYTvvIEiOwoJY29uc3Qgc3RyaW5nIERFQyAgID0gIuOBmeOBo+OBlOODvOOBhO+8gSI7Cgljb25zdCBzdHJpbmcgUFVUICAgPSAi44Gq44Gr44GT44KM44Gq44Gr44GT44KM77yBIjsKCWNvbnN0IHN0cmluZyBHRVQgICA9ICLjgYrjgoLjgZfjgo3jg7zjgYTvvIEiOwoJY29uc3Qgc3RyaW5nIFNUQVJUID0gIuOBhuOCj+ODvO+8gSI7Cgljb25zdCBzdHJpbmcgRU5EICAgPSAi44GK44KC44GX44KN44O844GE77yBIjsKCQoJLyoKCWNvbnN0IHN0cmluZyBQSU5DICA9ICI+IjsKCWNvbnN0IHN0cmluZyBQREVDICA9ICI8IjsKCWNvbnN0IHN0cmluZyBJTkMgICA9ICIrIjsKCWNvbnN0IHN0cmluZyBERUMgICA9ICItIjsKCWNvbnN0IHN0cmluZyBQVVQgICA9ICIuIjsKCWNvbnN0IHN0cmluZyBHRVQgICA9ICIsIjsKCWNvbnN0IHN0cmluZyBTVEFSVCA9ICJbIjsKCWNvbnN0IHN0cmluZyBFTkQgICA9ICJdIjsKCSovCgkJCglwdWJsaWMgc3RhdGljIHZvaWQgTWFpbigpCgl7CgkJUHJpbnQoIkZyaWVuZHMiKTsKCX0KCQoJcHJpdmF0ZSBzdGF0aWMgaW50IFB1dChjaGFyIGMsIGludCBjdXIgPSAwKQoJewoJCXZhciBkaWZmID0gYyAtIGN1cjsKCQkJCgkJdmFyIG9wZSAgPSAoZGlmZiA+IDApID8gSU5DIDogREVDOwoJCXZhciBzcXJ0ID0gKGludClNYXRoLlNxcnQoTWF0aC5BYnMoZGlmZikpOwoJCXZhciB4ID0gc3FydCArIDE7CgkJdmFyIHkgPSBzcXJ0OwoJCXZhciBvZmZzZXQgPSBkaWZmIC0geCAqIHk7CgkJCgkJaWYgKG9mZnNldCA8IDApIHsgb2Zmc2V0ICs9IHk7IHgtLTsgfQoJCQoJCS8vIG9wdGltaXplCgkJZm9yICh2YXIgaSA9IDE7IGkgPCB4IC0gMTsgKytpKQoJCXsKCQkJdmFyIHRtcCA9IGRpZmYgLSAoc3FydCArIGkpICogKHNxcnQgKyBpKTsKCQkJaWYgKDAgPD0gdG1wICYmIHRtcCA8IG9mZnNldCkKCQkJewoJCQkJeCA9IHNxcnQgKyBpOwoJCQkJeSA9IHNxcnQgLSBpOwoJCQkJb2Zmc2V0ID0gdG1wOwoJCQl9CgkJfQoJCQoJCWlmIChkaWZmIDwgKHggKyB5ICsgMykpCgkJewoJCQlDb25zb2xlLldyaXRlKFBJTkMpOwoJCQlmb3IgKHZhciBpID0gMDsgaSA8IE1hdGguQWJzKGRpZmYpOyArK2kpCgkJCQlDb25zb2xlLldyaXRlKG9wZSk7CgkJCUNvbnNvbGUuV3JpdGUoUFVUKTsKCQkJQ29uc29sZS5Xcml0ZShQREVDKTsKCQkJcmV0dXJuIGM7CgkJfQoJCQoJCS8vIHNldCBhIHJlcGVhdCBudW1iZXIKCQlmb3IgKHZhciBpID0gMDsgaSA8IHg7ICsraSkKCQkJQ29uc29sZS5Xcml0ZShJTkMpOwoJCQkKCQkvLyBsb29wIHN0YXJ0CgkJQ29uc29sZS5Xcml0ZShTVEFSVCk7CgkJCQoJCUNvbnNvbGUuV3JpdGUoUElOQyk7CgkJZm9yICh2YXIgaSA9IDA7IGkgPCB5OyArK2kpCgkJCUNvbnNvbGUuV3JpdGUob3BlKTsKCQkKCQkvLyBsb29wIGRlY3JpbWVudAoJCUNvbnNvbGUuV3JpdGUoUERFQyk7CgkJQ29uc29sZS5Xcml0ZShERUMpOwoJCQoJCS8vIGxvb3AgZW5kCgkJQ29uc29sZS5Xcml0ZShFTkQpOwoJCQoJCUNvbnNvbGUuV3JpdGUoUElOQyk7CgkJZm9yICh2YXIgaSA9IDA7IGkgPCBvZmZzZXQ7ICsraSkKCQkJQ29uc29sZS5Xcml0ZShvcGUpOwoJCQoJCS8vIG91dHB1dAoJCUNvbnNvbGUuV3JpdGUoUFVUKTsKCQkKCQlDb25zb2xlLldyaXRlKFBERUMpOwoJCQoJCXJldHVybiBjOwoJfQoJCglwcml2YXRlIHN0YXRpYyBpbnQgUHJpbnQoc3RyaW5nIHN0ciwgaW50IGN1ciA9IDApCgl7CgkJZm9yZWFjaCAodmFyIGMgaW4gc3RyKQoJCQljdXIgPSBQdXQoYywgY3VyKTsKCQlyZXR1cm4gY3VyOwoJfQp9