// Suit Distribution package main import ( "fmt" "os" ) func read_distribution(file *os.File) (int, int) { var number1, number2 int _, err := fmt.Fscanf(file, "%d %d\n", &number1, &number2) if err != nil { panic(fmt.Sprintf("Scan Failed: %v", err)) } return number1, number2 } func write_integer(file *os.File, number int) { _, err := file.WriteString(fmt.Sprintf("%d\n", number)) if err != nil { fmt.Printf("error writing string: %v", err) } } func combination(n int, k int) int { result := 1 if k > (n - k) { k = n - k } for i := k + 1; i <= n; i++ { result *= i } for i := 2; i <= n-k; i++ { result /= i } return result } func probability(hand1 int, hand2 int) float64 { denominator := combination(26, 13) numerator := combination(hand1+hand2, hand1) numerator *= combination(26-hand1-hand2, 13-hand1) result := float64(numerator) / float64(denominator) if hand1 != hand2 { result *= 2 } return result } func main() { input_file, err := os.Open("suit.in") if err != nil { fmt.Println(err) } defer input_file.Close() output_file, err := os.Create("suit.out") // creating... if err != nil { fmt.Printf("error creating file: %v", err) return } defer output_file.Close() cards1, cards2 := read_distribution(input_file) for cards1 != -1 && cards2 != -1 { result := probability(cards1, cards2) // fmt.Printf("%d-%d split: %.8f\n", cards1, cards2, result) output_file.WriteString(fmt.Sprintf("%d-%d split: %.8f\n", cards1, cards2, result)) cards1, cards2 = read_distribution(input_file) } }