static DefaultGame() { foreach (var(value, info) in MahjongTable.Read2("mahjong2.table")) { mahjongTable.Add(value, info); } }
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); }
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); // } //} }