2023年06月07日

銚子丸でいくらの寿司を何枚食べるといいか

 銚子丸の寿司皿の一皿あたりの値段は、かなり幅があります。
 200 円引きのクーポンを使う場合、1,000 円以上食べないといけません。これは簡単にクリアーできますが、問題はその次です。一定金額よりも多く、かつあまり高くならないようにするためには、いくらの寿司を何枚食べるといいでしょうか。オーツの場合、たとえば、1,200 円を基準にして、それよりも若干多いようにしながら、なるべく 1,200 円に近づけたいと思いました。
 銚子丸の一皿の価格はいろいろですが、400 円以上の皿を食べることはないものと仮定します。すると、寿司皿の価格は7種類になります。
 いろいろな組み合わせが考えられるので、それぞれの金額の皿の枚数も変わります。皿数の合計は5枚以上とします。金額別のメニューを見ると、場合によっては1皿とか2皿しかない場合もあるので、その場合は、その枚数を超えないようにします。また、赤エビが大変おいしいので、毎回食べるとすると、その金額の皿(242 円皿)は必ず1枚入ることになります。
 こんな諸条件を全部考慮していくらの皿を何枚食べるといいか、計算するのがとても面倒なように思ったので、ちょっとプログラムを作ってみました。オーツは、プログラム言語として、無料で使える「free PASCAL」を使っています。
 作成した PASCAL のプログラムは以下の通りです。ブログ記事では、(html 言語で表現するために)半角空白によるインデンテーションがうまく表現できないので、プログラム中の半角空白2個を全角空白1個に置き換えています。また半角の不等号「小なり」を全角に置き換えています。

program tyousi2; (* 銚子丸で金額を指定してそれに近い皿数を求める *)
const kingaku=1200; (* 1525 *)
   kakaku1=396; kakaku2=352; kakaku3=308; kakaku4=264;
   kakaku5=242; kakaku6=198; kakaku7=154; (* 1皿の単価 *)
var s1,s2,s3,s4,s5,s6,s7,mai:integer; (* 皿の枚数 *)
  i,j,n,sum,min,minj:integer;
  data:array[1..7, 1..3000] of integer;
  skingaku:array[1..3000] of integer;
begin
n:=0;
for s1:=0 to 1 do (* 396 円皿は最大1枚 *)
 begin
  for s2:=0 to 2 do (* 352 円皿は最大2枚 *)
  begin
   for s3:=0 to 1 do (* 308 円皿は最大1枚 *)
   begin
    for s4:=0 to 1 do (* 264 円皿は最大1枚 *)
    begin
     for s5:=1 to 3 do (* 242 円皿は(赤海老があるから)最小1枚、最大3枚 *)
     begin
      for s6:=0 to 2 do (* 198 円皿は最大2枚 *)
      begin
       for s7:=0 to 1 do (* 154 円皿は最大1枚 *)
       begin
        sum:=s1*kakaku1+s2*kakaku2+s3*kakaku3+s4*kakaku4
          +s5*kakaku5+s6*kakaku6+s7*kakaku7;
        mai:=s1+s2+s3+s4+s5+s6+s7;
        if (sum>kingaku) and (sum<kingaku*1.3) and (mai>=5) then
        begin
         inc(n);
         if n>3000 then
         begin
          writeln('error n>3000'); halt;
         end;
         skingaku[n]:=sum;
         data[1,n]:=s1; data[2,n]:=s2; data[3,n]:=s3; data[4,n]:=s4;
         data[5,n]:=s5; data[6,n]:=s6; data[7,n]:=s7;
         (* writeln('sum=',sum); *)
        end;
       end;
      end;
     end;
    end;
   end;
  end;
 end;
for i:=1 to 20 do
 begin
  min:=9999;
  for j:=1 to n do
  begin
   if skingaku[j]<min then
   begin
    min:=skingaku[j]; minj:=j;
   end;
  end;
  write('順位=',i:2,' 金額=',min);
  if data[1,minj]>0 then write(kakaku1:5,'円皿×',data[1,minj]);
  if data[2,minj]>0 then write(kakaku2:5,'円皿×',data[2,minj]);
  if data[3,minj]>0 then write(kakaku3:5,'円皿×',data[3,minj]);
  if data[4,minj]>0 then write(kakaku4:5,'円皿×',data[4,minj]);
  if data[5,minj]>0 then write(kakaku5:5,'円皿×',data[5,minj]);
  if data[6,minj]>0 then write(kakaku6:5,'円皿×',data[6,minj]);
  if data[7,minj]>0 then write(kakaku7:5,'円皿×',data[7,minj]);
  writeln;
  skingaku[minj]:=9999;
 end;
end.

 これを実行すると、以下のように出力されます。

順位= 1 金額=1210 308円皿×1 264円皿×1 242円皿×1 198円皿×2
順位= 2 金額=1210 308円皿×1 264円皿×1 242円皿×2 154円皿×1
順位= 3 金額=1210 352円皿×1 264円皿×1 242円皿×1 198円皿×1 154円皿×1
順位= 4 金額=1232 308円皿×1 242円皿×3 198円皿×1
順位= 5 金額=1232 352円皿×1 242円皿×2 198円皿×2
順位= 6 金額=1232 352円皿×1 242円皿×3 154円皿×1
順位= 7 金額=1232 396円皿×1 242円皿×2 198円皿×1 154円皿×1
順位= 8 金額=1254 308円皿×1 264円皿×1 242円皿×2 198円皿×1
順位= 9 金額=1254 352円皿×1 264円皿×1 242円皿×1 198円皿×2
順位=10 金額=1254 352円皿×1 264円皿×1 242円皿×2 154円皿×1
順位=11 金額=1254 352円皿×1 308円皿×1 242円皿×1 198円皿×1 154円皿×1
順位=12 金額=1254 396円皿×1 264円皿×1 242円皿×1 198円皿×1 154円皿×1
順位=13 金額=1276 242円皿×3 198円皿×2 154円皿×1
順位=14 金額=1276 352円皿×1 242円皿×3 198円皿×1
順位=15 金額=1276 396円皿×1 242円皿×2 198円皿×2
順位=16 金額=1276 396円皿×1 242円皿×3 154円皿×1
順位=17 金額=1298 264円皿×1 242円皿×2 198円皿×2 154円皿×1
順位=18 金額=1298 308円皿×1 264円皿×1 242円皿×3
順位=19 金額=1298 352円皿×1 264円皿×1 242円皿×2 198円皿×1
順位=20 金額=1298 352円皿×1 308円皿×1 242円皿×1 198円皿×2

 オーツは、この組み合わせ表(の上位の一部)と、寿司皿を価格別に並べたメニューリストを用意し、紙にプリントして店に持参して、それを見ながらタブレットで注文しています。
posted by オーツ at 03:47| Comment(0) | TrackBack(0) | パソコンとIT | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバック