begin jiang

This commit is contained in:
Tao Tien 2026-02-13 10:11:17 -08:00
parent 8c4132e628
commit 042975e561
7 changed files with 134 additions and 16 deletions

7
jiang/Cargo.toml Normal file
View file

@ -0,0 +1,7 @@
[package]
name = "jiang"
version = "0.1.0"
edition = "2024"
[dependencies]
jong-types.workspace = true

68
jiang/src/lib.rs Normal file
View file

@ -0,0 +1,68 @@
use std::collections::HashMap;
use jong_types::*;
// pub fn check_valid() {}
pub enum Meldable {
Ron,
Chii(Tile, Tile),
Pon,
Kan,
}
pub fn find_meldables(hand: &[Tile], dealt: Tile) -> Vec<Meldable> {
let counts = hand.iter().fold(HashMap::new(), |mut m, t| {
let e = m.entry(t).or_insert(0);
*e += 1;
m
});
let mut calls = vec![];
// find pon & kan
if let Some(&count) = counts.get(&dealt) {
if count == 3 {
calls.push(Meldable::Kan)
} else if count == 2 {
calls.push(Meldable::Pon)
}
}
// find chii
if let Some(next_outer) = dealt.next_rank() {
if let Some(next_inner) = next_outer.next_rank()
&& counts.contains_key(&next_outer)
&& counts.contains_key(&next_inner)
{
calls.push(Meldable::Chii(next_outer, next_inner));
}
if let Some(prev_inner) = next_outer.prev_rank()
&& counts.contains_key(&next_outer)
&& counts.contains_key(&prev_inner)
{
calls.push(Meldable::Chii(next_outer, prev_inner));
}
}
if let Some(prev_outer) = dealt.prev_rank()
&& let Some(prev_inner) = prev_outer.prev_rank()
&& counts.contains_key(&prev_outer)
&& counts.contains_key(&prev_inner)
{
calls.push(Meldable::Chii(prev_outer, prev_inner));
}
// find ron
calls
}
fn count_shapes(hand: &[Tile]) {
let hand = if !hand.is_sorted() {
let mut hand = hand.to_vec();
hand.sort();
&hand
} else {
hand
};
}