using System;
using System.IO;
public class Program
{
static void Main(string[] args)
{
MemoryStream ms = new MemoryStream();
ms.WriteByte(100);
ms.WriteByte(100);
ms.WriteByte(0);
ms.WriteByte(200);
ms.WriteByte(200);
ms.WriteByte(1);
ms.WriteByte(50);
ms.Seek(0, SeekOrigin.Begin);
Console.WriteLine(Factory.FromStream(ms));
Console.WriteLine(Factory.FromStream(ms));
}
}
public struct Point
{
public int X;
public int Y;
public override string ToString()
{
return string.Format("<Point(X={0}, Y={1})>", X, Y);
}
}
public class Shape
{
protected Point origin;
public Shape(int x, int y)
{
origin.X = x;
origin.Y = y;
}
public override string ToString()
{
return string.Format("<Shape(origin={0})>", origin);
}
}
public class Circle : Shape
{
private double r;
public Circle(int x, int y , int r) : base(x, y)
{
this.r = r;
}
public override string ToString()
{
return string.Format("<Circle(origin={0}, r={1})>", origin, r);
}
}
public class Factory
{
public static Shape FromStream(Stream stream)
{
int x = stream.ReadByte();
int y = stream.ReadByte();
switch (stream.ReadByte())
{
case 0:
return new Shape(x, y);
case 1:
return new Circle(x, y, stream.ReadByte());
default:
throw new Exception();
}
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uSU87CgpwdWJsaWMgY2xhc3MgUHJvZ3JhbQp7CiAgICBzdGF0aWMgdm9pZCBNYWluKHN0cmluZ1tdIGFyZ3MpCiAgICB7CiAgICAgICAgTWVtb3J5U3RyZWFtIG1zID0gbmV3IE1lbW9yeVN0cmVhbSgpOwogICAgICAgIG1zLldyaXRlQnl0ZSgxMDApOwogICAgICAgIG1zLldyaXRlQnl0ZSgxMDApOwogICAgICAgIG1zLldyaXRlQnl0ZSgwKTsKICAgICAgICBtcy5Xcml0ZUJ5dGUoMjAwKTsKICAgICAgICBtcy5Xcml0ZUJ5dGUoMjAwKTsKICAgICAgICBtcy5Xcml0ZUJ5dGUoMSk7CiAgICAgICAgbXMuV3JpdGVCeXRlKDUwKTsKCiAgICAgICAgbXMuU2VlaygwLCBTZWVrT3JpZ2luLkJlZ2luKTsKICAgICAgICBDb25zb2xlLldyaXRlTGluZShGYWN0b3J5LkZyb21TdHJlYW0obXMpKTsKICAgICAgICBDb25zb2xlLldyaXRlTGluZShGYWN0b3J5LkZyb21TdHJlYW0obXMpKTsKICAgIH0KfQoKcHVibGljIHN0cnVjdCBQb2ludAp7CiAgICBwdWJsaWMgaW50IFg7CiAgICBwdWJsaWMgaW50IFk7CgogICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpCiAgICB7CiAgICAgICAgcmV0dXJuIHN0cmluZy5Gb3JtYXQoIjxQb2ludChYPXswfSwgWT17MX0pPiIsIFgsIFkpOwogICAgfQp9CgpwdWJsaWMgY2xhc3MgU2hhcGUKewogICAgcHJvdGVjdGVkIFBvaW50IG9yaWdpbjsKCiAgICBwdWJsaWMgU2hhcGUoaW50IHgsIGludCB5KQogICAgewogICAgICAgIG9yaWdpbi5YID0geDsKICAgICAgICBvcmlnaW4uWSA9IHk7CiAgICB9CgogICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpCiAgICB7CiAgICAgICAgcmV0dXJuIHN0cmluZy5Gb3JtYXQoIjxTaGFwZShvcmlnaW49ezB9KT4iLCBvcmlnaW4pOwogICAgfQp9CgpwdWJsaWMgY2xhc3MgQ2lyY2xlIDogU2hhcGUKewogICAgcHJpdmF0ZSBkb3VibGUgcjsKCiAgICBwdWJsaWMgQ2lyY2xlKGludCB4LCBpbnQgeSAsIGludCByKSA6IGJhc2UoeCwgeSkKICAgIHsKICAgICAgICB0aGlzLnIgPSByOwogICAgfQoKICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKQogICAgewogICAgICAgIHJldHVybiBzdHJpbmcuRm9ybWF0KCI8Q2lyY2xlKG9yaWdpbj17MH0sIHI9ezF9KT4iLCBvcmlnaW4sIHIpOwogICAgfQp9CgpwdWJsaWMgY2xhc3MgRmFjdG9yeQp7CiAgICBwdWJsaWMgc3RhdGljIFNoYXBlIEZyb21TdHJlYW0oU3RyZWFtIHN0cmVhbSkKICAgIHsKICAgICAgICBpbnQgeCA9IHN0cmVhbS5SZWFkQnl0ZSgpOwogICAgICAgIGludCB5ID0gc3RyZWFtLlJlYWRCeXRlKCk7CiAgICAgICAgc3dpdGNoIChzdHJlYW0uUmVhZEJ5dGUoKSkKICAgICAgICB7CiAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2hhcGUoeCwgeSk7CiAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ2lyY2xlKHgsIHksIHN0cmVhbS5SZWFkQnl0ZSgpKTsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oKTsKICAgICAgICB9CiAgICB9Cn0K