#include <iostream>
using namespace std;
class Console
{
public:
template<typename ...Args>
static bool WriteLine(const std::string& format, Args&&... args)
{
bool success = write(format.c_str(), std::forward<Args>(args)...);
std::cout << std::endl;
return success;
}
template <typename ...Args>
static bool Write(const std::string& format, Args&&... args)
{
return write(format.c_str(), std::forward<Args>(args)...);
}
template<typename T>
static void WriteLine(T&& value)
{
std::cout << std::forward<T>(value) << std::endl;
}
template<typename T>
static void Write(T&& value)
{
std::cout << std::forward<T>(value);
}
private:
template<typename ...Args>
static bool write(const char * format, Args&&... args)
{
while (*format)
{
if (*format == '{')
{
bool found_closing_brace = false;
short value_position = -1;
while (*(++format))
{
if (*format == '}')
{
if (value_position == -1)
return false; // {} is not allowed.
write_value(value_position, 0, std::forward<Args>(args)...);
found_closing_brace = true;
break;
}
else
{
if (value_position >= 10)
return false; //Only range {0 ~ 99} is allowed.
if (value_position == -1)
value_position = *format - '0';
else
value_position = (value_position * 10) + (*format - '0');
}
}
if (!found_closing_brace)
return false;
// Continue back to the main loop. This is required.
// We need to process the next character, because it could be a '\0' or a '{'
format++;
continue;
}
std::cout << *format;
format++;
}
return true;
}
template<typename T, typename ...Args>
static void write_value(int x, int i, T&& value, Args&&... values)
{
if (i == x)
std::cout << std::forward<T>(value);
else
write_value(x, ++i, std::forward<Args>(values)...);
}
static void write_value(int x, int i) { }
};
int main()
{
Console::WriteLine("Big {11} Bang {0} Theory {6} [{11}, {12}]",
"Zero", "One", "Two", "Three", "Four", "Five",
"Six", "Seven", 8, "Nine", "Teen", 11, 12.5f);
// your code goes here
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgQ29uc29sZQp7CnB1YmxpYzoKCXRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3M+CglzdGF0aWMgYm9vbCBXcml0ZUxpbmUoY29uc3Qgc3RkOjpzdHJpbmcmIGZvcm1hdCwgQXJncyYmLi4uIGFyZ3MpCgl7CgkJYm9vbCBzdWNjZXNzID0gd3JpdGUoZm9ybWF0LmNfc3RyKCksIHN0ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKS4uLik7CgkJc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsKCQlyZXR1cm4gc3VjY2VzczsKCX0KCgl0ZW1wbGF0ZSA8dHlwZW5hbWUgLi4uQXJncz4KCXN0YXRpYyBib29sIFdyaXRlKGNvbnN0IHN0ZDo6c3RyaW5nJiBmb3JtYXQsIEFyZ3MmJi4uLiBhcmdzKQoJewoJCXJldHVybiB3cml0ZShmb3JtYXQuY19zdHIoKSwgc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKTsKCX0KCgl0ZW1wbGF0ZTx0eXBlbmFtZSBUPgoJc3RhdGljIHZvaWQgV3JpdGVMaW5lKFQmJiB2YWx1ZSkKCXsKCQlzdGQ6OmNvdXQgPDwgc3RkOjpmb3J3YXJkPFQ+KHZhbHVlKSA8PCBzdGQ6OmVuZGw7Cgl9CgkKCXRlbXBsYXRlPHR5cGVuYW1lIFQ+CglzdGF0aWMgdm9pZCBXcml0ZShUJiYgdmFsdWUpCgl7CgkJc3RkOjpjb3V0IDw8IHN0ZDo6Zm9yd2FyZDxUPih2YWx1ZSk7Cgl9Cgpwcml2YXRlOgoJdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncz4KCXN0YXRpYyBib29sIHdyaXRlKGNvbnN0IGNoYXIgKiBmb3JtYXQsIEFyZ3MmJi4uLiBhcmdzKQoJewoJCXdoaWxlICgqZm9ybWF0KQoJCXsKCQkJaWYgKCpmb3JtYXQgPT0gJ3snKQoJCQl7CgkJCQlib29sIGZvdW5kX2Nsb3NpbmdfYnJhY2UgPSBmYWxzZTsKCQkJCXNob3J0IHZhbHVlX3Bvc2l0aW9uID0gLTE7CgoJCQkJd2hpbGUgKCooKytmb3JtYXQpKQoJCQkJewoJCQkJCWlmICgqZm9ybWF0ID09ICd9JykKCQkJCQl7CgkJCQkJCWlmICh2YWx1ZV9wb3NpdGlvbiA9PSAtMSkKCQkJCQkJCXJldHVybiBmYWxzZTsgIC8vIHt9IGlzIG5vdCBhbGxvd2VkLgoKCQkJCQkJd3JpdGVfdmFsdWUodmFsdWVfcG9zaXRpb24sIDAsIHN0ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKS4uLik7CgkJCQkJCWZvdW5kX2Nsb3NpbmdfYnJhY2UgPSB0cnVlOwoJCQkJCQlicmVhazsKCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJaWYgKHZhbHVlX3Bvc2l0aW9uID49IDEwKQoJCQkJCQkJcmV0dXJuIGZhbHNlOyAvL09ubHkgcmFuZ2UgezAgfiA5OX0gaXMgYWxsb3dlZC4gCgoJCQkJCQlpZiAodmFsdWVfcG9zaXRpb24gPT0gLTEpCgkJCQkJCQl2YWx1ZV9wb3NpdGlvbiA9ICpmb3JtYXQgLSAnMCc7CgkJCQkJCWVsc2UKCQkJCQkJCXZhbHVlX3Bvc2l0aW9uID0gKHZhbHVlX3Bvc2l0aW9uICogMTApICsgKCpmb3JtYXQgLSAnMCcpOwoJCQkJCX0KCQkJCX0KCQkJCQkJCgkJCQlpZiAoIWZvdW5kX2Nsb3NpbmdfYnJhY2UpCgkJCQkJcmV0dXJuIGZhbHNlOyAKCgkJCQkvLyBDb250aW51ZSBiYWNrIHRvIHRoZSBtYWluIGxvb3AuIFRoaXMgaXMgcmVxdWlyZWQuCgkJCQkvLyBXZSBuZWVkIHRvIHByb2Nlc3MgdGhlIG5leHQgY2hhcmFjdGVyLCBiZWNhdXNlIGl0IGNvdWxkIGJlIGEgJ1wwJyBvciBhICd7JwoJCQkJZm9ybWF0Kys7CgkJCQljb250aW51ZTsKCQkJfQoKCQkJc3RkOjpjb3V0IDw8ICpmb3JtYXQ7CgkJCWZvcm1hdCsrOwoJCX0KCgkJcmV0dXJuIHRydWU7Cgl9CgkKCXRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIC4uLkFyZ3M+CglzdGF0aWMgdm9pZCB3cml0ZV92YWx1ZShpbnQgeCwgaW50IGksIFQmJiB2YWx1ZSwgQXJncyYmLi4uIHZhbHVlcykKCXsKCQlpZiAoaSA9PSB4KQoJCQlzdGQ6OmNvdXQgPDwgc3RkOjpmb3J3YXJkPFQ+KHZhbHVlKTsKCQllbHNlCgkJCXdyaXRlX3ZhbHVlKHgsICsraSwgc3RkOjpmb3J3YXJkPEFyZ3M+KHZhbHVlcykuLi4pOwoJfQoKCXN0YXRpYyB2b2lkIHdyaXRlX3ZhbHVlKGludCB4LCBpbnQgaSkgeyB9CQp9OwoKaW50IG1haW4oKQp7CglDb25zb2xlOjpXcml0ZUxpbmUoIkJpZyB7MTF9IEJhbmcgezB9IFRoZW9yeSB7Nn0gW3sxMX0sIHsxMn1dIiwKCgkJIlplcm8iLCAiT25lIiwgIlR3byIsICJUaHJlZSIsICJGb3VyIiwgIkZpdmUiLAoJCSJTaXgiLCAiU2V2ZW4iLCA4LCAiTmluZSIsICJUZWVuIiwgMTEsIDEyLjVmKTsKCQoJLy8geW91ciBjb2RlIGdvZXMgaGVyZQoJcmV0dXJuIDA7Cn0=