このディレクトリの索引

% 以下のサイトは # 出典::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',[_何行目]). % 以下のサイトは # # 上部の基壇に幅をもたせたピラミッドの矩形 # # # _向き = 上向き, _頂点の高さ = 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). % 以下のサイトは # # 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). % 以下のサイトは # # (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). % 以下のサイトは # このディレクトリの索引 # [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://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://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/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). % 以下のサイトは # 出典:: 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/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/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/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/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/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). % 以下のサイトは # 出典::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).