私はハンドジェネレータを作成していますが、3カードハンドやフルハウスなどの特定のハンドが作成されたかどうかを記録したいと思います。私はこれを行う方法を理解しようとしており、文字列にgrepを使用する方法も考えましたが、多くの行を作成する必要があり、過度に反復的であることに気づきました。という最後に生成された文字列を保持するファイルがありますout.txt
。
以下はスクリプトの出力です。
io@conroe$ ./card 5
♦ 6 ♦ Q ♠Q ♥J ♣3
私は次のようなものが欲しい:
io@conroe$ ./card 5
♦ 6 ♦ Q ♠Q ♥J ♣3
PAIR - QUEENS
コードは単純に見えますが、まだこの部分を完了する方法を見つけようとしています。 (今、私は小さなピクセルカードグラフィックセットを見つけてテキストの代わりに使うことができれば本当に良いようです。)コード:
#!/bin/bash
cat /dev/null > out.txt
z=$( < out.txt)
for (( y=1; y<=$1; y++ ))
do
< /dev/urandom LC_CTYPE=C tr -dc HDCS | head -c 1 | while read -n 1 s
do
case $s in
D)
printf ' \e[0;31;47m ♦ '
;;
H)
printf ' \e[0;31;47m ♥'
;;
S)
printf ' \e[0;30;47m ♠'
;;
C)
printf ' \e[0;31;47m ♣'
;;
esac
done
< /dev/urandom LC_CTYPE=C tr -dc "1""2""3""4""5""6""7""8""9""10""J""Q""K""A" | head -c 1 | while read -n 1 n
do
if [ $n = "0" ]
then
echo -n '10 '
echo -n '10 ' >> out.txt
else
echo -n "$n "
echo -n "$n " >> out.txt
fi
done
printf '\e[0m'
done
printf "\n"
編集:ところで、文字列はout.txt
次のようになります。
6 Q Q J 3
ベストアンサー1
printf '%s\n' {♠,♣,♢,♡}$'\t'{{2..10},J,K,Q,A} | shuf -n5 |
gawk 'BEGIN{ split(",Twos,Threes,Fours,Fives,Sixes,Sevens,Eights,Nines,Tens",vt,","); vt["J"]="Jacks"; vt["Q"]="Queens"; vt["K"]="Kings"; vt["A"]="Aces"; } # values-text
{ c[$2]++; printf("%s %s", $1, $2(NR==5?"\n":"\t")) }
END{ for(i in c){
if( c[i]==2 ){ print "PAIR: " vt[i]; cp++ }
if( c[i]==3 ){ print "THREE: " vt[i]; ct++ }
if( c[i]==4 ){ print "FOUR: " vt[i] } }
if( cp==2 ) { print "TWO PAIRS" }
if( cp&&ct ) { print "FULL HOUSE" } }'
出力例:
♡ Q ♣ A ♢ A ♢ Q ♡ 2
PAIR: Aces
PAIR: Queens
TWO PAIRS
bashがoptionsを介してawkに渡されたawkのrand()シードメソッドを使用するawk
ことを除いて、ここではまったく同じことが行われます。出力は上記と同じです。 $RANDOM
-v
gawk -v seed=$RANDOM '
BEGIN{srand(seed)
split("♠♣♢♡",s,"") # suit: 1-4
split("A,2,3,4,5,6,7,8,9,10,J,Q,K",v,",") # values: 1-13
split(",Twos,Threes,Fours,Fives,Sixes,Sevens,Eights,Nines,Tens",vt,","); vt["A"]="Aces"; vt["J"]="Jacks"; vt["Q"]="Queens"; vt["K"]="Kings"; # values-text
for(es in s){ for(ev in v){ sv[i++]=s[es]" "v[ev] }}; # 0-51
imax=4; for(i=0;i<=imax;i++){ # pick 5 cards at random from array `v`
rix=int(rand()*(52-i))+i # ranges from 0-51 to 4-51, as per `i`
tmp=sv[i]; sv[i]=sv[rix]; sv[rix]=tmp # swap ramdom value to front of array, as per `i`
split(sv[i],fv," "); c[fv[2]]++ # increment face-value counts
printf("%s", sv[i](i==imax?"\n":"\t")) # print the full hand in incremets
}
for(i in c){
if( c[i]==2 ){ print "PAIR: " vt[i]; cp++ }
if( c[i]==3 ){ print "THREE: " vt[i]; ct++ }
if( c[i]==4 ){ print "FOUR: " vt[i] } }
if( cp==2 ) { print "TWO PAIRS" }
if( cp&&ct ) { print "FULL HOUSE" }}'