ご覧のページは旧ページです。



新ページへ3秒後に移動します。










« 「中の小人さん」的C言語考 | Top | 頭につけるだけで驚くほど勢いが増す言葉 »

2006年03月25日




●学食大人買い計算器

C言語を勉強するにあたり、まずアルゴリズムを勉強する事にした。
アルゴリズムってのは物の考え方や処理の方法論なので、早くて美しくてシンプルなコードに書くには必須の思考法な訳であるからして、これはこれでやってみると中々面白い。
コードを書くにも、その前にフローチャートを書き、設計段階で処理を考える。
一定条件で処理を反復させるにしても、処理前に条件を判断する「前判定型」を使うか、処理後に判断する「後判定型」を使うかで、ソースの見栄えやら処理の速さが変わるので、設計の難しさというか、面白みもあるなぁと納得。
今までは設計も何も無しでいきなりコードを書き、何でもかんでも「前判定型」で押し通す人だったので、この辺はなんとも新鮮な感じがする。

というわけで、練習コードを書くついでに、俺の勤務先に通う学生や教職員の全てに有用なプログラムを作ったので公開してみる。
名付けて「学食大人買い計算器」。
もちろんフリーウェアでGPLライセンス。商用利用も可能で、コードを開示すればソースコードの改変も可能。
ちなみに有用であると感じるかはどうかは「個人差」があると思う。いや、正直言うと、これ以上無いくらいアホなプログラムです…

「学食大人買い計算器」

概要;
某大学の学食で「同窓会うどん」と「日替わり定食」が人気メニューである事は疑いようのない事実であり、もし1億円でこの「同窓会うどん」と「日替わり定食」を買い占めるとすればいくつ買えるのだろう?という疑問もまた学食を利用する全ての人間にとって切実なものであると断言できる。
しかしながら、上記の疑問を二次方程式や鶴亀算で計算するにはいささかややこしすぎるわけで、「まぁ、死ぬほど食べられるのは確かやろうなぁ」という結論に落ち着いている方が大多数だと思われる。
そこで、「土偶しょーもないことを考えてみようプロジェクト、ハッカーチーム(総員1名)」がその疑問に答えを出すべくプログラムの開発に乗り出した。
開発環境は抜群の安定性と高速なカーネルを誇るSolaris11 b33、そしてSolarisに最もネイティブなCコンパイラであるSunStudio11である。

仕様:
100000000(一億円)で、
日替わり定食(350円)と同窓会うどん(60円)をあまり(おつり)が出ることなく、購入できる組み合わせを全て表示し、
最後にその組み合わせの総数を表示する。
どうしてもおつりが出る場合はその旨を表示する。

結果;
おつりを受け取ることなく1億円で「日替わり定食」と「同窓会うどん」を大人買いする組み合わせは47619通りあり、
「日替わり定食」が最も少ない場合の組み合わせは、「日替わり定食」2セット「同窓会うどん」1666655杯であり、
「日替わり定食」が最も多い場合の組み合わせは、「日替わり定食」285710セット「同窓会うどん」25杯
である事が判明した。
いずれにせよ「死ぬほど食べらるのは確かやろうなぁ」という事実に疑いの余地は無いようである。

問題点:
ちなみに、Intel Xeon 2.8Ghz RAM2GB 64bit環境のsolari11でこの計算に42分と10.26秒を要した。
処理は考え得る全ての組み合わせを試しているわけで、明らかにアルゴリズム的に悪いコードであるのは明白な事実である。
より一層の最適化が望まれる。

今後の課題:
現在「土偶しょーもないことを考えてみようプロジェクト、ハッカーチーム」は総員1名であり、明らかに参加者土偶の技術上の限界にある。
「土偶しょーもないことを考えてみようプロジェクト、ハッカーチーム(現在総員1名)」に対する参加を広く呼びかけ、より一層プロジェクトチームの充実を図り、コードの洗練が望まれる。
誰かこれより早いコード書いて下さい。m(_ _)m どう?>某Y氏、某カテジナ氏


