challenge 変形Fizz-Buzz問題

どもraynstardです。
どちらにしようか迷いましたが発想の元ネタがUIさんの投稿からなので
こちらに投稿してみます。
--------------
以下の仕様を満たす文字列を
20行出力するプログラムを作成してください。

1. 1行の出力は「<行番号> ':' <メッセージ>」であること。
2. 行番号が 3の倍数であるとき、メッセージは「Fizz」であること
3. 行番号が 5の倍数であるとき、メッセージは「Buzz」であること
4. 行番号が 3の倍数かつ5の倍数であるとき、メッセージは「FizzBuzz」であること
5. 上記に記した条件以外のメッセージについては「hoge」であること
6. 条件分岐する場合、if文のみが使用でき、
   かつ、論理式が成立した場合の処理のみが記述できます。
#アセンブリなどifがなければif以外でもかまわないです。(意味が同じならば)

というわけでこの問題はFizz-Buzz問題をelseなしならどう書く?という問題です。

出力例:
 1:hoge
 2:hoge
 3:Fizz
 4:hoge
 5:Buzz
 6:Fizz
 7:hoge
 8:hoge
 9:Fizz
10:Buzz
11:hoge
12:Fizz
13:hoge
14:hoge
15:FizzBuzz
16:hoge
17:hoge
18:Fizz
19:hoge
20:Buzz

Posted feedbacks - OCaml

お題の意図がいまいち掴めてません。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
let fizzbuzz n =
  let rec fb n i =
    Printf.printf "%2d:%s\n" i
      (match i with
           _ when i mod 15 == 0 -> "FizzBuzz"
         | _ when i mod 3 == 0 -> "Fizz"
         | _ when i mod 5 == 0 -> "Buzz"
         | _ -> "hoge");
    if i < n then fb n (i+1)
  in fb n 1

let _ = fizzbuzz 20

ifもelseもmod演算子も無しで書いてみました。
1
2
3
4
5
6
7
8
let mes = [| "hoge"; "Fizz"; "Buzz"; "FizzBuzz" |]

let f acc i =
  let c = acc land 3 in
  let _ = Printf.printf "%02d:%s\n" i mes.(c) in
  (acc lsr 2) lor (c lsl 28)

let _ = Array.fold_left f 810092048 (Array.init 20 (fun i->i+1))

Index

Feed

Other

Link

Pathtraq

loading...