2017-02-22 11 views
5

Tôi đang in một bảng Tic-Tac-Toe. Tôi có một loạt các ký tự cho mỗi ô của bảng và một chuỗi định dạng cho bảng. Tôi hiện đang làm:Cho ăn một mảng để infn

let cells = [| 'X'; 'O'; 'X'; 'O'; 'X'; 'O'; ' '; ' '; ' ' |] 
printfn ".===.===.===.\n\ 
     | %c | %c | %c |\n\ 
     .===.===.===.\n\ 
     | %c | %c | %c |\n\ 
     .===.===.===.\n\ 
     | %c | %c | %c |\n\ 
     .===.===.===.\n" cells.[0] cells.[1] cells.[2] cells.[3] cells.[4] cells.[5] cells.[6] cells.[7] cells.[8] 

Có cách nào để nạp mảng ô vào printfn mà không liệt kê rõ ràng tất cả 9 mục trong mảng không? Tôi có thể sử dụng Array.fold hoặc kprintf bằng cách nào đó?

Trả lời

5

Funk của câu trả lời là khá tốt, nhưng tôi nghĩ bạn có thể làm cho nó đơn giản hơn bằng cách giới thiệu một chức năng join để ghép các yếu tố (tế bào riêng lẻ hoặc các hàng) có dải phân cách giữa họ và xung quanh họ.

let join s arr = sprintf "%s%s%s" s (String.concat s arr) s 

Sau đó, bạn có thể làm điều này:

cells 
|> Seq.chunkBySize 3 
|> Seq.map (Seq.map (sprintf " %c ") >> join "|") 
|> Seq.map (fun s -> s + "\n") 
|> join ".===.===.===.\n" 
|> printfn "%s" 
+0

Bây giờ đó là giống như nó! – Funk

3

Mỗi ứng dụng liên tiếp của đối số cho hàm sẽ dẫn đến một loại khác. Ví dụ:

let f1 = printfn "%d %d %d" // f1 : int -> int -> int -> unit 
let f2 = f1 0 // f2 : int -> int -> unit 
let f3 = f2 1 // f3 : int -> unit 
let r = f3 2 // r : unit 

Chú ý cách f1, f2, f3, và r tất cả đều có các loại khác nhau. Các loại khác nhau có nghĩa là bạn không thể đưa chúng vào cấu trúc dữ liệu chung, chẳng hạn như danh sách hoặc chuỗi.

(phải trung thực, có một con đường để đi về việc này sử dụng quá tải phương pháp, nhưng có xu hướng phá vỡ biên dịch và thường là không cần thiết cho các ứng dụng thực tế)

Tôi thà đi một con đường khác nhau:

for i in 0..2 do 
    printf ".===.===.===.\n|" 
    for j in 0..2 do 
    printf "%c |" cells.[i*3+j] 
    printfn "" 
printfn ".===.===.===." 
4

Thật xa vời, nhưng có một mẫu được tìm thấy.

cells 
|> Array.toList 
|> List.chunkBySize 3 
|> List.fold 
    (fun acc list -> acc + 
        (list |> List.fold (fun acc char -> acc + sprintf "| %c " char) "") + 
        "|\n.===.===.===.\n") 
    ".===.===.===.\n" 
|> printf "%s" 
Các vấn đề liên quan