2017-02-22 1 views
5

Ich drucke ein Tic-Tac-Toe Board. Ich habe eine Reihe von Zeichen für jede Zelle der Platine und eine Format-Zeichenfolge für die Platine. Ich mache zur Zeit:Ein Array zu printfn einspeisen

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] 

Gibt es eine Möglichkeit, die Zellen-Array zu ernähren, ohne explizit auf printfn im Array alle 9 Artikel aufzählt? Könnte ich irgendwie Array.fold oder kprintf benutzen?

Antwort

5

Antwort Funks ist ziemlich gut, aber ich denke, man kann es durch die Einführung einer join Funktion einfacher machen Elemente verketten (einzelne Zellen oder Zeilen) mit Separatoren zwischen ihnen und um sie herum.

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

Dann können Sie dies tun:

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

mehr Nun, das ist wie es! – Funk

3

Jede nachfolgende Anwendung eines Arguments auf die Funktion führt zu einem anderen Typ. Zum Beispiel:

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 

Beachten Sie, wie f1, f2, f3 und r alle verschiedenen Arten haben. Unterschiedliche Typen bedeuten, dass Sie sie nicht in eine generische Datenstruktur wie z. B. eine Liste oder eine Sequenz verschieben können.

(um ehrlich zu sein, gibt es eine Möglichkeit, über diese mit der Methode Überlastungen zu gehen, aber das dazu neigt, den Compiler zu brechen und in der Regel nicht notwendig ist für reale Anwendungen)

ich lieber einen anderen Weg gehen würde:

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

Es ist weit entfernt von sexy, aber es gibt ein Muster zu finden.

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" 
Verwandte Themen