問題(和訳)

Problem 205 - PukiWiki
https://goo.gl/r6CkVi

回答例

(echo -e {1..6}'+'{1..6}'+'{1..6}'+'{1..6}'+'{1..6}'+'{1..6}"\\n" | bc | awk '{a[$1]++}END{for(v in a)print "6",v,a[v]}'; echo -e {1..4}'+'{1..4}'+'{1..4}'+'{1..4}'+'{1..4}'+'{1..4}'+'{1..4}'+'{1..4}'+'{1..4}"\\n" | bc | awk '{a[$1]++}END{for(v in a)print "4",v,a[v]}') | awk '$1==4{d4[$2]=$3}$1==6{d6[$2]=$3}END{for(x in d4)for(y in d6)if(x*1>y*1)print x,y,d4[x],d6[y]}' | awk '{a+=$3*$4}END{printf "%0.7f\n",a/(6^6*4^9)}'

実行結果

0.5731441

real    0m4.413s
user    0m3.250s
sys     0m1.530s

解説

問題文の通り、そのまま素直に、
ピーターとコリンそれぞれのサイコロの出目と組み合わせ数を計算し、

(ピーターがコリンに勝つ組み合わせ数)/ (全体の組み合わせ数)

を計算する

#!/bin/bash

(
# 6 のサイコロの出目の組み合わせを全て出力(bash依存)
# 1+1+1+1+1+1
# 1+1+1+1+1+2
#  ...
# 6+6+6+6+6+6
echo -e {1..6}'+'{1..6}'+'{1..6}'+'{1..6}'+'{1..6}'+'{1..6}"\\n" |
# 出目の合計値を計算
bc |
# それぞれの出目が何通りあるかを集計
awk '
{
  a[$1]++
}END{
  for(v in a)
    # 6 のサイコロの出目であることを識別するために、
    # 先頭フィールドに "6" を付与する
    print "6",v,a[v]
}';
# 同様に 4 のサイコロの出目の組み合わせを集計
echo -e {1..4}'+'{1..4}'+'{1..4}'+'{1..4}'+'{1..4}'+'{1..4}'+'{1..4}'+'{1..4}'+'{1..4}"\\n" |
bc |
awk '
{
  a[$1]++
}END{
  for(v in a)
    print "4",v,a[v]
}'
) |
# ピーターがコリンに勝つ組み合わせを探す
awk '
# 4 のサイコロの出目の組み合わせを、配列 d4 に格納
$1==4{
  d4[$2]=$3
}
# 6 のサイコロの出目の組み合わせを、配列 d6 に格納
$1==6{
  d6[$2]=$3
}
END{
  for(x in d4)
    for(y in d6)
      # ピーター (x) がコリン (y) に勝つ場合は出力
      if(x*1>y*1)
        print x,y,d4[x],d6[y]
}' |
# 結果の出力
awk '
{
  # ピーターがコリンに勝つ組み合わせの合計を集計
  a+=$3*$4
}END{
  # 勝つ組み合わせを、全ての組み合わせで割る
  # 10進7桁にroundし、 0.abcdefgという形で回答
  printf "%0.7f\n",a/(6^6*4^9)
}'

別解

最後の集計部分を awk ではなく dc で求めてみたところ、
dc でも k コマンドで小数点 7 桁の精度で出せるが、
残念なことに round はしてくれないようだ

ry) | awk '{a+=$3*$4}END{printf "%0.7f\n",a/(6^6*4^9)}'
       ↓
ry) | awk '{print $3*$4}END{for(i=1;i<=NR;i++)printf "+";print "";print 6^6;print 4^9;print "*\n7\nk/p"}' | dc

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-11-15 (水) 23:49:47