見出し画像

SASでFizzBuzzを実装してみた

分析屋の藤島です。

普段、解析用データセットの作成や帳票作成でSASを用いることが多いのですが、SASを用いてプログラミングを楽しむ(?)ということはやったことないです。

そこでふとSASで有名なFizzBuzzを実装してみようと思い、やってみました。


1.FizzBuzzとは

ご存知の方もいるかもしれませんが、FizzBuzzとは元々海外での遊びで1から順番に数を言うゲームのルールは以下の通りです。

  • 3の倍数なら「Fizz」と言う

  • 5の倍数なら「Buzz」と言う

  • 3の倍数かつ5の倍数なら「Fizz Buzz」と言う

  • 上記以外でなければ、その数を言う

イメージとしては1, 2, Fizz, 4, Buzz ,..., 13, 14, Fizz Buzz,,,,といった感じで、3がFizz、5がBuzz、15がFizz Buzzに該当します。

2.SASによる実装

上手くいかなかったパターンも含めて、全部で3つ紹介します。

パターン1

【プログラム】

data FizzBuzz1 ;
  length i 8 A $200 ;
  do i = 1 to 100 ;
    if mod(i,3) = 0 then A = "Fizz" ;
    if mod(i,5) = 0 then A = "Buzz" ;
    if mod(i,3) = 0  and mod(i,5) = 0 then A = "Fizz Buzz" ;
    else A = strip(put(i, best.)) ;
    output ;
  end ;
run ;

以下、プログラムの説明になります。

  • 1行目:出力時のデータセット名

  • 2行目:変数の長さを指定

  • 3行目~9行目:ループ処理(Pythonでいうfor文になります)

  • 4行目:1~100のうち3で割り切れるなら、”Fizz”を格納する

  • 5行目:1~100のうち5で割り切れるなら、”Buzz”を格納する

  • 6行目:1~100のうち3と5で割り切れるなら、”Fizz Buzz”を格納する

  • 7行目:上記に該当しない場合は、その数を格納する

  • 8行目:データセットへ出力

  • 9行目:ループ処理終了

【実行結果】

実行結果を確認すると3の倍数かつ5の倍数では”Fizz Buzz”という結果になったが、それ以外はすべて数となっています。
なぜかというと、7行目にあるelseは6行目に記載している条件に対応しているためです。
4行目や5行目の条件で”Fizz”、”Buzz”となったとしても、プログラムの処理の順番により実際は6~7行目に書いてある条件で判定されてしまっています。

パターン2

【プログラム】

data FizzBuzz2;
  length i 8 A $200 ;
  do i = 1 to 100 ;
    if mod(i,3) = 0 then A = "Fizz" ;
    else if mod(i,5) = 0 then A = "Buzz" ;
    else if mod(i,3) = 0  and mod(i,5) = 0 then A = "Fizz Buzz" ;
    else A = strip(put(i, best.)) ;
    output ;
  end ;
run ;

以下、プログラムの説明になります。

  • 1行目:出力時のデータセット名

  • 2行目:変数の長さを指定

  • 3行目~9行目:ループ処理(Pythonでいうfor文になります)

  • 4行目:1~100のうち3で割り切れるなら、”Fizz”を格納する

  • 5行目:4行目の条件に当てはまらず、1~100のうち5で割り切れるなら、”Buzz”を    格納する

  • 6行目:4~5行目の条件に当てはまらず、1~100のうち3と5で割り切れるなら、”     Fizz Buzz”を格納する

  • 7行目:いずれの条件にも該当しない場合は、その数を格納する

  • 8行目:データセットへ出力

  • 9行目:ループ処理終了

【実行結果】

実行結果を確認すると3の倍数または5の倍数でそれぞれ”Fizz”、 “Buzz”という結果になりましたが、3の倍数かつ5の倍数では”Fizz Buzz”という結果にはならず、”Fizz”になりました。なぜかというと、6行目の条件に入る前に3の倍数もしくは5の倍数であれば、それぞれ”Fizz”、”Buzz”とする条件に流れてしまい、7行目の条件に該当する数値がなく、3の倍数もしくは5の倍数でなければそのまま8行目へ流れてしまっているためです。

パターン3

【プログラム】

data FizzBuzz3 ;
  length i 8 A $200 ;
  do i = 1 to 100 ;
    if mod(i, 3) = 0 and mod(i, 5) = 0 then A = "Fizz Buzz" ;
    else if mod(i, 3) = 0 then A = "Fizz" ;
    else if mod(i, 5) = 0 then A = "Buzz" ;
    else A = strip(put(i, best.)) ;
    output ;
  end ;
run ;

以下、プログラムの説明になります。

  • 1行目:出力時のデータセット名

  • 2行目:変数の長さを指定

  • 3行目~9行目:ループ処理(Pythonでいうfor文になります)

  • 4行目:1~100のうち3と5で割り切れるなら、”Fizz Buzz”を格納する

  • 5行目:4行目の条件に当てはまらず、1~100のうち3で割り切れるなら、”Fizz”を    格納する

  • 6行目:4~5行目の条件に当てはまらず、1~100のうち3で割り切れるなら、”Buzz”         を格納する

  • 7行目:いずれの条件にも該当しない場合は、その数を格納する

  • 8行目:データセットへ出力

  • 9行目:ループ処理終了

【実行結果】

FizzBuzzのルール通りになりました!

3.感想

条件分岐とループ処理の練習・復習にはちょうど良かったです。
条件分岐に慣れてくると、そのプログラム処理の順番で良いかどうか確認することを怠りがちになるかもしれません。
しかし、実際データセットや解析、分析するときに気をつけないと自分が想像していた挙動とはほど遠い挙動を起こすことがあるので、注意しないといけないと思います。

4.最後に

慣れてきたタイミングで基礎基本に立ち返ると、何か新しい発見があるかもしれません!



ここまでお読みいただき、ありがとうございました!
この記事が少しでも参考になりましたら「スキ」を押していただけると幸いです!

株式会社分析屋について

弊社が作成を行いました分析レポートを、鎌倉市観光協会様HPに掲載いただきました。

ホームページはこちら。

noteでの会社紹介記事はこちら。

【データ分析で日本を豊かに】
分析屋はシステム分野・ライフサイエンス分野・マーケティング分野の知見を生かし、多種多様な分野の企業様のデータ分析のご支援をさせていただいております。 「あなたの問題解決をする」をモットーに、お客様の抱える課題にあわせた解析・分析手法を用いて、問題解決へのお手伝いをいたします!
【マーケティング】
マーケティング戦略上の目的に向けて、各種のデータ統合及び加工ならびにPDCAサイクル運用全般を支援や高度なデータ分析技術により複雑な課題解決に向けての分析サービスを提供いたします。
【システム】
アプリケーション開発やデータベース構築、WEBサイト構築、運用保守業務などお客様の問題やご要望に沿ってご支援いたします。
【ライフサイエンス】
機械学習や各種アルゴリズムなどの解析アルゴリズム開発サービスを提供いたします。過去には医療系のバイタルデータを扱った解析が主でしたが、今後はそれらで培った経験・技術を工業など他の分野の企業様の問題解決にも役立てていく方針です。
【SES】
SESサービスも行っております。


この記事が参加している募集