このディレクトリの索引

% 以下のサイトは # 出典::C/C++の宿題片付けます 128代目 #222 # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9599.txt # “パスカルの三角形”を表示するプログラムを作ってください。 # ただし、表示する段数はキー入力するようにします。 # # 実行の様子はこのような感じです。 # # [b8000@localhost]$ ./main # 何段表示しますか?: 13 # 1 # 1 1 # 1 2 1 # 1 3 3 1 # 1 4 6 4 1 # 1 5 10 10 5 1 # 1 6 15 20 15 6 1 # 1 7 21 35 35 21 7 1 # 1 8 28 56 70 56 28 8 1 # 1 9 36 84 126 126 84 36 9 1 # 1 10 45 120 210 252 210 120 45 10 1 # 1 11 55 165 330 462 462 330 165 55 11 1 # 1 12 66 220 495 792 924 792 495 220 66 12 1 # # # この問題は、calloc() を使って領域確保をしてください。 # 段数を入力した後、calloc() を使って、必要分の領域確保をします。 # # 表示の体裁は大まかに二等辺三角形の形になっていればOKです。 # なお、上の実行例のプログラムでは、 # # printf("%3d ", 〜); # ↑ # ここは半角スペース3個 # # という記述で表示を行なっています。 パスカルの三角形(_段) :- パスカルの三角形(_段,LL), パスカルの三角形_表示(_段,LL). パスカルの三角形(_段,[[1]|LL]) :- length([_|Ln],_段), パスカルの三角形加算(Ln,[1,1],LL). パスカルの三角形加算([],_,[]). パスカルの三角形加算([_|Ln],L,[L|R2]) :- 指定された段に達するまでパスカルの三角形加算を続ける(Ln,L,R2). 指定された段に達するまでパスカルの三角形加算を続ける(Ln,L,R2) :- パスカルの三角形一行計算(L,L1), パスカルの三角形加算(Ln,L1,R2). パスカルの三角形一行計算(L,L1) :- 上の行の隣り合う二項の合計を取っていく(L,L0), 両端に1を付加する(L0,L1). 上の行の隣り合う二項の合計を取っていく(L,L0) :- findall(N,( append(_,[A,B|_],L),N is A + B),L0). 両端に1を付加する(L0,L1) :- append([1|L0],[1],L1). パスカルの三角形_表示(0,_) :- !. パスカルの三角形_表示(N,[L|R]) :- 'N>0の間、パスカルの三角形の表示'(N,L,R). 'N>0の間、パスカルの三角形の表示'(N,L,R) :- N > 0, succ(N_1,N), パスカルの三角形一行表示(N_1,L), パスカルの三角形_表示(N_1,R). パスカルの三角形一行表示(N_1,L) :- 左端からの空白表示(N_1), パスカルの三角形部分表示(L), write('\n'). 左端からの空白表示(N_1) :- 左端からの空白文字列の生成(N_1,_空白文字列), writef('%w',[_空白文字列]). 左端からの空白文字列の生成(N_1,_空白文字列) :- 左端からの空白文字ならびの生成(N_1,_空白ならび), atomic_list_concat(_空白ならび,_空白文字列). 左端からの空白文字ならびの生成(N_1,_空白ならび) :- Len is 3 * N_1, length(_空白ならび,Len), all(_空白ならび,' '). all([],_). all([V|R],V) :- all(R,V). パスカルの三角形部分表示(L) :- forall(member(A,L), writef('%5r ',[A])). % 以下のサイトは % 使用言語 SWI-Prolog % 以下、ソースコード :- op(400,xfx,だけ). :- op(300,xf,分). :- op(400,xfx,が真になる全ての場合). :- op(500,xfx,を). :- op(600,xf,に収集する). :- op(400,xfx,を結合して). :- op(600,xf,を得る). 行のずれを意味する空白文字列(' '). 項表示形式('%6c'). パスカルの三角形 :- パスカルの三角形([_,_,_,_,_,_,_,_,_,_],[1]). パスカルの三角形([_],_上の行) :- '第一引数(行数)が空になったら、最終行を表示して終了する'([],_上の行). パスカルの三角形([_|_行数],_上の行) :- パスカルの三角形の行を順に表示する([_|_行数],_上の行). '第一引数(行数)が空になったら、最終行を表示して終了する'([],_上の行) :- パスカルの三角形の上の行を表示([],_上の行). パスカルの三角形の行を順に表示する([_|_行数],_上の行) :- 'パスカルの三角形の上の行を表示した上、現在行を計算して生成する'(_行数,_上の行,_現在行), パスカルの三角形(_行数,_現在行). 'パスカルの三角形の上の行を表示した上、現在行を計算して生成する'(_行数,_上の行,_現在行) :- 上の行の二項の和(_上の行,_上の行の二項の和) が真になる全ての場合 _上の行の二項の和 を _両端の1が落ちた計算された行 に収集する, パスカルの三角形の上の行を表示(_行数,_上の行), 両端に1を付加して現在行を完成する(_両端の1が落ちた計算された行,_現在行). 上の行の二項の和(_上の行,_上の行の二項の和) :- append(_,[_左上の項,_右上の項|_],_上の行), _上の行の二項の和 is _左上の項 + _右上の項. パスカルの三角形の上の行を表示(_行数,_上の行) :- '_行数から行頭からの空白文字列の生成'(_行数,_行頭からの空白文字列), 上の行の数字表示文字列(_上の行,_上の行の数字表示文字列), 表示する('%t%t\n',[_行頭からの空白文字列,_上の行の数字表示文字列]). '_行数から行頭からの空白文字列の生成'(_行数,_行頭からの空白文字列) :- 行のずれを意味する空白文字列(_行のずれを意味する空白文字列), _行数 分 だけ _行のずれを意味する空白文字列 を _空白文字列ならび に収集する, _空白文字列ならび を結合して _行頭からの空白文字列 を得る. 上の行の数字表示文字列(_上の行,_上の行の数字表示文字列) :- 上の行の数字表示部分(_上の行,_上の行の数字表示部分), _上の行の数字表示部分 を結合して _上の行の数字表示文字列 を得る. 上の行の数字表示部分(_上の行,_上の行の数字表示部分) :- 項表示形式(_項表示形式), 上の行の項を数字文字列に変換(_上の行,_項表示形式,_上の行の数字文字列) が真になる全ての場合 _上の行の数字文字列 を _上の行の数字表示部分 に収集する. 上の行の項を数字文字列に変換(_上の行,_項表示形式,_上の行の数字文字列) :- member(_項,_上の行), swritef(_上の行の数字文字列,_項表示形式,[_項]). 両端に1を付加して現在行を完成する(_両端の1が落ちた計算された行,_現在行) :- append([1|_両端の1が落ちた計算された行],[1],_現在行). _行数 分 だけ _行のずれを意味する空白文字列 を _空白文字列ならび に収集する :- findall(_行のずれを意味する空白文字列,member(_,_行数),_空白文字列ならび). _目標 が真になる全ての場合 _収集項 を _収集項ならび に収集する :- findall(_収集項,_目標,_収集項ならび). 上の行の項を数字文字列に変換(_上の行,_項表示形式,_上の行の数字文字列) が真になる全ての場合 _上の行の数字文字列 を _上の行の数字表示部分 に収集する :- findall(_上の行の数字文字列,( 上の行の項を数字文字列に変換(_上の行,_項表示形式,_上の行の数字文字列)),_上の行の数字表示部分). _上の行の数字表示部分 を結合して _上の行の数字表示文字列 を得る :- atomic_list_concat(_上の行の数字表示部分,_上の行の数字表示文字列). 表示する(_表示形式項,_値ならび) :- writef(_表示形式項,_値ならび). :- nl,パスカルの三角形,nl,halt. % 以下、実行結果 # swipl -f temp1.pl 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 1 7 21 35 35 21 7 1 1 8 28 56 70 56 28 8 1 1 9 36 84 126 126 84 36 9 1 % 以下のサイトは # 最近、マシューはポエマーな女子高生に恋をしている。彼女は詩人なんだが、パーコさんと言うんだ。 # # パーコ :「あらゆる物体、すなわち大空、星、大地、その王国などは、精神の最も小さいものにもおよばない。なぜなら、精神はそれらのすべてと自身とを認識するが、物体は何も認識しないからである。」 # # マシュー:「それは新しい詩かい?」 # # パーコ :「違う。パスカルの『パンセ』に記載された有名な一節。知らない人がいるんだ。」 # # マシュー:「Oh...ごめんよ。」 # # パーコ :「人間は自然の中では矮小な生き物にすぎないが、考えることによって宇宙を超える、というパスカルの考え方には実に共感するものがある。」 # # マシュー:「そうだなあ。確かに、マシューの肉体は小さいが、妄想だけはいつもビッグサイズだ!・・・さて、パーコ、デートに行かないか?」 # # パーコ :「うん、そうね。じゃあ、パスカルにちなんで、パスカルの三角形をプログラムで表示して欲しい。もちろん、数学の美しさを生かした記述の仕方をしてね。」 # # 以下の三角形が10行分のパスカルの三角形だ。こちらを再現して欲しい。 # # 1 # 1 1 # 1 2 1 # 1 3 3 1 # 1 4 6 4 1 # 1 5 10 10 5 1 # 1 6 15 20 15 6 1 # 1 7 21 35 35 21 7 1 # 1 8 28 56 70 56 28 8 1 # 1 9 36 84 126 126 84 36 9 1 # # 動作確認はideoneで行う。 # ideoneで正しく動作しない場合は不正解となりますので注意してくれよ。 # 言語は40種類以上サポートしているぞ。 # # ・使用した言語 # ・ソースコード # ・答え # の3つを合わせて記述して欲しい。 % 使用言語 SWI-Prolog % 以下、ソースコード :- op(400,xfx,だけ). :- op(300,xf,分). :- op(400,xfx,が真になる全ての場合). :- op(500,xfx,を). :- op(600,xf,に収集する). :- op(400,xfx,を結合して). :- op(600,xf,を得る). 行のずれを意味する空白文字列(' '). 項表示形式('%6c'). パスカルの三角形 :- パスカルの三角形([_,_,_,_,_,_,_,_,_,_],[1]),!. パスカルの三角形([_],_上の行) :- '第一引数(行数)が空になったら、最終行を表示して終了する'([],_上の行). パスカルの三角形([_|_行数],_上の行) :- パスカルの三角形の行を順に表示する([_|_行数],_上の行). '第一引数(行数)が空になったら、最終行を表示して終了する'([],_上の行) :- パスカルの三角形の上の行を表示([],_上の行). パスカルの三角形の行を順に表示する([_|_行数],_上の行) :- 'パスカルの三角形の上の行を表示した上、現在行を計算して生成する'(_行数,_上の行,_現在行), パスカルの三角形(_行数,_現在行). 'パスカルの三角形の上の行を表示した上、現在行を計算して生成する'(_行数,_上の行,_現在行) :- 上の行の二項の和(_上の行,_上の行の二項の和) が真になる全ての場合 _上の行の二項の和 を _両端の1が落ちた計算された行 に収集する, パスカルの三角形の上の行を表示(_行数,_上の行), 両端に1を付加して現在行を完成する(_両端の1が落ちた計算された行,_現在行). 上の行の二項の和(_上の行,_上の行の二項の和) :- append(_,[_左上の項,_右上の項|_],_上の行), _上の行の二項の和 is _左上の項 + _右上の項. パスカルの三角形の上の行を表示(_行数,_上の行) :- '_行数から行頭からの空白文字列の生成'(_行数,_行頭からの空白文字列), 上の行の数字表示文字列(_上の行,_上の行の数字表示文字列), 表示する('%t%t\n',[_行頭からの空白文字列,_上の行の数字表示文字列]). '_行数から行頭からの空白文字列の生成'(_行数,_行頭からの空白文字列) :- 行のずれを意味する空白文字列(_行のずれを意味する空白文字列), _行数 分 だけ _行のずれを意味する空白文字列 を _空白文字列ならび に収集する, _空白文字列ならび を結合して _行頭からの空白文字列 を得る. 上の行の数字表示文字列(_上の行,_上の行の数字表示文字列) :- 上の行の数字表示部分(_上の行,_上の行の数字表示部分), _上の行の数字表示部分 を結合して _上の行の数字表示文字列 を得る. 上の行の数字表示部分(_上の行,_上の行の数字表示部分) :- 項表示形式(_項表示形式), 上の行の項を数字文字列に変換(_上の行,_項表示形式,_上の行の数字文字列) が真になる全ての場合 _上の行の数字文字列 を _上の行の数字表示部分 に収集する. 上の行の項を数字文字列に変換(_上の行,_項表示形式,_上の行の数字文字列) :- member(_項,_上の行), swritef(_上の行の数字文字列,_項表示形式,[_項]). 両端に1を付加して現在行を完成する(_両端の1が落ちた計算された行,_現在行) :- append([1|_両端の1が落ちた計算された行],[1],_現在行). _行数 分 だけ _収集項 を _収集項ならび に収集する :- findall(_収集項,member(_,_行数),_収集項ならび). _目標 が真になる全ての場合 _収集項 を _収集項ならび に収集する :- findall(_収集項,_目標,_収集項ならび). L を結合して A を得る :- atomic_list_concat(L,A). 表示する(_表示形式項,_値ならび) :- writef(_表示形式項,_値ならび). :- nl,パスカルの三角形,nl,halt. % 以下、実行結果 # swipl -f temp1.pro 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 1 7 21 35 35 21 7 1 1 8 28 56 70 56 28 8 1 1 9 36 84 126 126 84 36 9 1 % 以下のサイトは # # 出典::増井技術士事務所 今週のアルゴリズムの@masuipeoさんからのアルゴリズムの問題 # # 有名な「パスカルの三角形」は「右上の数と左上の数の和」を配置していきますが、 ここでは単純な「和」ではなく、「排他的論理和」を使うことを考えます。 # 1段目から順に配置してみると、以下の図のようになります。 # # 上から順番に配置していったとき、2014番目の「0」が出力されるのは何段目になるかを求めてください。 # # 1番めの「0」は、3段目、2・3・4番目の「0」は5段目に出力されています。 # # 【解答方法】 # 解答フォームの1行目に答えを記入してください。 # 2行目以降はあなたが求めた方法を記入してください。プログラムを書いた場合はコードを貼り付けてください。 排他的論理和を使ったパスカルの三角形で2014番目の0は何行目に現れるか(_何行目) :- length(_0計測器,2014), 排他的論理和を使ったパスカルの三角形で2014番目の0は何行目に現れるか([_],[1],_0計測器,_行計測器), length(_行計測器,_何行目). 排他的論理和を使ったパスカルの三角形で2014番目の0は何行目に現れるか(_行計測器,_,[],_行計測器) :- !. 排他的論理和を使ったパスカルの三角形で2014番目の0は何行目に現れるか(_行計測器_1,_パスカルの三角形の底の行,_0計測器_1,_行計測器) :- 排他的論理和を使ったパスカルの三角形の次の行(_パスカルの三角形の底の行,_0計測器_1,_右端に1を付加したパスカルの三角形の次の行,_0計測器_2), _両端に1を付加したパスカルの三角形の次の行 = [1|_右端に1を付加したパスカルの三角形の次の行], 排他的論理和を使ったパスカルの三角形で2014番目の0は何行目に現れるか([_|_行計測器_1],_両端に1を付加したパスカルの三角形の次の行,_0計測器_2,_行計測器). 排他的論理和を使ったパスカルの三角形の次の行(_行_1,_0計測器,_行_2,_0計測器) :- '停止条件 :: _0計測器が[]なら計算を打ち切る。行の排他的論理和計算が完了したら新しい底の行の右端に1を付加して終了する'(_行_1,_0計測器,_行_2,_0計測器). 排他的論理和を使ったパスカルの三角形の次の行([_値_1,_値_2|R1],_0計測器_1,[_排他的論理和|R3],_0計測器) :- '排他的論理和をとり、0である場合だけ_0計測器を減じる'(_値_1,_値_2,_0計測器_1,_0計測器_2,_排他的論理和), 排他的論理和を使ったパスカルの三角形の次の行([_値_2|R1],_0計測器_2,R3,_0計測器). '停止条件 :: _0計測器が[]なら計算を打ち切る。行の排他的論理和計算が完了したら新しい底の行の右端に1を付加して終了する'(_,_0計測器,_,[]) :- '_0計測器が[]なら計算を打ち切る。'(_0計測器). '停止条件 :: _0計測器が[]なら計算を打ち切る。行の排他的論理和計算が完了したら新しい底の行の右端に1を付加して終了する'(_行_1,_0計測器,[1],_0計測器) :- '行の排他的論理和計算が完了したら新しい底の行の右端に1を付加して終了する'(_行_1). '_0計測器が[]なら計算を打ち切る。'([]). '行の排他的論理和計算が完了したら新しい底の行の右端に1を付加して終了する'([_]). '排他的論理和をとり、0である場合だけ_0計測器を減じる'(_値_1,_値_2,_0計測器_1,_0計測器_2,_排他的論理和) :- 排他的論理和をとり(_値_1,_値_2,_排他的論理和), 排他的論理和が0である場合だけ_0計測器を減じる(_排他的論理和,_0計測器_1,_0計測器_2). 排他的論理和をとり(0,0,0). 排他的論理和をとり(0,1,1). 排他的論理和をとり(1,0,1). 排他的論理和をとり(1,1,0). 排他的論理和が0である場合だけ_0計測器を減じる(0,[_|_0計測器],_0計測器). 排他的論理和が0である場合だけ_0計測器を減じる(1,_0計測器,_0計測器). :- 排他的論理和を使ったパスカルの三角形で2014番目の0は何行目に現れるか(_何行目), writef('0が2014個に達するのは%t行目です。\n',[_何行目]). % 以下のサイトは # # 出典::増井技術士事務所 今週のアルゴリズムの@masuipeoさんからのアルゴリズムの問題 # # 有名な「パスカルの三角形」は「右上の数と左上の数の和」を配置していきますが、 ここでは単純な「和」ではなく、「排他的論理和」を使うことを考えます。 # 1段目から順に配置してみると、以下の図のようになります。 # # 上から順番に配置していったとき、2014番目の「0」が出力されるのは何段目になるかを求めてください。 # # 1番めの「0」は、3段目、2・3・4番目の「0」は5段目に出力されています。 # # 【解答方法】 # 解答フォームの1行目に答えを記入してください。 # 2行目以降はあなたが求めた方法を記入してください。プログラムを書いた場合はコードを貼り付けてください。 排他的論理和を使ったパスカルの三角形で2014番目の0は何行目に現れるか(_何行目) :- 排他的論理和を使ったパスカルの三角形で2014番目の0は何行目に現れるか([_],[1],[],_何行目),!. 排他的論理和を使ったパスカルの三角形で2014番目の0は何行目に現れるか(Ln,_,_0ならび,_何行目) :- '0ならびの要素数が2014以上の時は何行目'(Ln,_0ならび,_何行目). 排他的論理和を使ったパスカルの三角形で2014番目の0は何行目に現れるか(Ln,_パスカルの三角形の行,_0ならび_1,_何行目) :- パスカルの三角形の次の行(_パスカルの三角形の行,_パスカルの三角形の次の行), '0ならびの更新'(_パスカルの三角形の次の行,_0ならび_1,_0ならび_2), 排他的論理和を使ったパスカルの三角形で2014番目の0は何行目に現れるか([_|Ln],_パスカルの三角形の次の行,_0ならび_2,_何行目). '0ならびの要素数が2014以上の時は何行目'(Ln,_0ならび,_何行目) :- length(_0ならび,_要素数), _要素数 >= 2014, length(Ln,_何行目). パスカルの三角形の次の行(_パスカルの三角形の行,_パスカルの三角形の次の行) :- findall(N,( append(_,[A,B|_],_パスカルの三角形の行), 排他的論理和(A,B,N)),_上段の対の値から排他的論理和を取ったならび), 上段の対の値から排他的論理和を取ったならびの両端に1を付加する(_上段の対の値から排他的論理和を取ったならび,_パスカルの三角形の次の行). 上段の対の値から排他的論理和を取ったならびの両端に1を付加する(_上段の対の値から排他的論理和を取ったならび,_パスカルの三角形の次の行) :- append([1|_上段の対の値から排他的論理和を取ったならび],[1],_パスカルの三角形の次の行). 排他的論理和(0,0,0). 排他的論理和(0,1,1). 排他的論理和(1,0,1). 排他的論理和(1,1,0). '0ならびの更新'([],_0ならび_1,_0ならび_1). '0ならびの更新'([0|R1],_0ならび_1,[0|_0ならび_2]) :- '0ならびの更新'(R1,_0ならび_1,_0ならび_2). '0ならびの更新'([1|R1],_0ならび_1,_0ならび_2) :- '0ならびの更新'(R1,_0ならび_1,_0ならび_2). % 以下のサイトは # # 出典::増井技術士事務所 今週のアルゴリズムの@masuipeoさんからのアルゴリズムの問題 # # 有名な「パスカルの三角形」は「右上の数と左上の数の和」を配置していきますが、 ここでは単純な「和」ではなく、「排他的論理和」を使うことを考えます。 # 1段目から順に配置してみると、以下の図のようになります。 # # 上から順番に配置していったとき、2014番目の「0」が出力されるのは何段目になるかを求めてください。 # # 1番めの「0」は、3段目、2・3・4番目の「0」は5段目に出力されています。 # # 【解答方法】 # 解答フォームの1行目に答えを記入してください。 # 2行目以降はあなたが求めた方法を記入してください。プログラムを書いた場合はコードを貼り付けてください。 排他的論理和を使ったパスカルの三角形で2014番目の0は何行目に現れるか(_何行目) :- length(_0計測器,2014), 排他的論理和を使ったパスカルの三角形で2014番目の0は何行目に現れるか([_],[1],_0計測器,_行計測器), length(_行計測器,_何行目). 排他的論理和を使ったパスカルの三角形で2014番目の0は何行目に現れるか(_行計測器,_,[],_行計測器) :- !. 排他的論理和を使ったパスカルの三角形で2014番目の0は何行目に現れるか(_行計測器_1,_パスカルの三角形の底の行,_0計測器_1,_行計測器) :- 排他的論理和を使ったパスカルの三角形の次の行(_パスカルの三角形の底の行,_0計測器_1,_右端に1を付加したパスカルの三角形の次の行,_0計測器_2), _両端に1を付加したパスカルの三角形の次の行 = [1|_右端に1を付加したパスカルの三角形の次の行], 排他的論理和を使ったパスカルの三角形で2014番目の0は何行目に現れるか([_|_行計測器_1],_両端に1を付加したパスカルの三角形の次の行,_0計測器_2,_行計測器). 排他的論理和を使ったパスカルの三角形の次の行(_行_1,_0計測器,_行_2,_0計測器) :- '停止条件 :: _0計測器が[]なら計算を打ち切る。行の排他的論理和計算が完了したら新しい底の行の右端に1を付加して終了する'(_行_1,_0計測器,_行_2,_0計測器). 排他的論理和を使ったパスカルの三角形の次の行([_値_1,_値_2|R1],_0計測器_1,[_排他的論理和|R3],_0計測器) :- '排他的論理和をとり、0である場合だけ_0計測器を減じる'(_値_1,_値_2,_0計測器_1,_0計測器_2,_排他的論理和), 排他的論理和を使ったパスカルの三角形の次の行([_値_2|R1],_0計測器_2,R3,_0計測器). '停止条件 :: _0計測器が[]なら計算を打ち切る。行の排他的論理和計算が完了したら新しい底の行の右端に1を付加して終了する'(_,_0計測器,_,[]) :- '_0計測器が[]なら計算を打ち切る。'(_0計測器). '停止条件 :: _0計測器が[]なら計算を打ち切る。行の排他的論理和計算が完了したら新しい底の行の右端に1を付加して終了する'(_行_1,_0計測器,[1],_0計測器) :- '行の排他的論理和計算が完了したら新しい底の行の右端に1を付加して終了する'(_行_1). '_0計測器が[]なら計算を打ち切る。'([]). '行の排他的論理和計算が完了したら新しい底の行の右端に1を付加して終了する'([_]). '排他的論理和をとり、0である場合だけ_0計測器を減じる'(_値_1,_値_2,_0計測器_1,_0計測器_2,_排他的論理和) :- 排他的論理和をとり(_値_1,_値_2,_排他的論理和), 排他的論理和が0である場合だけ_0計測器を減じる(_排他的論理和,_0計測器_1,_0計測器_2). 排他的論理和をとり(0,0,0). 排他的論理和をとり(0,1,1). 排他的論理和をとり(1,0,1). 排他的論理和をとり(1,1,0). 排他的論理和が0である場合だけ_0計測器を減じる(0,[_|_0計測器],_0計測器). 排他的論理和が0である場合だけ_0計測器を減じる(1,_0計測器,_0計測器). :- 排他的論理和を使ったパスカルの三角形で2014番目の0は何行目に現れるか(_何行目), writef('0が2014個に達するのは%t行目です。\n',[_何行目]). % 以下のサイトは # 出典: twitter_by_@takashi_sansu_20140627 # # 【算数】たかしくんはネオン街に飛び出した。 # 街の喧騒がすべてを忘れさせてくれる。 # 家庭崩壊、いじめ、裏切り。 # 信頼は疑心に変わり、愛情は憎しみへと変化した。 # たかしくんは荒んだ心の隙間を満たすように夜の街へ消えていった。 # 底辺2cm,高さ3cmの三角形の面積を求めなさい。 # '【算数】たかしくんはネオン街に飛び出した。 街の喧騒がすべてを忘れさせてくれる。 家庭崩壊、いじめ、裏切り。 信頼は疑心に変わり、愛情は憎しみへと変化した。 たかしくんは荒んだ心の隙間を満たすように夜の街へ消えていった。 底辺2cm,高さ3cmの三角形の面積を求めなさい。'(_底辺2cm高さ3cmの三角形の面積) :- 'たかしくんはネオン街に飛び出した。 街の喧騒がすべてを忘れさせてくれる。 家庭崩壊、いじめ、裏切り。 信頼は疑心に変わり、愛情は憎しみへと変化した。 たかしくんは荒んだ心の隙間を満たすように夜の街へ消えていった。', '底辺2cm,高さ3cmの三角形の面積を求めなさい。'(_底辺2cm高さ3cmの三角形の面積). 'たかしくんはネオン街に飛び出した。 街の喧騒がすべてを忘れさせてくれる。 家庭崩壊、いじめ、裏切り。 信頼は疑心に変わり、愛情は憎しみへと変化した。 たかしくんは荒んだ心の隙間を満たすように夜の街へ消えていった。'. '底辺2cm,高さ3cmの三角形の面積を求めなさい。'(_底辺2cm高さ3cmの三角形の面積) :- 三角形の面積の公式(2,3,_底辺2cm高さ3cmの三角形の面積). 三角形の面積の公式(_底辺,_高さ,_三角形の面積) :- _三角形の面積 is _底辺 * _高さ / 2. % 以下のサイトは # # 上部の基壇に幅をもたせたピラミッドの矩形 # # # _向き = 上向き, _頂点の高さ = 2, _上部の基壇の幅 = 3 の場合 # # *** # ***** # # _向き = 右向き, _頂点の高さ = 3, _上部の基壇の幅 = 2 の場合 # # * # ** # *** # *** # ** # * # ピラミッドの矩形(右向き,_頂点の高さ,_上部基壇の幅,_ピラミッドの矩形) :- 下向きピラミッドの矩形を転置する(_頂点の高さ,_上部基壇の幅,_ピラミッドの矩形),!. ピラミッドの矩形(左向き,_頂点の高さ,_上部基壇の幅,_ピラミッドの矩形) :- 上向きピラミッドの矩形を転置する(_頂点の高さ,_上部基壇の幅,_ピラミッドの矩形),!. ピラミッドの矩形(_向き,_頂点の高さ,_上部基壇の幅,_ピラミッドの矩形) :- '上・下向きピラミッドの矩形を描く'(_向き,_頂点の高さ,_上部基壇の幅,_ピラミッドの矩形). 下向きピラミッドの矩形を転置する(_頂点の高さ,_上部基壇の幅,_ピラミッドの矩形) :- ピラミッドの矩形(下向き,_頂点の高さ,_上部基壇の幅,_ピラミッドの矩形_1), 転置(_ピラミッドの矩形_1,_ピラミッドの矩形). 上向きピラミッドの矩形を転置する(_頂点の高さ,_上部基壇の幅,_ピラミッドの矩形) :- ピラミッドの矩形(上向き,_頂点の高さ,_上部基壇の幅,_ピラミッドの矩形_1), 転置(_ピラミッドの矩形_1,_ピラミッドの矩形). '上・下向きピラミッドの矩形を描く'(_向き,_頂点の高さ,_上部基壇の幅,_ピラミッドの矩形) :- _底辺の幅 is _頂点の高さ * 2 + _上部基壇の幅, length(L,_底辺の幅), findall(L4,( append(L1,L2,L), 行にピラミッドの文様を描く(_向き,_上部基壇の幅,L1,L2,L4)), _ピラミッドの矩形). 行にピラミッドの文様を描く(上向き,_上部基壇の幅,[A|L1],L2,L4) :- length(L0,_上部基壇の幅), append(L0,L1,L), 行にピラミッドの文様を描く(L,L2,L4). 行にピラミッドの文様を描く(下向き,_上部基壇の幅,L1,[A|L2],L4) :- length(L0,_上部基壇の幅), append(L0,L2,L), 行にピラミッドの文様を描く(L,L1,L4). 行にピラミッドの文様を描く(L1,L2,L4) :- all(L1,'*'), all(L2,' '), append(L3,L3,L2), append(L3,L1,L3,L4). ピラミッドの矩形を表示する([]). ピラミッドの矩形を表示する([L|R]) :- atomic_list_concat(L,A), writef('%t\n',[A]), ピラミッドの矩形を表示する(R). all([],_). all([A|R],A) :- all(R,A). append([],L2,L3,L4) :- append(L2,L3,L4). append([U|L1],L2,L3,[U|L4]) :- append(L1,L2,L3,L4). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). % 以下のサイトは ピラミッドの矩形(右向き,_頂点の高さ,_ピラミッドの矩形) :- 下向きピラミッドの矩形を転置する(_頂点の高さ,_ピラミッドの矩形),!. ピラミッドの矩形(左向き,_頂点の高さ,_ピラミッドの矩形) :- 上向きピラミッドの矩形を転置する(_頂点の高さ,_ピラミッドの矩形),!. ピラミッドの矩形(_向き,_頂点の高さ,_ピラミッドの矩形) :- '上・下向きピラミッドの矩形を描く'(_向き,_頂点の高さ,_ピラミッドの矩形). 下向きピラミッドの矩形を転置する(_頂点の高さ,_ピラミッドの矩形) :- ピラミッドの矩形(下向き,_頂点の高さ,_ピラミッドの矩形_1), 転置(_ピラミッドの矩形_1,_ピラミッドの矩形). 上向きピラミッドの矩形を転置する(_頂点の高さ,_ピラミッドの矩形) :- ピラミッドの矩形(上向き,_頂点の高さ,_ピラミッドの矩形_1), 転置(_ピラミッドの矩形_1,_ピラミッドの矩形). '上・下向きピラミッドの矩形を描く'(_向き,_頂点の高さ,_ピラミッドの矩形) :- _底辺の幅 is _頂点の高さ * 2 - 1, length(L,_底辺の幅), findall(L4,( append(L1,L2,L), 行にピラミッドの文様を描く(_向き,L1,L2,L4)), _ピラミッドの矩形). 行にピラミッドの文様を描く(上向き,[A|L1],L2,L4) :- all([A|L1],'*'), all(L2,' '), append(L3,L3,L2). append(L3,[A|L1],L3,L4). 行にピラミッドの文様を描く(下向き,L1,[A|L2],L4) :- all([A|L2],'*'), all(L1,' '), append(L3,L3,L1), append(L3,[A|L2],L3,L4). ピラミッドの矩形を表示する([]). ピラミッドの矩形を表示する([L|R]) :- atomic_list_concat(L,A), writef('%t\n',[A]), ピラミッドの矩形を表示する(R). all([],_). all([A|R],A) :- all(R,A). append([],L2,L3,L4) :- append(L2,L3,L4). append([U|L1],L2,L3,[U|L4]) :- append(L1,L2,L3,L4). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). % 以下のサイトは 横向きに星のピラミッドを描く(_ピラミッドの頂点の高さ) :- length(L,_ピラミッドの頂点の高さ), 横向きに星のピラミッドを描く([*],L). 横向きに星のピラミッドを描く(L,L) :- 星で行表示する(L),!. 横向きに星のピラミッドを描く(L_1,L) :- 星で行表示する(L_1), 横向きに星のピラミッドを描く([*|L_1],L), 星で行表示する(L_1). 星で行表示する(L) :- atomic_list_concat(L,A), writef('%t\n',[A]). % 以下のサイトは 横向きに星のピラミッドを描く(_ピラミッドの頂点の高さ) :- 横向きに星のピラミッドを描く(1,_ピラミッドの頂点の高さ). 横向きに星のピラミッドを描く(_ピラミッドの頂点の高さ,_ピラミッドの頂点の高さ) :- 星で行表示する(_ビラミッドの頂点の高さ),!. 横向きに星のピラミッドを描く(N,_ピラミッドの頂点の高さ) :- 星で行表示する(N), N_2 is N + 1, 横向きに星のピラミッドを描く(N_2,_ピラミッドの頂点の高さ), 星で行表示する(N). 星で行表示する(_表示する星の数) :- findall(*,between(1,_表示する星の数,_),L), atomic_list_concat(L,A), writef('%t\n',[A]). % 以下のサイトは 'for/3を使って横向きに星のピラミッドを描く'(_ピラミッドの頂点の高さ) :- for(1,_表示する星の数,_ピラミッドの頂点の高さ), 星で行表示する(_表示する星の数), fail. 'for/3を使って横向きに星のピラミッドを描く'(_ピラミッドの頂点の高さ) :- for(_ピラミッドの頂点の高さ-1,_表示する星の数,1), 星で行表示する(_表示する星の数), _ピラミッドの頂点の高さ = 1. 星で行表示する(_表示する星の数) :- for(1,M,_表示する星の数), 星を一個表示する, M = _表示する星の数, 改行する. 星を一個表示する :- put_char(*). 改行する :- nl. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % for ループ % % ?- for(1,N,3),writef('%t\n',[N]),N=3. % 1 % 2 % 3 % for(S,N,E) :- E >= S, for_2(S,N,E). for(S,N,E) :- E < S, for_1(S,N,E). for_1(S,_,E) :- S < E,!,fail. for_1(N,N,E). for_1(S,N,E) :- S1 is S - 1, for_1(S1,N,E). for_2(S,_,E) :- S > E,!,fail. for_2(N,N,E). for_2(S,N,E) :- S1 is S + 1, for_2(S1,N,E). % 以下のサイトは 'for/3を使って横向きに星のピラミッドを描く'(_ピラミッドの頂点の高さ) :- ビラミッドの頂点までを描く(_ピラミッドの頂点の高さ), ピラミッドの頂点から後を描く(_ピラミッドの頂点の高さ). ビラミッドの頂点までを描く(_ピラミッドの頂点の高さ) :- for(1,_表示する星の数,_ピラミッドの頂点の高さ), 星で行表示する(_表示する星の数), _表示する星の数 = _ピラミッドの頂点の高さ. ピラミッドの頂点から後を描く(_ビラミッドの頂点の高さ) :- for(_ピラミッドの頂点の高さ-1,_表示する星の数,1), 星で行表示する(_表示する星の数), _表示する星の数 = 1. 星で行表示する(_表示する星の数) :- for(1,M,_表示する星の数), 星を一個表示する, M = _表示する星の数, 改行する. 星を一個表示する :- put_char(*). 改行する :- nl. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % for ループ % % ?- for(1,N,3),writef('%t\n',[N]),N=3. % 1 % 2 % 3 % for(S,N,E) :- E >= S, for_2(S,N,E). for(S,N,E) :- E < S, for_1(S,N,E). for_1(S,_,E) :- S < E,!,fail. for_1(N,N,E). for_1(S,N,E) :- S1 is S - 1, for_1(S1,N,E). for_2(S,_,E) :- S > E,!,fail. for_2(N,N,E). for_2(S,N,E) :- S1 is S + 1, for_2(S1,N,E). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/400 # お題:一辺の長さがmの正三角形がある。ひとつの頂点に # 長さnの糸がつながっている。まず糸をすべて正三角形に巻きつける。 # 糸をピンと張った状態でほどいていき、そのまま逆向きにすべてを # 巻きつけた時の糸の先端の軌跡の長さを求める。小数点以下四捨五入。 # 例 # m=100, n=200, -> 1466 # # '一辺の長さがmの正三角形がある。ひとつの頂点に 長さnの糸がつながっている。まず糸をすべて正三角形に巻きつける。 糸をピンと張った状態でほどいていき、そのまま逆向きにすべてを 巻きつけた時の糸の先端の軌跡の長さを求める。小数点以下四捨五入。'(_糸の長さ,_辺の長さ,_軌跡の長さ) :- '糸をすべて正三角形に巻きつける。'(_糸の長さ,_辺の長さ,[],_糸の状態), '糸をピンと張った状態でほどいていき、そのまま逆向きにすべてを 巻きつけた時の糸の先端の軌跡の長さを求める。小数点以下四捨五入。'(_糸の状態,0,0,_四捨五入前の軌跡の長さ), 四捨五入(_四捨五入前の軌跡の長さ,_軌跡の長さ). '糸をすべて正三角形に巻きつける。'(_糸の長さ,_辺の長さ,L1,[_糸の長さ|L1]) :- _糸の長さ =< _辺の長さ,!. '糸をすべて正三角形に巻きつける。'(_糸の長さ,_辺の長さ,L1,L) :- _残りの糸の長さ is _糸の長さ - _辺の長さ, '糸をすべて正三角形に巻きつける。'(_残りの糸の長さ,_辺の長さ,[_辺の長さ|L1],L). '糸をピンと張った状態でほどいていき、そのまま逆向きにすべてを 巻きつけた時の糸の先端の軌跡の長さを求める。小数点以下四捨五入。'([_],_,_,_軌跡の長さ,_軌跡の長さ) :- !. '糸をピンと張った状態でほどいていき、そのまま逆向きにすべてを 巻きつけた時の糸の先端の軌跡の長さを求める。小数点以下四捨五入。'(_追加できる糸の長さ|R1],_これまでの糸の長さ,_軌跡の長さ_1,_軌跡の長さ) :- _アームの長さ is _追加できる糸の長さ + _これまでの糸の長さ, _軌跡の長さ_2 is _アームの長さ * 2 * 3.14 / 3 + _軌跡の長さ_1, '糸をピンと張った状態でほどいていき、そのまま逆向きにすべてを 巻きつけた時の糸の先端の軌跡の長さを求める。小数点以下四捨五入。'(R,_アームの長さ,_軌跡の長さ_2,_軌跡の長さ). 四捨五入(_数,_四捨五入した整数) :- _四捨五入した整数 is truncate(_数 + 0.5). % 以下のサイトは # # xxxx0xxxx # xxx000xxx # xx00000xx # # こういうピラミッドを作るコードを教えてください # 言語は何でも良いですけどコードが長くなるのはNGです # この例だと頂上の0は1個で、底辺は5個ですけど # 頂上n個、底辺k個、'0'と'x'の 文字は任意の文字を指定できるようなコードをおしえてください。 # また層は2個ずつちがいますけど、この部分も任意の値を指定できるようにしてください # # こういうのもあり # xx0xx # 00000 ピラミッドを作る(_基壇の幅,_頂上の数,_底辺の数,_段ごとの増分,_ピラミッドの文字,_周囲の文字) :- _左右の捌きの文字数初期値 is (_基壇の幅 - _頂上の数) // 2, _段数 is (_底辺の数 - _頂上の数) // _段ごとの増分, ピラミッドを作る(_段数,_左右の捌きの文字数初期値,_段ごとの増分,_頂上の数,_ピラミッドの文字,_周囲の文字). ピラミッドを作る(0,_,_,_,_,_) :- !. ピラミッドを作る(_段数,_左右の捌き文字数,_段ごとの増分,_ピラミッドの段の文字数,_ピラミッドの文字,_周囲の文字) :- 左右の捌き(_左右の捌き文字数,_段ごとの増分,_周囲の文字,_捌き文字列,_左右の捌き文字数_1), ピラミットの段(_ピラミッドの段の文字数,_段ごとの増分,_ピラミッドの文字,_捌き文字列,_ピラミッドの段の数_2), _段数_1 is _段数 - 1, ピラミッドを作る(_段数_1,_左右の捌き文字数_1,_段ごとの増分,_ピラミッドの段の数_2,_ピラミッドの文字,_周囲の文字). 左右の捌き(_左右の捌き文字数,_段ごとの増分,_周囲の文字,_捌き文字列,_左右の捌き文字数_1) :- n個の連続した文字列(_左右捌きの文字数,_周囲の文字,_左右捌きの文字列), _左右の捌き文字数_1 is _左右の捌き文字数 - _段ごとの増分 // 2. ピラミットの段(_ピラミッドの段の文字数,_段ごとの増分,_ピラミッドの文字,_捌き文字列,_ピラミッドの段の数_2) :- n個の連続した文字列(_ピラミッドの段の文字数,_ピラミッドの文字,_ピラミッド段の文字列), writef('%t%t%t\n',[_捌き文字列,_ピラミット段の文字列,_捌き文字列]), _ピラミッドの段の文字数_2 is _ピラミッドの段の文字数 + _段ごとの増分. n個の連続した文字列(_n個,_文字,_n個の連続した文字列) :- length(L,_n個), all(L,_文字), atom_chars(_n個の連続した文字列,L). all([],_). all([A|R],A) :- all(R,A). % 以下のサイトは %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % twitter by @hatsugai 20130908 % 原文と述語定義されたものの訴える力の差を示してみる。 % 一度は訪れたい観光地: 1. Category 2. 一般相対性理論、シュバルツシルト解導出 3. 場の理論、くりこみ計算 4. Lebesgue 積分 5. Prolog 実装 6. FPGA で CPU 7. エジプト、ピラミッド %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\ 一度は訪れたい観光地('1. Category'). 一度は訪れたい観光地('2. 一般相対性理論、シュバルツシルト解導出'). 一度は訪れたい観光地('3. 場の理論、くりこみ計算'). 一度は訪れたい観光地('4. Lebesgue 積分'). 一度は訪れたい観光地('5. Prolog 実装'). 一度は訪れたい観光地('6. FPGA で CPU'). 一度は訪れたい観光地('7. エジプト、ピラミッド'). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 一度は訪れたい観光地(1,'Category'). 一度は訪れたい観光地(2,'一般相対性理論、シュバルツシルト解導出'). 一度は訪れたい観光地(3,'場の理論、くりこみ計算'). 一度は訪れたい観光地(4,'Lebesgue 積分'). 一度は訪れたい観光地(5,'Prolog 実装'). 一度は訪れたい観光地(6,'FPGA で CPU'). 一度は訪れたい観光地(7,'エジプト、ピラミッド'). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 一度は訪れたい観光地(1,'Category'). 一度は訪れたい観光地(2,['一般相対性理論','シュバルツシルト解導出']). 一度は訪れたい観光地(3,['場の理論','くりこみ計算']). 一度は訪れたい観光地(4,'Lebesgue 積分'). 一度は訪れたい観光地(5,'Prolog 実装'). 一度は訪れたい観光地(6,'FPGA で CPU'). 一度は訪れたい観光地(7,['エジプト、ピラミッド']). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 以下のサイトは # # (p) http://cp1.nintendo.co.jp/2012 任天堂サイトの問題ですが # # $ python SimpleBarsTest.py # test_loop (__main__.testSimpleBars) ... ok # test_simple_rule (__main__.testSimpleBars) ... ok # # ---------------------------------------------------------------------- # Ran 2 tests in 0.000s # # OK # # テストコードまでOKなんですが、 # answerを出したのですが違っているようなんです。 # この問題を解いた方がいましたら少し教えてもらえませんでしょうか。 'iTピラミッド' :- 'iTピラミッド'(1,12,[i,'T']), 'iTピラミッド'(12,1,['T',i]). 'iTピラミッド'(1,6,[i,'T']). 'iTピラミッド'(_開始段数,_段数,_記号並び順) :- for(_開始段数,N,_段数), ピラミッドの段を生成(N,_記号並び順,L), 最初の3文字分を末尾に移動して段文字列とする(L,_段文字列), writef('%t\n',[_段文字列]), N = _段数. ピラミッドの段を生成(N,_記号並び順,L) :- 段の記号部分を生成(_記号並び順,L2), length(L,25), append(L1,L2,L1,L), all(L1,' '). 段の記号部分を生成(_記号並び順,L2) :- _length is (N - 1) * 2 + 1, length(L2,_length), '記号並び順に変数を埋める'(_記号並び順,L2). '記号並び順に変数を埋める'(_,[]). '記号並び順に変数を埋める'([A|R1],[A|R2]) :- append(R1,[A],L1), '記号並び順に変数を埋める'(L1,R2). 最初の3文字分を末尾に移動して段文字列とする([_1,_2,_3|R],_段文字列) :- append(R,[_1,_2,_3],_求める記号ならび), atomic_list_concat(_求める記号ならび,_段文字列). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% all([],_). all([V|R],V) :- all(R,V). for(S,N,E) :- for_2(S,N,E). for(S,N,E) :- for_1(S,N,E). for_1(S,_,E) :- S < E,!,fail. for_1(S,N,E) :- N is S. for_1(S,N,E) :- S1 is S - 1, for_1(S1,N,E). for_2(S,_,E) :- S > E,!,fail. for_2(S,N,E) :- N is S. for_2(S,N,E) :- S1 is S + 1, for_2(S1,N,E). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1370255305/761 # # どなたかお手伝いお願いします。 # # [1] 授業単元:プログラミング実習 # [2] 問題文:三角形底辺aと高さhを引数で与え、面積を計算する関数sを作成しなさい。 # また,main関数で底辺と高さを入力し、面積は関数で求め、main関数に返し出力しなさい。 # main :- 三角形の底辺aを得る(_a), 高さhを得る(_h), '三角形底辺aと高さhを引数で与え、面積sを計算する'(_a,_h,_s), writef('三角形の面積は %t \n',[_s]). '三角形底辺aと高さhを引数で与え、面積sを計算する'(_a,_h,_s) :- _s is 0.5 * _h * _s. 三角形の底辺aを得る(_a) :- write('三角形の底辺aを入力して下さい : '), get_line(Line), '診断: 三角形の底辺aを得る'(Line,_a),!. 三角形の底辺aを得る(_a) :- 三角形の底辺aを得る(_a). '診断: 三角形の底辺aを得る'(Line,_a) :- atom_number(Line,_a),!. '診断: 三角形の底辺aを得る'(Line,_a) :- writef('入力された %t は数値ではありません。再入力をお願いします。\n',[Line]), fail. 高さhを得る(_h) :- write('高さhを入力して下さい : '), get_line(Line), '診断: 高さhを得る'(Line,_h),!. 高さhを得る(_h) :- 高さhを得る(_h). '診断: 高さhを得る'(Line,_h) :- atom_number(Line,_h),!. '診断: 高さhを得る'(Line,_h) :- writef('入力された %t は数値ではありません。再入力をお願いします。\n',[Line]), fail. % 以下のサイトは % % 三角形の周囲の辺の長さをa,b,cとするとき % 三角形の面積は % ヘロンの公式(_a,_b,_c,_三角形の面積) :- _周囲の半分 is (_a + _b + _c) / 2, _三角形の面積 is sqrt(_周囲の半分 * (_周囲の半分 - _a) * (_周囲の半分 - _b) * (_周囲の半分 - _c)). % 以下のサイトは # このディレクトリの索引 # [1] 授業単元:プログラミング # [2] 問題文( # キーボードから入力したメニュー番号に沿った図形を「*」で表示するプログラムを # 作成してください。なお、プログラム作成時は以下の仕様に従ってください。 # ファイル名: kadai3.c # 【 問題作成時の注意点 】 # ・メニュー番号と図形の種類は以下の通りとします。なお、キーボードから # 入力した値が以下の番号以外の場合、再びメニュー番号を入力するように # してください。 # 1 三角形 # 2 四角形 # ・図形の段数(高さ)は、キーボードから入力してください。なお、キーボード # から入力した数が1 以下の場合、エラーメッセージを表示し、exit 関数で # プログラムを終了してください。 # エラーメッセージの例) wrong number # ・図形の表示には関数を利用してください。関数のプロトタイプ宣言は以下の # 通りとします。 # void DrawTriangle(int); # void DrawRectangle(int); # [3] 環境 #  [3.1] OS: Windows #  [3.2] コンパイラ名とバージョン: gcc 3.4 #  [3.3] 言語: C++ # [4] 期限: ([2006年11月2日17:30まで # [5] その他の制限:なし 'キーボードから入力したメニュー番号に沿った図形を「*」で表示するプログラムを 作成してください。なお、プログラム作成時は以下の仕様に従ってください。 l・メニュー番号と図形の種類は以下の通りとします。なお、キーボードから 入力した値が以下の番号以外の場合、再びメニュー番号を入力するように してください。 1 三角形 2 四角形 ・図形の段数(高さ)は、キーボードから入力してください。なお、キーボード から入力した数が1 以下の場合、エラーメッセージを表示し、exit 関数で プログラムを終了してください。' :- 'キーボードから入力した 1 三角形 2 四角形 のメニュー番号'(_メニュー番号), 'メニュー番号に沿った図形を「*」で表示する'(_メニュー番号). 'キーボードから入力した 1 三角形 2 四角形 のメニュー番号'(_メニュー番号) :- write('左側の数字で選択してください\n\n1 三角形\n2 四角形\n\n'), 整数を得る('メニュー番号[1/2]',member(_メニュー番号,[1,2]),_メニュー番号). 'メニュー番号に沿った図形を「*」で表示する'(1) :- 三角形の表示. 'メニュー番号に沿った図形を「*」で表示する'(2) :- 四角形の表示. 三角形の表示 :- '図形の段数(高さ)を入力してください'(_図形の高さ), 三角形の図形像(_図形の高さ,_図形像), 図形表示(_図形像). 三角形の図形像(_図形の高さ,_図形像,_図形像) :- findall(_表示星列,( between(1,_図形の段数,_現在の段), 三角形の表示星列(_現在の段,_表示星列)), _図形像). 三角形の表示星列(_現在の段,_表示星列) :- length(L,_現在の段), all(L,'*'), atomic_list_concat(L,_表示星列). 四角形の表示 :- 幅を入力してください(_図形の幅), '図形の段数(高さ)は、キーボードから入力してください'(_図形の高さ), 四角形の図形像(_図形の幅,_図形の高さ,_図形像), 図形の表示(_図形像). 四角形の図形像(_図形の幅,_図形の高さ,_図形像) :- 表示星列(_図形の幅,_表示星列), findall(_表示星列,( between(1,_図形の高さ,_), 四角形の表示星列(_図形の幅,_表示星列)), _図形像). 図形の表示(_図形像) :- append(_,[_表示星列|R],_図形像), writef('%t\n',[_表示星列]), R = []. 四角形の表示星列(_現在の段,_表示星列) :- length(L,_現在の段), all(L,'*'), atomic_list_concat(L,_表示星列). '図形の段数(高さ)を入力してください'(_図形の高さ) :- 整数を得る(図形の段数,_図形の高さ), 図形の高さ診断(_図形の高さ),!. '図形の段数(高さ)を入力してください'(_図形の高さ) :- '図形の段数(高さ)を入力してください'(_図形の高さ). 図形の高さ診断(_図形の高さ) :- _図形の高さ > 1,!. 図形の高さ診断(_図形の高さ) :- writef('入力された図形の高さ %t はこの図形の高さとして適切でありません。\n再入力をお願いします。\n',[_図形の高さ]), fail. '幅を入力してください'(_図形の幅) :- 整数を得る(図形の段数,_図形の幅), 図形の幅診断(_図形の幅),!. '幅を入力してください'(_図形の幅) :- '幅を入力してください'(_図形の幅). 図形の幅診断(_図形の幅) :- _図形の幅 > 1,!. 図形の幅診断(_図形の幅) :- writef('入力された図形の幅 %t はこの図形の幅として適切でありません。\n再入力をお願いします。\n',[_図形の幅]), fail. all([],_). all([A|R],A) :- all(R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/175 # # [1]C言語 # [2]問1. キーボードから正の整数を2 つ(x、y とする) 入力し、縦x 個、横y 個の文字'*' から # なる長方形を表示するプログラムを多重ループを用いて作成せよ。 # # 問2. キーボードから正の整数x を入力し、下記のように、一辺に'*' がx 個並んだ直角三角 # 形が画面に出力されるプログラムを作成せよ。(x = 5 のときの例) # ***** # **** # *** # ** # * # [3]Linux # gcc # C言語 # [4]本日中でお願いします。 # # :- op(700,xfx,(::)). 'キーボードから正の整数''x'' を入力し、一辺に''*'' がx 個並んだ直角三角形が画面に出力される' :- 'キーボードから正の整数''x'' を入力し'(_x), '一辺に''*'' がx 個並んだ直角三角形が画面に出力される'(_x). 'キーボードから正の整数''x'' を入力し'(_x) :- 整数を得る(正の整数x,_x > 0,_x). '一辺に''*'' がx 個並んだ直角三角形が画面に出力される'(0) :- !. '一辺に''*'' がx 個並んだ直角三角形が画面に出力される'(_x) :- _x :: write(*), nl, _x_1 is _x - 1, '一辺に''*'' がx 個並んだ直角三角形が画面に出力される'(_x_1). _回数 :: P :- between(1,_回数,N), P, _回数 = N. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/175 # # [1]C言語 # [2]問1. キーボードから正の整数を2 つ(x、y とする) 入力し、縦x 個、横y 個の文字'*' から # なる長方形を表示するプログラムを多重ループを用いて作成せよ。 # # 問2. キーボードから正の整数x を入力し、下記のように、一辺に'*' がx 個並んだ直角三角 # 形が画面に出力されるプログラムを作成せよ。(x = 5 のときの例) # ***** # **** # *** # ** # * # [3]Linux # gcc # C言語 # [4]本日中でお願いします。 # # 'キーボードから正の整数''x'' を入力し、一辺に''*'' がx 個並んだ直角三角形が画面に出力される' :- 'キーボードから正の整数''x'' を入力し'(_x), '一辺に''*'' がx 個並んだ直角三角形が画面に出力される'(_x). 'キーボードから正の整数''x'' を入力し'(_x) :- 整数を得る(正の整数x,_x > 0,_x). '一辺に''*'' がx 個並んだ直角三角形が画面に出力される'(_x) :- length(L,_x), all(L,'*'), '直角三角形が画面に出力される'(L). '直角三角形が画面に出力される'(L) :- append(_,L2,L), atomic_list_concat(L2,A), writef('%t\n',[A]), L2 = ['*']. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/844 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # http://ime.nu/codepad.org/DXRUGC3J # http://ime.nu/codepad.org/e9CIf3Iy # # /* # # 4. # 2次元平面上の3つの座標 p1、p2、 p3 を頂点とする # 3角形を考え、構造体 triangle を以下のように定義する。 # struct triangle { # double p1[2]; double p2[2]; double p3[2]; # }; # # 構造体 triangle に対して、以下の関数を作成せよ。 適当な構造体 triangle の変数を # いくつか作成して、この関数が正しく動作することを確認するプログラムを作成せよ。 # # int congruence (structure triangle *a, structure triangle *b) # # 三角形 a と三角形 b が合同かどうかを判定する、 # 合同なら 1 を合同でないなら 0 を返す # # */ # # /* # # 5.構造体Tri は三角形に対応するものであり、3 つの辺の長さ(a,b,c) とその三角形の面積(area) を # メンバーとしてして持つ。 # struct Tri { # int a; # int b; # int c; # double area # }; # # 構造体Tri の変数をランダムにn 個作成して、三角形の面積が大きい順に表示するプログラムを作成 # する。ただしn はプログラムの引数として与える。また構造体Tri の変数をランダムに作成する際 # に、a とb には3 以上30 以下の整数をランダムに入れ、c にはa とb の値から、3 辺a, b, c から三 # 角形ができるようにランダムに正の整数を入れる。 # # [実行結果] # > ./a.out 1000 # 1 番目に大きい三角形は3 辺が( 30, 29, 41 ) で面積は434.741302 # 2 番目に大きい三角形は3 辺が( 29, 29, 43 ) で面積は418.422260 # 3 番目に大きい三角形は3 辺が( 30, 27, 37 ) で面積は399.749922 # ... # 998 番目に大きい三角形は3 辺が( 4, 3, 3 ) で面積は4.472136 # 999 番目に大きい三角形は3 辺が( 3, 3, 3 ) で面積は3.897114 # 1000 番目に大きい三角形は3 辺が( 3, 3, 1 ) で面積は1.479020 # # */ '三角形の面積が大きい順に表示する'(_n) :- 三角形をn個生成する(_n,_n個の三角形ならび), 大きい順に表示する(_n個の三角形ならび). 三角形をn個生成する(_n,_n個の三角形ならび) :- findall([_a,_b,_c],( between(1,_n,_), 三辺の長さを生成する(_a,_b,_c)), _n個の三角形ならび). 三辺の長さを生成する(_a,_b,_c) :- _a is random(100) + 1, _b is random(100) + 1, _c is random(100) + 1. 大きい順に表示する(_n個の三角形ならび) :- 三角形の面積と相対位置のならびを作る(0,_n個の三角形ならび,_面積と相対位置のならび), 大きい順に(_面積と相対位置のならび,_大きい順に整列した面積と相対位置のならび), 表示する(0,_大きい順に整列した面積と相対位置のならび,_n個の三角形ならび). 三角形の面積と相対位置のならびを作る(_,[],[]). 三角形の面積と相対位置のならびを作る(N_1,[[_a,_b,_c]|R1],[[_三角形の面積,N_2]|R2]) :- N_2 is N + 1, ヘロンの公式(_a,_b,_c,_三角形の面積), 三角形の面積と相対位置のならびを作る(0,R1,R2). ヘロンの公式(_a,_b,_c,_三角形の面積) :- _周囲の半分 is (_a + _b + _c) / 2, _三角形の面積 is sqrt(_周囲の半分 * (_周囲の半分 - _a) * (_周囲の半分 - _b) * (_周囲の半分 - _c)). 大きい順に([],[]). 大きい順に([_軸要素|L1],L2) :- 大きい順に分割する(_軸要素,L1,_軸要素に等しいか大きい要素ならび,_軸要素より小さい要素ならび), 大きい順に(_軸要素に等しいか大きい要素ならび,_大きい順に整列した軸要素に等しいか大きい要素ならび), 大きい順に(_軸要素より小さい要素ならび,_大きい順に整列した軸要素より小さい要素ならび), append(_大きい順に整列した軸要素に等しいか大きい要素ならび,[_軸要素|_大きい順に整列した軸要素より小さい],L2). 大きい順に分割する(_,[],[],[])). 大きい順に分割する(_軸要素,[_要素|R1],[_要素|_軸要素に等しいか大きい要素ならび],_軸要素より小さい要素ならび) :- _要素 @>= _軸要素, 大きい順に分割する(_軸要素,R1,_軸要素に等しいか大きい要素ならび,_軸要素より小さい要素ならび). 大きい順に分割する(_軸要素,[_要素|R1],_軸要素に等しいか大きい要素ならび,[_要素|_軸要素より小さい要素ならび]) :- _要素 @< _軸要素, 大きい順に分割する(_軸要素,R1,_軸要素に等しいか大きい要素ならび,_軸要素より小さい要素ならび). 表示する(_,[],_). 表示する(_順位_0,[[_面積,_相対番号]|R1],_n個の三角形ならび) :- _順位 is _順位_0 + 1, nth1(_相対番号,_n個の三角形ならび,[_a,_b,_c]), writef('%t 番目に大きい三角形は3 辺が( %t, %t, %t ) で面積は%t\n',[_順位,_a,_b,_c,_面積]), 表示する(_順位,R1,_n個の三角形ならび). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/844 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # http://ime.nu/codepad.org/DXRUGC3J # http://ime.nu/codepad.org/e9CIf3Iy # # /* # # 4. # 2次元平面上の3つの座標 p1、p2、 p3 を頂点とする # 3角形を考え、構造体 triangle を以下のように定義する。 # struct triangle { # double p1[2]; double p2[2]; double p3[2]; # }; # # 構造体 triangle に対して、以下の関数を作成せよ。 適当な構造体 triangle の変数を # いくつか作成して、この関数が正しく動作することを確認するプログラムを作成せよ。 # # int congruence (structure triangle *a, structure triangle *b) # # 三角形 a と三角形 b が合同かどうかを判定する、 # 合同なら 1 を合同でないなら 0 を返す # # */ '三角形 a と三角形 b が合同かどうかを判定する、合同なら 1 を合同でないなら 0 を返す'(_p1_a,_p2_a,_p3_a,_p1_b,_p2_b,_p3_b,1) :- 三角形の三辺を得る(_p1_a,_p2_a,_p3_a,L1), 三角形の三辺を得る(_p1_b,_p2_b,_p3_b,L2), 'L1とL2の三辺がそれぞれ等しい'(L1,L2),!. '三角形 a と三角形 b が合同かどうかを判定する、合同なら 1 を合同でないなら 0 を返す'(_,_,_,_,_,_,0). 三角形の三辺を得る((_x1,_y1),(_x2,_y2),(_x3,_y3),[_辺1,_辺2,_辺3]) :- _辺1 is sqrt((_x2 - _x1) * (_x2 - _x1) + (_y2 - _y1) * (_y2 - _y1)), _辺2 is sqrt((_x3 - _x2) * (_x3 - _x2) + (_y3 - _y2) * (_y3 - _y2)), _辺3 is sqrt((_x1 - _x3) * (_x1 - _x3) + (_y1 - _y3) * (_y1 - _y3)). 'L1とL2の三辺がそれぞれ等しい'([],[]). 'L1とL2の三辺がそれぞれ等しい'([A|R1],L2) :- select(A,L1,R1), select(A,L2,R2), 'L1とL2の三辺がそれぞれ等しい'(R1,R2). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/790 # # 【質問テンプレ】 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # 数値を1つ入力し、その個数分の"*"を1辺とする # \喫形 ∋鯵儼 5媚鯵儼 せ鯵儡 ゥ瀬ぅ箏 θ角形 Ю鰻舛鯢漸茲擦 # # ・繰り返しの条件指定の工夫のみの作成。 # ・描画部分のアルゴリズムでif文を使用しないこと # ・1回のprintf()関数で出力できるものは「*」「 」「\n」のみ。 # ただし「*」の後ろに半角スペースを付加することはOK。 # ・各図形の描画は、それぞれ関数化されていること。 # ・2〜9以外の数字が入力されたら、エラーメッセージを出力して再入力させる。 # ・メニュー形式にして、どの図形を描画するか選択式にする # さらに1回で終了せず描画後、メニューに戻ること。 # ・描画する図形の内部を空白にする。 # # 入力させるメッセージは「数字(2〜9)を入力してください。」 # エラーメッセージは「エラー! 2〜9の数字を入力してください。」 # メニューは、1)正方形 2)三角形 3)逆三角形 4)三角旗 5)ダイヤ型 6)八角形 7)星形を表示し、 # そこから選ばせるようにすること。 # 三角旗(_n) :- 旗の部分(1,_n), 残りの竿の部分(_n). 旗の部分(_n), between(1,_n,M), 竿のひと節, 旗(_n), M = _n, 旗(_n,_n) :- 一筋書く(_m),!. 旗(_m,_n) :- 一筋書く(_m), _m_2 is _m + 1, 旗(_m_2,_n), 一筋書く(_m). 竿のひと節 :- write('*'). 一筋書く(_m) :- between(1,_m,M), write('*'), _m = M, write('\n'). 残りの竿の部分(_n) :- between(1,_n,M), 竿のひと節, write('\n'), _n = M. % 以下のサイトは # 出典::いろんな言語で宿題 第五編 # 問題 # # 三本のまっすぐな棒の長さ a, b, c (1<= a,b,c <=1000 の整数)が与えられたとき # 三本の棒で作ることの出来る三角形の最大面積を求めよ(計算誤差は 0.001以下とする) # 棒は切断したり曲げたりすることは出来ない # また棒の太さは十分細く無視できるものとする # '三本のまっすぐな棒の長さ a, b, c (1<= a,b,c <=1000 の整数)が与えられたとき三本の棒で作ることの出来る三角形の最大面積を求めよ(計算誤差は 0.001以下とする)棒は切断したり曲げたりすることは出来ないまた棒の太さは十分細く無視できるものとする'(_a,_b,_c,_三角形の面積) :- 最長辺の二乗が他の二辺のそれぞれの長さの二乗の和以下である(_a,_b,_c), ヘロンの公式(_a,_b,_c,_三角形の面積). '三本のまっすぐな棒の長さ a, b, c (1<= a,b,c <=1000 の整数)が与えられたとき三本の棒で作ることの出来る三角形の最大面積を求めよ(計算誤差は 0.001以下とする)棒は切断したり曲げたりすることは出来ないまた棒の太さは十分細く無視できるものとする'(_a,_b,_c,_三角形の面積) :- 最長辺の二乗が他の二辺のそれぞれの長さの二乗の和より大きい(_a,_b,_c,_最長辺,_辺_2,_辺_3), '最大面積の三角形は、長辺を直径として、頂点が円周上にある三角形つまり長編を斜辺とする直角三角形である'(_辺_2,_辺_3,_三角形の面積). 最長辺の二乗が他の二辺のそれぞれの長さの二乗の和以下である(_a,_b,_c) :- select(_最長辺,[_a,_b,_c],[_辺_2,_辺_3]), _最長辺 >= _辺_2, _最長辺 >= _辺_3, _最長辺 * _最長辺 =< _辺_2 * _辺_2 + _辺_3 * _辺_3,!. 最長辺の二乗が他の二辺のそれぞれの長さの二乗の和より大きい(_a,_b,_c,_最長辺,_辺_2,_辺_3) :- select(_最長辺,[_a,_b,_c],[_辺_2,_辺_3]), _最長辺 >= _辺_2, _最長辺 >= _辺_3, _最長辺 * _最長辺 > _辺_2 * _辺_2 + _辺_3 * _辺_3,!. ヘロンの公式(_a,_b,_c,_三角形の面積) :- _周囲の半分 is (_a + _b + _c) / 2, _三角形の面積 is sqrt(_周囲の半分 * (_周囲の半分 - _a) * (_周囲の半分 - _b) * (_周囲の半分 - _c)). '最大面積の三角形は、長辺を直径として、頂点が円周上にある三角形つまり長編を斜辺とする直角三角形である'(_辺_2,_辺_3,_三角形の面積) :- _三角形の面積 is _辺_2 * _辺_3 * 0.5. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/850 # # 3角形の3辺の長さがあたえられたとき、 # 正三角形、2等辺三角形、直角三角形か調べるプログラムをつくりなさい # ってな問題がでたことあるんだけど・・・ # 結構むずいよね。 # # '3角形の3辺の長さがあたえられたとき、正三角形、2等辺三角形、直角三角形か調べる'(_辺_1,_辺_2,_辺_3,_診断) :- 正三角形か調べる(_辺_1,_辺_2,_辺_3,_), 2等辺三角形か調べる(_辺_1,_辺_2,_辺_3,_2等辺三角形診断), 直角三角形か調べる(_辺_1,_辺_2,_辺_3,_直角三角形診断), 診断を編集する(_直角三角形診断,_2等辺三角形診断,_診断). 正三角形か調べる(_辺_1,_辺_2,_辺_3,_) :- 正三角形は2等辺三角形に属するからそちらで診断する. 正三角形は2等辺三角形に属するからそちらで診断する. '2等辺三角形か調べる'(_辺,_辺,_辺,'正') :- !. '2等辺三角形か調べる'(_辺,_辺,_,'2等辺') :- !. '2等辺三角形か調べる'(_,_辺,_辺,'2等辺') :- !. '2等辺三角形か調べる'(_辺,_,_辺,'2等辺') :- !. '2等辺三角形か調べる'(_,_,_,''). 直角三角形か調べる(_辺_1,_辺_2,_辺_3,直角) :- select(_長辺,[_辺_1,_辺_2,_辺_3],[_短辺_1,_短辺_2]), _長辺 * _長辺 =:= _短辺_1 * _短辺_1 + _短辺_2 * _短辺_2,!. 直角三角形か調べる(_,_,_,''). 診断を編集する('','','正三角形、2等辺三角形、直角三角形の何れでもない') :- !. 診断を編集する(_直角三角形診断,_2等辺三角形診断,_診断) :- atomic_list_concat([_直角三角形診断,_2等辺三角形診断,'三角形'],_診断). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/850 # # 3角形の3辺の長さがあたえられたとき、 # 正三角形、2等辺三角形、直角三角形か調べるプログラムをつくりなさい # ってな問題がでたことあるんだけど・・・ # 結構むずいよね。 # # '3角形の3辺の長さがあたえられたとき、正三角形、2等辺三角形、直角三角形か調べる'(_辺_1,_辺_2,_辺_3,_診断) :- 正三角形か(_辺_1,_辺_2,_辺_3,_), 2等辺三角形か(_辺_1,_辺_2,_辺_3,_2等辺三角形診断), 直角三角形か(_辺_1,_辺_2,_辺_3,_直角三角形診断), 調べる(_直角三角形診断,_2等辺三角形診断,_診断). 正三角形か(_辺_1,_辺_2,_辺_3,_) :- 正三角形は2等辺三角形に属するからそちらで診断する. 正三角形は2等辺三角形に属するからそちらで診断する. '2等辺三角形か'(_辺,_辺,_辺,'正') :- !. '2等辺三角形か'(_辺,_辺,_,'2等辺') :- !. '2等辺三角形か'(_,_辺,_辺,'2等辺') :- !. '2等辺三角形か'(_辺,_,_辺,'2等辺') :- !. '2等辺三角形か'(_,_,_,''). 直角三角形か(_辺_1,_辺_2,_辺_3,直角) :- select(_長辺,[_辺_1,_辺_2,_辺_3],[_短辺_1,_短辺_2]), _長辺 * _長辺 =:= _短辺_1 * _短辺_1 + _短辺_2 * _短辺_2,!. 直角三角形か(_,_,_,''). 調べる('','','正三角形、2等辺三角形、直角三角形の何れでもない') :- !. 調べる(_直角三角形診断,_2等辺三角形診断,_診断) :- atomic_list_concat([_直角三角形診断,_2等辺三角形診断,'三角形'],_診断). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/850 # # 3角形の3辺の長さがあたえられたとき、 # 正三角形、2等辺三角形、直角三角形か調べるプログラムをつくりなさい # ってな問題がでたことあるんだけど・・・ # 結構むずいよね。 # # '3角形の3辺の長さがあたえられたとき、正三角形、2等辺三角形、直角三角形か調べる'(_辺_1,_辺_2,_辺_3,_診断) :- 正三角形か調べる(_辺_1,_辺_2,_辺_3,_正三角形診断), 直角三角形か調べる(_辺_1,_辺_2,_辺_3,_直角三角形診断), '2等辺三角形か調べる'(_辺_1,_辺_2,_辺_3,_2等辺三角形診断), 診断を編集する(_正三角形診断,_直角三角形診断,_2等辺三角形診断,_診断). 正三角形か調べる(_辺,_辺,_辺,正) :- !. 正三角形か調べる(_,_,''). '2等辺三角形か調べる'(_辺,_辺,_,'2等辺') :- !. '2等辺三角形か調べる'(_,_辺,_辺,'2等辺') :- !. '2等辺三角形か調べる'(_辺,_,_辺,'2等辺') :- !. '2等辺三角形か調べる'(_,_,_,''). 直角三角形か調べる(_辺_1,_辺_2,_辺_3,直角) :- select(_長辺,[_辺_1,_辺_2,_辺_3],[_短辺_1,_短辺_2]), _長辺 * _長辺 =:= _短辺_1 * _短辺_1 + _短辺_2 * _短辺_2,!. 直角三角形か調べる(_,_,_,''). 診断を編集する('','','','正三角形、2等辺三角形,直角三角形の何れでもない') :- !. 診断を編集する(正,_,_,正三角形) :- !. 診断を編集する(_,_直角三角形診断,_2等辺三角形診断,_診断) :- atomic_list_concat([_直角三角形診断,_2等辺三角形診断,'三角形'],_診断),!. % % 一つ問題なのは、「正三角形は直角三角形にはならない」という事を分かって % しまっている定義だということだ。課題のどこを見てもそんな記述はない。 % % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/850 # # 3角形の3辺の長さがあたえられたとき、 # 正三角形、2等辺三角形、直角三角形か調べるプログラムをつくりなさい # ってな問題がでたことあるんだけど・・・ # 結構むずいよね。 # # '3角形の3辺の長さがあたえられたとき、正三角形、2等辺三角形、直角三角形か調べる'(_辺_1,_辺_2,_辺_3,_診断) :- 正三角形か(_辺_1,_辺_2,_辺_3,_正三角形診断), 直角三角形か(_辺_1,_辺_2,_辺_3,_直角三角形診断), '2等辺三角形か'(_辺_1,_辺_2,_辺_3,_2等辺三角形診断), 調べる(_正三角形診断,_直角三角形診断,_2等辺三角形診断,_診断). 正三角形か(_辺,_辺,_辺,正) :- !. 正三角形か(_,_,''). '2等辺三角形か'(_辺,_辺,_,'2等辺') :- !. '2等辺三角形か'(_,_辺,_辺,'2等辺') :- !. '2等辺三角形か'(_辺,_,_辺,'2等辺') :- !. '2等辺三角形か'(_,_,_,''). 直角三角形か(_辺_1,_辺_2,_辺_3,直角) :- select(_長辺,[_辺_1,_辺_2,_辺_3],[_短辺_1,_短辺_2]), _長辺 * _長辺 =:= _短辺_1 * _短辺_1 + _短辺_2 * _短辺_2,!. 直角三角形か(_,_,_,''). 調べる('','','','正三角形、2等辺三角形,直角三角形の何れでもない') :- !. 調べる(正,_,_,正三角形) :- !. 調べる(_,_直角三角形診断,_2等辺三角形診断,_診断) :- atomic_list_concat([_直角三角形診断,_2等辺三角形診断,'三角形'],_診断),!. % % 一つ問題なのは、「正三角形は直角三角形にはならない」という事を分かって % しまっている定義だということだ。課題のどこを見てもそんな記述はない。 % % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/802 # # [1] 授業単元:if else # [2] 問題文(含コード&リンク): # 三角形の3辺の長さ a,b,c をfloat型で入力し, # 直角三角形,鈍角三角形,鋭角三角形のどれであるかを判定するプログラムを作成しなさい。 # なお、if文をよういること # '三角形の3辺の長さをfloat型で入力し,直角三角形,鈍角三角形,鋭角三角形のどれであるかを判定する'(_判定) :- '三角形の3辺の長さfloat型で入力し'(_辺_1,_辺_2,_辺_3), '直角三角形,鈍角三角形,鋭角三角形のどれであるかを判定する'(_辺_1,_辺_2,_辺_3,_判定). '三角形の3辺の長さをfloat型で入力し'(_辺_1,_辺_2,_辺_3) :- write('三角形の3 辺の長さを浮動小数点数で入力してください。 '), findall(_辺,( append(Ln,[_|_],[_,_,_]), length([_|Ln],_n), 辺の長さの入力(_n,_辺)), [_辺_1,_辺_2,_辺_3]). 辺の長さの入力(_n,_辺) :- writef('辺[%t] : ',[_n]), get_line(Line), 辺の長さの入力診断(Line,_辺),!. 辺の長さの入力(_n,_辺) :- 辺の長さの入力(_n,_辺). 辺の長さの入力診断(Line,_辺) :- atom_to_term(Line,_辺,_), float(_辺), _辺 > 0.0,!. 辺の長さの入力診断(Line,_辺) :- writef('入力された %t からは三角形の辺にあたる情報が得られません。再入力をお願いします。\n',[Line]), fail. '直角三角形,鈍角三角形,鋭角三角形のどれであるかを判定する'(_辺_1,_辺_2,_辺_3,_判定) :- '二つの短辺と長辺に分ける'([_辺_1,_辺_2,_辺_3],[_短辺_1,_短辺_2],_長辺), '直角三角形、鈍角三角形、鋭角三角形の判定'(_短辺_1,_短辺_2,_長辺,_判定). '二つの短辺と長辺に分ける'([_長辺|R],R,_長辺) :- \+((member(_辺,R),_辺 > _長辺)),!. '二つの短辺と長辺に分ける'([_辺|R1],[_辺|R2],_長辺) :- '二つの短辺と長辺に分ける'(R1,R2,_長辺). '直角三角形、鈍角三角形、鋭角三角形の判定'(_短辺_1,_短辺_2,_長辺,直角三角形) :- (_長辺 * _長辺) =:= (_短辺_1 * _短辺_1) + (_短辺_2 * _短辺_2),!. '直角三角形、鈍角三角形、鋭角三角形の判定'(_短辺_1,_短辺_2,_長辺,鋭角三角形) :- (_長辺 * _長辺) < (_短辺_1 * _短辺_1) + (_短辺_2 * _短辺_2),!. '直角三角形、鈍角三角形、鋭角三角形の判定'(_短辺_1,_短辺_2,_長辺,鈍角三角形) :- (_長辺 * _長辺) > (_短辺_1 * _短辺_1) + (_短辺_2 * _短辺_2),!. % 以下のサイトは yes. # # 最初に1要素、バックトラックしてくるとその後は2要素、さらに3要素と # 取り出し要素が増える。 # バックトラックした時は前回取得できた次の要素から取り出していく。 # 平坦なリストからピラミッドを描くような場合に有効。 # 'N++個組'(L,N,S,L0,X,R) :- 'N++個組'(1,0,L,N,S,L0,X,R). 'N++個組'(N_1,S_1,L,N,S,L0,X,R) :- length(X_1,N_1), length(L0_1,S_1), append(L0_1,X_1,R_1,L), 'N++個組'(N_1,S_1,L,L0_1,X_1,R_1,N,S,L0,X,R). 'N++個組'(N,S,L,L0,X,R,N,S,L0,X,R). 'N++個組'(N_1,S_1,L,_,_,_,N,S,L0,X,R) :- N_2 is N_1 + 1, S_2 is S_1 + N_1, 'N++個組'(N_2,S_2,L,N,S,L0,X,R). % % ?- 'N++個組'([1,2,3,4,5,6,7,8,9,10],N,S,L0,X,R). % N = 1, % S = 1, % L0 = [], % X = [1], % R = [2,3,4,5,6,7,8,9,10]; % % N = 2, % S = 3, % L0 = [1], % X = [2,3], % R = [4,5,6,7,8,9,10]; % % N = 3, % S = 6, % L0 = [1,2,3], % X = [4,5,6], % R = [7,8,9,10]; % % N = 4, % S = 10, % L0 = [1,2,3,4,5,6], % X = [7,8,9,10], % R = []; % % false % % 以下のサイトは # http://oshiete.goo.ne.jp/qa/7474619.html # A,B,Cを使って直角三角形が成り立ち真となる関係right triangleを定義するプログラムを教えてください。今のところ # triangle(A,B,C). # vertical(seg(point(X,Y),point(X,Y1)). # horizontal(seg(point(X,Y),point(X1,Y)). # を使うところまではわかっているのですが先に進みません。 'A,B,Cを使って直角三角形が成り立ち真となる関係'(座標(A),座標(B),座標(C)) :- '三点の座標から辺の長さを得る'(A,B,C,_辺1,_辺2,_辺3), 'A,B,Cを使って直角三角形が成り立ち真となる関係'(辺の長さ(_辺1),辺の長さ(_辺2),辺の長さ(_辺3)). 'A,B,Cを使って直角三角形が成り立ち真となる関係'(辺の長さ(A),辺の長さ(B),辺の長さ(C)) :- A > B,A > C, A * A =:= B * B + C * C,!. 'A,B,Cを使って直角三角形が成り立ち真となる関係'(辺の長さ(A),辺の長さ(B),辺の長さ(C)) :- B > A,B > C, 'A,B,Cを使って直角三角形が成り立ち真となる関係'(辺の長さ(B),辺の長さ(A),辺の長さ(C)). 'A,B,Cを使って直角三角形が成り立ち真となる関係'(辺の長さ(A),辺の長さ(B),辺の長さ(C)) :- C > A,C > B, 'A,B,Cを使って直角三角形が成り立ち真となる関係'(辺の長さ(C),辺の長さ(A),辺の長さ(B)). 'A,B,Cを使って直角三角形が成り立ち真となる関係'(ラジアン角度(A),辺の長さ(B),辺の長さ(C)) :- A is pi / 2,!. 'A,B,Cを使って直角三角形が成り立ち真となる関係'(辺の長さ(A),ラジアン角度(B),辺の長さ(C)) :- 'A,B,Cを使って直角三角形が成り立ち真となる関係'(角度(B),辺の長さ(A),辺の長さ(C)). 'A,B,Cを使って直角三角形が成り立ち真となる関係'(辺の長さ(A),ラジアン角度(B),辺の角度(C)) :- 'A,B,Cを使って直角三角形が成り立ち真となる関係'(角度(C),辺の長さ(A),辺の長さ(B)). 'A,B,Cを使って直角三角形が成り立ち真となる関係'(度数法角度(A),辺の長さ(B),辺の長さ(C)) :- 180.0 is A * 1.0,!. 'A,B,Cを使って直角三角形が成り立ち真となる関係'(辺の長さ(A),度数法角度(B),辺の長さ(C)) :- 'A,B,Cを使って直角三角形が成り立ち真となる関係'(度数法角度(B),辺の長さ(A),辺の長さ(C)). 'A,B,Cを使って直角三角形が成り立ち真となる関係'(辺の長さ(A),辺の長さ(B),度数法角度(C)) :- 'A,B,Cを使って直角三角形が成り立ち真となる関係'(度数法角度(C),辺の長さ(A),辺の長さ(B)). '三点の座標から辺の長さを得る'((X1,Y1),(X2,Y2),(X3,Y3),_辺1,_辺2,_辺3) :- _辺1 is sqrt((X1-X2) * (X1-X2) + (Y1-Y2) * (Y1-Y2)), _辺2 is sqrt((X1-X3) * (X1-X3) + (Y1-Y3) * (Y1-Y3)), _辺1 is sqrt((X2-X3) * (X2-X3) + (Y2-Y3) * (Y2-Y3)). % 以下のサイトは # http://oshiete.goo.ne.jp/qa/7474619.html # A,B,Cを使って直角三角形が成り立ち真となる関係right triangleを定義するプログラムを教えてください。今のところ # triangle(A,B,C). # vertical(seg(point(X,Y),point(X,Y1)). # horizontal(seg(point(X,Y),point(X1,Y)). # を使うところまではわかっているのですが先に進みません。 'A,B,Cを使って直角三角形が成り立ち真となる関係'(A,B,C) :- A > B,A > C, A * A =:= B * B + C * C,!. 'A,B,Cを使って直角三角形が成り立ち真となる関係'(A,B,C) :- B > A,B > C, 'A,B,Cを使って直角三角形が成り立ち真となる関係'(B,A,C). 'A,B,Cを使って直角三角形が成り立ち真となる関係'(A,B,C) :- C > A,C > B, 'A,B,Cを使って直角三角形が成り立ち真となる関係'(C,A,B). % 以下のサイトは # http://oshiete.goo.ne.jp/qa/7474619.html # A,B,Cを使って直角三角形が成り立ち真となる関係right triangleを定義するプログラムを教えてください。今のところ # triangle(A,B,C). # vertical(seg(point(X,Y),point(X,Y1)). # horizontal(seg(point(X,Y),point(X1,Y)). # を使うところまではわかっているのですが先に進みません。 'A,B,Cを使って直角三角形が成り立ち真となる関係'(A,B,C) :- A * A =:= B * B + C * C. 'A,B,Cを使って直角三角形が成り立ち真となる関係'(A,B,C) :- B * B =:= A * A + C * C. 'A,B,Cを使って直角三角形が成り立ち真となる関係'(A,B,C) :- C * C =:= A * A + B * B. % 以下のサイトは パスカルの三角形ならび(_n,_パスカルの三角形ならび) :- findall(L,( パスカルの三角形(_n,L)), _パスカルの三角形ならび). パスカルの三角形(_n,_パスカルの三角形) :- パスカルの三角形(1,_n,[1],_パスカルの三角形). パスカルの三角形(_m,_n,L1,_) :- _m > _n,!, fail. パスカルの三角形(_,_,_パスカルの三角形,_パスカルの三角形). パスカルの三角形(_m,_n,L1,_パスカルの三角形) :- パスカルの三角形の次の行(L1,L2), _m_2 is _m + 1, パスカルの三角形(_m_2,_n,L2,_パスカルの三角形). パスカルの三角形の次の行(L1,[1|L2]) :- パスカルの三角形の次の行の二(L1,L2). パスカルの三角形の次の行の二([],[1]). パスカルの三角形の次の行の二([A,B|R1],[C|R2]) :- C is A + B, パスカルの三角形の次の行の二([B|R1],R2). % 以下のサイトは パスカルの三角形ならび(_n,_パスカルの三角形ならび) :- findall(L,( パスカルの三角形(_n,L)), _パスカルの三角形ならび). パスカルの三角形(_n,_パスカルの三角形) :- length(Ln,_n), パスカルの三角形(Ln,[1],_パスカルの三角形). パスカルの三角形(Ln,L1,_) :- append(Ln,[_|_],L1),!, fail. パスカルの三角形(Ln,_パスカルの三角形,_パスカルの三角形). パスカルの三角形(Ln,L1,_パスカルの三角形) :- パスカルの三角形の次の行(L1,L2), パスカルの三角形(Ln,L2,_パスカルの三角形). パスカルの三角形の次の行(L1,L2) :- findall(N,( append(_,[A,B|_],L1), N is A + B), L3), append([1|L3],[1],L2). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1309076891/908 # # 【 課題 】ttp://www.dotup.org/uploda/www.dotup.org2712711.txt.html # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 GUI  】制限なし # 【 期限 】3/8 0:00 # 【 Ver  】java version "1.7.0_02-ea" # 【 補足 】3/8が提出期限なので、それまでにどうかお願いいたします。 # # # 専門学校での課題です。 # 課題1については自力でできたのですが、ところどころわからないので、課題1から3をお願いします # # # # 課題1. # 以下の仕様に従ってクラスを作った後、長方形グラフ、三角グラフ、放物線グラフの逆さと幅を設定し、グラフを描くプログラムを作りなさい。プロジェクト名は「kadai1」、mainを持つクラス名は「GraphTest」とする。 # # ・クラス1からクラス3まで全てのクラスを実装すること。 # ・全てのクラスは、カプセル化を行い、フィールドは完全に隠蔽すること。ただし、サブクラスは親クラスのフィールドは見えてもいいとする。 # ・自分自身のフィールドを設定できるコンストラクタも作ること。 # ・三角クラス及び放物線クラスは長方形クラスから継承すること。 # ・"グラフを描く"メソッドはオーバーライドを使うこと。 # # なお、グラフは*(半角)を用いて以下のようなものをテキストで描くとする。 # # 長方形 高さ5 幅4の場合 # **** # **** # **** # **** # **** # # 三角 高さ5 幅4の場合 # 幅優先で描かれて幅が0の状態(*がない状態)から1つずつ増える、高さは無視 # # * # ** # *** # **** # # 放物線 高さ5 幅4の場合 # 幅優先で描かれて幅が4の状態から1つずつ減った後、0まで行ったところでまた高さまで1ずつ増えていく、幅は無視 # **** # *** # ** # * # # * # ** # *** # **** # # クラス1 # (クラス名) # 長方形グラフ # # (フィールド) # 高さ # 幅 # # (メソッド) # 高さの設定をする # 幅の設定をする # グラフを描く # # クラス2 # (クラス名) # 三角グラフ # # (メソッド) # グラフを描く # # クラス3 # (クラス名) # 放物線グラフ # # (メソッド) # グラフを描く # # '長方形グラフ、三角グラフ、放物線グラフの逆さと幅を設定し、グラフを描く' :- 長方形(5,4), 三角形グラフ(4), 放物線グラフ(4). 長方形(_高さ,_幅) :- 幅分の星文字列(_幅,_星文字列), for(1,_行,_高さ), writef('%t\n',[_星文字列]), _行 = _高さ. 幅分の星文字列(_幅,_星文字列) :- length(L,_幅), all(L,'*'), concat_atom(L,S). 三角グラフ(_幅) :- 部分三角グラフ(_幅,L,L0,_星文字列), L = L0 部分三角グラフ(_幅,L,L0) :- length(L,_幅), append(L0,_,L), length(L0,_行の幅), 幅分の星文字列(_行の幅,_星文字列), writef('%t\n',[_星文字列]). 倒置した三角グラフ(_幅) :- 倒置した部分三角グラフ(_幅,L,L1,_星文字列), L1 = []. 倒置した部分三角グラフ(_幅,L,L1) :- length(L,_幅), append(_,L1,L), length(L1,_行の幅), 幅分の星文字列(_行の幅,_星文字列), writef('%t\n',[_星文字列]). 放物線グラフ(_高さ) :- _幅 is _高さ - 1, 倒置した部分三角グラフ(_幅,L,L1), L1 = [_], 部分三角グラフ(_幅,L,L0), L = L0. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/349 # # 【質問テンプレ】 # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク): # その物体を構成している三角形のそれぞれの辺の中点をとって一個の三角形を四つに分割し、新しい三角形の配列に加えていくプログラムを作れ。 # (頂点の配列に、新しくできた中点の座標を加えていく。 # そしてそれを加えられた頂点の配列から3つずつ選び新しい三角形を構成する配列を作る。) # 'その物体を構成している三角形のそれぞれの辺の中点をとって一個の三角形を四つに分割し、新しい三角形の配列に加えていく'([_三角形の頂点ならび|R1],_新しい三角形の構成) :- 四つの三角形(_三角形の頂点ならび,_新しい三角形の構成,R2), 'その物体を構成している三角形のそれぞれの辺の中点をとって一個の三角形を四つに分割し、新しい三角形の配列に加えていく'(R1,R2),!. 'その物体を構成している三角形のそれぞれの辺の中点をとって一個の三角形を四つに分割し、新しい三角形の配列に加えていく'([],[]). 四つの三角形([[X1,Y1],[X2,Y2],[X3,Y3]],[[[X1,Y1],[_x1,_y1],[_x2,_y2]],[[X2,Y2],[_x1,_y1],[_x3,_y3]],[[X3,Y3],[_x3,_y3],[_x1,_y1]],[[_x1,_y1],[_x2,_y2],[_x3,_y3]]|R2],R2) :- _x1 is (X1+X2) / 2, _y1 is (Y1+Y2) / 2, _x2 is (X1+X3) / 2, _y2 is (Y1+Y3) / 2, _x3 is (X2+X3) / 2, _y3 is (Y2+Y3) / 2. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/891 # # うまくいかなかったので、わかる方、お手数ですがもう1度お願いします。 # # 問題 # # 一つの行に、n個の “ “(空白)に続いてm個の “*”を順番に出力する関数 void putzs(int n, int m)を作成せよ。 # 更にこれを用いて no段のピラミッドを描くプログラムを作成せよ。 # # # no=3の場合 # # - * # - *** # - ***** # # よろしくお願いします。 # '一つの行に、n個の “ “(空白)に続いてm個の “*”を順番に出力する関数 void putzs(int n, int m)を作成せよ。 更にこれを用いて no段のピラミッドを描くプログラムを作成せよ。 no=3の場合 - * - *** - ***** よろしくお願いします。'(_no段) :- between(1,_no段,_段), _n is _no段 - _段, _m is (_段 - 1) * 2 + 1, putzs(_n,_m), _no段 = _段. putzs(_n,_m) :- between(1,_n,N), write(' '), _n = N, between(1,_m,M), write(*), _m = M. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/335 # # [1] 授業単元:楽しいプログラミング # [2] 問題文(含コード&リンク): 以下の実行例のように,三角形の2 辺の長さとその2 # 辺のなす角(0〜180[deg])を入力すると,もう1 辺の # 長さと,三角形の面積を表示するプログラムを作成せ # よ.π = 3.14159265 とする. #  [3.1] OS: linux #  [3.2] コンパイラ名とバージョン: gcc 3.4 #  [3.3] 言語: C # [4] 期限:2011年11月17日 9:00まで # [5] その他の制限: while, if, for, 配列まで # # 例 #  三角形の2 辺の長さを入力してください。 # 辺1:-3.0 # 正の値を入力してください。辺1:3.0 # 辺2:6.0 # 2 辺のなす角度[deg] を入力してください:200.0 # 0<角度[deg]<180 の値を入力してください。30.0 # もう1 辺の長さ= 3.717941 # 三角形の面積= 4.500000 # # '三角形の2 辺の長さとその2辺のなす角(0〜180[deg])を入力すると,もう1 辺の長さと,三角形の面積を表示するプログラムを作成せよ.π = 3.14159265 とする' :- '三角形の2 辺の長さとその2辺のなす角(0〜180[deg])を入力すると'(_辺の長さ_1,_辺の長さ_2,_2辺のなす角), もう1辺の長さと三角形の面積を表示する(_辺の長さ_1,_辺の長さ_2,_2辺のなす角). '三角形の2 辺の長さとその2辺のなす角(0〜180[deg])を入力すると'(_辺の長さ_1,_辺の長さ_2,_2辺のなす角) :- write('三角形の2 辺の長さを入力してください。 '), 辺の長さ_1の入力(_辺の長さ_1), 辺の長さ_2の入力(_辺の長さ_2), '2辺のなす角の入力'(_2辺のなす角). 辺の長さ_1の入力(_辺の長さ_1) :- write('辺[1] : '), get_line(Line), 辺の長さ_1の入力診断(Line,_辺の長さ_1),!. 辺の長さ_1の入力(_辺の長さ_1) :- 辺の長さ_1の入力(_辺の長さ_1). 辺の長さ_2の入力(_辺の長さ_2) :- write('辺[2] : '), get_line(Line), 辺の長さの入力診断(Line,_辺の長さ_2),!. 辺の長さ_2の入力(_辺の長さ_2) :- 辺の長さ_2の入力(_辺の長さ_2). 辺の長さの入力診断(Line,_辺の長さ) :- atom_to_term(Line,_辺の長さ,_), number(_辺の長さ), _辺の長さ > 0.0,!. 辺の長さの入力診断(Line,_辺の長さ) :- writef('入力された %t からは三角形の辺にあたる情報が得られません。再入力をお願いします。\n',[Line]), fail. '2辺のなす角の入力'(_2辺のなす角) :- write('2辺のなす角度を入力して下さい (0<角度<180) : '), get_line(Line), '2辺のなす角の入力診断'(Line,_2辺のなす角),!. '2辺のなす角の入力'(_2辺のなす角) :- '2辺のなす角の入力(_2辺のなす角). '2辺のなす角の入力診断'(Line,_2辺のなす角) :- atom_to_term(Line,_2辺のなす角), number(_2辺のなす角), _2辺のなす角 > 0.0, _2辺のなす角 < 180.0,!. '2辺のなす角の入力診断'(Line,_2辺のなす角) :- writef('入力された%t からは2辺のなす角を得られません。再入力をお願いします。\n',[Line]), fail. もう1辺の長さと三角形の面積を表示する(_辺の長さ_1,_辺の長さ_2,_2辺のなす角) :- _辺の長さ_2 >= _辺の長さ_1, もう1辺の長さ(_辺の長さ_1,_辺の長さ_2,_2辺のなす角,_もう1辺の長さ), 三角形の面積(_辺の長さ_1,_辺の長さ_2,_2辺のなす角,_三角形の面積), 表示する(_もう1辺の長さ,_三角形の面積),!. もう1辺の長さと三角形の面積を表示する(_辺の長さ_1,_辺の長さ_2,_2辺のなす角) :- _辺の長さ_2 < _辺の長さ_1, もう1辺の長さと三角形の面積を表示する(_辺の長さ_2,_辺の長さ_1,_2辺のなす角). もう1辺の長さ(_辺の長さ_1,_辺の長さ_2,_2辺のなす角,_もう1辺の長さ) :- _三角形の高さ is _辺の長さ_1 * sin(_2辺のなす角 / 180 * pi), _辺の長さ_2_1 is _辺の長さ_1 * cos(_2辺のなす角 / 180 * pi), _辺の長さ_2_2 is _辺の長さ_2 - _辺の長さ_2_1, _もう1辺の長さ is sqrt(_辺の長さ_2_2 * _辺の長さ_2_2 + _三角形の高さ * _三角形の高さ). 三角形の面積(_辺の長さ_1,_辺の長さ_2,_2辺のなす角,_三角形の面積) :- _三角形の高さ is _辺の長さ_1 * sin(_2辺のなす角 / 180 * pi), _三角形の面積 is _辺の長さ_2 * _三角形の高さ / 2. 表示する(_もう1辺の長さ,_三角形の面積) :- writef('%16c : %12r\n%16c : %12r\n',[もう1辺の長さ,_もう1辺の長さ,三角形の面積,_三角形の面積]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/154 # # [1] # int型整数 x に対して、その3乗の値 x3 を返す関数 int cube(int x) を作成せよ。 # そしてcubeを用いて、1から10までの整数の3乗値を出力するプログラムを作成せよ。 # # # [2] # 一つの行に、n個の “ “(空白)に続いてm個の “*”を順番に出力する関数 void putzs(int n, int m)を作成せよ。 # 更にこれを用いて no段のピラミッドを描くプログラムを作成せよ。 # # # no=3の場合 # # * # *** # ***** # # # # # よろしくお願いします。 # # # putzz(_n,_m) :- 'n個の" "(空白)に続いて'(_n,_n個の空白), 'm個の"*"を'(_m,_m個の星), 順番に出力する(_n個の空白,_m個の星), 'n個の" "(空白)に続いて'(_n,_n個の空白) :- length(L,_n), all(L,' '). 'm個の"*"を'(_m,_m個の星) :- length(L,_m), all(L,'*'). 順番に出力する(_n個の空白,_m個の星) :- putlist(_n個の空白), putlist(_m個の星), write('\n'). put_list([]) :- !. put_list([A|R]) :- put_char(A), put_list(R). 'putzzを用いてno段のピラミッドを描く'(_no) :- for(1,N,_no), _m is (N - 1) * 2 + 1, _n is _no - N, putzz(_n,_m), N = _no. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/154 # # [1] # int型整数 x に対して、その3乗の値 x3 を返す関数 int cube(int x) を作成せよ。 # そしてcubeを用いて、1から10までの整数の3乗値を出力するプログラムを作成せよ。 # # # [2] # 一つの行に、n個の “ “(空白)に続いてm個の “*”を順番に出力する関数 void putzs(int n, int m)を作成せよ。 # 更にこれを用いて no段のピラミッドを描くプログラムを作成せよ。 # # # no=3の場合 # # * # *** # ***** # # # # # よろしくお願いします。 # # # cube(_x,_cube) :- integer(_x), _x >= 1, _x =< 10, _cube is _x * _x * _x. 'cubeを用いて、1から10までの整数の3乗値を出力する' :- for(1,N,10), cube(N,_cube), writef('cube(%t) = %t\n',[N,_cube]), N = 10. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/926 # # [1] 授業単元: C言語プログラミング # [2] 問題文(含コード&リンク): # # 1以上の整数値を入力すると、以下の条件を満たすピラミッドをoxを使って表示するピラミッドを出力するプログラムを作成せよ # # *条件 # 1以上の奇数が入力された時のみピラミッドを表示し、それ以外の場合は「条件をみたしていないので表示しない」と出力する。 # ピラミッドの底辺の長さは入力された数値とする。 # # *実行例 # xxxo # xxooo # xooooo # ooooooo # # '1以上の整数値を入力すると、以下の条件を満たすピラミッドをoxを使って表示するピラミッドを出力する *条件 1以上の奇数が入力された時のみピラミッドを表示し、それ以外の場合は「条件をみたしていないので表示しない」と出力する。ピラミッドの底辺の長さは入力された数値とする。' :- '1以上の整数値を入力すると'(_1以上の整数), 'ピラミッドを表示する'(_1以上の整数). '1以上の整数値を入力すると'(_1以上の整数) :- write('1以上の整数値(奇数)を入力して下さい : '), get_line(Line), '1以上の整数値を入力診断,(Line,_1以上の整数),!. '1以上の整数値を入力すると'(_1以上の整数) :- '1以上の整数値を入力すると'(_1以上の整数). '1以上の整数値を入力診断'(Line,_1以上の整数) :- atom_to_term(Line,_1以上の整数,_), '1以上の奇数が入力された時のみ'(_1以上の整数),!. '1以上の整数値を入力診断'(Line,_1以上の整数) :- write('条件をみたしていないので表示しない\n'), fail. '1以上の奇数が入力された時のみ'(_1以上の整数),!. _1以上の整数 >= 1, 奇数である(_1以上の整数),!. ピラミッドを表示する(_1以上の整数) :- length(L,_1以上の整数), append(L1,[_|L1],L), length(L1,Len), all(L1,'x'), ピラミッドを表示する(_1以上の整数,L1). ピラミッドを表示する(_1以上の整数,[]) :- length(L,_1以上の整数), all(L,o), put_list_ln(L). ピラミッドを表示する(_1以上の整数,[A|L1]) :- length(L,_1以上の整数), append([A|L1],L2,[A|L1],L), all(L2,o), put_list_ln(L), ピラミッドを表示する(_1以上の整数,L1). 奇数である(N) :- 1 is N mod 2. put_list_ln([]) :- write('\n'). put_list_ln([A|R]) :- put_char(A), put_list_ln(R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/926 # # [1] 授業単元: C言語プログラミング # [2] 問題文(含コード&リンク): # # 1以上の整数値を入力すると、以下の条件を満たすピラミッドをoxを使って表示するピラミッドを出力するプログラムを作成せよ # # *条件 # 1以上の奇数が入力された時のみピラミッドを表示し、それ以外の場合は「条件をみたしていないので表示しない」と出力する。 # ピラミッドの底辺の長さは入力された数値とする。 # # *実行例 # xxxo # xxooo # xooooo # ooooooo # # '1以上の整数値を入力すると、以下の条件を満たすピラミッドをoxを使って表示するピラミッドを出力する *条件 1以上の奇数が入力された時のみピラミッドを表示し、それ以外の場合は「条件をみたしていないので表示しない」と出力する。ピラミッドの底辺の長さは入力された数値とする。' :- '1以上の整数値を入力すると'(_1以上の整数), 'ピラミッドを表示する'(_1以上の整数). '1以上の整数値を入力すると'(_1以上の整数) :- write('1以上の整数値(奇数)を入力して下さい : '), get_line(Line), '1以上の整数値を入力診断,(Line,_1以上の整数),!. '1以上の整数値を入力すると'(_1以上の整数) :- '1以上の整数値を入力すると'(_1以上の整数). '1以上の整数値を入力診断'(Line,_1以上の整数) :- atom_to_term(Line,_1以上の整数,_), '1以上の奇数が入力された時のみ'(_1以上の整数),!. '1以上の整数値を入力診断'(Line,_1以上の整数) :- write('条件をみたしていないので表示しない\n'), fail. '1以上の奇数が入力された時のみ'(_1以上の整数),!. _1以上の整数 >= 1, 奇数である(_1以上の整数),!. ピラミッドを表示する(_1以上の整数) :- length(L,_1以上の整数), append(L1,[_|L1],L), length(L1,Len), all(L1,'x'), ピラミッドを表示する(_1以上の整数,L1). ピラミッドを表示する(_1以上の整数,[]) :- length(L,_1以上の整数), all(L,o), put_list_ln(L). ピラミッドを表示する(_1以上の整数,[A|L1]) :- length(L,_1以上の整数), append([A|L1],L2,[A|L1],L), all(L2,o), put_list_ln(L), ピラミッドを表示する(_1以上の整数,L1). 奇数である(N) :- 1 is N mod 2. put_list_ln([]) :- write('\n'). put_list_ln([A|R]) :- put_char(A), put_list_ln(R). % 以下のサイトは # x^2+y^2=z^2を満たす正の整数をピタゴラス数と呼び、三つ組(x,y,z)で表す。 # ピタゴラス数のリストを生成する関数pythsを定義せよ。 # ただし、ピタゴラス数の要素は、与えられた上限以下であるとする。 # ピタゴラス数ならび(_ピタゴラス数要素の上限,_ピタゴラス数ならび) :- findall([_x,_y,_z],( ピタゴラス数(_ピタゴラス数要素の上限,_x,_y,_z)), _ピタゴラス数ならび). ピタゴラス数(_ピタゴラス数要素の上限,_x,_y,_z) :- '_x,_y,_zの候補は'(_ピタゴラス数要素の上限,_x,_y,_z), 'ピタゴラス数は_zを直角三角形の斜辺_x,_yを直角の隣辺とした時の制約を持つ'(_x,_y,_z). '_x,_y,_zの候補は'(_ピタゴラス数要素の上限,_x,_y,_z) :- between(1,_ピタゴラス数要素の上限,_x), between(1,_ピタゴラス数要素の上限,_y), between(1,_ピタゴラス数要素の上限,_z). 'ピタゴラス数は_zを直角三角形の斜辺_x,_yを直角の隣辺とした時の制約を持つ'(_x,_y,_z) :- ピタゴラスの定理を適用する(_x,_y,_z). ピタゴラスの定理を適用する(_x,_y,_z) :- '直角の隣辺の二乗の和は斜辺の二乗に等しい'(_x,_y,_z). '直角の隣辺の二乗の和は斜辺の二乗に等しい'(_x,_y,_z) :- '直角の隣辺の二乗の和は'(_x,_y,_直角の隣辺の二乗の和), '斜辺の二乗に'(_z,_斜辺の二乗), 等しい(_直角の隣辺の二乗の和,_斜辺の二乗). '直角の隣辺の二乗の和は'(_x,_y,_直角の隣辺の二乗の和) :- _直角の隣辺の二乗の和 is _x * _x + _y * _y. '斜辺の二乗に'(_z,_斜辺の二乗) :- _斜辺の二乗 is _z * _z. 等しい(X,Y) :- X =:= Y. % 関連解答 % http://nojiriko.asia/prolog/pythagorean_su.html % http://nojiriko.asia/prolog/pythagorean_su_2.html % http://nojiriko.asia/prolog/pythagorean_su_3.html % 以下のサイトは # x^2+y^2=z^2を満たす正の整数をピタゴラス数と呼び、三つ組(x,y,z)で表す。 # ピタゴラス数のリストを生成する関数pythsを定義せよ。 # ただし、ピタゴラス数の要素は、与えられた上限以下であるとする。 # ピタゴラス数ならび(_ピタゴラス数要素の上限,_ピタゴラス数ならび) :- findall([_x,_y,_z],( ピタゴラス数(_ピタゴラス数要素の上限,_x,_y,_z)), _ピタゴラス数ならび). ピタゴラス数(_ピタゴラス数要素の上限,_x,_y,_z) :- '_x,_y,_zの候補は'(_要素値上限,_x,_y,_z), 'ピタゴラス数は_zを直角三角形の斜辺_x,_yを直角の隣辺とした時の制約を持つ'(_x,_y,_z). '_x,_y,_zの候補は'(_ピタゴラス数要素の上限,_x,_y,_x) :- for(1,_x,_ピタゴラス数要素の上限), for(1,_y,_ピタゴラス数要素の上限), for(1,_z,_ピタゴラス数要素の上限), 'ピタゴラス数は_x,_yを三角形の短辺_zを長辺とした時の制約を持つ'(_x,_y,_z). 'ピタゴラス数は_zを直角三角形の斜辺_x,_yを直角の隣辺とした時の制約を持つ'(_x,_y,_z) :- ピタゴラスの定理を適用する(_x,_y,_z). ピタゴラスの定理を適用する(X,Y,Z) :- Z * Z =:= X * X + Y * Y. 'ピタゴラス数は_x,_yを三角形の短辺_zを長辺とした時の制約を持つ'(_x,_y,_z) :- _z > _x, _z > _y, _z < _x + _y. % 関連解答 % http://nojiriko.asia/prolog/pythagorean_su.html % http://nojiriko.asia/prolog/pythagorean_su_2.html % 以下のサイトは # x^2+y^2=z^2を満たす正の整数をピタゴラス数と呼び、三つ組(x,y,z)で表す。 # ピタゴラス数のリストを生成する関数pythsを定義せよ。 # ただし、ピタゴラス数の要素は、与えられた上限以下であるとする。 # ピタゴラス数ならび(_ピタゴラス数要素の上限,_ピタゴラス数ならび) :- findall([_x,_y,_z],( ピタゴラス数(_ピタゴラス数要素の上限,_x,_y,_z)), _ピタゴラス数ならび). ピタゴラス数(_ピタゴラス数要素の上限,_x,_y,_z) :- '_x,_y,_zの候補は'(_要素値上限,_x,_y,_z), 'ピタゴラス数は_zを直角三角形の斜辺_x,_yを直角の隣辺とした時の制約を持つ'(_x,_y,_z). '_x,_y,_zの候補は'(_ピタゴラス数要素の上限,_x,_y,_x) :- for(1,_x,_ピタゴラス数要素の上限), for(1,_y,_ピタゴラス数要素の上限), for(1,_z,_ピタゴラス数要素の上限). 'ピタゴラス数は_zを直角三角形の斜辺_x,_yを直角の隣辺とした時の制約を持つ'(_x,_y,_z) :- ピタゴラスの定理を適用する(_x,_y,_z). ピタゴラスの定理を適用する(X,Y,Z) :- Z * Z =:= X * X + Y * Y. % 以下のサイトは # x^2+y^2=z^2を満たす正の整数をピタゴラス数と呼び、三つ組(x,y,z)で表す。 # ピタゴラス数のリストを生成する関数pythsを定義せよ。 # ただし、ピタゴラス数の要素は、与えられた上限以下であるとする。 # ピタゴラス数ならび(_要素値上限,_ピタゴラス数ならび) :- findall([_x,_y,_z],( ピタゴラス数(_要素値上限,_x,_y,_z)), _ピタゴラス数ならび). ピタゴラス数(_要素値上限,_x,_y,_z) :- '1から_要素値上限までの整数リストを生成'(_要素値上限,L), 重複組合せ(L,3,[X,Y,_z]), 'X,Y,を三角形の短辺、_zを長辺だとみなすことができる'(X,Y,_z), ピタゴラスの定理を適用する(X,Y,_z), 短辺はひっくり返すことも可能(X,Y,_x,_y). '1から_要素値上限までの整数リストを生成'(_要素値上限,L) :- findall(N,for(1,N,_要素値上限),L). 'X,Y,を三角形の短辺、_zを長辺だとみなすことができる'(X,Y,_z) :- _z > X, _z > Y, _z < X + Y. ピタゴラスの定理を適用する(X,Y,Z) :- Z * Z =:= X * X + Y * Y. 短辺はひっくり返すことも可能(_x,_x,_x,_x) :- !. 短辺はひっくり返すことも可能(_x,_y,_x,_y). 短辺はひっくり返すことも可能(_y,_x,_x,_y). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/617 # # 【1】C言語 # 【2】キャラクタでピラミッドを表示するプログラムを作成せよ # 実行結果 # 何段にしますか? # 7 # #       # #      ### #     ##### #    ####### #   ######### #  ########### # ############# # 【3】UNIXのC言語 # 【4】6/17まで # お願いします # # キャラクタでピラミッドを表示する :- 何段にしますか(_段数), ピラミッドの表示(_段数,_段数). 何段にしますか(_段数) :- write('何段にしますか : '), readln([_段数]), integer(_段数),!. 何段にしますか(_段数) :- write('整数を入力してください。 '), 何段にしますか(_段数). ピラミッドの表示(0,_) :- !. ピラミッドの表示(N,_段数) :- N1 is N - 1, for(1,M1,N1), write(' '), M1 = N1, N3 is (_段数 - N) * 2 + 1, for(1,M2,N3), write('#'), M2 = N3, write('\n'), ピラミッドの表示(N1). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/617 # # 【1】C言語 # 【2】キャラクタでピラミッドを表示するプログラムを作成せよ # 実行結果 # 何段にしますか? # 7 # #       # #      ### #     ##### #    ####### #   ######### #  ########### # ############# # 【3】UNIXのC言語 # 【4】6/17まで # お願いします # # キャラクタでピラミッドを表示する :- 何段にしますか(_段数), 表示枠を作る(_段数,_表示枠), 表示する(_表示枠), R = []. 何段にしますか(_段数) :- write('何段にしますか : '), readln([_段数]), integer(_段数),!. 何段にしますか(_段数) :- write('整数を入力してください。 '), 何段にしますか(_段数). 表示枠を作る(_段数,_表示枠) :- length(L,_段数), append(L0,[_|R],L), '#を嵌めこむ'(L0,R), append(L0,R,L1), append(R,L0,L2), append(L2,['#'|L1],_表示枠). '#を嵌めこむ'(L0,R) :- all(R,' '), all(L0,'#'). 表示する(L3) :- concat_atom(L3,S), writef('%t\n',[S]). all([],_). all([V|R],V) :- all(R,V). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/262 # # [1] 授業単元:C言語 # [2] 問題文: # 構造体trinagleを typedef struct{ # double x,y; # } Point; # # typedey struct{ # Point p1,p2,p3; # } Trinagle; # とする。 # 構造体の構成要素は3つの頂点のx座標、y座標をメンバとして持つ構造体Pointである。 # 任意の三角形の面積、その三角形を適当な2×2行列で線形変換した結果の三角形の座 # 標とその面積、任意の二つの三角形が合同かどうかを表示するプログラムを作りなさい。 # 座標の回転 90度 [[0,-1],[1,0]] 180度 [[-1,0],[0,-1]] 270度 [[0,1],[-1,0]] # -90度 [[0,1],[-1,0]] -180度 [[-1,0],[0,-1]] -270度 [[0,1],[-1,0]] 変換正方行列(回転,V,[[A,B],[C,D]]) :- \+(var(V)), R is pi * V / 180, A is cos(R), B is (-1) * sin(R), C is sin(R), D = A. 変換正方行列(回転,90,[[0,-1],[1,0]]). 変換正方行列(回転,180,[[-1,0],[0,-1]]). 変換正方行列(回転,270,[[0,1],[-1,0]]). 変換正方行列(回転,-90,[[0,1],[-1,0]]). 変換正方行列(回転,-180,[[-1,0],[0,-1]]). 変換正方行列(回転,-270,[[0,-1],[1,0]]). 任意の三角形の面積、その三角形を適当な2×2行列で線形変換した結果の三角形の座標とその面積(X1,Y1,X2,Y2,X3,Y3,_x1,_y1,_x2,_y2,_x3,_y3,_面積) :- 三角形の面積(X1,Y1,X2,Y2,X3,Y3,_面積_1), writef('三角形の面積 %t\n',[_面積_1]), 変換正方行列(回転,_度,_変換行列), 行列の積([[Y1,X1],[Y2,X2],[Y3,X3]],_変換行列,[[_y1,_x1],[_y2,_x2],[_y3,_x3]]), 三角形の面積(_x1,_y1,_x2,_y2,_x3,_y3,_面積_2), writef('%t度回転された座標は(%t %t)(%t %t)(%t %t) 面積は %t です\n',[_度,_x1,_y1,_x2,_y2,_x3,_y3,_面積_2]), fail. 任意の三角形の面積、その三角形を適当な2×2行列で線形変換した結果の三角形の座標とその面積'(X1,Y1,X2,Y2,X3,Y3,_x1,_y1,_x2,_y2,_x3,_y3,_面積). 任意の二つの三角形が合同かどうか(X1,Y1,X2,Y2,X3,Y3,_x1,_y1,_x2,_y2,_x3,_y3) :- 任意の二つの三角形が合同かどうか(X1,Y1,X2,Y2,X3,Y3,_x1,_y1,_x2,_y2,_x3,_y3,_合同かどうか), writef('%t\n',[_合同かどうか]). 任意の二つの三角形が合同かどうか(X1,Y1,X2,Y2,X3,Y3,_x1,_y1,_x2,_y2,_x3,_y3,合同) :- A is (X1-X2) * (X1-X2) + (Y1-Y2) * (Y1-Y2), B is (X2-X3) * (X2-X3) + (Y2-Y3) * (Y2-Y3), C is (X3-X1) * (X3-X1) + (Y3-Y1) * (Y3-Y1), _a is (_x1-_x2) * (_x1-_x2) + (_y1-_y2) * (_y1-_y2), _b is (_x2-_x3) * (_x2-_x3) + (_y2-_y3) * (_y2-_y3), _c is (_x3-_x1) * (_x3-_x1) + (_y3-_y1) * (_y3-_y1), sort([A,B,C],X), sort([_a,_b,_c],X),!. 任意の二つの三角形が合同かどうか(X1,Y1,X2,Y2,X3,Y3,_x1,_y1,_x2,_y2,_x3,_y3,合同ではない). 三角形の面積(X1,Y1,X2,Y2,X3,Y3,_三角形の面積) :- 一角を原点へ移動(X1,Y1,X2,Y2,X3,Y3,0,0,_x2,_y2,_x3,_y3), _三角形の面積 is abs(_x2 * _y3 - _y2 * _x3) / 2. 一角を原点へ移動(X1,Y1,X2,Y2,X3,Y3,0,0,_x2,_y2,_x3,_y3) :- _x2 is X2 - X1, _y2 is Y2 - Y1, _x3 is X3 - X1, _y3 is Y3 - X1. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1305867431/561 # # [1] 授業単元:C # [2] 問題文(含コード&リンク): # 「*」の記号を利用して、入力した数字を等しい2辺に持つ、次のような直角二等辺三角形を表示するプログラムを作成しなさい # '「*」の記号を利用して、入力した数字を等しい2辺に持つ、次のような直角二等辺三角形を表示する'(_等しい2辺の長さ) :- for(1,N,_等しい2辺の長さ), for(1,M,N), 星の表示(N,_等しい2辺の長さ,M,N), M = N, N = _等しい2辺の長さ. 星の表示(_,_,M,M) :- write('*'),nl,!. 星の表示(N,N,_,_) :- write('*'). 星の表示(_,_,1,_) :- write('*'),!. 星の表示(_,_,_,_) :- write(' '). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/778 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # n本の棒がある。棒i(3<n<100)の長さはa_i(1<a_i<10^4)である。 # あなたは、それらの棒から3本を選び、「できるだけ周長の長い三角形」と「できるだけ周長の短い三角形」 # を作ろうと考えている。それぞれ最大・最短の周長と選択した棒の組を求めるプログラムを作成せよ。 # ただし、どのような棒の組を選んでも三角形が作れない場合、0を答えとして返せ。 # プログラムの要件として、以下の事項を定める。 # ・引数として棒の長さデータが収められたファイル名のみが与えられるものとする。 # ・結果として、標準出力に、最大周長と棒の組み合わせ、最短周長と棒の組み合わせが出力されること。 # # % cat length.dat # 2 3 4 5 10 # % ./a.out length.dat # 最大周長=12 (3 4 5) # 最短周長=9 (2 3 4) # # %cat length.dat # 4 5 10 20 # % ./a.out length.dat # 0 # program :- user_parameters([_ファイル名]), get_lines(_ファイル名,Lines), findall(N,( append(_,[Line|_],Lines), sqlit(Line,[' '],L2), append(_,[N|_],L2)), _棒の長さならび), 周囲が最大の三角形(_棒の長さならび,[A1,B1,C1]), 周囲が最短の三角形(_棒の長さならび,[A2,B2,C2]), write_formatted('最大周長=%t (%t %t %t)\n',[_最大周長,A1,B1,C1]), write_formatted('最短周長=%t (%t %t %t)\n',[_最短周長,A2,B2,C2]). fail. program. 周囲が最大の三角形(_棒の長さならび,[A,B,C],_最大周長) :- 最大周長を得る(_棒の長さならび,_最大周長), 周長から三辺を得る(_棒の長さならび,_最大周長,A,B,C). 最大周長を得る(_棒の長さならび,_最大周長) :- findmax(_周囲,( 組み合わせ(_棒の長さならび,3,[A,B,C]), C > A + B, B > A + C, A > B + C, _周囲 is A + B + C), _最大周長),!. 周囲が最短の三角形(_棒の長さならび,[A,B,C]) :- 最短周長を得る(_棒の長さならび,_最短周長), 周長から三辺を得る(_棒の長さならび,_最大周長,A,B,C). 最短周長を得る(_棒の長さならび,_最短周長) :- findmin(_周囲,( 組み合わせ(_棒の長さならび,3,[A,B,C]), C > A + B, B > A + C, A > B + C, _周囲 is A + B + C), _最短周囲). 周長から三辺を得る(_棒の長さならび,_周長,A,B,C) :- 組み合わせ(組み合わせ(_棒の長さならび,3,[A,B,C]), 組み合わせ(_棒の長さならび,3,[A,B,C]), _周長 is A + B + C, C > A + B, B > A + C, A > B + C. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1267796762/694 # # 【課題】三角形の面積を求めるプログラムを作成せよ。三角形のデータは、2辺の長さとその間の角度(単位はdegree)が分かっているとする。面積は、double値で表示すること。面積の計算には、Mathクラスのスタティックメソッドsin()を利用する。 # 【形態】1. Javaアプリケーション # 【期限】3日くらい # 【補足】あんまり関係ないかもしれませんが、linuxを使ったと思います # class クラス名 { # クラスの内容 # } # が一般形式みたいです。 # % http://nojiriko.asia/prolog/c135_856.html も参照してください。 '三角形の面積を求める。三角形のデータは、2辺の長さとその間の角度(単位はdegree)が分かっているとする。'(_辺1,_辺2,_その間のdegree角度,_三角形の面積) :- _その間のradian角度 is ((_その間のdegree角度 / 180 ) * pi), _三角形の面積 is 0.5 * _辺1 * _辺2 * sin(_その間のradian角度). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/152 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク) # #  [3.1] OS: unix #  [3.2] コンパイラ名とバージョン: gcc #  [3.3] 言語: C # [4] 期限:12月8日 # よろしくお願いします。 # # # 問題2 2重ループの構文を用いて、次の実行結果に示すように数値でピラミッドを表示するプログラムを作成しなさい。 # 段数を入力して下さい8 # 1 # 22 # 333 # 4444 # 55555 # 666666 # 7777777 # 88888888 '2重ループの構文を用いて、次の実行結果に示すように数値でピラミッドを表示する' :- 催促付き整数入力('段数を入力して下さい ',_段数), for(1,M,_段数), for(1,N,_段数), write_formatted('%t',[N]), N = _段数, nl, M = _段数. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289913298/391 # # [1] 授業単元:プログラミング実験 # [2]1~30の整数の範囲で、3辺a, b, c(cを斜辺 a <= b <= c)の三角形のうち、直角三角形が成立する # 場合の辺a,b,cをすべて見つける。 # '1~30の整数の範囲で、3辺a, b, c(cを斜辺 a <= b <= c)の三角形のうち、直角三角形が成立する場合の辺a,b,cをすべて見つける'(_直角三角形ならび) :- findall(N,for(1,N,30),L), findall([_a,_b,_c],直角三角形をひとつ取り出す(L,_a,_b,_c),_直角三角形ならび). 直角三角形をひとつ取り出す(L,_a,_b,_c) :- 重複組み合わせ(L,3,[_a,_b,_c]), 0 is _a * _a + _b * _b - _c * _c. % 以下のサイトは # 三角形 # n本の棒があります。棒iの長さはaiです。あなたは、それらの棒から3本選んでできるだけ # 周長の長い三角形を作ろうと考えています。最大の周長を求めなさい。ただし、三角形が # 作れない際には0を答えとしなさい。 'n本の棒があります。棒iの長さはaiです。あなたは、それらの棒から3本選んでできるだけ周長の長い三角形を作ろうと考えています。最大の周長を求めなさい。ただし、三角形が作れない際には0を答えとしなさい。'(_棒の長さならび,_最大の周長) :- findmax(_周長,( 組合せ(_棒の長さならび,3,[_辺の一,_辺の二,_辺の三]), 三角形を構成できる(_辺の一,_辺の二,_辺の三), sum(L,_周長)), _最大の周長). 三角形を構成できる(_辺の一,_辺の二,_辺の三) :- _辺の一 < _辺の二 + _辺の三, _辺の二 < _辺の一 + _辺の三, _辺の三 < _辺の一 + _辺の二. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1284632294/618 # # [1] 授業単元:C++ベーシック # [2] 問題文(含コード&リンク): 三辺の長さがそれぞれx,y,zの三角形がある。x,y,zが整数値で1~100までの値をとるときに、 # この三角形が直角三角形になるときのx,y,zの組をすべて調べて、その組の数を求めるプログラムを作りなさい。 # # '三辺の長さがそれぞれx,y,zの三角形がある。x,y,zが整数値で1~100までの値をとるときに、この三角形が直角三角形になるときのx,y,zの組をすべて調べて、その組の数を求める'(_直角三角形ならび,_その数) :- findall([_x,_y,_z],( for(1,Nx,100), for(1,Ny,100), for(1,Nz,100), 直角三角形である(Nx,Ny,Nz)),_直角三角形ならび), Count(_直角三角形ならび,Count), _その数 is truncate(Count),!. 直角三角形である(_x,_y,_z) :- X2 is truncate(_x * _x), Y2 is truncate(_y * _y), Z2 is truncate(_z * _z), 直角三角形の辺の二乗の関係(X2,Y2,Z2),!. 直角三角形の辺の二乗の関係(X2,Y2,Z2) :- X2 is Y2 + Z2,!. 直角三角形の辺の二乗の関係(X2,Y2,Z2) :- Y2 is X2 + Z2,!. 直角三角形の辺の二乗の関係(X2,Y2,Z2) :- Z2 is X2 + Y2,!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1284632294/391 # # [1] C言語復習 # [2] 1 桁の整数をスーペース区切りで何個か入力する # (EOF で入力の終了とする) と, 下のように隣合う要素同士で桁上がりを無視した加算を行って逆三角形を作り, # 最後に残った 2 桁 (ただし 3 桁で 1 0 0 が残ったときは満点なのでそこで終了する) で運勢を占う, というプログラムを作成せよ. # 0 7 9 5 6 5 7 7 4 2 ← 入力 # 7 6 4 1 1 2 4 1 6 # 3 0 5 2 3 6 5 7 # 3 5 7 5 9 1 2 # 8 2 2 4 0 3 # 0 4 6 4 3 # 4 0 0 7 # 4 0 7 # 4 7 # '隣合う要素同士で桁上がりを無視した加算を行って逆三角形を作り,最後に残った 2 桁 (ただし 3 桁で 1 0 0 が残ったときは満点なのでそこで終了する) で運勢を占う'(_運勢) :- '1 桁の整数をスーペース区切りで何個か入力する'(Line), split(Line,[' '],L1), '隣合う要素同士で桁上がりを無視した加算を行って逆三角形を作り'(0,L1,_運勢情報), 運勢(_運勢情報,_運勢). '1 桁の整数をスーペース区切りで何個か入力する'(Line) :- write('1 桁の整数をスーペース区切りで何個か入力しなさい : '), get_line(Line). '隣合う要素同士で桁上がりを無視した加算を行って逆三角形を作り'(_,[1,0,0],[1,0,0]) :- !. '隣合う要素同士で桁上がりを無視した加算を行って逆三角形を作り'(_,[A,B],[A,B]) :- !. '隣合う要素同士で桁上がりを無視した加算を行って逆三角形を作り'(N,L1,_運勢情報) :- concat_atom(L1,' ',S), 'N桁の空白'(N,_N桁の空白), write_formatted('%t%t\n',[_N桁の空白,S]), '2桁ずつ桁上がりなしの加算'(L1,L2), N2 is N + 1, '隣合う要素同士で桁上がりを無視した加算を行って逆三角形を作り'(N2,L2,_運勢情報). '2桁ずつ桁上がりなしの加算'([_],[]) :- !. '2桁ずつ桁上がりなしの加算'([M1,M2|R1],[M|R2]) :- M is (M1 + M2) mod 10, '2桁ずつ桁上がりなしの加算'([M2|R1],R2). 運勢([1,0,0],'100点') :- !. 運勢([M,M],'90点') :- !. 運勢([M,N],'80点') :- M > 5,M < N,!. 運勢([M,N],'70点') :- M < 6,M < N,!. 運勢([M,N],'60点') :- M > N,!. 'N桁の空白'(N,_N桁の空白) :- findall(' ',(for(0,M,N),\+(M=0)),L), concat_atom(L,_N桁の空白). % 'N桁の空白'(N,_N桁の空白) :- findall(' ',for(1,_,N),L),concat_atom(L,_N桁の空白). % で良さそうなものだが、これだと0桁の空白を表現できない。 % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1274827528/880 # # [1] 授業単元:計算機とアルゴリズム # [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10699.txt # # 問題3 # # 実数 (小数点付き数) a, b, c について、これらの値を長さとする三角形が平面上で存在しえるかどうかを判定するプログラムを作成しなさい。 # 例として a, b, c をそれぞれ 1.0, 5.0, 3.0 としたとき、および a, b, c をそれぞれ 4.0, 5.0, 3.0 としたときの実行結果例を示す。 # # 実行結果(a=1.0, b=5.0, c=3.0 の場合) # # 辺の長さが 1.000000 と 5.000000 と 3.000000 となる三角形があり得るかどうか判定します # ありえません # # # 実行結果(a=4.0, b=5.0, c=3.0 の場合) # # 辺の長さが 4.000000 と 5.000000 と 3.000000 となる三角形があり得るかどうか判定します # ありえます # :- op(600,xfx,と). :- op(650,fx,辺の長さが). :- op(700,xf,となる三角形があり得るかどうか判定します). 辺の長さが _a と _b と _c となる三角形があり得るかどうか判定します :- _a > _b + _c, _b > _a + _c, _c > _a + _b, write('ありえます\n'),!. 辺の長さが _a と _b と _c となる三角形があり得るかどうか判定します :- write('ありえません\n'). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '実数 (小数点付き数) a, b, c について、これらの値を長さとする三角形が平面上で存在しえるかどうかを判定する'(_a,_b,_c) :- float(_a), float(_b), float(_c), 辺の長さが _a と _b と _c となる三角形があり得るかどうか判定します. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '実数 (小数点付き数) a, b, c について、これらの値を長さとする三角形が平面上で存在しえるかどうかを判定する' :- get_line(Line), atom_to_term(Line,_a,_), get_line(Line), atom_to_term(Line,_b,_), get_line(Line), atom_to_term(Line,_c,_), float(_a), float(_b), float(_c), 辺の長さが _a と _b と _c となる三角形があり得るかどうか判定します. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1274827528/31 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク): # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10625.txt # より # 三角形の三頂点の座標が与えられたとして重心を求めなさい。 # 三角形の三頂点の座標が与えられたとして重心を求める(X1,Y1,X2,Y2,X3,Y3,_重心のX座標,_重心のY座標) :- _重心のX座標 is (((X2+X3)/2-X1)*2)/3+X1, _重心のY座標 is (((Y2+Y3)/2-Y1)*2)/3+Y1. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 三角形の三頂点の座標が与えられたとして重心を求める(X1,Y1,X2,Y2,X3,Y3,_重心のX座標,_重心のY座標) :- 'X1の対辺の中点の座標'(X2,Y2,X3,Y3,_対辺の中点のX座標,_対辺の中点のY座標), '重心は(X1,Y1)からこの中点へ伸ばした直線の中点寄り3分の2の所にある'(X1,Y1,_対辺の中点のX座標,_対辺の中点のY座標,_重心のX座標,_重心のY座標). 'X1の対辺の中点の座標'(X2,Y2,X3,Y3,X,Y) :- _対辺の中点のX座標 is (X2 + X3) / 2, _対辺の中点のY座標 is (Y2 + Y3) / 2. '重心は(X1,Y1)からこの中点へ伸ばした直線の中点寄り3分の2の所にある'(X1,Y1,_対辺の中点のX座標,_対辺の中点のY座標,_重心のX座標,_重心のY座標) :- _重心のX座標 is (X1 - _対辺の中点のX座標) / 3 + _対辺の中点のX座標, _重心のY座標 is (Y1 - _対辺の中点のY座標) / 3 + _対辺の中点のY座標. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1269438098/856 # # [1] 授業単元: プログラム演習 # [2] 問題文(含コード&リンク): 三角形の三つの辺の長さを引数とし、内角の大きさを返す関数を実装しなさい。 # さらに、その関数を用いて、三角形の三つの点の座標(x座標, y座標)を入力し、それらの点が作る三角形のすべての内角の角度を計算するプログラムを実装しなさい。 # 計算結果の角度の表示は必ずmain()関数の中で行われなければならないとする。 # 三角形の角度(_辺1,_辺2,_辺3,_辺1の対角の角度,_辺2の対角の角度,_辺3の対角の角度) :- 辺の対角(_辺1,_辺2,_辺3,_辺1の対角の角度), 辺の対角(_辺2,_辺1,_辺3,_辺2の対角の角度), 辺の対角(_辺3,_辺2,_辺1,_辺3の対角の角度). 三角形の面積(_辺1,_辺2,_辺3,_面積) :- S1 is (_辺1+_辺2+_辺3) / 2, _面積 is sqrt(S1 * (S1 - _辺1) * (S1 - _辺2) * (S1 - _辺3)). 三角形の高さ(_辺1,_辺1,_辺2,_辺3,_高さ) :- 三角形の面積(_辺1,_辺2,_辺3,_三角形の面積), _高さ is _三角形の面積 / _辺1 * 2. 辺の対角(_辺,_辺2,_辺3,_対角) :- 三角形の面積(_辺,_辺2,_辺3,_三角形の面積), _高さ is _三角形の面積 / _辺 * 2, _ラジアン角1 is acos(_高さ / _辺2), _ラジアン角2 is acos(_高さ / _辺3), 辺の対角(_辺,_辺2,_辺3,_高さ,_ラジアン角1,_ラジアン角2,_対角). 辺の対角(_辺,_辺2,_辺3,_高さ,_ラジアン角1,_ラジアン角2,_対角) :- (_辺2 ^ 2 - _高さ ^ 2) =< (_辺 ^ 2), (_辺3 ^ 2 - _高さ ^ 2) =< (_辺 ^ 2), _対角 is 180 * (_ラジアン角1 + _ラジアン角2) / pi. 辺の対角(_辺,_辺2,_辺3,_高さ,_ラジアン角1,_ラジアン角2,_対角) :- (_辺2 ^ 2 - _高さ ^ 2) > (_辺 ^ 2), _対角 is 180 * (_ラジアン角1 - _ラジアン角2) / pi. 辺の対角(_辺,_辺2,_辺3,_高さ,_ラジアン角1,_ラジアン角2,_対角) :- (_辺3 ^ 2 - _高さ ^ 2) > (_辺 ^ 2), _対角 is 180 * (_ラジアン角2 - _ラジアン角1) / pi. /* cos(_ラジアン角,_cos値) :- var(_ラジアン角), findall([C,E],(for(0,D,100) , E is (D * pi / 100) / 2, C is abs(_cos値 - cos(E))),L), min(L,[_,_ラジアン角]),!. cos(_ラジアン角,_cos値) :- \+(var(_ラジアン角)), _cos値 is cos(_ラジアン角),!. */ % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1269438098/818 # # [1] 授業単元:ソフトウェア演習 # [2] 問題文(含コード&リンク): # # 直角三角形の3辺a,b,cのa,bの長さが与えられたときCの長さを返す関数のプログラム、 # 角度0〜180の値を与えるラジアンに変換した値、sinの値、cosの値を返す関数のプログラムをひとつのプログラムで行う。 # π=3.141592 # # '直角三角形の3辺a,b,cのa,bの長さが与えられたときCの長さを返す'(A,B,C) :- A == B, C is sqrt(A ^ 2 + B ^ 2). '直角三角形の3辺a,b,cのa,bの長さが与えられたときCの長さを返す'(A,B,C) :- B > A, C is sqrt(B ^ 2 + A ^ 2). '直角三角形の3辺a,b,cのa,bの長さが与えられたときCの長さを返す'(A,B,C) :- B > A, C is sqrt(B ^ 2 - A ^ 2). '直角三角形の3辺a,b,cのa,bの長さが与えられたときCの長さを返す'(A,B,C) :- A > B, C is sqrt(A ^ 2 + B ^ 2). '直角三角形の3辺a,b,cのa,bの長さが与えられたときCの長さを返す'(A,B,C) :- A > B, C is sqrt(A ^ 2 - B ^ 2). ラジアン値(_角度0〜180,_ラジアン値) :- _ラジアン値 is pi * _角度0〜180 / 180. sin(_角度0〜180,Sin値) :- ラジアン値(_角度0〜180,_ラジアン値),Sin値 is sin(_ラジアン値). cos(_角度0〜180,Cos値) :- ラジアン値(_角度0〜180,_ラジアン値),Cos値 is cos(_ラジアン値). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1269438098/627 # '1〜9までの値の整数 n を入力として受け取り、実行例のように、その n を高さとした二等辺三角形を出力するプログラムを作成しなさい。' :- '1〜9までの値の整数 n を入力として受け取り、'(N), 'その n を高さとした二等辺三角形を出力する'(N). '1〜9までの値の整数 n を入力として受け取り、'(N) :- repeat, 催促付き整数入力('1から9までの整数を入力:',N), '1〜9までの値の整数'(N),!. '1〜9までの値の整数'(N) :- N >= 1,N =< 9,!. '1〜9までの値の整数'(N) :- 'なお、10以上が入力されたら以下の実行例のようなエラーメッセージを発するようにしなさい。'(N),fail. 'なお、10以上が入力されたら以下の実行例のようなエラーメッセージを発するようにしなさい。'(N) :- write('入力する数は1から9までです \n'). 'その n を高さとした二等辺三角形を出力する'(N) :- 'その n を高さとした二等辺三角形を出力する'(1,N), 'その n を高さとした二等辺三角形を出力する'(N,N) :- 表示する数値列(N,S), write_formatted('%t\n',[S]),!. 'その n を高さとした二等辺三角形を出力する'(M,N) :- 表示する数値列(M,S), write_formatted('%t\n',[S]), M2 is M + 1, 'その n を高さとした二等辺三角形を出力する'(M2,N), write_formatted('%t\n',[S]),!. 表示する数値列(M,S) :- length(L,M),all(L,M),concat_atom(L,S),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/438 # # 1] 授業単元: プログラミング実習 # [2] 問題文(含コード&リンク): # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10181.txt # # 〜課題2〜 # 変数nを入力すると、以下の図のような表示を行うプログラムをそれぞれ作成せよ。ただし、図はn=5の場合である。 # 1つのプログラムとして作成せよ。 # # *   #     *** # ***** # ******* # ********* ピラミッド(N) :- length(L1,N), all(L1,' '), ピラミッド(L1,[*]). ピラミッド([],HL) :- concat_atom(HL,S),write_formatted('%t\n',[S]). ピラミッド([_|L1],HL) :- append(L1,HL,L1,L2), concat_atom(L2,S), write_formatted('%t\n',[S]), ピラミッド(L1,['**'|HL]). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/392 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク): # 3つの自然数を辺にもつ直角三角形を1000個出力するプログラムを書きなさい。 # ただし、3つの辺 a, b, c は a <= b <= c とする。 # また、3辺の比率が同じものはカウントしないこととする。 '3つの自然数を辺にもつ直角三角形を1000個出力' :- '3つの自然数を辺にもつ直角三角形'(1,1000,1,[],X), member(L,X), write_formatted('%t\n',[L]), fail. '3つの自然数を辺にもつ直角三角形を1000個出力'. '3つの自然数を辺にもつ直角三角形'(M,Max,_,_,[]) :- M > Max,!. '3つの自然数を辺にもつ直角三角形'(M,Max,C,Y,[[A,B,C]|R]) :- 約数が存在しない(C,Y), C1 is truncate(C ^ 2), 自然数の2乗(3,N,A,A1), 自然数の2乗(3,N,B,B1), A =< B, C1 is A1 + B1, M2 is M + 1,C2 is C + 1, '3つの自然数を辺にもつ直角三角形'(M2,Max,C2,[C|Y],R). '3つの自然数を辺にもつ直角三角形'(M,Max,C,Y,X) :- C2 is C + 1,'3つの自然数を辺にもつ直角三角形'(M,Max,C2,Y,X). 自然数の2乗(M,N,M,X) :- M =< N,X is truncate(M * M). 自然数の2乗(M1,N,M,X) :- M =< N,M2 is M1 + 1,自然数の2乗(M2,N,M,X). 約数が存在しない(A,L) :- \+((member(B,L),0 is A mod B)),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258320456/45 # # Polygonをスーパークラスとして,正三角形(Triangle),正四角形(Square)を表現するクラスをそれぞれ定義せよ. # # ・辺の長さのみを引数に与えてインスタンスを生成する # ・自身の面積を計算して結果を返すメソッドarea()を持つ # √3 = 1.73 としてよい # メインルーチンでは,実際にインスタンスを生成し,各インスタンスについて,インスタンス自身,周囲の長さ,面積の3項目を表示するようにせよ. # class 正多角形 has   :create(Class,Obj,_辺の長さ) :-     :new(Class,Obj),     Obj!辺の長さ := _辺の長さ; instance   attibute 辺の長さ,角; end. class 三角形 has nature 正多角形;   attribute 角 := 3; instance   :area(Obj,_面積) :-     Obj!辺の長さ * 1.73; end. class 四角形 has nature 正多角形;   attribute 角 := 4; instance   :area(Obj,_面積) :-     Obj!辺の長さ * Obj!辺の長さ; end. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1248012902/444 # 【課題】課題は3つあります。 # http://www.dotup.org/uploda/www.dotup.org318192.zip % 問題1 星ピラミットの表示 入力された段数になるように星文字でピラミッドを築く :- 入力された段数に(_入力された段数), なるように星文字でピラミッドを築く(_入力された段数). なるように星文字でピラミッドを築く(_入力された段数) :- _最終行の星数 is (_入力された段数 - 1) * 2 + 1, length(L,_最終行の星数), between(1,_入力された段数,N), 星文字でピラミッドを築く(N), N = _入力された段数. 入力された段数に(_入力された段数) :- write('段数を入れてください : '), get_integer(_段数). 星文字でピラミッドを築く(N) :- length(L1,N), all(L1,'*'), append(L0,L1,L0,L), all(L0,' '), atom_chars(Atom,L), writef(' %t \n',[Atom]). 乱数を使って発生させた2つの整数のたし算を5問示しそれぞれの回答診断と5問答えるのに要した時間を表示 :- _開始時刻 is time, for(1,N,5), 一問答える, N = 5, _終了時刻 is time, _回答するのに要した時間 is _終了時刻 - _開始時刻, writef('5問回答までの時間は%t秒でした。\n',[_回答するのに要した時間]). 一問答える :- A is random(100), B is random(100), writef('%t + %t =? ',[A,B]),get_integer(_答え), _正解 is A + B, 回答診断(_正解,_答え,_診断), writef('%t\n',[_診断]). 回答診断(_正解,_正解,'正解です!!'). 回答診断(_正解,_答え,_診断) :- 1 is abs(_正解 - _答え), concat_atom(['惜しいです。正解は',_正解],_診断). 回答診断(_正解,_答え,_診断) :- \+(_答え=_正解), \+(1 is abs(_正解 - _答え)), concat_atom(['間違いです。正解は',_正解],_診断). 'ファイル名を入力させてそのファイルの行数その中に現れる小文字、大文字、その他の文字数を表示する' :- 'ファイル名を入力させて'(_ファイル名), get_chars(_ファイル名,Chars). '行数、小文字数、大文字数、その他文字数の集計'(Chars,_行数,_小文字数,_大文字数,_その他文字数), そのファイルの行数その中に現れる小文字、大文字、その他の文字数を表示する'(_行数,_小文字数,_大文字数,_その他文字数). 'ファイル名を入力させて'(_ファイル名) :- write('ファイル名を入力してください\n'), get_line(_ファイル名). そのファイルの行数その中に現れる小文字、大文字、その他の文字数を表示する'(_行数,_小文字数,_大文字数,_その他文字数) :- writef('%t行ありました\n',[_行数]), writef('小文字の数は%t\n',[_小文字数]), writef('大文字の数は%t\n',[_大文字数]), writef('その他の数は%t\n',[_その他文字数]). '行数、小文字数、大文字数、その他文字数の集計'([],0,0,0,0). '行数、小文字数、大文字数、その他文字数の集計'(['\n'|R],S1,S2,S3,S4) :- 行数の加算(R,S1,S2,S3,S4). '行数、小文字数、大文字数、その他文字数の集計'([A|R],S1,S2,S3,S4) :- 小文字数の加算([A|R],S1,S2,S3,S4,S11,S12,S13,S14). '行数、小文字数、大文字数、その他文字数の集計'([A|R],S1,S2,S3,S4) :- 大文字数の加算([A|R],S1,S2,S3,S4,S11,S12,S13,S14). '行数、小文字数、大文字数、その他文字数の集計'([_|R],S1,S2,S3,S4) :- その他文字数の加算(R,S1,S2,S3,S4). 行数の加算(R,S1,S2,S3,S4) :- '行数、小文字数、大文字数、その他文字数の集計'(R,S11,S2,S3,S4), S1 is S11 + 1,!. 小文字数の加算([A|R],S1,S2,S3,S4) :- A @>= 'a',A @=< 'z', '行数、小文字数、大文字数、その他文字数の集計'(R,S1,S21,S3,S4), S2 is S21 + 1,!. 大文字数の加算([A|R],S1,S2,S3,S4) :- A @>= 'A',A @=< 'Z', '行数、小文字数、大文字数、その他文字数の集計'(R,S1,S2,S31,S4), S3 is S31 + 1,!. その他文字数の加算(R,S1,S2,S3,S4) :- '行数、小文字数、大文字数、その他文字数の集計'(R,S1,S2,S3,S41), S4 is S41 + 1,!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% get_integer(N) :- repeat, get_line(Line), atom_to_term(Line,M,_), get_integer_診断(M,N),!. get_integer_診断(end_of_file,-1). get_integer_診断(N,N) :- integer(N). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1255709298/389 # # 四角形の頂点が全て、三角形の内側にある事。 四角形の頂点が全て、三角形の内側にある(_四角形X1,_四角形Y1,_四角形X2,_四角形Y2,_四角形X3,_四角形Y3,_四角形X4,_四角形Y4,X1,Y1,X2,Y2,X3,Y3) :- 三角形による包含判定(_四角形のX1,_四角形のY1,X1,Y1,X2,Y2,X3,Y3), 三角形による包含判定(_四角形のX2,_四角形のY2,X1,Y1,X2,Y2,X3,Y3), 三角形による包含判定(_四角形のX3,_四角形のY3,X1,Y1,X2,Y2,X3,Y3), 三角形による包含判定(_四角形のX4,_四角形のY4,X1,Y1,X2,Y2,X3,Y3). 三角形による包含判定(PのX座標,PのY座標,X1,Y1,X2,Y2,X3,Y3) :- _中心X座標 is (X1+X2+X3) / 3, _中心Y座標 is (Y1+Y2+Y3) / 3, それぞれ2点を通る2直線が交差しない(PのX座標,PのY座標,_中心X座標,_中心Y座標,X1,Y1,X2,Y2), それぞれ2点を通る2直線が交差しない(PのX座標,PのY座標,_中心X座標,_中心Y座標,X1,Y1,X3,Y3), それぞれ2点を通る2直線が交差しない(PのX座標,PのY座標,_中心X座標,_中心Y座標,X2,Y2,X3,Y3). それぞれ2点を通る2直線が交差しない(X1,Y1,X2,Y2,X3,Y3,X4,Y4) :- U1 is (X1-X2)*(Y3-Y1)+(Y1-Y2)*(X1-X3), U2 is (X1-X2)*(Y4-Y1)+(Y1-Y2)*(X1-X4), U is U1 * U2, U >= 0. それぞれ2点を通る2直線が交差する(X1,Y1,X2,Y2,X3,Y3,X4,Y4) :- U1 is (X1-X2)*(Y3-Y1)+(Y1-Y2)*(X1-X3), U2 is (X1-X2)*(Y4-Y1)+(Y1-Y2)*(X1-X4), U is U1 * U2, U < 0. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1242876647/369 # # 次の各プログラムを作成 # # 1.線分の長さを求める #  -両端点の座標値(浮動小数点)を入力 #  -線分の長さを計算、表示 # # 2.三角形の面積を求める #  -3頂点の座標軸(浮動小数点)を入力 #  -面積を計算、表示 # # 2では1つの点を原点に移動させてあとはS=1/2|ad-bc|でお願いします # # 補足でこれがありました # ◆ 平方根を求める関数 # # double型の関数 sqrt() を使います.仮引数もdouble型です. # # 例えばdouble型の変数 len の平方根を求める場合には,次のように呼び出 # します. # # sqrt(len) # # 関数sqrt()を使用するソースプログラムをコンパイルするときには, # # gcc -lm ***.c # # のように,コンパイルオプション「-lm」が必要です. # # # # ・main関数の座標値読み込み部分を省略したものは以下の通りです 線分の長さ(X1,Y1,X2,Y2,_線分の長さ) :- _線分の長さ is sqrt((X2-X1)^2 + (Y2-Y1)^2). 三角形の面積(X1,Y1,X2,Y2,X3,Y3,_三角形の面積) :- 一角を原点へ移動(X1,Y1,X2,Y2,X3,Y3,0,0,X22,Y22,X33,Y33), _三角形の面積 is abs(X22 * Y33 - Y22 * X33) / 2. 一角を原点へ移動((X1,Y1,X2,Y2,X3,Y3,0,0,X22,Y22,X33,Y33) :- X22 is X2 - X1, Y22 is Y2 - Y1, X33 is X3 - X1, Y33 is Y3 - X1. % 以下のサイトは # 出典::C/C++の宿題片付けます 128代目 #222 # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9599.txt # “パスカルの三角形”を表示するプログラムを作ってください。 # ただし、表示する段数はキー入力するようにします。 # # 実行の様子はこのような感じです。 # # [b8000@localhost]$ ./main # 何段表示しますか?: 13 # 1 # 1 1 # 1 2 1 # 1 3 3 1 # 1 4 6 4 1 # 1 5 10 10 5 1 # 1 6 15 20 15 6 1 # 1 7 21 35 35 21 7 1 # 1 8 28 56 70 56 28 8 1 # 1 9 36 84 126 126 84 36 9 1 # 1 10 45 120 210 252 210 120 45 10 1 # 1 11 55 165 330 462 462 330 165 55 11 1 # 1 12 66 220 495 792 924 792 495 220 66 12 1 # # # この問題は、calloc() を使って領域確保をしてください。 # 段数を入力した後、calloc() を使って、必要分の領域確保をします。 # # 表示の体裁は大まかに二等辺三角形の形になっていればOKです。 # なお、上の実行例のプログラムでは、 # # printf("%3d ", 〜); # ↑ # ここは半角スペース3個 # # という記述で表示を行なっています。 パスカルの三角形(_段) :- パスカルの三角形(_段,LL), パスカルの三角形_表示(_段,LL). パスカルの三角形(_段,[[1]|LL]) :- length([_|Ln],_段), パスカルの三角形加算(Ln,[1,1],LL). パスカルの三角形加算([],_,[]). パスカルの三角形加算([_|Ln],L,[L|R2]) :- 指定された段に達するまでパスカルの三角形加算を続ける(Ln,L,R2). 指定された段に達するまでパスカルの三角形加算を続ける(Ln,L,R2) :- パスカルの三角形一行計算(L,L1), パスカルの三角形加算(Ln,L1,R2). パスカルの三角形一行計算(L,L1) :- 上の行の隣り合う二項の合計を取っていく(L,L0), 両端に1を付加する(L0,L1). 上の行の隣り合う二項の合計を取っていく(L,L0) :- findall(N,( append(_,[A,B|_],L),N is A + B),L0). 両端に1を付加する(L0,L1) :- append([1|L0],[1],L1). パスカルの三角形_表示(0,_) :- !. パスカルの三角形_表示(N,[L|R]) :- 'N>0の間、パスカルの三角形の表示'(N,L,R). 'N>0の間、パスカルの三角形の表示'(N,L,R) :- N > 0, succ(N_1,N), パスカルの三角形一行表示(N_1,L), パスカルの三角形_表示(N_1,R). パスカルの三角形一行表示(N_1,L) :- 左端からの空白表示(N_1), パスカルの三角形部分表示(L), write('\n'). 左端からの空白表示(N_1) :- 左端からの空白文字列の生成(N_1,_空白文字列), writef('%w',[_空白文字列]). 左端からの空白文字列の生成(N_1,_空白文字列) :- 左端からの空白文字ならびの生成(N_1,_空白ならび), atomic_list_concat(_空白ならび,_空白文字列). 左端からの空白文字ならびの生成(N_1,_空白ならび) :- Len is 3 * N_1, length(_空白ならび,Len), all(_空白ならび,' '). all([],_). all([V|R],V) :- all(R,V). パスカルの三角形部分表示(L) :- forall(member(A,L), writef('%5r ',[A])). % 以下のサイトは # http://pc12.2ch.net/test/read.cgi/tech/1244449887/953 # [1] 授業単元: ピラミッドアート # [2] 問題文(含コード&リンク): http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9534.txt # 課題「ピラミッドアート」 # # 数値を一つ入力し、その個数分の'*'を1辺とする # ?ダイヤ型、?八角形、?星型 などを描画する # # 実行画面例?ダイヤ型 # 数字(2〜9)を入力してください:3 # * # *** # ***** # *** # * # # 実行画面例?八角形 # 数字(2〜9)を入力してください:2 # ** # **** # **** # ** # # 実行画面例?星型 # 数字(2〜9)を入力してください:7 # * * * # * * * # *** # ******* # *** # * * * # * * * # # --------------------------------------------- # オプション:描画する図形の内部を空白にする # # 実行画面例?ダイヤ型(中抜き) # 数字(2〜9)を入力してください:3 # * # * * # * * # * * # * # # 実行画面例?八角形(中抜き) # 数字(2〜9)を入力してください:2 # ** # * * # * * # ** # # 実行画面例?星型(中抜き) # 数字(2〜9)を入力してください:7 # * * * # * * * # *** # *** *** # *** # * * * # * * * ピラミットアート(ダイヤ型,N) :- M is 2 * N - 1, for(1,J,M), ピラミットアート行(_,M,J,L1), put_chars(L1),nl, J=M, M2 is M - 1, for(M2,K,1), ピラミットアート行(_,M,K,L2), put_chars(L2),nl, K = 1. ピラミットアート(八角形,N) :- M is N + 2 * (N - 1), N2 is N - 1, for(1,J,N2), J2 is N + 2 * J, ピラミットアート行(_,M,J2,L1), put_chars(L1),nl, J=N2, for(1,J2,N), ピラミットアート行(_,M,M,L2), put_chars(L2),nl, J=N, for(N2,K,1), K2 is N + 2 * K, ピラミットアート行(_,M,K2,L3), put_chars(L3),nl, K = 1. ピラミットアート行(_,M,J,L) :- length(L,M), length(L1,J), all(L1,'*'), append(L0,L1,L2,L), length(L0,Len0), length(L2,Len0), all(L0,' '), all(L2,' '). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% put_chars([]) :- !. put_chars([A|R]) :- write(A),put_chars(R). all([],_) :- !. all([A|R],A) :- all(R,A). append([],L1,L2,L) :- append(L1,L2,L). append([A|R1],L1,L2,[A|R]) :- append(R1,L1,L2,R). % 以下のサイトは 三角形として成立 :- write('三辺の長さをカンマで区切って入力してください(最後に.を付加) ? '), read((A,B,C)), 三角形として成立([A,B,C]), write('OK'). 三角形として成立 :- write('NG'). 三角形として成立(_三辺の長さリスト) :- リストをひとつ左回転(_三辺の長さリスト,[_辺1,_辺2,_辺3]), _辺1 >= _辺2, _辺1 >= _辺3, !, _辺1 < _辺2 + _辺3. リストをひとつ左回転(_リスト,_ひとつ左回転したリスト) :- リスト = [_先頭要素|_残り要素], append(_残り要素,[_先頭要素],_ひとつ左回転したリスト_1), リストをひとつ左回転_1(_ひとつ左回転したリスト_1,_ひとつ左回転したリスト). リストをひとつ左回転_1(_ひとつ左回転したリスト,_ひとつ左回転したリスト). リストをひとつ左回転_1(_リスト,_ひとつ左回転したリスト). リストをひとつ左回転(_リスト,_ひとつ左回転したリスト). % 以下のサイトは # 出典 :: Python の宿題ここで答えます Part 1 #38 # 出典 :: ★★ Java の宿題ここで答えます Part 57 ★★ #215 # 【 課題 】キーボードから10個の数字を入力する。 #       隣同士の足し算をし、以下の例のように1の位の数字を次の行に出力し、 #       最後に残った数字を出力する。 # #       (例) #       数字を入力してください。 #       2359318473 # #       2 3 5 9 3 1 8 4 7 3 #        5 8 4 2 4 9 2 1 0 #        3 2 6 6 3 1 3 1 (以下略 # #       最後に残った数字は 2 です。 # 'キーボードから10個の数字を入力する。 隣同士の足し算をし、1の位の数字を次の行の現在行の数字の間に全体として逆三角形を形成するように出力し、 最後に残った数字を別の行に出力する。 数字の間には必ずひとつ空白が入るようにすること。' :- キーボードから10個の数字を入力する(L), '隣同士の足し算をし、1の位の数字を次の行の現在行の数字の間に全体として逆三角形を形成するように出力し、'([],L,_最後に残った数字), '最後に残った数字を別の行に出力する。'(_最後に残った数字). キーボードから10個の数字を入力する(L) :- write('10個の数字列を入力してください :'), n個の数字ならびを得る(10,L),!. n個の数字ならびを得る(N,L) :- length(Ln,N), 数字ならびを得る(Ln,L),!. 数字ならびを得る([],[]). 数字ならびを得る([_|Ln],[N|R]) :- 数字をひとつ得る(N), 数字ならびを得る(Ln,R). 数字をひとつ得る(N) :- 数字を得る(N). 数字をひとつ得る(N) :- 数字をひとつ得る(N). 数字を得る(N) :- get_code(_数字コード), between(48,57,_数字コード), N is _数字コード - 48. '隣同士の足し算をし、1の位の数字を次の行の現在行の数字の間に全体として逆三角形を形成するように出力し、'(Ln,[_最後に残った数字],_最後に残った数字) :- 最後に残った数字を表示する(Ln,_最後に残った数字). '隣同士の足し算をし、1の位の数字を次の行の現在行の数字の間に全体として逆三角形を形成するように出力し、'(Ln,L,_最後に残った数字) :- 複数要素ある場合は一行表示と逆三角形の加算処理による要素数減衰を繰り返す(Ln,L,_最後に残った数字). 複数要素ある場合は一行表示と逆三角形の加算処理による要素数減衰を繰り返す(Ln,L,X) :- 一行表示(Ln,L), 逆三角形の加算処理(L,L2), '隣同士の足し算をし、1の位の数字を次の行の現在行の数字の間に全体として逆三角形を形成するように出力し、'([' '|Ln],L2,X). 最後に残った数字を表示する(Ln,_最後に残った数字) :- 空白文字列印字(Ln), writef('%w\n',[_最後に残った数字]). '最後に残った数字を別の行に出力する。'(_最後に残った数字) :- writef('\n残った数字は: %w です\n',[_最後に残った数字]). 一行表示(Ln,L) :- 空白文字列印字(Ln), atomic_list_concat(L,' ',A), writef('%w\n',[A]). 空白文字列印字(L) :- all(L,' '), atomic_list_concat(L,_空白文字列), writef('%w',[_空白文字列]). all([],V). all([V|R],V) :- all(R,V). 逆三角形の加算処理([_],[]). 逆三角形の加算処理([A,B|R1],[C|R2]) :- C is (A+B) mod 10, 逆三角形の加算処理([B|R1],R2).