using System;
public class Nibble
{
const int bits = 4;
private bool[] _bools = new bool[bits];
public void Reset()
{
for ( int i = 0; i < _bools.Length; i++ )
_bools[i] = false;
}
public void Increment()
{
bool[] result = new bool[bits];
bool[] carries = new bool[bits + 1];
carries[0] = true;
for ( int i = 0; i < bits; i++ )
{
result[i] = _bools[i] ^ carries[i];
carries[i + 1] = _bools[i] && carries[i];
}
if ( carries[bits] )
Console.WriteLine("Overflow!");
_bools = result;
}
public byte Value
{
get
{
byte result = 0;
for ( int i = 0; i < bits; i++ )
{
if ( _bools[i] )
result += (byte)(1 << i);
}
return result;
}
}
}
static class Program
{
static void Main()
{
var nibble = new Nibble();
for ( int i = 0; i < 17; i++ )
{
Console.WriteLine(nibble.Value);
nibble.Increment();
}
}
}
dXNpbmcgU3lzdGVtOwoKcHVibGljIGNsYXNzIE5pYmJsZQp7CiAgICBjb25zdCBpbnQgYml0cyA9IDQ7CgogICAgcHJpdmF0ZSBib29sW10gX2Jvb2xzID0gbmV3IGJvb2xbYml0c107CgogICAgcHVibGljIHZvaWQgUmVzZXQoKQogICAgewogICAgICAgIGZvciAoIGludCBpID0gMDsgaSA8IF9ib29scy5MZW5ndGg7IGkrKyApCiAgICAgICAgICAgIF9ib29sc1tpXSA9IGZhbHNlOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIEluY3JlbWVudCgpCiAgICB7CiAgICAgICAgYm9vbFtdIHJlc3VsdCA9IG5ldyBib29sW2JpdHNdOwogICAgICAgIGJvb2xbXSBjYXJyaWVzID0gbmV3IGJvb2xbYml0cyArIDFdOwoKICAgICAgICBjYXJyaWVzWzBdID0gdHJ1ZTsKCiAgICAgICAgZm9yICggaW50IGkgPSAwOyBpIDwgYml0czsgaSsrICkKICAgICAgICB7CiAgICAgICAgICAgIHJlc3VsdFtpXSA9IF9ib29sc1tpXSBeIGNhcnJpZXNbaV07CiAgICAgICAgICAgIGNhcnJpZXNbaSArIDFdID0gX2Jvb2xzW2ldICYmIGNhcnJpZXNbaV07CiAgICAgICAgfQoKICAgICAgICBpZiAoIGNhcnJpZXNbYml0c10gKQogICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiT3ZlcmZsb3chIik7CgogICAgICAgIF9ib29scyA9IHJlc3VsdDsKICAgIH0KCiAgICBwdWJsaWMgYnl0ZSBWYWx1ZQogICAgewogICAgICAgIGdldAogICAgICAgIHsKICAgICAgICAgICAgYnl0ZSByZXN1bHQgPSAwOwogICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBiaXRzOyBpKysgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIF9ib29sc1tpXSApCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IChieXRlKSgxIDw8IGkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQogICAgfQp9CiAgICAgICAgCnN0YXRpYyBjbGFzcyBQcm9ncmFtCnsKICAgIHN0YXRpYyB2b2lkIE1haW4oKQogICAgewogICAgICAgIHZhciBuaWJibGUgPSBuZXcgTmliYmxlKCk7CiAgICAgICAgZm9yICggaW50IGkgPSAwOyBpIDwgMTc7IGkrKyApCiAgICAgICAgewogICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShuaWJibGUuVmFsdWUpOwogICAgICAgICAgICBuaWJibGUuSW5jcmVtZW50KCk7CiAgICAgICAgfQogICAgfQp9