ソースコード:


#include <stdio.h>
int main(){
        int mo,x,y,c;

//              printf("所持金は?"); //コメントを外せば任意の金額で計算する。
//      scanf("%d",&mo); //コメントを外せば任意の金額で計算する。

        mo=100000000;   //↑で金額を入力する場合はコメントアウトする。
        c=0;
        for(x=0 ; 350*x + 60*y <= mo ;x++){
                for(y=0 ; 350*x + 60*y <= mo ;y++){
                        if( 350*x + 60*y == mo){
                                c++;
                                printf("「日替わり定食」が %d セット「同窓会うどん」が %d 杯 \n",x,y);
                        }

                }
        y=0;
        }
        if(c==0){
                printf("%d円ではおつりが出ます。\n",mo);
        }
        else{
                printf("%d通りの大人買い/n",c);
        }

        return 0;

}

142

トラックバックURL

 

コメント

こんばんは。

'------------
Option Explicit

Const ALLMONEY = 100000000
Const PRICE_HIGAWARI = 350
Const PRICE_UDON = 60
Dim objShell
Dim objFs
Dim objTs
Dim strPath
Dim i
Dim iMax
Dim lngMoneyToBuyUdon
Dim lngCount
Dim sngTime1
Dim sngTime2


Set objShell = CreateObject("Wscript.Shell")
strPath = objShell.SpecialFolders("DeskTop")

Set objFs = CreateObject("Scripting.FileSystemObject")
Set objTS = objFs.CreateTextFile(strPath & "\Operation_UDON_XX.txt")

iMax = ALLMONEY / PRICE_HIGAWARI

lngCount = 0

sngTime1 = Timer

For i = 1 To iMax

lngMoneyToBuyUdon = (ALLMONEY - (PRICE_HIGAWARI * i))
If lngMoneyToBuyUdon Mod PRICE_UDON = 0 Then
lngCount = lngCount + 1
objts.WriteLine lngCount & vbTab & "higawari: " & i & vbTab & "udon: " & lngMoneyToBuyUdon / PRICE_UDON
End If

Next

sngTime2 = Timer

objTs.WriteLine "経過: " & (sngTime2 - sngTime1) & " 秒"

objTs.Close
Set objTs = Nothing

Set objFs = Nothing

MsgBox "Completed" & vbNewLine & "経過: " & (sngTime2 - sngTime1) & " 秒" & vbNewLine & "件数: " & lngCount & vbNewLine & "デスクトップのファイルを参照してください。", vbOKOnly, "Message"
'------------

これをファイル名「Operation_UDON_XX.vbs」で保存してダブルクリックしてみてください。拡張子でわかるようにWindowsでしか動きませんが、大丈夫ですよね?


コソバソハ、ヨウコン、毒舌紳士様

「土偶しょーもないことを考えてみようプロジェクト、ハッカーチーム」への入隊ありがとうございます。
(ちなみに除隊は受け付けておりません)

むむ…ファイル出力、時間計測まで実装済みですかぁ…
Max = ALLMONEY / PRICE_HIGAWARIのところでバイナリーサーチちっくなアルゴリズムなのは何となく…
確かにシーケンシャルに判定する必要は全く無いですやね…
うどんの可能的最大個数=総額/うどんの値段(全て整数)
定食の可能的最大個数=総額/定食の値段(全て整数)
ですわな。確かに。
でも、 完全にコード追い切れないでつ。(;つД`);

土偶家のSolarisにWindowsShellScriptインタプリタは入っていないので、明日職場で試してみます。(土偶家Windowsは休眠状態です...)
UNIX版cscriptやwscript作ると流行るかも…

コメントする

(必須項目:名前とコメント本文)
皆様のコメントを心よりお待ちしております。m(__)m