Comment detail

ポーカーの役判定 (Nested Flatten)

sedで書けそうな気がするのですが、めんどくさがってsortを使うことにしたのでシェルスクリプトになってしまいました。 行が長いです。ごめんなさい。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#!/bin/sh

if echo $1 | grep -q -v '^\([CDHS][A2-9TJQK]\)\{5\}$'; then
    echo 'Error: Invalid hand'
    exit 1
fi

declare n=`echo $1 | sed 's/[CDHS]\(.\)/\1\n/g' | tr 'A2-9TJQK' 'a-m' | sort | tr -d '\n' | sed -e '/[a-e]$/y/abcde/ijklm/' -e '/[f-i]$/y/abcdefghi/efghijklm/' -e '/[jk]$/y/abcdefghijk/cdefghijklm/' -e '/l$/y/abcdefghijkl/bcdefghijklm/'`

if echo $1 | grep -q '\(.\).\(\1.\)\{4\}'; then
    echo $n | sed -e 's/ajklm/Royal flush/' -e 's/ijklm/Straight flush/' -e 's/....m/Flush/'
elif echo $n | grep -q '[ai]jklm'; then
    echo Straight
elif echo $n | grep -q '\(.\)\1\1\1'; then
    echo Four of a kind
else
    echo $n | sed -e 's/\(.\)\1\1//' -e 's/\(.\)\1//g' -e 's/^.....$/No pair/' -e 's/^...$/One pair/' -e 's/^..$/Three of a kind/' -e 's/^.$/Two pair/' -e 's/^$/Full house/'
fi

その後、まじめにsedで書いてみました。こっちのほうがきれいかも。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#!/bin/sed -f

/^\([CDHS][A2-9TJQK]\)\{5\}$/!b
/\([CDHS][A2-9TJQK]\).*\1/b

/\(.\).\(\1.\)\{4\}/{
    s/^/X/
}

s/[CDHS]//g

s/\([2468TQK]\+\)\([A3579J]\+\)/\2\1/g
s/\([2468TQK]\+\)\([A3579J]\+\)/\2\1/

s/\([3478JQK]\+\)\([A2569T]\+\)/\2\1/g
s/\([3478JQK]\+\)\([A2569T]\+\)/\2\1/

s/\([5-8K]\+\)\([A2349TJQ]\+\)/\2\1/g
s/\([5-8K]\+\)\([A2349TJQ]\+\)/\2\1/

s/\([9TJQK]\+\)\([A2-8]\+\)/\2\1/g
s/\([9TJQK]\+\)\([A2-8]\+\)/\2\1/

/[2-5]$/y/A2345/9TJQK/
/[6-9]$/y/A23456789/56789TJQK/
/[TJ]$/y/A23456789TJ/3456789TJQK/
/Q$/y/A23456789TJQ/23456789TJQK/

s/^\(.\)\1\1\1K$\|^.KKKK$/Four of a kind/

s/\(.\)\1\+//g

s/^$/Full house/
s/^.$/Two pair/
s/^..$/Three of a kind/
s/^...$/One pair/
s/^[A9]TJQK$/Straight/
s/^.....$/No pair/
s/^XATJQK$/Royal flush/
s/^X9TJQK$/Straight flush/
s/^X.....$/Flush/

Index

Feed

Other

Link

Pathtraq

loading...