2017-02-22 10 views
5

पर एक सरणी खिला रहा है मैं एक टिक-टैक-टो बोर्ड मुद्रित कर रहा हूं। मेरे पास बोर्ड के प्रत्येक सेल और बोर्ड के लिए प्रारूप स्ट्रिंग के लिए वर्णों की एक श्रृंखला है। मैं वर्तमान में कर रहा हूँ:printfn

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] 

वहाँ स्पष्ट रूप से सरणी में सभी 9 आइटम की गणना के बिना printfn करने के लिए कोशिकाओं सरणी को खिलाने के लिए कोई तरीका है? क्या मैं किसी भी तरह Array.fold या kprintf का उपयोग कर सकता हूं?

उत्तर

5

फंक का जवाब बहुत अच्छा है, लेकिन मुझे लगता है कि आप यह उन्हें और उन्हें आसपास के बीच विभाजक के साथ तत्वों (व्यक्तिगत कोशिकाओं या पंक्तियाँ) को श्रेणीबद्ध करने के लिए एक join समारोह शुरू करने से सरल बना सकते हैं।

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

तो फिर तुम यह कर सकते हैं:

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

अब जब कि इसे और अधिक की तरह है! – Funk

3

फ़ंक्शन के लिए तर्क के प्रत्येक क्रमिक अनुप्रयोग को एक अलग प्रकार में परिणाम मिलता है। उदाहरण के लिए:

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 

सूचना कैसे f1, f2, f3, और r सभी विभिन्न प्रकार की है। विभिन्न प्रकारों का मतलब है कि आप उन्हें एक सामान्य डेटा संरचना, जैसे सूची या अनुक्रम में नहीं डाल सकते हैं।

(ईमानदारी से, वहाँ इस विधि भार के उपयोग के बारे में जाने के लिए एक तरीका है, लेकिन यह है कि संकलक तोड़ने के लिए जाता है और आम तौर पर वास्तविक अनुप्रयोगों के लिए आवश्यक नहीं है)

मैं नहीं बल्कि एक अलग रास्ता जाना होगा:

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

यह सेक्सी से बहुत दूर है, लेकिन एक पैटर्न पाया जा सकता है।

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" 
संबंधित मुद्दे