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 - Haskell

無限リストを使って、明示的条件判断無しでやってみました。

showItのところは

 zipWith4 (printf "%2d: %s%s%s") [1..] fizz buzz hoge

だと型が推測できんと怒られた。そういうもの?
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
import Data.List
import Text.Printf

fizzbuzz = zipWith4 showIt [1..] fizz buzz hoge
  where showIt :: Int->[Char]->[Char]->[Char]->[Char]
        showIt = printf "%2d: %s%s%s"
        fizz = ["","","Fizz"]++fizz
        buzz = ["","","","","Buzz"]++buzz
        hoge = ["hoge","hoge","","hoge","","","hoge","hoge",
                "","","hoge","","hoge","hoge",""]++hoge

main = putStr $ unlines $ take 20 $ fizzbuzz

ああ、[1..]の型が曖昧なのがprintfの型情報からだけでは解決できないってことなのかな。
こうしたら通った。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import Data.List
import Text.Printf

fizzbuzz = zipWith4 (printf "%2d: %s%s%s") ([1..]::[Int]) fizz buzz hoge
  where fizz = ["","","Fizz"]++fizz
        buzz = ["","","","","Buzz"]++buzz
        hoge = ["hoge","hoge","","hoge","","","hoge","hoge",
                "","","hoge","","hoge","hoge",""]++hoge

main = putStr $ unlines $ take 20 $ fizzbuzz

elseを書かないifを作ってしまいました。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
module Main (main) where

main = mapM_ putStrLn [show x ++ ":" ++ fizzBuzz x | x <- [1..10]]

fizzBuzz x = nif (isFizzBuzz x) "FizzBuzz" $ nif (isFizz x) "Fizz" $ nif (isBuzz x) "Buzz" "hoge"

isFizzBuzz x = (ntrue : replicate 14 nfalse) !! (x `mod` 15)
isFizz x = (ntrue : replicate 2 nfalse) !! (x `mod` 3)
isBuzz x = (ntrue : replicate 4 nfalse) !! (x `mod` 5)

ntrue x y = x
nfalse x y = y
nif x f g = x f g

Control.Monad.whenを使う
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
import Control.Monad
import Text.Printf

fizzs = tail  $ cycle $ take  3 $ "Fizz": repeat ""
buzzs = tail  $ cycle $ take  5 $ "Buzz": repeat ""

main = mapM_ (uncurry printing) 
     $ take 20 
     $ zip [1::Int ..] 
     $ zipWith (++) fizzs buzzs

printing n s = printf "%2d: " n >> when (s == "") (putStr "hoge") >> putStrLn s

1 と書いただけでは、Num クラスのどのインスタンスか分らないんです
ghciのプロンプトで型を確かめて見るとわかります

Prelude> :type 1
1 :: (Num t) => t

Index

Feed

Other

Link

Pathtraq

loading...