Пример #1
0
 static DefaultGame()
 {
     foreach (var(value, info) in MahjongTable.Read2("mahjong2.table"))
     {
         mahjongTable.Add(value, info);
     }
 }
Пример #2
0
        private static ulong BuildKey(SortedTilesEnumerator tiles)
        {
            ulong result    = 0xF;
            int   prevIndex = -3;

            for (int i = 0; i < 34; i++)
            {
                if (i % 9 == 0 || i >= 27)
                {
                    prevIndex = -3;
                }
                if (tiles.Tiles[i] == 0)
                {
                    continue;
                }
                int diffIndex = i - prevIndex - 1;
                result    = (result << 4) | (diffIndex >= 2 ? 8U : (uint)diffIndex << 2);
                result   |= (byte)(tiles.Tiles[i] - 1);
                prevIndex = i;
            }
            result = MahjongTable.Rebuild(result);
            return(result);
        }
Пример #3
0
        unsafe static void Main(string[] args)
        {
            // WriteTable(@"Z:\mahjong.table");

            //var dict = new Dictionary<ulong, int>(4104364);
            //foreach (var (value, syanten) in ReadTable(@"Z:\mahjong.table")) {
            //	dict.Add(value, (sbyte) syanten);
            //}

            //var field = dict.GetType().GetField("buckets", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
            //var val = field.GetValue(dict) as int[];



            //const int N = 1674319;
            //int[] counts = new int[N];
            //ulong min = ulong.MaxValue, max = ulong.MinValue;
            //foreach (var value in ReadOriginalTable(@"Z:\mahjong.table")) {
            //	counts[(((value / 10)) ^ 0xC0FFEE_EEFF0CUL) % N]++;
            //}

            //int maxCnt = int.MinValue;
            //for (int i = 0; i < N; i++) {
            //	maxCnt = Math.Max(maxCnt, counts[i]);
            //}
            //Console.WriteLine($"{maxCnt}");

            //var list = new List<ulong>(4104364);
            //foreach (var value in ReadOriginalTable(@"Z:\mahjong.table")) {
            //	list.Add(value / 10);
            //}
            //list.Sort();

            //SortedDictionary<ulong, int> diffDict = new SortedDictionary<ulong, int>();
            //for (int i = 1; i < list.Count; i++) {
            //	if (diffDict.TryGetValue(list[i] - list[i - 1], out var value)) {
            //		diffDict[list[i] - list[i - 1]] = value + 1;
            //	} else {
            //		diffDict[list[i] - list[i - 1]] = 1;
            //	}
            //}

            //var diffs = diffDict.OrderByDescending(kv => kv.Value).ToArray();
            //var diffList = new List<KeyValuePair<ulong, int>>();
            //int count = 0;
            //for (int i = 0, j = 0; i < 32; j++) {
            //	if (diffs[j].Key >= 32) { diffList.Add(diffs[j]); i++; }
            //	count += diffs[j].Value;
            //}
            //Console.WriteLine(count);
            //int index = 0;
            //foreach (var d in diffList) {
            //	Console.Write($"{{ 0x{d.Key:X}, {index++} }},");
            //}


            //while (true) ;

            //foreach (var (value, syanten) in ReadTable(@"Z:\mahjong.table")) {
            //	var otherValue = Flip(value, GetLength(value));
            //	var syanten2 = Syanten(otherValue);
            //	if (syanten2 != syanten) {
            //		Console.WriteLine(Str2(value));
            //		Console.WriteLine(Str2(otherValue));
            //		Console.WriteLine(syanten);
            //		Console.WriteLine(syanten2);
            //		syanten2 = Syanten(otherValue);
            //		break;
            //	}
            //}

            // WriteTable(@"Z:\mahjong.table");
            //var dict = new Dictionary<ulong, int>(1292059); // 1292059
            //foreach (var (value, syanten) in ReadTable(@"Z:\mahjong.table")) {
            //	dict.Add(value, syanten);
            //}

            //var field = dict.GetType().GetField("buckets", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
            //var val = field.GetValue(dict) as int[];

            //var table = new HashSet<ulong>();
            //EnumTiles(14, table);

            //foreach (var value in table) {
            //	var info = GetInfo(value);
            //	if (info.Syanten == -1) {
            //		Console.WriteLine(Str2(value));
            //		Console.WriteLine(string.Join(" ; ", info.Analysis));
            //	}
            //}


            // WriteTable2(@"Z:\mahjong.table");
            //Console.WriteLine(Str2(0x0000000fa0000305));
            //Console.WriteLine(string.Join(", ", GetInfo(0x0000000fa0000305).Analysis));
            //var a = GetInfo(0x0000000fa0000305).Analysis[0];
            //uint val = a.GetArithmetic(true, out int bytes);
            //var ana = AnalysisResult.Build((int) (val >> 3));



            //void GetDiff(Dictionary<ulong, int> result, List<ulong> values) {
            //	ulong prev = values[0];
            //	int length = values.Count;
            //	for (int i = 1; i < length; i++) {
            //		ulong diff = values[i] - prev;
            //		if (result.TryGetValue(diff, out int count)) {
            //			result[diff] = count + 1;
            //		} else {
            //			result[diff] = 1;
            //		}
            //		prev = values[i];
            //	}
            //}

            //var hash = new HashSet<ulong>();
            //for (int n = 2; n <= 14; n += 3) {
            //	MahjongTable.EnumTiles(n, hash);
            //}

            //var lists = new List<ulong>[10];
            //for (int i = 0; i < lists.Length; i++) lists[i] = new List<ulong>();

            //foreach (var value in hash) {
            //	var info = MahjongTable.GetInfo(value);
            //	lists[info.Syanten + 1].Add(value);
            //}

            //Dictionary<ulong, int> diffDict = new Dictionary<ulong, int>();
            //for (int i = 0; i < lists.Length; i++) {
            //	lists[i].Sort();
            //	GetDiff(diffDict, lists[i]);
            //}

            //var alists = new List<ulong>[10];
            //for (int i = 0; i < alists.Length; i++) {
            //	alists[i] = lists[i].ConvertAll(val => MahjongTable.Arithmetic(val));
            //}

            //Dictionary<ulong, int> diffDict2 = new Dictionary<ulong, int>();
            //for (int i = 0; i < alists.Length; i++) {
            //	alists[i].Sort();
            //	GetDiff(diffDict2, alists[i]);
            //}

            //var huffman = Huffman<ulong>.Build(diffDict.Select(kv => (kv.Key, (long) kv.Value)).ToArray());
            //Console.WriteLine(Huffman<ulong>.GetInfo(huffman));
            //var huffman2 = Huffman<ulong>.Build(diffDict2.Select(kv => (kv.Key, (long) kv.Value)).ToArray());
            //Console.WriteLine(Huffman<ulong>.GetInfo(huffman2));

            MahjongTable.Write2(@"Z:\mahjong2.table");

            //foreach (var (val, info) in MahjongTable.Read2(@"Z:\mahjong2.table")) {
            //	if (info.Syanten == -1) {
            //		Console.WriteLine(MahjongTable.Str(val));
            //		Console.WriteLine(string.Join("; ", info.Analysis));
            //	}
            //}

            //var values = new List<(ulong Value, long Count)>();
            //for (int i = 1; i < 20; i++) {
            //	values.Add(((ulong) i, i));
            //}

            //var info = Huffman<ulong>.Build(values);
            //foreach (var i in info) {
            //	Console.WriteLine($"{i.Key} => '{i.Binary}'");
            //}

            //byte[] data = null;
            //using (var mem = new MemoryStream()) {
            //	using (var writer = new HuffmanWriter<ulong>(mem, values))
            //	using (var handler = writer.BeginWrite((int) values.Sum(p => p.Count))) {
            //		for (int i = 0; i < values.Count; i++) {
            //			for (int j = 0; j < values[i].Count; j++) {
            //				handler.Write(values[i].Value);
            //			}
            //		}
            //	}
            //	data = mem.ToArray();
            //}

            //using (var mem = new MemoryStream(data))
            //using (var reader = new HuffmanReader<ulong>(mem)) {
            //	foreach (var val in reader.ReadValues()) {
            //		Console.WriteLine(val);
            //	}
            //}
        }