1 :
デフォルトの名無しさん :
2010/06/19(土) 00:00:38 前スレは512k超えで終了しました。
http://pc12.2ch.net/test/read.cgi/tech/1274827528/904 # 期限6月21日18時
# よろしくお願いします。
#
# 3次元の実数ベクトルを、要素がfloat型で要素数3の配列を用いて表すものとする。
# 二つの3次元ベクトルに対して、それらの和、差、内積、外積を求める関数を定義する。
# 和、差、内積、外積を計算する関数はそれぞれaddvec、subvec、innervec、outervecとし、
# それぞれの関数定義の頭部は
# void addvec(const float x[3], const float y[3], float z[3])
# void subvec(const float x[3], const float y[3], float z[3])
# float innervec(const float x[3], const float y[3])
# void outervec(const float x[3], const float y[3], float z[3])
# とする。
# プログラムの動作は、二つの3次元ベクトルaとbの各成分をじゅんじに入力して、それらの和、差、内積、外積を求めて出力する。
# 以上の説明に沿ったプログラムをC言語を用いて書け。
#
http://pc12.2ch.net/test/read.cgi/tech/1274827528/918 # [1] 授業単元:Cプログラミング演習
# [2] 問題文(含コード&リンク):
# 問題1:文字列"Computer1Programing2Communication3Electro4"を、"test.txt"に書き込むプログラムを作成せよ。
# 問題2:ファイル"test.txt"から文字列も読み込み、並びを逆にしてファイル"sample.txt"に出力するプログラムを作成せよ。("test.txt"は問題1で作成したものを使用すること。)
# 問題3:ファイル"sample.txt"から大文字だけを画面に表示させるプログラムを作成せよ。("sample.txt"は問題2で作成したものを使用すること。)
#
http://pc11.2ch.net/test/read.cgi/db/1274791771/139 # 期間の抽出について相談です。
# 元情報
# ID START END
# ----- ----- -----
# 10 2010/06/01 2010/06/12
# 10 2010/06/13 2010/06/14
# 10 2010/06/15 NULL
# 20 2010/06/01 2010/06/11
# 20 2010/06/13 2010/06/15
# ↓
# 欲しい情報
# ID START END
# ----- ----- -----
# 10 2010/06/01 NULL
# 20 2010/06/01 2010/06/11
# 20 2010/06/13 2010/06/15
#
# ・開始日、終了日の期間重複はなし
# ・IDごとにデータを抽出。抽出単位は連続している期間の最小開始日と最大終了日
# ・期間は綺麗に連続(ID=10)することもあれば非連続することもある(ID=20)
http://pc11.2ch.net/test/read.cgi/db/1274791771/154 # 質問です。
# Oracle10gです。
#
# 部門の親子関係を示す以下のようなテーブルがある。
#
# 親部門ID 子部門ID 子部門の区分
# 1 2 0
# 1 3 1
# 3 4 0
# 3 5 1
# 5 6 0
# 7 8 0
# 7 9 1
# 9 10 0
#
# ある親部門IDを指定し、その部門以下の階層に含まれる部門のうち区分が0となっているものを取得したい。
# 上の例だと部門ID=1と指定した場合2,4,6を取得したい。
#
>>3 使用言語:J
read=:1!:1
write=:1!:2
N.B.問題1
'Computer1Programing2Communication3Electro4' write <'test.txt'
N.B.問題2
reverse=: |.
(reverse read <'test.txt') write <'sample.txt'
N.B.問題3
ascii=: a. & i.
isUpper=: 65&<: *. 90&>:
smoutput (#~ isUpper@ascii) read <'sample.txt'
ECPC
http://pc12.2ch.net/test/read.cgi/tech/1276215571/54 # アルゴリズムや処理の高速化の知恵をお借りしたく。宿題ではありません。
#
# Cで英単語のスペルチェッカを作って、タイムアタックするYO!というお題。
# 与えられているのは、14万語強の英単語リスト(約1.4MB)、
# 700万語強の照合するテキスト(約39MB)と、プログラムのテンプレ。
# これに、各自で辞書の読み込みload()、チェックルーチンcheck()、
# 辞書の単語数のカウントcount()、メモリの開放unload()を実装するようです。
# 照合の仕様は、単純に辞書に同じ単語があるかどうかだけです。
# ただし大文字小文字は区別しません。
#
# 試しに手元のMacBook+gccで配列に突っ込んだ辞書を
# 逐一リニアサーチさせてみると9700秒、
# 辞書を50万個のハッシュの中に無理矢理おさめて14秒です。
#
# 講義で想定している実装は、ハッシュ+片方向の連結リスト。
# あるいはトライ木。ぼちぼちと試していくつもりですが、
# ↓の結果(クラウドなサーバー上で実行)を見る限り、
# トップのあたりはどうも想像の斜め上をいく実装をしている模様。
#
ttp://www.cs50.net/boards/pset6.php # みなさんなら、どう攻めますか?
# お題の詳細は↓の中のpset6.pdf、辞書はwords、
# テンプレのプログラムと照合テキストはpset6.zipにあります。
#
ttp://cdn.cs50.net/2009/fall/psets/6/
>>7 % Prolog
'ある親部門IDを指定し、その部門以下の階層に含まれる部門のうち区分が0となっているものを取得したい。'(_親部門ID,_区間が0となっている子部門ID) :-
部門(_親部門ID,_子部門ID,_子部門の区分),
その部門以下の階層に含まれる部門のうち区分が0となっているものを取得(_子部門ID,_子部門区分,_区間が0となっている子部門ID).
その部門以下の階層に含まれる部門のうち区分が0となっているものを取得(_子部門ID,0,_子部門ID).
その部門以下の階層に含まれる部門のうち区分が0となっているものを取得(_子部門ID_1,_子部門の区分,X) :-
部門(_子部門ID_1,_子部門ID_2,_子部門の区分_2),
その部門以下の階層に含まれる部門のうち区分が0となっているものを取得(_子部門ID_2,_子部門の区分_2,X).
>>6 % Prolog
'IDごとにデータを抽出。抽出単位は連続している期間の最小開始日と最大終了日' :-
findsetof(_ID,期間(_ID,_期間下限,_期間上限),L1),
findall([_ID,_最小開始日,_最大終了日],(
member(_ID,L1),
findmin([_ID,_開始日],開始日(_ID,_開始日),_最小開始日),
findmax([_ID,_終了日],終了日(_ID,_終了日),_最大終了日)),
L).
write('ID START END \n----- ----- ----- \n'),
append(_,[[_ID,_Start,_End]|R],L),
write_formatted('%t %t %t\n',[_ID,_Start,_End]),
R = [].
開始日(_ID,_開始日) :- 期間(_ID,_開始日,_).
終了日(_ID,_終了日) :- 期間(_ID,_開始日,_終了日),\+(_終了日='NULL').
>>5 % Prolog
'与えられた金額に対して、最小枚数のコインでmを支払うときの枚数を求めよ。'(_m,_最小コイン枚数) :-
暫定候補枚数を得る(_m,[15,10,8,5,1],0,_暫定候補枚数),
最小枚数のコインでmを支払うときの枚数(_暫定候補枚数,_最小コイン枚数).
暫定候補枚数を得る(0,_,X,X) :- !.
暫定候補枚数を得る(_m,[P|R1],S1,X) :-
D is _m // P,
_m_2 is _m mod P,
S2 is S + D,
暫定候補枚数を得る(_m_2,S2,X).
最小枚数のコインでmを支払うときの枚数(_m,_暫定候補枚数,_最小コイン枚数) :-
findmin(_枚数,暫定候補枚数より少ない支払いを探す(_m,_暫定候補枚数,_枚数,_最小コイン枚数),!.
暫定候補枚数より少ない支払いを探す(_m,_暫定候補枚数,_枚数) :-
for(0,A,_暫定候補枚数),
for(0,B,_暫定候補枚数),
for(0,C,_暫定候補枚数),
for(0,D,_暫定候補枚数),
for(0,E,_暫定候補枚数),
_m is 1 * A + 5 * B + 8 * C + 10 * D + 15 * E,
_枚数 A + B + C + D + e,
_枚数 =< _暫定候補枚数.
>>3 使用言語:Io
P1 := method(
File clone open("test.txt") do(
write("Computer1Programing2Communication3Electro4\n")
close
)
)
P2 := method(
File clone open("sample.txt") do(
f := File clone open("test.txt")
write(f readLine reverse,"\n")
f close
close
)
)
P3 := method(
File clone open("sample.txt") do(
foreach(v,if(v>=65 and v<=90,v asCharacter print))
""println
close
)
)
P1;P2;P3
http://pc12.2ch.net/test/read.cgi/tech/1267796762/170 # 【 課題 】入力したテキストに含まれる文字を種類別に使用回数を表示し、降順にソートし出力するプログラムを作れ。
# 【 形態 】Javaアプリケーション(main()で開始)
# 【 期限 】6月22日
# 【 Ver 】1.6.0_20
# 【 補足 】../test/read.cgi/tech/1267796762/83と同様の問題ですが漢字や記号など全ての種類によらずに統計したい場合です。よろしくお願いします。
#
#
>>2 % Prolog
'二つの3次元ベクトルaとbの各成分をじゅんじに入力して、それらの和、差、内積、外積を求めて出力する' :-
write('入力してください X1,Y1,Z1 : '),get_split_line([','],[X1,Y1,Z1]),
write('入力してください X2,Y2,Z2 : '),get_split_line([','],[X2,Y2,Z2]),
ベクトルの和([[X1],[Y1],[Z1]],[[X2],[Y2],[Z2]],_ベクトルの和),
ベクトルの差([[X1],[Y1],[Z1]],[[X2],[Y2],[Z2]],_ベクトルの差),
ベクトルの内積([[X1],[Y1],[Z1]],[[X2],[Y2],[Z2]],_ベクトルの内積),
ベクトルの外積([[X1],[Y1],[Z1]],[[X2],[Y2],[Z2]],_ベクトルの外積),
write_formatted('和は %t \n差は %t \n内積は %t \n外積は %t です\n').
ベクトルの和([],[],[]) :- !.
ベクトルの和([[A]|R1],[[B]|R2],[[C]|R3]) :-
C is A + B,
ベクトルの和(R1,R2,R3).
ベクトルの差([],[],[]) :- !.
ベクトルの差([[A]|R1],[[B]|R2],[[C]|R3]) :-
C is A - B,
ベクトルの差(R1,R2,R3).
>>2 % Prolog (その二)
ベクトルの内積([],[],0) :- !.
ベクトルの内積([[A]|R1],[[B]|R2],X) :-
X is Y + A * B.
ベクトルの内積(R1,R2,Y),
innervec([],[],0) :- !.
innervec([A|R1],[B|R2],Inner) :-
innervec(R1,R2,Inner2),
Inner is Inner2 + A * B,!.
ベクトルの外積([[X1],[Y1],[Z1]],[[X2],[Y2],[Z2]],_ベクトルの外積) :-
X3 is Y1 * Z2 - Z1 * Y2,
Y3 is Z1 * X2 - X1 * Z2,
Z3 is X1 * Y2 - Y1 * X2,
_ベクトルの外積 = [[X3],[Y3],[Z3]],!.
>>3 使用言語:maxima
P1():=(f:openw("test.txt"),
printf(f,"Computer1Programing2Communication3Electro4~%"),
close(f)
);
P2():=(fin:openr("test.txt"),fout:openw("sample.txt"),
printf(fout,"~a~%",sreverse(readline(fin))),
close(fin),
close(fout)
);
P3():=(fin:openr("sample.txt"),
text:readline(fin),
for v in charlist(text) do if uppercasep(v) then printf(true, "~a", v),
close(fin),
print("")
);
P1();P2();P3();
>>3 % Prolog (その一)
'文字列"Computer1Programing2Communication3Electro4"を、"test.txt"に書き込む' :-
open('test.txt',write,Output),
write(Output,'Computer1Programing2Communication3Electro4'),
close(Output).
'ファイル"test.txt"から文字列も読み込み、並びを逆にしてファイル"sample.txt"に出力する' :-
get_lines('test.txt',Lines),
open('sample.txt',write,Output),
append(_,[Line|R],Lines),
並びを逆に(Line,_並びを逆にしたLine),
write_formatted(Output,_並びを逆にしたLine),
R = [],
close(Output).
並びを逆に(Line,_並びを逆にしたLine) :-
atom_chars(Line,Chars),
reverse(Chars,Rchars),
atom_chars(_並びを逆にしたLine,Rchars).
>>3 % Prolog (その二)
'ファイル"sample.txt"から大文字だけを画面に表示させる' :-
get_chars('sample.txt',Chars),
append(_,[Char|R],Chars),
大文字だけを画面に表示させる(Char),
R = [],!.
大文字だけを画面に表示させる(Char) :- Char @>= 'A',Char @=< 'Z',
write(Char).
大文字だけを画面に表示させる(Char) :- \+((Char @>= 'A',Char @=< 'Z')).
>>16 使用言語:J
f=:monad def ';:inv":&.>(\:{:"1)(~.;"0#/.~)y'
f ucp'a/bb/ccc/漢字'
/ 3
c 3
b 2
a 1
漢 1
字 1
>>2 使用言語:J
addvec=: +
subvec=: -
innervec=: +/ .*
outervec=: [:(-/ .*)&>2<\(}.,2&{.)@,.
A=: 1 2 3
B=: 4 5 6
A addvec B
5 7 9
A subvec B
_3 _3 _3
A innervec B
32
A outervec B
_3 6 _3
>>2 使用言語:maxima
load("eigen");
addvec(a,b):= a + b;
subvec(a,b):= a - b
innervec(a,b):= inprod(a,b);
outervec(a,b):= transpose(adjoint(matrix(A,B,[1,1,1])))[3];
(%i102) A:[1,2,3];
(%i103) B:[4,5,6];
(%i105) addvec(A,B);
(%o105) [5, 7, 9]
(%i106) subvec(A,B);
(%o106) [- 3, - 3, - 3]
(%i107) innervec(A,B);
(%o107) 32
(%i111) outervec(A,B);
(%o111) [- 3, 6, - 3]
>>2 使用言語:十進BASIC
DIM a(3),b(3),c(3)
DATA 1,2,3
DATA 4,5,6
MAT READ a
MAT READ b
SUB addvec(a(),b(),c())
MAT c=a+b
END SUB
SUB subvec(a(),b(),c())
MAT c=a-b
END SUB
FUNCTION innervec(a(),b())
LET innervec=DOT(a,b)
END FUNCTION
SUB outervec(a(),b(),c())
MAT c=cross(a,b)
END SUB
CALL addvec(a,b,c)
MAT PRINT c
CALL subvec(a,b,c)
MAT PRINT c
PRINT innervec(a,b)
CALL outervec(a,b,c)
MAT PRINT c
END
http://pc12.2ch.net/test/read.cgi/tech/1276810079/95 # [1] 授業単元:数値計算法
# [2] 問題文(含コード&リンク):
# 与えられた零以上の実数(a,b,c,d)と正の実数(e,f)に対して
# つぎのロンバーグ表と積分値を求めるプログラムを作成せよ
# (分割数:n=2^k≧16,推定回数:m≧3)
#
# I=∫ 1/(a*x^3+b*x^2+c*x+d)dx (e≦x≦f)
#
# ただし、キーボードから(a,b,c,d,e,f)を入力すれば
# 上記の定積分のロンバーグ表の値と積分値が画面表示
# されるようなプログラムを作ること。
#
# ・テーブルデータ # DATE | DATA # ------------+---------- # 2010-06-01 | aaa # 2010-06-02 | bbb # 2010-06-03 | ccc # 2010-06-04 | ddd # 2010-06-05 | eee # 2010-06-06 | fff # 2010-06-07 | ggg # # ・欲しい結果 # 最新3件を昇順で。 # DATE | DATA # ------------+---------- # 2010-06-05 | eee # 2010-06-06 | fff # 2010-06-07 | ggg # # ・説明 # select DATE, DATA from TABLE order by DATE desc limit 3; # とすれば、最新3件を降順で取得できますが、 # できれば降順でなく昇順で最新3件を取得したいです。
>>29 % Prolog
'DATEの最新3件を昇順で取得する'(L) :-
findsort([DATE],テーブル(DATE,DATA),L1),
length(L,3),
append(_,L,L1).
findsort(_鍵ならび,P,_解ならび) :-
P =.. [F|L1],
append(_鍵ならび,L1,L2),
findall(L2,P,L3),
sort(L3,L4),
findall(L1,member(L2,L4),_解ならび).
>>27 % Prolog
'1から10までの積を計算する。このとき,画面に 1*2*3*・・・・*10 = という風に表示
されるようにする' :-
'1から10までの積を計算する。このとき,画面に 1*2*3*・・・・*10 = という
されるようにする'(1,1).
'1から10までの積を計算する。このとき,画面に 1*2*3*・・・・*10 = という風に表示
されるようにする'(10,S1) :-
S is S1 * 10,
write_formatted('10 = %t\n',[S]),!.
'1から10までの積を計算する。このとき,画面に 1*2*3*・・・・*10 = という風に表示
されるようにする'(N,S1) :-
S2 is S1 * N,
N2 is N + 1,
write_formatted('%t*',[N]),
'1から10までの積を計算する。このとき,画面に 1*2*3*・・・・*10 = という
風に表示されるようにする'(N2,S2).
>>31 (
>>27 )
% Prolog 改行の補正をし忘れた。すみません。
'1から10までの積を計算する。このとき,画面に 1*2*3*・・・・*10 = という風に表示されるようにする' :-
'1から10までの積を計算する。このとき,画面に 1*2*3*・・・・*10 = というされるようにする'(1,1).
'1から10までの積を計算する。このとき,画面に 1*2*3*・・・・*10 = という風に表示されるようにする'(10,S1) :-
S is S1 * 10,
write_formatted('10 = %t\n',[S]),!.
'1から10までの積を計算する。このとき,画面に 1*2*3*・・・・*10 = という風に表示されるようにする'(N,S1) :-
S2 is S1 * N,
N2 is N + 1,
write_formatted('%t*',[N]),
'1から10までの積を計算する。このとき,画面に 1*2*3*・・・・*10 = という風に表示されるようにする'(N2,S2).
>>4 % Prolog
ベクトルの正規化(V1,V2) :-
flat(V1,L1),
分散(L1,_分散),
U is sqrt(_分散) / _分散,
行列の積(V1,[[U]],V2).
ベクトルの差([],[],[]) :- !.
ベクトルの差([[A]|R1],[[B]|R2],[[C]|R3]) :-
C is A - B,
ベクトルの差(R1,R2,R3).
normal(V1,V2) :- ベクトルの正規化(V1,V2).
dist(V1,V2,Dist) :- ベクトルの差(V1,V2,Dist).
http://pc12.2ch.net/test/read.cgi/tech/1276810079/133 # [1] 授業単元:C言語プログラミング
# [2] 問題文(含コード&リンク):
# [1] 授業単元:
# char buf[80];
# int main(int ac, char ** av)
# {
# int i;
# buf[0] = '\0';
# for(i = 1; i < ac; i++){
# printf("%3d \"%s\"\n", strlen(av[i]), av[i]);
# strcat(buf, av[i]);
# }
# printf("%3d \"%s\"\n", strlen(buf), buf);
#
# これを入力した文字列を逆順に表示できるように書き換えよ
#
>>34 % Prolog 視点を少しずらしてみた。EUC版は易しい。
バイナリーモードで読み込まれたバイトコードならびを逆順に並べ変えた後に、EUC全角文字を復元して文字列を作る'(_コードならび,_逆順文字列) :-
reverse(_コードならび,_逆転したコードならび),
'EUC全角文字コードを復元する'(_コードならび,_文字単位ならび),
atom_codes(_逆順文字列,_文字単位ならび).
'EUC全角文字コードを復元する'([],[]) :- !.
'EUC全角文字コードを復元する'([C1,C2|R1],[C|R2]) :-
C1 > 127,
C2 > 127,
C is C2 * 256 + C1,
'EUC全角文字コードを復元する'(R1,R2),!.
'EUC全角文字コードを復元する'([C|R1],[C|R2]) :-
'EUC全角文字コードを復元する'(R1,R2),!.
http://pc12.2ch.net/test/read.cgi/tech/1276810079/138 # 1] 授業単元:システムコール
# [2] 問題文(含コード&リンク):
# コマンドライン引数で指定された文字列のいずれかと一致する名前の環境変数につい てのみ、
# #include <stdio.h>
# #include <stdlib.h>
# extern char **environ;
# main()
# {
# char **p;
# for (p = environ; *p != NULL; p ++) {
# printf("%s\n", *p);}
# return 0;}
# や
# #include <stdio.h>
# #include <stdlib.h>
# main(int argc, char *argv[], char *envp[])
# {
# char **p;
# for (p = envp; *p != NULL; p ++) {
# printf("%s\n", *p);}
# return 0;}
# のように変数名と値を表示するプログラムを書け。
# ただし、コマンドライン引数に重複があっても、対応する環境変数について複数回表示してはならない
>>36 % Prolog
program :-
user_parameters(L),
append(_,[_環境変数名|R],L),
環境変数の表示(_環境変数名),
R = [].
環境変数の表示(_環境変数名) :-
getenv(_環境変数名,_値),
write_formatted('%t=%t\n',[_環境変数名,_値]),!.
環境変数の表示(_).
>>39 % Prolog
二つのリストの最初のN要素だけ入れ替える(L1_1,L2_1,N,L1_2,L2_2) :-
length(L1_0,N),
length(L2_0,N),
append(L1_0,R1,L1),
append(L2_0,R2,L2),
append(L2_0,R1,L3),
append(L1_0,R2,L4),!.
>>40 % Prolog 論理変数名が間違ってました。ついでに2パターン追加。
二つのリストの最初のN要素だけ入れ替える(L1_1,L2_1,N,L1_2,L2_2) :-
length(L1_0,N),
length(L2_0,N),
append(L1_0,R1,L1_1),
append(L2_0,R2,L2_1),
append(L2_0,R1,L1_2),
append(L1_0,R2,L2_2),!.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
二つのリストの最初のN要素だけ入れ替える(L1_1,L2_1,N,L1_2,L2_2) :-
integer(N),
length(LN,N),
二つのリストの最初のN要素だけ入れ替える(L1_1,L2_1,LN,L1_2,L2_2).
二つのリストの最初のN要素だけ入れ替える(R1,R2,[],R1,R2).
二つのリストの最初のN要素だけ入れ替える([A|R1_1],[B|R2_1],[_|R],[B|R1_2],[A|R2_2]) :-
二つのリストの最初のN要素だけ入れ替える(R1_1,R2_1,R,R1_2,R2_2).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
二つのリストの最初のN要素だけ入れ替える(R1,R2,0,R1,R2).
二つのリストの最初のN要素だけ入れ替える([A|R1_1],[B|R2_1],N,[B|R1_2],[A|R2_2]):-
N1 is N - 1,
二つのリストの最初のN要素だけ入れ替える(R1_1,R2_1,N1,R1_2,R2_2).
http://pc12.2ch.net/test/read.cgi/tech/1276810079/166 # 表示例のように,名前,性別,身長,体重,腹囲(ウエスト)を3人分入力した後, 3名全員について入力データに加えてBMI値とメタボリック症候群の疑いの判定を 表示するプログラムを作成しなさい.
# プログラムでは,名前,性別,身長,体重,腹囲をまとめて 個人データとして表すための構造体を定義して利用すること.
# 注意
# " 体重はkg, 身長,腹囲はcmで入力する.
# " 性別は 1 で男性,2で女性を表す.
# " BMI値 = 体重(kg) / 身長(m)2
# " 男性は腹囲85cm以上,女性は腹囲90cm以上でメタボリック症候群の疑い がある
#
# 表示例
# データ1を入力してください
# 名前: Hanako
# 性別: 2
# 身長: 156.4
# 体重: 65.3
# 腹囲: 93.4
# 名前: Hanako, 性別: 女, 身長: 156.4, 体重: 65.3, 腹囲: 93.4, BMI: 26.7, メタボリック症候群の疑いがあります
>>44 % Prolog 相当に無理があるが、構造体配列に近いものを定義してみた。
構造体(点数([英語(_英語),数学(_数学),物理(_物理)])).
要素数3の構造体配列を宣言 :-
length(L,3),
findall(L1,(member(L1,L),構造体(点数(L1))),X),
assertz(構造体配列(点数構造体ならび,X)).
:- 要素数3の構造体配列を宣言.
'それぞれの値を標準入力(キーボードから入力)し、各科目の平均点を表示する'
構造体配列(点数構造体ならび(L)),
findall(L1,(member(L1,L),三科目を入力する(L1)),L),
各科目の平均点を表示する(L).
三科目を入力する([]) :- !.
三科目を入力する([P|R]) :-
P =.. [F,Q],
write_formatted('%t:',[F]),get_integer(Q),
三科目を入力する(R).
各科目の平均点を表示する(L) :-
構造体(点数(L0)),
member(_科目構造,L0),
_科目構造=..[_科目名,_点数],
findavg(_点数,(member(L1,L),member(_科目構造,L1)),_平均点),
write_formatted('%tの平均点は%tです。\n',[_科目名,_平均点]),
fail.
各科目の平均点を表示する(_).
>>42 % Prolog
出会うまでリストを手繰る(_求めるもの,[_求めるもの|R]) :-
write_formatted('!%t!\n',[_求めるもの]).
出会うまでリストを手繰る(_求めるもの,[A|R]) :-
list(A),
write_formatted('%t-',[A]),
出会うまでリストを手繰る(_求めるもの,A);
\+(list(A)),
write_formatted('%t-',[A]),
出会うまでリストを手繰る(_求めるもの,R).
>>48 (
>>42 )
% Prolog 間違えました。
>>48 は、深く潜ってのリストの探索に失敗するとそれで終わりになってしまいます。
出会うまでリストを手繰る(_求めるもの,[_求めるもの|R]) :-
write_formatted('!%t!\n',[_求めるもの]).
出会うまでリストを手繰る(_求めるもの,[A|R]) :-
list(A),
出会うまでリストを手繰る(_求めるもの,A);
出会うまでリストを手繰る(_求めるもの,R).
出会うまでリストを手繰る(_求めるもの,[A|R]) :-
\+(list(A)),
write_formatted('%t-',[A]),
出会うまでリストを手繰る(_求めるもの,R).
>>49 (
>>42 )
% Prolog これも致命的な欠陥がありました。一応訂正したものから示すと、
出会うまでリストを手繰る(_求めるもの,[_求めるもの|R]) :-
write_formatted('!%t!\n',[_求めるもの]).
出会うまでリストを手繰る(_求めるもの,[A|R]) :-
list(A),
出会うまでリストを手繰る(_求めるもの,A).
出会うまでリストを手繰る(_求めるもの,[_|R]) :-
list(A),
出会うまでリストを手繰る(_求めるもの,R).
出会うまでリストを手繰る(_求めるもの,[A|R]) :-
\+(list(A)),
write_formatted('%t-',[A]),
出会うまでリストを手繰る(_求めるもの,R).
%
>>49 のどこがいけないかというと、Aがリストでないとき、
% \+(list(A))の節が実行されるのではなく、list(A)の節の ;より後の副目標が
% 実行されてしまいます。これだと write_formatted('%t-',[A]),による
% トレースができませんね。
出会うまでリストを手繰る(_求めるもの,[A|R]) :-
list(A),
出会うまでリストを手繰る(_求めるもの,A);
出会うまでリストを手繰る(_求めるもの,R).
出会うまでリストを手繰る(_求めるもの,[A|R]) :-
\+(list(A)),
write_formatted('%t-',[A]),
出会うまでリストを手繰る(_求めるもの,R).
>>46 % Prolog
'名前,性別,身長,体重,腹囲(ウエスト)を3人分入力した後, 3名全員について入力 データに加えてBMI値とメタボリック症候群の疑いの判定を表示する' :-
'名前,性別,身長,体重,腹囲(ウエスト)を3人分入力'(L),
'3名全員について入力データに加えてBMI値とメタボリック症候群の疑いの判定を表示する'(L).
'名前,性別,身長,体重,腹囲(ウエスト)を3人分入力'(L) :-
findall([_名前,_性別,_身長,_体重,_腹囲],(
for(1,N,3),
write('名前:'),get_line(_名前),
write('性別:'),get_integer(_性別),
write('身長:'),get_integer(_身長),
write('体重:'),get_integer(_体重),
write('腹囲:'),get_integer(_腹囲)),
L).
'3名全員について入力データに加えてBMI値とメタボリック症候群の疑いの判定を表示する'([]) :- !.
'3名全員について入力データに加えてBMI値とメタボリック症候群の疑いの判定を表示する'([[_名前,_性別,_身長,_体重,_腹囲]|R]) :-
write_formatted('%t:%t, %t:%t, %t:%t, %t:%t,%t :%t, ',[名前,性別,身長,体重,腹囲,_名前,_性別,_身長,_体重,_腹囲]),
_BMI値 = _体重 / ((_身長 / 100) ^ 2),
write_formatted('%t:%t, ',['BMI値:',_BMI値]),
診断(_性別,_腹囲,_診断),
write_formatted('%t\n',[_診断]),
'3名全員について入力データに加えてBMI値とメタボリック症候群の疑いの判定を表示する'(R).
診断(1,_腹囲,メタボリック症候群の疑いがあります) :- _腹囲 >= 85,!.
診断(2,_腹囲,メタボリック症候群の疑いがあります) :- _腹囲 >= 90,!.
診断(_,_,'').
>>51 % Prolog 名前が整数では困りますね。それから整数とは限らない入力が多いようなので
'名前,性別,身長,体重,腹囲(ウエスト)を3人分入力'(L) :-
findall([_名前,_性別,_身長,_体重,_腹囲],(
for(1,N,3),
write('名前:'),get_line(_名前),
write('性別:'),get_line(Line),atom_to_term(Line,_性別,_),
write('身長:'),get_line(Line),atom_to_term(Line,_身長,_),
write('体重:'),get_line(Line),atom_to_term(Line,_体重,_),
write('腹囲:'),get_line(Line),atom_to_term(Line,_腹囲,_)),
L).
>>53 % Prolog
'関数sqrtを使って1〜10までの二乗根の和を求める'(X) :-
findsum(Y,(for(1,N,10),Y is sqrt(N)),X).
'16進数ABC.DEを10進数に変換'(X) :-
小数点を含む16進数を10進数に変換('ABC.DE',X).
小数点を含む16進数を10進数に変換(_16進文字列,_10進数) :-
sub_atom(_16進文字列,S,1,RLen,'.'),
sub_atom(_16進文字列,0,S,_,S_1),
sub_atom(_16進文字列,S+1,RLen,_,S_2),
'16進文字列表現を10進整数に変換'(S_1,N1),
'16進文字列表現を10進整数に変換'(S_2,N2),
Z is truncate(16 ^ RLen),
_10進数 is N1 + N2 / Z.
% '16進文字列表現を10進整数に変換'/2 は
http://nojiriko.asia/prolog/c136_75.html 参照
http://pc12.2ch.net/test/read.cgi/tech/1276810079/172 # 【質問テンプレ】
# [1] 授業単元: プログラミングB
# [2] 問題文(含コード&リンク):実行したい処理を選ぶことが可能なプログラムを作りなさい。このとき、実
# 行できる処理は以下の三つとする。
#
# 処理1:複数の2択問題への回答に応じた結果を表示する。(例:職種選択、旅行先選び
#
# 処理2:文字コード一覧表を出力する。(文字コード32~126を一行に8文字ずつ)
#
# 処理3:本のページ数を入力し、その本を読み切るために必要な日数を表示
# する。このとき、初日は10ページ、2日目は20ページ,,,と読むページ
# 数は増加するものとする。
#
# 以下の仕様で作成すること
#
# キーボードから入力された数に応じて、switch文で各処理に移動する。
# 処理1:if文を使って
# 処理2:for文を使って
# 処理3:while文またはdo・while文を使って。
http://pc12.2ch.net/test/read.cgi/tech/1276810079/192 # [1] 授業単元:プログラミング演習
# [2] 問題文(含コード&リンク):
# 問題1:char name[20], int english, int mathematicsをメンバとする構造体 scoreを定義せよ
# 問題2:以下の5人の情報をもつ配列 seito[5] を、問題1で作成した構造体 score 型を使って宣言せよ。なお、5人の情報は初期値として宣言することにする。
# name english mathematics
# "yamada" 50 70
# "tanaka" 70 60
# "suzuki" 80 70
# "yamamoto" 40 60
# "sakata" 90 80
# 問題3:問題2で初期値を代入した構造体 score 型の構造体配列 seito[5] を宣言し、各メンバ変数をソートする関数を作成せよ。
>>56 % Prologモンテカルロ法で√2の近似値を求める(_試行回数,_除数,X) :- count((for(1,N,_試行回数),U is (random mod _除数) ^ 2,U < _除数 * _除数/ 2),Y), X is Y / (_試行回数 / 2).
>>58 % Prolog 字化けしてしまいました。書き直し。
モンテカルロ法で√2の近似値を求める(_試行回数,_除数,X) :-
count((for(1,N,_試行回数),U is (random mod _除数) ^ 2,U < _除数 * _除数/ 2),Y),
X is Y / (_試行回数 / 2).
http://pc12.2ch.net/test/read.cgi/tech/1276810079/196 # 演習6-1
#
# 複数の文字列を読み込み,それらの文字列を空白を入れて繋ぎ合わせるプログラムを作成せよ.
#
# 【実行例】
#
# 何個の文字列を入力しますか?:3
# 入力文字列[1]:A
# 入力文字列[2]:B
# 入力文字列[3]:C
#
# 結果:A B C
#
# 演習6-3
#
# 入力したDNA塩基配列中にある塩基 t, c, a, gそれぞれの個数をカウントするプログラムを作成せよ.
# 【実行例】
#
# % ./a.out
# tataatccg ← 入力し,リターンを押して ^D
# Thymine (t) : 3
# Cytosine (c) : 2
# Adenine (a) : 3
# Guanine (g) : 1
# %
>>63 % Prolog
'ファイルkadai.txt に記述された数行の数値を表す文字列を読み込み、整数に変更して数値として表示する' :-
get_lines('kadai.txt',_行ならび),
append(_,[_行文字列|R],_行ならび),
整数に変更して(_行文字列,_整数),
write_formatted('%t\n',[_整数]),
R = [].
整数に変更して(_行文字列,_整数) :-
sub_atom(_行文字列,0,1,_,'0'),
atom_codes(_行文字列,Codes),
reverse(Codes,Codes2),
反転した基数コードならびから10進数を得る(8,Codes2,_整数),!.
整数に変更して(_行文字列,_整数) :-
atom_codes(_行文字列,Codes),
reverse(Codes,Codes2),
反転した基数コードならびから10進数を得る(10,Codes2,_整数),!.
反転した基数コードならびから10進数を得る(_,[],0) :- !.
反転した基数コードならびから10進数を得る(_基数,[C|R],M) :-
\+((C >=48,C =< 57)),
反転した基数コードならびから10進数を得る(_基数,R,M),!.
反転した基数コードならびから10進数を得る(_基数,[C|R],M) :-
M0 is C - 48,
反転した基数コードならびから10進数を得る(_基数,R,M2),
M is M2 * _基数 + M0.
# バブルソートでは, 配列のデータがすでに適正な順序, あるいはそれに近い順序で並んでいても # n-1回の走査をしなければならない. すなわち, n(n-1)/2回の比較が行われなければならない. そこで, 各回の走査の終わりに, # 交換が行われたか否かをチェックするようにし, 交換が行われていなければそれ以上走査の必要はないのでソートを完了するようなプログラムを作成しなさい. # sizeofは使わない。 # ↓のような出力結果になるようにする。 # 初期状態: 10, 3, 1, 15, 2, 7 # [1回目の走査] # 1回目の交換: 3, 10, 1, 15, 2, 72回目の交換: 3, 1, 10, 15, 2, 73回目の交換: 3, 1, 10, 2, 15, 74回目の交換: 3, 1, 10, 2, 7, 15 # [2回目の走査] # 1回目の交換: 1, 3, 10, 2, 7, 15 2回目の交換: 1, 3, 2, 10, 7, 15 3回目の交換: 1, 3, 2, 7, 10, 15 # [3回目の走査] # 1回目の交換: 1, 2, 3, 7, 10, 15 # [4回目の走査] # # 最終状態: 1, 2, 3, 7, 10, 15
# 今2つのテキストファイルがあって、内容はおおよそ下のようです # # --------------テキストA------------------- # fcart1 -0.0000000000E+00 -0.0000000000E+00 1.0770536961E-04 # -0.0000000000E+00 -0.0000000000E+00 6.6543134784E-04 # -0.0000000000E+00 -0.0000000000E+00 -7.7313671745E-04 # getden1 0 # ------------------------------------------ # # --------------テキストB-------------------- # xred 0.0 0.0 0.047843858990 # 0.0 0.0 0.000434433306 # 1/3 2/3 -0.011730466739 # #Definition of the planewave basis set # ------------------------------------------ # テキストAの一番右の列の数値3つをそれぞれ上から順番に、テキストBの一番右の列の数値に足したいのですが # どのようにしたらいいでしょうか
>>69 % Prolog (その一)
テキストAの一番右の列の数値3つをそれぞれ上から順番に、テキストBの一番右の列の
数値に足す(_テキストA,_テキストB) :-
get_lines(_テキストA,LinesA),
get_lines(_テキストB,LinesB),
テキストAの一番右の列の数値3つをそれぞれ上から順番に、テキストBの一番
右の列の数値に足す(LinesA,LinesB,LinesC),
put_lines(_テキストB,LineC).
テキストAの一番右の列の数値3つをそれぞれ上から順番に、テキストBの一番右の列の
数値に足す(LinesA,LinesB,LinesC) :-
テキストの一番右の列の数値を切り取る(LinesA,LA),
テキストの一番右の列の数値を切り取る(LinesB,LB),
加算([LA,LB],LC),
テキストBの最終数値要素を置換(LB,LC,LineC).
テキスト一番右の列の数値を切り取る([],[]) :- !.
テキスト一番右の列の数値を切り取る([Line|R1],[V|R2]) :-
split(Line,[ ],L),
数値要素が3個以上(L),
last(L,V),
テキストAの一番右の列の数値を切り取る(R1,R2).
>>69 % Prolog (その二)
テキストBの最終数値要素を置換([],_,[]) :- !.
テキストBの最終数値要素を置換([Line|R1],[V|R2],[LineC|R3]) :-
sPLIT(Line,[ ],L1),
数値要素が3個以上(L1),
length(L1,Len),
findmax(Nth,(
for(1,Nth,Len),
list_nth(Nth,L1,V1),number(V1)),
LastNth),
要素番号によるならびの置換(LastNth,V,L1,L3),
concat_atom(L3,LineC),
テキストBの最終数値要素を置換(R1,R2,R3),!.
テキストBの最終数値要素を置換([Line|R1],L2,[Line|R3]) :-
テキストBの最終数値要素を置換(R1,L2,R3),!.
数値要素が3個以上(L1) :-
count((member(A,L1),number(A)),Count),
Count >= 3,!.
>>69 使用言語:J
マイナス符号を変換しなくてはいけないのがめんどう。
(9!:11)16 NB.表示桁数を16桁にする
load 'strings'
read=: 1!:1
f=: monad define
".>}:{:@cutopen;._2 toJ (read y) rplc '-';'_'
)
(f <'texta.txt') + f <'textb.txt'
0.04795156435961 0.00109986465384 _0.01250360345645
75 :
69 :2010/06/25(金) 08:34:45
>>74 % Prolog
'拡張子が .rb の全てのファイルに対して、#!/usr/bin/env ruby を #!/usr/local/bin/ruby に置換する。ついでに、「ruby」という文字を「perl」に置き換える' :-
shs('ls -N *.cs',Files),
append(_,[File|R],Files),
get_lines(File,Lines),
指定された内容に文字列を置換する(Lines,Lines2),
put_lines(File,Lines2),
R = [].
指定された内容に文字列を置換する([],[]) :- !.
指定された内容に文字列を置換する([Line|R1],[Line2|R2]) :-
sub_atom(Line,_,_,_,A1,'#!/usr/bin/env ruby',A3,L1,L2,L3),
concat_atom([A1,'#!/usr/local/bin/ruby',A3],Line1),
rubyをperlに置換する(Line1,Line2),
指定された内容に文字列を置換する(R1,R2),!.
指定された内容に文字列を置換する([Line|R1],[Line2|R2]) :-
rubyをperlに置換する(Line,Line2),
指定された内容に文字列を置換する(R1,R2).
rubyをperlに置換する(Line,Line2) :-
replace_all(Line,ruby,perl,Line2).
% replace_all/3は
http://nojiriko.asia/prolog/replace_atom.html 参照
>>66 問題文が抜けてしまいました。
#
# 問題
# 適当な数字a,b,cを用いてax^3+bx^2-cx=0なる3次方程式をニュートン・ラフソン法を用いて解く為のプログラムを作成せよ。
#
# 以下は教科書に載っていたx^3-1=0を解く為の参考とするプログラムです。これを今回の問題に当てはめて解くようです。
#
# /* 《 ニュートン・ラフソン法の関数 》 */
# void S_NEWT(int *n,double *x0,double e,int NMAX,double (*FUNC)())
# /* n : スカラー 反復回数 (Out)
# x0 : スカラー 初期値(解) (In/Out)
# e : スカラー 収束判定定数 (In)
# NMAX : スカラー 最大反復回数 (In)
# FUNC : ユーザー定義関数 (In) */
>>66 % Prolog
'適当な数字a,b,cを用いてax^3+bx^2-cx=0なる3次方程式をニュートン・ラフソン法を用いて解く'(_最大反復回数,_収束判定定数,A,B,C,X0,X) :-
Y0 is A * X0 ^ 3 + B * X0 ^ 2 + C * X0,
'3次曲線上の(X0,Y0)が接点となる直線がX座標と交差する(X1,0)は'(1,_最大反復回数,_収束判定定数,A,B,C,X0,Y0,X).
'3次曲線上の(X0,Y0)が接点となる直線がX座標と交差する(X1,0)は'(N,_最大反復回数,_,_,_,X,_,X) :- N > _最大反復回数,!.
'3次曲線上の(X0,Y0)が接点となる直線がX座標と交差する(X1,0)は'(_,_,_収束判定定数,_,_,_,X,_,X) :-
Y =< _収束判定定数,!.
'3次曲線上の(X0,Y0)が接点となる直線がX座標と交差する(X1,0)は'(N,_最大反復回数,_収束判定定数,A,B,C,X0,Y0,X) :-
次のXはX軸との交点のX座標(A,B,C,X0,Y0,_X軸との交点のX座標,Y1),
N2 is N + 1,
'3次曲線上の(X0,Y0)が接点となる直線がX座標と交差する(X1,0)は'(N2,_最大反復回数,_収束判定定数,A,B,C,_X軸との交点のX座標,Y1,X).
次のXはX軸との交点のX座標(A,B,C,X0,Y0,_X軸との交点のX座標,Y1) :-
_傾き is 3 * A * (X0 ^ 2) + 2 * B * X0 + C,
_Y軸との交点のY座標 is Y0 - _傾き * X0,
_X軸との交点のX座標 is (-1) * (_Y軸との交点のY座標) / _傾き,
Y1 is A * _X軸との交点のX座標 ^ 3 + B * _X軸との交点のX座標 ^ 2 + C * _X軸との交点のX座標,!.
http://pc12.2ch.net/test/read.cgi/tech/1276810079/215 # [1] 授業単元: 画像処理
#
# [2] 問題文(含コード&リンク):
# 入力した2値白黒画像をハフ変換して直線および円を検出し、結果を表示するプログラムを作成せよ。
# 直線の式はρ= xcosθ + ysinθを、円の式はr2= (x-a)2 + (y-b)2をそれぞれ使用する。
#
# なお、直線について処理後のρθ平面を濃淡画像として出力せよ。
# 円については処理後のabrパラメータ空間をGnuplotを用いて、
# 1点のエッジに対する軌跡(円錐)と2点以上のエッジに対する軌跡(円錐)を出力せよ。
#
# また、円と直線両方について、3種類以上に閾値を変化させた実験結果を逆変換し、
# その結果を原画像に投影した画像も出力せよ。
>>80 % Prolog
挨拶 :-
'午前四時から正午までは Good Morning! と、正午から午後八時までは Good Afternoon! と、午後八時から午前四時までは Good Evening! と、表示する'.
'午前四時から正午までは Good Morning! と、正午から午後八時までは Good Afternoon! と、午後八時から午前四時までは Good Evening! と、表示する' :-
_時刻 is time,
localtime(_時刻,_年,_月,_日,_曜日番号,_通算日数,_時,_分,_秒),
挨拶を表示する(_時,_分,_秒),!.
挨拶を表示する(_時,_分,_秒) :-
[_時,_分,_秒] @> [4,0,0],
[_時,_分,_秒] @=< [12,0,0],
write(' Good Mornig! \n').
挨拶を表示する(_時,_分,_秒) :-
[_時,_分,_秒] @> [12,0,0],
[_時,_分,_秒] @=< [20,0,0],
write(' Good Afternoon! \n').
挨拶を表示する(_時,_分,_秒) :-
[_時,_分,_秒] @> [20,0,0],
write(' Good Evening! \n').
挨拶を表示する(_時,_分,_秒) :-
[_時,_分,_秒] @=< [4,0,0],
write(' Good Evening! \n').
>>80 使用言語:J
f=: monad define
'Good ',>(3|<.8%~4+3{6!:0''){'Evening!';'Morning!';'Afternoon!'
)
f ''
Good Afternoon!
>>80 使用言語:Io
f := method(
writeln("Good ",list("Evening!","Morning!","Afternoon!")at(((Date hour + 4) / 8) floor % 3))
)
Io> f()
Good Afternoon!
==> nil
>>84 % Prolog
構造定義(成績,成績(_番号,_国語,_数学,_英語)).
構造検査(成績,成績(_番号,_国語,_数学,_英語)) :-
integer(_番号),integer(_国語),integer(_数学),integer(_英語).
'番号 国語 数学 英語のメンバを持っている構造体を作る :-
'番号 国語 数学 英語のメンバを持っている構造体を作る'(1,L).
'番号 国語 数学 英語のメンバを持っている構造体を作る(_,[]) :-!.
'番号 国語 数学 英語のメンバを持っている構造体を作る(N,[[A,B,C]|R]) :-
assertz(成績(N,A,B,C)),
N2 is N + 1,
'番号 国語 数学 英語のメンバを持っている構造体を作る(N2,R).
各教科の平均値と、全平均値を求める(_各教科の平均,_全平均値) :-
findavg([_国語,_数学,_英語],(
成績(_,_国語,_数学,_英語),
_各教科の平均値ならび),
findavg(_個人合計,(
成績(_,_国語,_数学,_英語),
_個人合計 is _国語 + _数学 + _英語),
_全平均値).
>>86 (
>>84 )
% Prolog 述語名の終わりの'が落ちているところがあった。
構造定義(成績,成績(_番号,_国語,_数学,_英語)).
構造検査(成績,成績(_番号,_国語,_数学,_英語)) :-
integer(_番号),integer(_国語),integer(_数学),integer(_英語).
'番号 国語 数学 英語のメンバを持っている構造体を作る' :-
'番号 国語 数学 英語のメンバを持っている構造体を作る'(1,L).
'番号 国語 数学 英語のメンバを持っている構造体を作る'(_,[]) :-!.
'番号 国語 数学 英語のメンバを持っている構造体を作る'(N,[[A,B,C]|R]) :-
assertz(成績(N,A,B,C)),
N2 is N + 1,
'番号 国語 数学 英語のメンバを持っている構造体を作る'(N2,R).
各教科の平均値と、全平均値を求める(_各教科の平均,_全平均値) :-
findavg([_国語,_数学,_英語],(
成績(_,_国語,_数学,_英語),
_各教科の平均値ならび),
findavg(_個人合計,(
成績(_,_国語,_数学,_英語),
_個人合計 is _国語 + _数学 + _英語),
_全平均値).
しまった。境界の時刻の処理ができていません。
>>82 >>85 はボツにしてください。
http://pc11.2ch.net/test/read.cgi/db/1274791771/197 # ・DBMS名とバージョン
# VB2008でOLEDBを使ってOracle10gに繋いでます。
#
# ・テーブルデータ
# どの部品にはどの部品が使われてて〜といううような、
# 部品の構成を表す、下記のような親子関係と必要数のテーブルがあります
# -------------
# OYA KO KAZU
# -------------
# A B 1
# A G 1
# B C 1
# B F 1
# C D 1
# C E 1
# G C 2
# G H 1
#
>>92 のつづきです。
#
# ツリーで表記すると、
# A
# ├B
# │├C
# ││├D
# ││└E
# │└F
# └G
# ├C
# │├D
# │└E
# └H
#
# Aという部品は、BとGの部品で出来ている。
# Bという部品はCとFの部品で出来ている〜という感じです。
#
>>92 >>93 のつづきです。
# ・欲しい結果
# これを階層のレベルと、それぞれの子の合計数を出したい。
# ここでいうBの下のCは1なので、DもEも1だが、
# Gの下のCは2なので、DもEもx2されて2になる
# ----------------
# LV KO GOUKEI
# ----------------
# 1 B 1
# 2 C 1
# 3 D 1
# 3 E 1
# 2 F 1
# 1 G 1
# 2 C 2
# 3 D 2
# 3 E 2
# 2 H 1
#
http://pc11.2ch.net/test/read.cgi/db/1274791771/200 # JDK1.4とオラクル9iです
#
# TESTのテーブルから下の結果を得たいのですが可能でしょうか?
#
# 1カラム目はIDで
# 2カラム目は開始日で
# 3カラム目は終了日です
#
#
# テーブルTEST
# a,20110403,20110611
# b,20110505,20110721
#
# 結果
# a,201104
# a,201105
# a,201106
# b,201105
# b,201106
# b,201107
#
>>80 使用言語:J
分、秒も参照するようにしました。
f=: monad define
'Good ',>(3|<.8%~3+({.>.@+[:*[:+/}.)3 4 5{6!:0''){'Evening!';'Morning!';'Afternoon!'
)
f ''
Good Morning!
>>89 % Prolog
標本値を採取(LX,LY) :-
findall(X,(for(10,N,40),X is N / 10),LX),
findall(Y,(member(V,LX),Y is log(V)),LY).
ラグランジェ補間(X,Y) :-
標本値を採取(LX,LY),
ラグランジェ補間(LX,LY,X,0.0,Y).
ラグランジェ補間(_,_,[],[],_,Y,Y) :- !.
ラグランジェ補間([B|R1],[C|R2],X,A,Y) :-
ラグランジェ補間(LX,[B|R1],X,1.0,U),
A2 is A + U * C,
ラグランジェ補間(R1,R2,X,A2,Y).
ラグランジェ補間([],_,_,U,U) :- !.
ラグランジェ補間([C|R1],[B|R2],X,D,U) :-
\+(R1=R2),!,
D2 is D * (X-C) / (B-C),
ラグランジェ補間(R1,[B|R2],X,D2,U).
ラグランジェ補間([C|R1],[B|R2],X,D,U) :-
ラグランジェ補間(R1,[B|R2],X,D,U).
http://pc12.2ch.net/test/read.cgi/tech/1267796762/186 # 【課題 】ネストを用いて九九を出力するためのプログラムを2種類作成
# 【 補足】出力画面は1行で1*1=1〜1*9、2行目は1*2=2〜9*2となるように表示するプログラムと(下は例)
# 1*1=1 2*1=1 3*1=3 4*1=4 5*1=5 6*1=6 7*1=7 8*1=8 9*1=9
# 1*2=2 2*2=2 3*2=6 4*2=8 5*2=10 6*2=12 7*2=14 8*2=16 9*2=18
# ・
# 1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64 8*9=72
# 1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9*=81
# もうひとつは下記みたいに数字が横3つごとにに出力されるプログラムです
# 1*1=1 2*1=2 3*1=3
# 1*2=2 2*2=4 3*2=6
# ・ ・ ・
# 1*8=8 2*8=16 3*8=24
# 1*9=9 2*9=18 3*9=27
#
# 4*1=4 5*1=5 6*1=6
# 4*2=8 5*2=10 6*2=12
# ・ ・ ・
# 4*8=32 5*8=40 6*8=48
# 4*9=36 5*9=45 6*9=54
#
# 7*1=7 8*1=8 9*1=9
# ・ ・ ・
# 7*9=63 8*9=72 9*9=81
# 行数の関係で・・と省略したところもありますが実際は・を省略せずに作成してください
>>99 使用言語:J
f=:dyad define
7{.(":x),'*',(":y),'=',":x*y
)
NB. p1
;"1|:<@f"0/~>:i.9
1*1=1 2*1=2 3*1=3 4*1=4 5*1=5 6*1=6 7*1=7 8*1=8 9*1=9
1*2=2 2*2=4 3*2=6 4*2=8 5*2=10 6*2=12 7*2=14 8*2=16 9*2=18
:
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
NB. p2
;"1(|:"2)3 3 9$,<@f"0/~>:i.9
1*1=1 2*1=2 3*1=3
1*2=2 2*2=4 3*2=6
:
1*9=9 2*9=18 3*9=27
4*1=4 5*1=5 6*1=6
4*2=8 5*2=10 6*2=12
:
4*9=36 5*9=45 6*9=54
7*1=7 8*1=8 9*1=9
7*2=14 8*2=16 9*2=18
:
7*9=63 8*9=72 9*9=81
>>53 使用言語:J
NB. p1
+/%:>:i.10
22.4683
NB. p2
16babc.de
2748.87
>>99 % Prolog (最初のパターン)
九九 :- 九九([_],[_]).
九九([_,_,_,_,_,_,_,_,_,_],_) :- !.
九九(L1,[_,_,_,_,_,_,_,_,_,_]) :-
write('\n'),
九九([_|L1],[_]),!.
九九(L1,L2) :-
掛け算(L1,L2,LX),
'式をN1*N2=N3で表現する'(L1,L2,LX,N1,N2,N3),
九九(L1,[_|L2]).
掛け算(L1,L2,X) :- list(L1),list(L2),掛け算(L1,L2,[],X).
掛け算([],_,LX,LX) :- !.
掛け算([_|R1],L2,LY,LX) :-
append(L2,LY,LY2),
掛け算(R1,L2,LY2,LX).
'式をN1*N2=N3で表現する'(L1,L2,L3,N1,N2,N3) :-
length(L1,N1),
length(L2,N2),
length(L3,N3),
write_formatted('%d*%d=%2d ',[N1,N2,N3]).
>>99 % Prolog (第二パターン) 変数_にしておくより、具体的なアトムの方が実効速度が100倍も速くなるようなので_をaに変更。
九九_3 :- 九九([a],[a],[a,a,a,a],[a]).
九九([a,a,a,a,a,a,a,a,a,a],_,_,_) :- !.
九九(LK,L11,LK,L2) :-
write('\n'),
九九(L11,L11,LK,[a|L2]).
九九(L1,L11,LK,[a,a,a,a,a,a,a,a,a,a]) :-
九九([a,a,a|L11],[a,a,a|L11],[a,a,a|LK],[a]),!.
九九(L1,L11,LK,L2) :-
掛け算(L1,L2,LX),
'式をN1*N2=N3で表現する'(L1,L2,LX,N1,N2,N3),
九九([a|L1],L11,LK,L2).
>>99 % Prolog length/2 を使うのが不本意なら、
'式をN1*N2=N3で表現する'(L1,L2,L3,N1,N2,N3) :-
割り算(L1,[a,a,a,a,a,a,a,a,a,a],LM1),
ならびによる数表現を数値文字列に変換(LM1,S1),
割り算(L2,[a,a,a,a,a,a,a,a,a,a],LM2),
ならびによる数表現を数値文字列に変換(LM2,S2),
割り算(L3,[a,a,a,a,a,a,a,a,a,a],LM3),
ならびによる数表現を数値文字列に変換(LM3,S3),
write_formatted('%t*%t=%2s ',[S1,S2,S3]),!.
割り算(L1,L2,L) :- list(L1),list(L2),割り算(L1,L2,[],[],L).
割り算([],_,_,U,U) :- !.
割り算(L1,L2,LD1,U,X) :-
append(L2,R1,L1),
割り算(R1,L2,[a|LD1],U,X).
割り算(LM,L2,LD,U,X) :-
割り算(LD,L2,[],[LM|U],X).
>>99 % Prolog (つづき)
ならびと数字の対応([],'0').
ならびと数字の対応([a],'1').
ならびと数字の対応([a,a],'2').
ならびと数字の対応([a,a,a],'3').
ならびと数字の対応([a,a,a,a],'4').
ならびと数字の対応([a,a,a,a,a],'5').
ならびと数字の対応([a,a,a,a,a,a],'6').
ならびと数字の対応([a,a,a,a,a,a,a],'7').
ならびと数字の対応([a,a,a,a,a,a,a,a],'8').
ならびと数字の対応([a,a,a,a,a,a,a,a,a],'9').
ならびによる数表現を数値文字列に変換([],'') :- !.
ならびによる数表現を数値文字列に変換([L|R],_数値文字列) :-
ならびと数字の対応(L,S),
ならびによる数表現を数値文字列に変換(R,_数値文字列2),
concat_atom([S,_数値文字列2],_数値文字列).
>>104 -
>>106 は何をやってるか?
もし、Prologに整数がなかったら、九九表はこのように書く、というのが
>>106 組込述語length/2の第二引数は整数となるから、「整数がない」と言うわけにはいかない。
それでlength/2を排除しようとしている。
>>96 % Prolog
連続した日付の生成(_ID,_年月) :-
'TEST'(_ID,_開始日,_終了日),
sub_atom(_開始日,0,6,_,_開始年月),
sub_atom(_終了日,0,6,_,_終了年月),
年月の生成(_開始年月,_年月,_終了年月).
年月の生成(_開始年月,_,_終了年月) :- _開始年月 @> _終了年月,!.
年月の生成(_開始年月,_開始年月,_終了年月).
年月の生成(_開始年月,_年月,_終了年月) :-
次の年月(_開始年月,_次の年月),
年月の生成(_次の年月,_年月,_終了年月).
次の年月(_年月,_次の年月) :-
sub_atom(_年月,4,2,_,'12'),
sub_atom(_年月,0,4,_,_年),
atom_to_term(_年,_年整数,_),
_年整数2 is _年整数 + 1,
number_chars(_年整数2,Chars),
atom_chars(_次の年,Chars),
concat_atom([_次の年,'01],_次の年月),!.
次の年月(_年月,_次の年月) :-
atom_to_term(_年月,_年月整数,_),
_年月整数2 is _年月整数 + 1,
number_chars(_年月整数2 is Chars),
atom_chars(_次の年月,Chars).
>>109 (
>>96 )
% Prolog 日付ではなかった。述語名を連続した年月の生成に訂正。
連続した年月の生成(_ID,_年月) :-
'TEST'(_ID,_開始日,_終了日),
sub_atom(_開始日,0,6,_,_開始年月),
sub_atom(_終了日,0,6,_,_終了年月),
年月の生成(_開始年月,_年月,_終了年月).
年月の生成(_開始年月,_年月,_終了年月) :-
次の年月(_開始年月,_次の年月),
年月の生成(_次の年月,_年月,_終了年月).
次の年月(_年月,_次の年月) :-
sub_atom(_年月,4,2,_,'12'),
sub_atom(_年月,0,4,_,_年),
atom_to_term(_年,_年整数,_),
_年整数2 is _年整数 + 1,
number_chars(_年整数2,Chars),
atom_chars(_次の年,Chars),
concat_atom([_次の年,'01],_次の年月),!.
次の年月(_年月,_次の年月) :-
atom_to_term(_年月,_年月整数,_),
_年月整数2 is _年月整数 + 1,
number_chars(_年月整数2 is Chars),
atom_chars(_次の年月,Chars).
>>108 % Prolog
'数列 an = n*n とその和をM項目まで表示する'(M) :-
'数列 an = n*n とその和をM項目まで'(M,_数列,_和),
write_formatted('%t 和=%t\n',[_数列,_和]).
'数列 an = n*n とその和をM項目まで'(M,_数列,_和) :-
findall(U,(for(1,N,M),U is N * N),_数列),
加算(_数列,_和_1),
_和 is truncate(_和_1).
'漸化式 a(n) = 2*a(n-1), a1 = 2 で生成される数列をM項目まで表示します'(M) :-
'漸化式 a(n) = 2*a(n-1), a1 = 2 で生成される数列をM項目まで'(M,_数列),
write_formatted('%t\n',[_数列]).
'漸化式 a(n) = 2*a(n-1), a1 = 2 で生成される数列をM項目まで'(M,_数列) :-
findall(U,(for(1,N,M),a(N,U)),_数列).
a(1,2).
a(N,X) :- N1 is N - 1,a(N1,Y),X is 2 * Y.
>>92 % Prolog
部品('A','G',1).
部品('B','C',1).
部品('B','F',1).
部品('C','D',1).
部品('C','E',1).
部品('G','C',2).
部品('G','H',1).
階層のレベルと、それぞれの子の合計数を出力する :-
階層のレベルと、それぞれの子の合計数を出力する(0,'A',_,A,B,C).
階層のレベルと、それぞれの子の合計数を出力する.
階層のレベルと、それぞれの子の合計数を出力する(_階層,_部品,_個数,_階層,_部品,_個数) :-
\+(_階層=0),
write_formatted('%t,%t,%t\n',[_階層,_部品,_個数]),
fail.
階層のレベルと、それぞれの子の合計数を出力する(_階層1,_親1,_,_階層,_親,_個数) :-
部品(_親1,_子,_個数2),
_階層2 is _階層1 + 1,
階層のレベルと、それぞれの子の合計数を出力する(_階層2,_子,_個数2,_階層,_親,_個数).
>>113 % Prolog
'入力した2つの整数の間 (入力した数も範囲に含める) にある「2の倍数でない」かつ「3の倍数でない」かつ「5の倍数でない」の条件を満たす整数を順に表示し,最後にその個数を表示する' :-
入力した2つの整数(N1,N2),
count((for(N1,N,N2),\+(0 is N mod 2),\+(0 is N mod 3),\+(0 is N mod 5),write_formatted('%t ',[N])),Count),
write_formatted('\n個数 = %t\n',[Count]).
入力した2つの整数(N1,N2) :-
催促付き整数入力('開始整数を入力してください : ',N1),
催促付き整数入力('終了整数を入力してください : ',N2).
>>27 使用言語:J
((,'*'&,)&":/,' = '"_,":@(*/))>:i.10
1*2*3*4*5*6*7*8*9*10 = 3628800
>>113 使用言語:J
f=:dyad define
a=.x+i.>:y-x
b=.(0~:*/*2 3 5|/a)#a
smoutput b
smoutput #b
)
1 f 100
1 7 11 13 17 19 23 29 31 37 41 43 47 49 53 59 61 67 71 73 77 79 83 89 91 97
26
http://pc12.2ch.net/test/read.cgi/tech/1267796762/199 # 【 課題 】下記参照です。
# 【 形態 】1. Javaアプリケーション(main()で開始)/
# 【 期限 】6/29
# 【 Ver 】"1.6.0_20"
# 【 補足 】丸投げです。よろしくお願いします。
#
# キーホ゛ート゛から整数(0-100)をいくつか入力し、終わった時点で、それらの最大値・最小値・平均を表示させよう。
# 「!」の入力で処理を終了する。
# 数値の入力のたびにすべきこと:
# 最大値と最小値の更新
# 入力の総和に加算
# 入力の個数を1増加
#
http://pc12.2ch.net/test/read.cgi/tech/1276810079/255 # 1] 授業単元:情報処理学
# [2] 問題文(含コード&リンク):
# 1次元配列に34 57 45 21 89 63 39 48 78 68 76 84 92 53 62 のデータをセットして、
# これらの平均値を求めよ。さらにint eval[3]という1次元配列を用意して
# eval[0]には0〜60の数の個数
# eval[1]には61〜80の数の個数
# eval[2]には81〜100の数の個数
# を格納するようにし、それらを出力するプログラムを作成せよ。(配列、for文、if文を使って)
>>117 % Prolog (その一)
'キーホ゛ート゛から整数(0-100)をいくつか入力し、終わった時点で、それらの最大値・最小値・平均を表示させよう。「!」の入力で処理を終了する。'((-1),_度数,_合計値,_最大値,_最小値) :-
'終わった時点で、それらの最大値・最小値・平均を表示させよう。'(_度数1,_合計値,_最大値,_最小値).
'キーホ゛ート゛から整数(0-100)をいくつか入力し、終わった時点で、それらの最大値・最小値・平均を表示させよう。「!」の入力で処理を終了する。'(N1,_度数1,_合計値1,_最大値1,_最小値1) :-
N1 < _最小値1,
_度数2 is _度数 + 1,
_合計値2 is _合計値1 + N1,
'キーホ゛ート゛から整数(0-100)を入力し'(N2),
'キーホ゛ート゛から整数(0-100)をいくつか入力し、終わった時点で、それらの最大値・最小値・平均を表示させよう。「!」の入力で処理を終了する。'(N2,_度数2,_合計値2,_最大値1,N1),!.
'キーホ゛ート゛から整数(0-100)をいくつか入力し、終わった時点で、それらの最大値・最小値・平均を表示させよう。「!」の入力で処理を終了する。'(N1,_度数1,_合計値1,_最大値1,_最小値1) :-
N1 > _最大値1,
_度数2 is _度数 + 1,
_合計値2 is _合計値1 + N1,
'キーホ゛ート゛から整数(0-100)を入力し'(N2),
'キーホ゛ート゛から整数(0-100)をいくつか入力し、終わった時点で、それらの最大値・最小値・平均を表示させよう。「!」の入力で処理を終了する。'(N2,_度数2,_合計値2,N1,_最小値1),!.
'キーホ゛ート゛から整数(0-100)をいくつか入力し、終わった時点で、それらの最大値・最小値・平均を表示させよう。「!」の入力で処理を終了する。'(N1,_度数1,_合計値1,_最大値1,_最小値1) :-
_度数2 is _度数 + 1,
_合計値2 is _合計値1 + N1,
'キーホ゛ート゛から整数(0-100)を入力し'(N2),
'キーホ゛ート゛から整数(0-100)をいくつか入力し、終わった時点で、それ らの最大値・最小値・平均を表示させよう。「!」の入力で処理を終了する。'(N2,_度数2,_合計値2,_最大値1,_最小値1),!.
>>117 % Prolog (その二)
'終わった時点で、それらの最大値・最小値・平均を表示させよう。'(_度数1,_合計値1,_最大値1,_最小値1) :-
_平均値 is _合計値 / _度数,
write_formatted('最大値=%t,最小値=%t,平均値=%t\n',[_最大値,_最小値,_平均値]),!.
'キーホ゛ート゛から整数(0-100)を入力し'(N) :-
write('整数(0-100)を入力してください : ',
get_line(Line),
'「!」の入力で処理を終了する。'(Line,N).
'「!」の入力で処理を終了する。'((!),(-1)) :- !.
'「!」の入力で処理を終了する。'(Line,N) :- atom_to_term(Line,N,_).
>>119 % Prolog にとって不自然な部分排除した。構造体などの課題もこのように改変して答える方が本当は良いのだろう。
'1次元配列に34 57 45 21 89 63 39 48 78 68 76 84 92 53 62 のデータをセットして、これらの平均値を求めよ'(L,_平均値) :-
'1次元配列に34 57 45 21 89 63 39 48 78 68 76 84 92 53 62 のデータをセットして'(L),
avg(L,_平均値).
'1次元配列に34 57 45 21 89 63 39 48 78 68 76 84 92 53 62 のデータをセットして'(L) :-
split('34 57 45 21 89 63 39 48 78 68 76 84 92 53 62',[','],L).
'1次元配列に34 57 45 21 89 63 39 48 78 68 76 84 92 53 62 のデータをセットして、0〜60の数の個数 61〜80の数の個数 81〜100の数の個数 を集計して出力する' :-
'1次元配列に34 57 45 21 89 63 39 48 78 68 76 84 92 53 62 のデータをセットして'(L),
'0〜60の数の個数 61〜80の数の個数 81〜100の数の個数 を集計して出力する'(L,0,0,0),!.
>>119 % Prolog (つづき)
'0〜60の数の個数 61〜80の数の個数 81〜100の数の個数 を集計して出力する'([],_0〜60の数の個数,_61〜80の数の個数,_81〜100の数の個数) :-
write_formatted('0〜60の数の個数=%t\n',[_0〜60の数の個数]),
write_formatted('61〜80の数の個数=%t\n',[_61〜80の数の個数]),
write_formatted('81〜100の数の個数=%t\n',[81〜100の数の個数]),!.
'0〜60の数の個数 61〜80の数の個数 81〜100の数の個数 を集計して出力する'([N|R],_0〜60の数の個数_1,_61〜80の数の個数,_81〜100の数の個数) :-
N =< 60,
_0〜60の数の個数_2 is_0〜60の数の個数_1 + 1,
'0〜60の数の個数 61〜80の数の個数 81〜100の数の個数 を集計して出力する'(R,_0〜60の数の個数_2,_61〜80の数の個数,_81〜100の数の個数),!.
'0〜60の数の個数 61〜80の数の個数 81〜100の数の個数 を集計して出力する'([N|R],_0〜60の数の個数,_61〜80の数の個数_1,_81〜100の数の個数) :-
N >= 61,N =< 80,
_61〜80の数の個数_2 is_61〜80の数の個数_1 + 1,
'0〜60の数の個数 61〜80の数の個数 81〜100の数の個数 を集計して出力する'(R,_0〜60の数の個数,_61〜80の数の個数_2,_81〜100の数の個数),!.
'0〜60の数の個数 61〜80の数の個数 81〜100の数の個数 を集計して出力する'([N|R],_0〜60の数の個数,_61〜80の数の個数,_81〜100の数の個数_1) :-
N >= 81,N =< 100,
_81〜100の数の個数_2 is_81〜100の数の個数_1 + 1,
'0〜60の数の個数 61〜80の数の個数 81〜100の数の個数 を集計して出力する'(R,_0〜60の数の個数,_61〜80の数の個数,_81〜100の数の個数_2),!.
>>118 % Prolog
キーボードから入力された値が素数であるかどうかを判別する :-
get_integer(N),
素数であるかどうかを判別する(N).
素数であるかどうかを判別する(N) :-
素数ではない(N,_最小因子),
write_formatted('%tは素数ではありません。最小因子は%tです。\n',[N,_最小,!.
素数であるかどうかを判別する(N) :-
write_formatted('%tは素数です。\n',[N]).
素数ではない(N,_最小因子) :-
N2 is N // 2,
for(2,M,N2),
0 is N mod M,
_最小因子 = M,!.
>>118 使用言語:J
f=:monad define
a=.q:y
if. 1=#a do.
smoutput (":y),' は素数です。'
else.
smoutput (":y),' は素数ではありません。最小因子は ',(":{.a),' です。'
end.
)
f 7
7 は素数です。
f 77
77 は素数ではありません。最小因子は 7 です。
>>119 使用言語:J
data=: 34 57 45 21 89 63 39 48 78 68 76 84 92 53 62
eval=: +/"1=/:~data{61 20 20 # 0 1 2
eval
7 5 3
>>129 % Prolog
'2つの自然数 n と m を入力し、その積 n×m を たし算のみで計算する'(_n,0,0) :- !.
'2つの自然数 n と m を入力し、その積 n×m を たし算のみで計算する'(_n,_m,X) :-
_m_1 is _m - 1,
'2つの自然数 n と m を入力し、その積 n×m を たし算のみで計算する'(_n,_m_1,Y),
X is Y + _n.
>>131 まだつづきがありました
#
# n+1 m=0 and n>_0
# ack(m,n)= ack(m-1,1) m>0 and n=0
# ack(m-1,ack(m,n-1)) m>0 and n>0
http://pc12.2ch.net/test/read.cgi/tech/1267796762/200 # [課題]携帯のiアプリをSTARを使い作成しています。
# 学校のホームページに載っている休講情報に接続して、それから先生の名前と日にちだけ取り出す方法が知りたいです。
# 休講情報は
#
# 6月
# 24日
# 野口 文子 先生
# 山下 紗枝 先生
# 井上 恵子 先生
#
# 25日
# 山下 紗枝 先生
#
# 26日
# ・
# ・
# ・
#
# のようになっています。
# 先生の名前の前の全角スペースを目印にして、配列に入れるそうなのですが・・・。
>>131 使用言語:J
ack=: dyad define M.
if. x=0 do. >:y
elseif. y=0 do. (<:x) ack 1
elseif. do. (<:x) ack x ack <:y
end.
)
3 ack 1
13
3 ack 8
2045
>>131 % Prolog
アッカーマン関数(0,N,X) :-
N > 0,
X is N + 1.
アッカーマン関数(M,0,X) :-
M > 0,
M_1 is M - 1,
アッカーマン関数(M_1,1,X).
アッカーマン関数(M,N,X) :-
M > 0,
N > 0,
M_1 is M - 1,
N_1 is N - 1,
アッカーマン関数(M,N_1,Y),
アッカーマン関数(M_1,Y,X).
>>129 使用言語:J
大きい数の方を小さい数だけコピーしてリストをつくり合計。
f=: dyad define
if. 0=x<.y do. 0 else. x(<.+/@#>.)y end.
)
628 f 2010
1262280
12 f 0
0
>>131 使用言語:maxima
なんかあっさりスタックオーバーフローになるなあ。
ack(m,n):=
if m=0 then n+1
elseif n=0 then ack(m-1,1)
else ack(m-1,ack(m,n-1));
(%i7) ack(3,4);
(%o7) 125
(%i8) ack(3,5);
Maxima encountered a Lisp error:
Error in PROGN [or a callee]: Bind stack overflow.
Automatically continuing.
To reenable the Lisp debugger set *debugger-hook* to nil.
>>129 使用言語:maxima
f(a,b):=(x:min(a,b),y:max(a,b),sum(y,i,1,x));
(%i19) f(628,2010);
(%o19) 1262280
(%i20) f(2,0);
(%o20) 0
>>118 使用言語:maxima
f(x):=(
a:ifactors(x),
if length(a)=1 then
printf(true,"~d は素数です。~%",x)
else
printf(true,"~d は素数ではありません。最小因子は ~d です。~%",x,a[1][1])
);
(%i6) f(7);
7 は素数です。
(%o6) false
(%i7) f(77);
77 は素数ではありません。最小因子は 7 です。
(%o7) false
http://pc12.2ch.net/test/read.cgi/tech/1276810079/286 # [1] プログラミング1
# [2] 現在のインターネットを実現しているTCP/IP通信プロトコルでは主にIPv4
# を用いており、コンピュータを一意に識別するために32ビットのIPアドレスを
# 用いている。これを踏まえ、IPアドレスの4つの数字を入力させ、これらを32ビットの
# データ型であるunsigned int型の変数にIPアドレスを示す2進数の数値として保存せよ。
# 保存したIPアドレスがunsigned intの整数値として解釈するといくつとなるか表示する
# プログラムを作成せよ。
>>27 使用言語:maxima
(%i13) printf(true,"10 = ~d~%",product((printf(true,"~d*",i),i),i,1,9)*10);
1*2*3*4*5*6*7*8*9*10 = 3628800
(%i24) printf(true,"~{~a~^*~} = ~d~%",makelist(i,i,1,10),10!);
1*2*3*4*5*6*7*8*9*10 = 3628800
http://pc12.2ch.net/test/read.cgi/tech/1276810079/304 # 次レスにまとめても規制されてしまったので・・・・
# [2] 問題文:[1],[2]のプログラムを作成せよ。
# [1]多項式の次数nと係数a,(i=0,1・・・・,n)を入力し、
# その多項式f(x)=a_nx^2+a_n-1x^n-1+・・・+a_2x^2+a_1x+a_0と
# その微分の多項式f'(x)を出力するプログラムを作成せよ。
# ただし、nはint型,a_iはdouble型の配列とせよ。n<100と仮定してよい。
# 以下に入力例を示す
# n=5
# a5=1
# a4=0
# a3=2
# a2=0
# a1=3
# a0=0
# f(x)=x^5+2x^3+3x
# f'(x)=5x^4+6x^2+3
#
#
http://pc12.2ch.net/test/read.cgi/tech/1276810079/305 # [2]以下の要領で、平均点、分散、標準偏差、最小値、最大値を求めるプログラム
# を作成せよ。
# (1)100人分の点数(int型)を記憶するための配列変数aを定義する
# (2)人数(int型)を記憶するための変数nを定義する。
# (3)人数nの初期値を0とする
# (4)点数をa[n]に入力する
# (5)点数が負の数ならば終了する
# (6)人数nを1つ増やす
# (7)全員の点数を空白で区切って表示する。例:83 52 64
# (8)平均点を出力する
# (9)分散を出力する
# (10)標準偏差を出力する
# (11)最小値を出力する
# (12)最大値を出力する
# (13)(4)へ戻る
# ※標準ライブラリのsqrt関数を使わずニュートン法によって平方根を
# 求める自作の関数を使え。
# ※平均点、分散、標準偏差を求めるとき、キャスト演算子を用いてdouble型へ
# 型変換せよ。
http://pc11.2ch.net/test/read.cgi/db/1274791771/231 # tbl1にnum1,num2,id1,id2,id3
# tbl2にid,name,ssというフィールドがあるとして
# SELECT name, num1, num2, id1, id2, id3, time FROM tbl1, tbl2
# WHERE num1 = 1
# AND id1 = ( SELECT id FROM tbl2 WHERE ss = "monga")
# 上記のようなSQLを
# 特定のフィールドが他の行と重複してたら抜かすというのはどうやればいいでしょうか?
# 単にdistinctつけるだけだとどれかひとつでも重複していなかったら抽出されますよね。
# id1,id2,id3が他のレコードのid1,id2,id3と重複してたら
# 検索結果に入れないみたいな感じにしたいのですが。
# MYSQLです。
>>140 % Prolog 多分ほとんどの処理系で符号なし整数はサポートされていないと思う。ここでは符号付き整数で考えてみる。
'IPアドレスを32ビットの符号付き整数データとして保持する'([A1,A2,A3,A4],_アドレス) :-
var(A1),var(A2),var(A3),var(A4),_アドレス >= 0,
A1 is _アドレス // 16777216,
M1 is _アドレス mod 16777216,
A2 is M1 // 65536,
M2 is M1 mod 65536,
A3 is M2 // 256,
A4 is M2 mod 256,!.
'IPアドレスを32ビットの符号付き整数データとして保持する'([A1,A2,A3,A4],_アドレス) :-
var(A11),var(A22),var(A33),var(A44),_アドレス < 0,
A11 is _アドレス // -16777216,
M1 is _アドレス mod -16777216,
A22 is M1 // -65536,
M2 is M1 mod -65536,
A33 is M2 // ((-1) * 256),
A44 is M2 mod 256,
A1 is 255 - A11,A2 is 255 - A22,A3 is 255 - A33,A4 is A44 + 256.!.
'IPアドレスを32ビットの符号付き整数データとして保持する'([A1,A2,A3,A4],_アドレス) :-
A1 > 127,A11 is A1 - 256,
_アドレス is A11 * 256 * 256 * 256 + A2 * 256 * 256 + A3 * 256 + A4,!.
'IPアドレスを32ビットの符号付き整数データとして保持する'([A1,A2,A3,A4],_アドレ
ス) :-
A1 < 128,
_アドレス is A1 * 256 * 256 * 256 + A2 * 256 * 256 + A3 * 256+ A4,!.
>>144 % Prolog
'多項式の次数nと係数a,(i=0,1・・・・,n)を入力し、その多項式f(x)=a_nx^n+a_n-1x^n-1+・・・+a_2x^2+a_1x+a_0とその微分の多項式f'(x)を出力する' (_n,_係数ならび) :-
findall(S,(
append(L0,[A|R],_係数ならび),
length(R,N),
項文字列の生成(A,N)),
L1),
多項式に整形(L1,L2),
concat_atom(L2,_多項式).
項文字列の生成(0,_,'') :- !.
項文字列の生成(A,0,S) :- write_formatted_atom('%t',[A],S),!.
項文字列の生成(A,1,S) :- A > 1,write_formatted_atom('%tx',[A],S),!.
項文字列の生成(1,1,x) :- !.
項文字列の生成(A,N,S) :- write_formatted_atom('%tx^%t',[A,N],S),!.
多項式に整形(L1,_多項式) :-
加減算符号を付加(L1,L2),
先頭項のプラスは削除(L2,L3),
concat_atom(L3,_多項式),!.
加減算符号を付加([],[]) :- !.
加減算符号を付加([A|R1],[A|R2]) :- sub_atom(A,0,1,_,'-'),加減算符号を付加(R1,R2,!.
加減算符号を付加([A|R1],['+',A|R2]) :- 加減算符号を付加(R1,R2),!.
先頭項のプラスは除去(['+'|L],L) :- !.
先頭項のプラスは除去(L,L).
>>151 % Prolog
'複数の文字列を読み込み,さらに,それらの文字列を繋ぎ合わせる順番を入力し結果を出力する' :-
催促付き整数入力('文字列の個数を予約してください : ',N),
findall(S,(
for(1,_,N),write_formatted('入力文字列[%t] : ',[M]),
get_line(S)),
_入力文字列ならび),
write('繋ぎ合わせる順番を入力してください。\n'),
findall(N2,(for(1,_,N),get_integer(N2)),_結合順序指定ならび),
文字列のならびの並べ替え(_入力文字列ならび,_結合順序指定ならび,_指定順序に並び替えられたならび),
concat_atom(_指定順序に並べ替えられたならび,_繋ぎ合わされた文字列),
write_formatted('%t\n',[_繋ぎ合わされた文字列]).
文字列のならびの並べ替え(_,[],[]) :- !.
文字列のならびの並べ替え(_選択対象ならび,[N|R2],[_取り出し文字列|R3]) :-
list_nth(N,_選択対象ならび,_取り出し文字列),
文字列のならびの並べ替え(_選択対象ならび,R2,R3).
>>151 % Prolog [2]
'入力した文字配列中に,abcという並びがいくつあるか調べる' :-
get_chars(Chars),
count(append(_,[a,b,c|_],Chars),Count),
write_formatted('#abc = %t\n'[Count]).
>>148 % Prolog
'id1,id2,id3が他のレコードのid1,id2,id3と重複してたら検索結果に入れない'([_name,_num1,_num2,_id1,_id2,_id3]) :-
findall([_name,_num1,_num2,_id1,_id2,_id3],(
tbl1(num1,_num2,_id1,_id2,_id3),
num1 = 1,
tbl2(id1,_name,monga)),
L1),
findsetof([_id1,_id2,_id3],member([_,_,_,_id1,_id2,_id3],L1),L2),
findall([_id1,_id2,_id3],(
count((member([_id1,_id2,_id3],L2),1)),
L2),
member([_name,_num1,_num2,_id1,_id2,_id3],L1),
member([_id1,_id2,_id3],L2).
>>147 % Prolog
program :-
user_parameters([_データファイル,_出力ファイル]),
get_chars(_データファイル,Chars),
put_chars(_出力ファイル,Chars).
http://pc12.2ch.net/test/read.cgi/tech/1276810079/331 # [1] 授業単元:一般情報処理
# [2] 問題文(含コード&リンク):次のような動作をするプログラムを作成せよ。
# 配列内のデータの最小値を返す。int min() 配列内のデータの最大値を返す。int max()
# 配列内のデータの平均値を返す。double mean() 配列内のデータの標準偏差を返す。double stdev()
# ただしmain関数は次のものを使うこと。
# int main(void){
# int a[15]={81,36,45,67,73,98,62,56,77,61,65,70,25,51,18};
# printf("min=%d\n",min(15,a));
# printf("max=%d\n",max(15,a));
# printf("average=%lf\n",mean(15,a));
# printf("standard deviation=%lf\n",stdev(15,a));
# return 0; }
# さらに、配列a[]の各要素の偏差値を表示するプログラムを作成せよ
#
>>157 % Prolog
平均値([],N,S,M) :- M is S / N,!.
平均値([A|R],N,S,M) :- S1 is S + A,平均値(R,N,S1,M) .
平均値(L,M) :- length(L,N),平均値(L,N,0.0,M) .
最小値最大値([A|R],_最小値,_最大値) :- 最小値最大値(R,A,A,_最小値,_最大値).
最小値最大値([],_最小値,_最大値,_最小値,_最大値) :- !.
最小値最大値([A|R],_最小値1,_最大値1,_最小値,_最大値) :- A @> _最大値,最小値最大値(R,_最小値1,A,_最小値,_最大値),!.
最小値最大値([A|R],_最小値1,_最大値1,_最小値,_最大値) :- A @< _最小値,最小値最大値(R,A,_最大値1,_最小値,_最大値),!.
最小値最大値([A|R],_最小値1,_最大値1,_最小値,_最大値) :- 最小値最大値(R,_最小値1,_最大値1,_最小値,_最大値),!.
標準偏差(L,V) :- length(L,N),平均値(L,M),標準偏差(L,N,M,0.0,V).
標準偏差([],N,M,S,V) :- V is sqrt(S / (N - 1)),!.
標準偏差([A|R],N,M,S,V) :- S1 is (A - M) ^ 2,S2 is S + S1,標準偏差(R,N,M,S2,V).
偏差値(_標本値,_平均値,_標準偏差,_偏差値) :- _偏差値 is 10 * (_標本値 - _平均値 ) / _標準偏差 + 50.
偏差値(L,_偏差値ならび) :-
平均値(L,_平均値),
標準偏差(L,_標準偏差),
findall(_偏差値,(member(_値,L) ,偏差値(_値,_平均値,_標準偏差,_偏差値)),_偏差値ならび).
http://pc12.2ch.net/test/read.cgi/tech/1276810079/335 # [1] 授業単元:プログラミング演習
# [2] 問題文(含コード&リンク):ファイルに保存された会員情報を指定された項目をキーとしてソートするプログラムを作成する.
# 出力形式は,入力データと同じ,つまり1行に1人分のデータを格納し,各項目間はカンマで区切るものとする.
# また,ソート済みのデータはファイルではなく標準出力に出力するものとする.
# 整数型のデータについては数値として,文字列型のデータについては大文字/小文字を区別せずにソートをすること.
# ソートアルゴリズムはこれまでの演習で使用したもの,していないものに関わらず,何を用いてもよい.
#
# また,会員数は最大で20,000人と仮定してもよい.
#
# 会員情報の入ったファイルのファイル名,キーとなる項目,正順か逆順かの指定はプログラム実行時の引数として与える.第一引数が会員情報の入ったファイル名,第二引数が項目番号(表1参照),第三引数がソート方法(0なら昇順,1なら降順)とする.
nt)
# 州 5 文字列(最大で50文字)
# 郡 6 文字列(最大で50文字)#
# 表1: データ型 項目名 項目番号 型
# 会員ID 1 整数(int)
# 姓 2 文字列(最大で50文字)
# 名 3 文字列(最大で50文字)
http://pc12.2ch.net/test/read.cgi/tech/1276810079/340 # [1] 授業単元: プログラミング開発基礎
# [2] 問題文 複数ありますのでこちらで
#
http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10764.txt # 問題1
# 1 問題1読み込んで,その数が10 で割り切れるかどうかを表示するプログラムを作成
# 整数値を読み込んで,その数が10 で割り切れるかどうかを表示するプログラムを作成せよ.,表示後に,もう一度続けるかの確認を促し,それに応じて何度でも繰り返せる# なお,表示後に,もう一度続けるかの確認を促し,それに応じて何度でも繰り返せるようにすること
# 2 問題2
# 2 問題2数値を読み込んで,その桁数を表示するプログラムを作成せよ.
# 非負の整数値を読み込んで,その桁数を表示するプログラムを作成せよ.と.
# なお,負の値を読み込んだ場合は,再入力を促すメッセージを表示すること.
# 3 問題3
# 3 問題3数値を読み込んで,小さい方の数以上で大きい方の数以下の整数を全て加え
# 二つの整数値を読み込んで,小さい方の数以上で大きい方の数以下の整数を全て加えた値を表示するプログラムを作成せよ.
# 4 問題4読み込むまで次々と整数値を読み込んでいき,合計値および平均値を表示する
# 9999 を読み込むまで次々と整数値を読み込んでいき,合計値および平均値を表示するプログラムを作成せよ.なお,最後に読み込んだ9999 は合計には加えないものとする
http://pc12.2ch.net/test/read.cgi/tech/1266565626/675 # ../test/read.cgi/tech/1266565626/673
# ・とあるディレクトリd0以下に存在する全てのディレクトリをなぞる。
#
# ・このとき、今位置するディレクトリdnの相対的な深さをdとして、
# d個のピリオドをディレクトリdnの名前の前に足した文字列 をファイルFに出力する。
#
# ・また、このとき、今位置するディレクトリdnにテキストファイルがあれば、
# d+1個のピリオドをテキストファイルtnの名前の前に足し、拡張子.txtを除いた文字列 をファイルFに出力する。
# ・さらに、そのテキストファイルtnの内容をそのままファイルFに出力する。
# テキストファイルtnの内容の各行頭には、ピリオドはつけない。
# テキストファイルtnの内容のとある行頭にピリオドがある場合は、ピリオドの前に半角空白を入れる。
>>161 % Prolog [1] [2]
'整数値を読み込んで,その数が10 で割り切れるかどうかを表示する' :-
催促付き整数入力('整数値を入力してください : ',N),
'10で割り切れるか判定する'(N),
write('入力を続けますか y or n : '),get_line(Line),
Line = y,
'整数値を読み込んで,その数が10 で割り切れるかどうかを表示する'.
'整数値を読み込んで,その数が10 で割り切れるかどうかを表示する'.
'10で割り切れるか判定する'(N) :- 0 is N mod 10,
write('あなたの入力した数%tは10で割り切れます\n',[N]),!.
'10で割り切れるか判定する'(N) :-
write('あなたの入力した数%tは10で割り切れません\n',[N]),!.
'非負の整数値を読み込んで,その桁数を表示する' :-
催促付き整数入力('非負の整数値を入力してください : ',N),N >= 0,
入力された整数の桁数を表示する(1,N),
write('入力を続けますか y or n : '),get_line(Line),
Line = y,
'非負の整数値を読み込んで,その桁数を表示する'.
'非負の整数値を読み込んで,その桁数を表示する'.
入力された整数の桁数を表示する(M,N) :-
truncate(10 ^ M) > N,write('入力された非負整数は%桁です\n',[M]),!.
入力された整数の桁数を表示する(M1,N) :- M2 is M1 + 1,入力された整数の桁数を表示
する(M2,N).
>>161 % Prolog 問題3 問題4
二つの整数値を読み込んで,小さい方の数以上で大きい方の数以下の整数を全て加えた値を表示する :-
write('整数値をカンマで区切り二つ読み込みます : '),
get_split_line([','],[N1,N2]),
小さい順に(N1,N2,N3,N4),
findsum(N,for(N3,N,N4),Sum1),
Sum is truncate(Sum1),
write_formatted('%t以上%t以下のすべての整数の和は%tです。\n',[N3,N4,Sum]).
小さい順に(N1,N2,N1,N2) :- N1 =< N2,!.
小さい順に(N1,N2,N2,N1) :- N1 > N2,!.
'9999 を読み込むまで次々と整数値を読み込んでいき,合計値および平均値を表示する':-
findall(N,(repeat,get_integer(N),(N=9999,!,fail;true)),L),
length(L,Len),\+(Len=0),
合計値および平均値(L,Len,0,_合計値,_平均値),
write_formatted('合計値 = %t, 平均値 = %t\n',[_合計値,_平均値]).
合計値および平均値([],Len,_合計値,_合計値,_平均値) :- _平均値 is _合計値 / Len,!.
合計値および平均値([N|R],Len,_合計値1,_合計値,_平均値) :-
_合計値2 is _合計値 + N,
合計値および平均値(R,Len,_合計値2,_合計値,_平均値).
>>168 % Prolog
二分法による平方根の計算(X,Y) :-
S1 is X / 2,
二分法による平方根の計算(1,X,S1,Y).
二分法による平方根の計算(N,X,S1,Y) :-
Y is X / 2 + S1,
write_formattd('%t %10.4f\n',[N,Y]),
0.0001 > abs(Y - S1),!.
二分法よる平方根の計算(N1,X,S1,Y) :-
S2 is S / 2 + S1,
N2 is N1 + 1,
二分法による平方根の計算(N2,X,S2,Y).
http://pc12.2ch.net/test/read.cgi/tech/1276810079/357 # [1] 授業単元:プログラミング
# [2] 問題文(含コード&リンク):
#
http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10767.txt #
# 登録番号(int no)と名前(char *name)と年齢(int age)を含む構造体person型のポインタ変数を宣言し,
# 登録人数分だけの動的メモリ確保をせよ. そして, データをファイルから入力せよ. (malloc関数を使用すること)
# ファイルの形式は, 先頭に登録する人数とし, そのあとに人数分のデータを登録番号,名前, 年齢の順に書いていく
# (下の例を参照. 登録番号は入力順に1,2,3,4,5, …とする. そして, 入力した全員データを表示せよ.
#
# (ファイルの例)
# 3
# 1 田中 20
# 2 大田 40
# 3 井上 35
>>170 % Prolog データファイルを作ることも問題のうちなのかな。例によってポインター云々は無視。
ファイル作成(_ファイル名) :-
write('作成するデータ数を入力してください : '),
get_integer(N),
tell(_ファイル名),
write_formatted('%t\n',[N]),
for(1,M,N),
write('名前と年齢をカンマまたはスペース区切りで入力してください : '),
get_split_line([',',' '],[_名前,_年齢]),
write_formatted('%t %t %t\n',[N,_名前,_年齢]),
M = N,
told.
ファイルから読み取ったデータを登録する(_ファイル名) :-
get_split_lines(_ファイル名,[' '],LL),
LL = [_|LL2],
'この場合、要素数(構造体の数)はいらないから',
append(_,[[_登録番号,_名前,_年齢]|R],LL2),
assertz(人物(_登録番号,_名前,_年齢)),
R = [].
'この場合、要素数(構造体の数)はいらないから'.
>>170 % Prolog
>>171 はナンセンスで、Prologのプログラマなら、
ファイル作成(_ファイル名) :-
write('作成するデータ数を入力してください : '),
get_integer(N),
tell(_ファイル名),
for(1,M,N),
write('名前と年齢をカンマまたはスペース区切りで入力してください : '),
get_split_line([',',' '],[_名前,_年齢]),
write_formatted(人物('%q,%q,%q).\n',[N,_名前,_年齢]),
M = N,
told.
ファイルから読み取ったデータを登録する(_ファイル名) :-
consult(_ファイル名).
>>170 % Prolog (その一) 整列と併合を除く外殻だけ。
オンメモリ整列限界数(1000).
ファイルに保存された会員情報を指定された項目をキーとしてソートする(_対象ファイル,_鍵項目番号,_ソート方法) :-
オンメモリ整列限界数(_オンメモリ整列限界数),
open(_対象ファイル,read,Input),
ふたつの仮ファイルの取得と交互からくり生成,
入力出力ファイルを交互しながらの繰り返し(_,_仮出力ファイル,InputT,OutputT),
対象ファイルから読み込む(Input,_オンメモリ整列限界数,Lines,_診断),
鍵・昇降順・指定整列(Lines,_鍵項目番号,_ソート方法,_整列されたLines),
鍵項目番号とソート方法をしてファイル併合(_整列されたLines,_鍵項目番号,_ソート方法,InputT,OutputT),
_診断 = end_of_file,close(Input),
仮出力ファイルの内容を整理しながら標準出力に表示する(_仮出力ファイル,_鍵項目番号).
入力出力ファイルを交互しながらの繰り返し(_仮ファイルA,_仮ファイルB,InputT,OutputT) :-
仮ファイルからくり(_仮ファイルA,_仮ファイルB),
open(_仮ファイルA,read,InputT),
open(_仮ファイルB,write,OutputT).
仮ファイルからくり(X) :- 仮ファイルからくり(X).
ふたつの仮ファイルの取得と交互からくり生成 :-
tmpnam(_仮ファイル1),open(_仮ファイル1,write,Output1),close(Output1),
tmpnam(_仮ファイル2),opne(_仮ファイル2,write,Output2),close(Output2),
asserta(仮ファイルからくり(_仮ファイル2,_仮ファイル1)),
asserta(仮ファイルからくり(_仮ファイル1,_仮ファイル2)).
>>200 % Prolog
学校のホームページに載っている休講情報に接続して、それから先生の名前と日にちだけ取り出す(URL,_休講情報ならび) :-
w3c(URL,Lines),
先生の名前と日にちだけ取り出す(Lines,_休講情報ならび),!.
先生の名前と日にちだけ取り出す(Lines,_休講情報ならび) :-
append(L0,[A|R1],Lines),
sub_atom(A,_,2,_,先生),
月日を取り出す(L0,_月,_日),
ある日の休講情報ならびを得る([A|R1],_月,_日,_ある日の休講となる情報ならび,_残りならび),
先生の名前と日にちだけ取り出す(_残りならび,R),
append(_ある日の休講となる情報ならび,_休講情報ならび),!.
先生の名前と日にちだけ取り出す(_,[]) :- !.
月日を取り出す(Lines,_月,_日) :-
append(_,[A|_],Lines),sub_atom(A,S,1,_,月),sub_atom(A,0,S,_,_月),
append(_,[B|_],Lines),sub_atom(A,S,1,_,日),sub_atom(B,0,S,_,_日),!.
ある日の休講情報ならびを得る([],_,_,[],[]) :- !.
ある日の休講情報ならびを得る(['\n'|R],_,_,[],R) :- !.
ある日の休講情報ならびを得る([A|R1],_月,_日,[[_氏名,_月,_日]|R2],_残りならび) :-
sub_atom(A,_,2,_,先生),
split(A,[' '],[_姓,_名,先生]),
concat_atom([_姓,_名],_氏名),
ある日の休講情報ならびを得る(R1,_月,_日,R2,_残りならび).
>>179 % Prolog
フィボナッチ数(0,1).
フィボナッチ数(1,1).
フィボナッチ数(N,X) :-
N >= 2,
N_1 is N - 1,フィボナッチ数(N_1,X1),
N_2 is N - 2,フィボナッチ数(N_2,X2),
X is X1 + X2.
>>131 使用言語:十進BASIC
FUNCTION ack(m,n)
IF m=0 THEN
LET ack=n+1
ELSEIF n=0 THEN
LET ack=ack(m-1,1)
ELSE
LET ack=ack(m-1,ack(m,n-1))
END IF
END FUNCTION
FOR i=0 TO 8
PRINT USING "ask(3,#) = ####":i,ack(3,i)
NEXT I
END
ask(3,0) = 5
ask(3,1) = 13
ask(3,2) = 29
ask(3,3) = 61
ask(3,4) = 125
ask(3,5) = 253
ask(3,6) = 509
ask(3,7) = 1021
ask(3,8) = 2045
>>131 使用言語:Lua
function ack(m,n)
if m==0 then return n+1
elseif n==0 then return ack(m-1,1)
else return ack(m-1,ack(m,n-1))
end
end
for i=0,8 do print("ack(3,"..i..") = "..ack(3,i))end
ack(3,0) = 5
ack(3,1) = 13
ack(3,2) = 29
ack(3,3) = 61
ack(3,4) = 125
ack(3,5) = 253
ack(3,6) = 509
ack(3,7) = 1021
ack(3,8) = 2045
>>131 使用言語:Xtal
ack:fun(m,n){
if (m==0) return n+1;
if (n==0) return ack(m-1,1);
return ack(m-1,ack(m,n-1));
}
ix:009>9.times{%f"ack(3,%d)=%d"(it,ack(3,it)).p;};
ack(3,0)=5
ack(3,1)=13
ack(3,2)=29
ack(3,3)=61
ack(3,4)=125
ack(3,5)=253
ack(3,6)=509
ack(3,7)=1021
ack(3,8)=2045
ix:010>
http://pc12.2ch.net/test/read.cgi/tech/1267796762/215 #
# 【 課題 】
# 課題1
#
# 整数型の変数n1,n及びn3には、数値が格納されている。
# これらの3個の数値の大小比較を行い、最大値を変数maxに、最小値を変数minに格納する手続き部である。
# 最初にn1とn2の大小比較を行い、大きいほうをmaxに入れ、小さい方をmmminに入れる。
# 次に、max及びminとn3を大小比較して、大きいほうをmaxに、小さい方をminに入れて、最終的な最大値および
#
# 最小値を決定する。
http://pc12.2ch.net/test/read.cgi/tech/1260922392/45 # 以下の条件(仕様)を満たすプログラムを作成し, そのプログラム(Pascalプログラムソースファイル)とともに その解説書を提出すること.
# 逆ポーランド記法で入力された論理式の充足可能性を判定し, その式の値をtrueにする変数値を,通常の表記とともに出力すること.
# 可能な演算は論理積(and), 論理和(or), 否定(not), の3種類として, それぞれ'a','o','n' で表現すること.
# 使用可能な論理変数は x0, x1, ..., x9 の10種類とし, それぞれ '0','1',...,'9' で表現すること.
# 例) (x1∧x2)∨(¬x1∧x3) ⇒ 12a1n3ao
# 使用できない文字が含まれる入力に対してエラーの旨を出力すること.
# 入力された論理式の充足可能性を判定, 式の値を true にする変数値を出力した後, 再度入力待ち状態になり, 空の文字列を入力するとプログラムが終了すること.
>>189 % Prolog 問題B 問題B.1
_学籍番号+_氏名+_誕生_月+_誕生_日 :-
open('data_b.txt',append,Output),
write_formatted(Output,'%t %t %t %t\n',[_学籍番号,_氏名,_誕生_月,_誕生_日]),
close(Output).
'data_b.txtを読み込み、4月1日を年初めとして、誕生日の早いもの順にソートし、その結果を「output_b.txt」ファイルに出力する' :-
get_split_lines([' '],'data_b.txt',LL),
鍵項目の付加(LL,LL2),
整列(LL2,LL3),
鍵項目を除去しながら出力する(LL3).
鍵項目の付加([],[]) :- !.
鍵項目の付加([[_学籍番号,_氏名,_誕生_月,_誕生_日]|R1],[_誕生_月_2,_誕生_日,_学籍番号,_氏名,_誕生_月,_誕生_日]|R2]) :-
'1-3月を13-15月に修正'(_誕生_月,_誕生月_2),
鍵項目の付加(R1,R2).
'1-3月を13-15月に修正'(_誕生_月,_誕生月_2) :- _誕生_月 >= 1,_誕生_月 =< 3,_誕生_月_2 is _誕生_月 + 12,!.
'1-3月を13-15月に修正'(_誕生_月,_誕生月).
鍵項目を除去しながら出力する([]) :- !.
鍵項目を除去しながら出力する([[_,_|L]|R]) :-
open('out_b.txt',append,Output),
write_formatted(Output,'%t %t %t月 %t日\n',L),
close(Output),
鍵項目を除去しながら出力する(R).
>>191 (
>>189 )
% Prolog get_split_lines/3の引数の取り方に誤りがあった。修正。
_学籍番号+_氏名+_誕生_月+_誕生_日 :-
open('data_b.txt',append,Output),
write_formatted(Output,'%t %t %t %t\n',[_学籍番号,_氏名,_誕生_月,_誕生_日]),
close(Output).
'data_b.txtを読み込み、4月1日を年初めとして、誕生日の早いもの順にソートし、その結果を「output_b.txt」ファイルに出力する' :-
get_split_lines('data_b.txt',[' '],LL),
鍵項目の付加(LL,LL2),
整列(LL2,LL3),
鍵項目を除去しながら出力する(LL3).
鍵項目の付加([],[]) :- !.
鍵項目の付加([[_学籍番号,_氏名,_誕生_月,_誕生_日]|R1],[_誕生_月_2,_誕生_日,_学籍番号,_氏名,_誕生_月,_誕生_日]|R2]) :-
'1-3月を13-15月に修正'(_誕生_月,_誕生月_2),
鍵項目の付加(R1,R2).
'1-3月を13-15月に修正'(_誕生_月,_誕生月_2) :- _誕生_月 >= 1,_誕生_月 =< 3,_誕生_月_2 is _誕生_月 + 12,!.
'1-3月を13-15月に修正'(_誕生_月,_誕生月).
鍵項目を除去しながら出力する([]) :- !.
鍵項目を除去しながら出力する([[_,_|L]|R]) :-
open('out_b.txt',append,Output),
write_formatted(Output,'%t %t %t月 %t日\n',L),
close(Output),
鍵項目を除去しながら出力する(R).
>>189 % Prolog 問題B.2
'output_b.txtを読み込み、ある誕生日を入力したときに、その学生の学籍番号、氏名、
誕生月、誕生日を二分探索法により出力する'(_誕生_月,_誕生_日) :-
get_split_lines('output_b.txt',[' ',月,日],LL),
二分探索法(LL,_誕生_月,_誕生_日,[_学籍番号,_氏名,_誕生_月,_誕生_日]),
write_formatted('%t %t %t %t月%t日\n',[_学籍番号,_誕生_月,_誕生_日]).
二分探索法(LL,_誕生_月,_誕生_年,[_学籍番号,_氏名,_誕生_月,_誕生_日]) :-
'1-3月を13-15月に修正'(_誕生_月,_誕生月_0),
length(LL,Len),
Len0 is Len // 2,
append(L0,[[_学籍番号_1,_氏名_1,_誕生_月_1,_誕生_日_1|L1],LL),
length(L0,Len0),
'1-3月を13-15月に修正'(_誕生_月_1,_誕生月_10),
二分探索法(L0,L,L1,_誕生_月_0,_誕生_日,_誕生_月_10,_誕生_日_1,[_学籍番
号,_氏名,_誕生_月,_誕生_日]).
二分探索法(L0,L,L1,_誕生_月,_誕生_日,_誕生_月,_誕生_日,L) :- !.
二分探索法(L0,L,L1,_誕生_月_0,_誕生_日,_誕生_月_10,_誕生_日_1,[_学籍番号,_氏名,
_誕生_月,_誕生_日]) :-
[_誕生_月_0,_誕生_日] @> [_誕生_月_10,_誕生_日_1],!,
二分探索法(L0,_誕生_月,_誕生_年,[_学籍番号,_氏名,_誕生_月,_誕生_日]).
二分探索法(L0,L,L1,_誕生_月_0,_誕生_日,_誕生_月_10,_誕生_日_1,[_学籍番号,_氏名,
_誕生_月,_誕生_日]) :-
[_誕生_月_0,_誕生_日] @< [_誕生_月_10,_誕生_日_1],!,
二分探索法(L1,_誕生_月,_誕生_年,[_学籍番号,_氏名,_誕生_月,_誕生_日]).
>>193 (
>>189 )
% Prolog また、改行ミスがあった。
'output_b.txtを読み込み、ある誕生日を入力したときに、その学生の学籍番号、氏名、誕生月、誕生日を二分探索法により出力する'(_誕生_月,_誕生_日) :-
get_split_lines('output_b.txt',[' ',月,日],LL),
二分探索法(LL,_誕生_月,_誕生_日,[_学籍番号,_氏名,_誕生_月,_誕生_日]),
write_formatted('%t %t %t %t月%t日\n',[_学籍番号,_誕生_月,_誕生_日]).
二分探索法(LL,_誕生_月,_誕生_年,[_学籍番号,_氏名,_誕生_月,_誕生_日]) :-
'1-3月を13-15月に修正'(_誕生_月,_誕生月_0),
length(LL,Len),
Len0 is Len // 2,
append(L0,[[_学籍番号_1,_氏名_1,_誕生_月_1,_誕生_日_1|L1],LL),
length(L0,Len0),
'1-3月を13-15月に修正'(_誕生_月_1,_誕生月_10),
二分探索法(L0,L,L1,_誕生_月_0,_誕生_日,_誕生_月_10,_誕生_日_1,[_学籍番号,_氏名,_誕生_月,_誕生_日]).
二分探索法(L0,L,L1,_誕生_月,_誕生_日,_誕生_月,_誕生_日,L) :- !.
二分探索法(L0,L,L1,_誕生_月_0,_誕生_日,_誕生_月_10,_誕生_日_1,[_学籍番号,_氏名,_誕生_月,_誕生_日]) :-
[_誕生_月_0,_誕生_日] @> [_誕生_月_10,_誕生_日_1],!,
二分探索法(L0,_誕生_月,_誕生_年,[_学籍番号,_氏名,_誕生_月,_誕生_日]).
二分探索法(L0,L,L1,_誕生_月_0,_誕生_日,_誕生_月_10,_誕生_日_1,[_学籍番号,_氏名,_誕生_月,_誕生_日]) :-
[_誕生_月_0,_誕生_日] @< [_誕生_月_10,_誕生_日_1],!,
二分探索法(L1,_誕生_月,_誕生_年,[_学籍番号,_氏名,_誕生_月,_誕生_日]).
>>185 % Prolog
main :-
write('温度を入力してください : '),
get_line(Line),
atom_to_term(Line,_温度,_),
write('摂氏または華氏と入力してください : '),
get_line(_摂氏または華氏),
摂氏・華氏温度変換(_摂氏または華氏,_温度,_摂氏または華氏の二,_温度の二)
,
write_formatted('入力された%t%t度は%t%3.1f度です,[_摂氏または華氏,_温度,_摂氏または華氏の二,_温度の二).
摂氏・華氏温度変換(摂氏,_温度,華氏,_華氏) :- 摂氏・華氏変換計算(_温度,_華氏).
摂氏・華氏温度変換(華氏,_温度,摂氏,_摂氏) :- 摂氏・華氏変換計算(_摂氏,_温度).
摂氏・華氏変換計算(_摂氏,_華氏) :- \+(var(_摂氏)),_華氏 is 9 * _摂氏 / 5 + 32,! .
摂氏・華氏変換計算(_摂氏,_華氏) :- \+(var(_華氏)),_摂氏 is 5 * (_華氏 - 32) / 9,!.
>>131 使用言語:R
ack <- function(m,n){
if (m==0) n+1
else if (n==0) ack(m-1,1)
else ack(m-1,ack(m,n-1))
}
> for(i in 0:8)cat("ack( 3 ,",i,") =",ack(3,i),"\n")
ack( 3 , 0 ) = 5
ack( 3 , 1 ) = 13
ack( 3 , 2 ) = 29
ack( 3 , 3 ) = 61
ack( 3 , 4 ) = 125
ack( 3 , 5 ) = 253
エラー: 評価があまりに深く入れ子になっています。無限の再帰か options(expressions=)?
>
>>131 使用言語:uwsc
for i=0 to 6
print ack(3,i)
next
function ack(m,n)
if m = 0 then result = n+1
elseif n = 0 then result = ack(m - 1,1)
else result = ack(m - 1,ack(m,n - 1))
fend
5
13
29
61
125
253
509
>>131 使用言語:Clojure
(defn ack[m n]
(cond (zero? m) (inc n)
(zero? n) (ack (dec m) 1)
:else (ack (dec m) (ack m (dec n)))))
user=> (dotimes [i 9] (printf "(ack 3 %d) -> %d\n" i (ack 3 i)))
(ack 3 0) -> 5
(ack 3 1) -> 13
(ack 3 2) -> 29
(ack 3 3) -> 61
(ack 3 4) -> 125
(ack 3 5) -> 253
(ack 3 6) -> 509
(ack 3 7) -> 1021
(ack 3 8) -> 2045
>>131 使用言語:Io
Io> ack:=method(m,n,if(m==0,n+1,if(n==0,ack(m-1,1),ack(m-1,ack(m,n-1)))))
Io> 8 repeat(i,ack(3,i)println)
5
13
29
61
125
253
509
1021
==> 1021
http://pc12.2ch.net/test/read.cgi/tech/1276810079/414 # [1] 授業単元:C言語
# [2] 問題文(含コード&リンク):switch 文を使用して
# 1. データファイルの新規作成
# 2. データファイルの追加作成
# 3. データファイルの読み込みと表示
# 4. 終了
# をメニュー形式で処理するプログラムを作成せよ。
# ・ ファイル名はキーボードから入力する。
# ・ 1〜4の処理はユーザ関数として定義すること。
# void data_write(void)
# void data_append(void)
# void data_read(void)
# void the_end(void)
# ・1〜4以外の数値が入力されたら再入力させること。
>>202 % Prolog
switch(N,{N:P}) :- !,call(P).
switch(N,{N:P;_}) :- !,call(P).
switch(N,{P1;P2}) :- switch(N,{P1});switch(N,{P2}).
switch述語を使ってメニューを処理する(N,File) :-
switch(N,{1:データファイルの新規作成(File);2:データファイルの追加作成(File);3:データファイルの読み込みと表示(File);4:終了}).
データファイルの新規作成(File) :- open(File,write,Output),close(Output).
データファイルの追加作成(File) :-
write('追加要素を入力しなさい : '),
get_line(Line),
open(File,append,Output),
write_formatted(Output,'%t\n',[Line]),
close(Output).
データファイルの読み込みと表示(File) :-
get_lines(File,Lines),
put_lines(Lines).
終了 :- halt.
http://pc12.2ch.net/test/read.cgi/tech/1276810079/420 # [1] 授業単元:C言語入門
# [2] 問題文(含コード&リンク):
# 実数値(xとする)と正の実数値(yとする)を引数としてx^yを戻り値とする
# 関数mypowを作成し、プログラムリストと実行結果を示せ。
# ただし、xとyについてはmain関数でキーボードから入力するようにし、
# 出力結果としては、mypow関数の計算結果と数学関数pow関数の結果を
# 両方表示するようにせよ。また、mypow関数のプロトタイプ宣言も行うこと。
#
http://pc12.2ch.net/test/read.cgi/tech/1276810079/421 # [1] 授業単元: プログラム言語
# [2] 問題文(含コード&リンク):
# 10 人の成績を入力し,その順位を成績と共に表示したい。以下の考え方に基づいた
# プログラムを作成せよ。
# 1 ?
# 2次元配列s[10][2] を用意する。
# 2 ?
# i=0〜9 のfor 文を用いてs[i][0] に成績を入力する。
# 3 ?
# s[0][0] とs[j][0],j=0〜9 を比較し,s[0][0] より大きい数値の個数n を数え
# る。その個数+1 が成績順位になるので,s[0][1] にn+1 を代入する。
# 4 ?
# 同様の操作をs[i][0],i=0〜9 に対して行なえば,その成績順位がs[i][1] とし
# て求められるので,あとは成績と共に表示すればよい。
#
>>186 使用言語:J
f=:[:+.[r.(180%~4*_3 o.1)*]
2 f 30
1.73205 1
1 f 45
0.707107 0.707107
>>203 % Prolog
fact(N,X) :-
length(L1,N),
fact(L1,L1,LX),
length(LX,X) .
fact(L1,[_],L1) :- !.
fact(L1,[_|R2],LX) :-
findall(L1,member(_,R2),LY),
flat(LY,LZ),
fact(LZ,R2,LX).
>>186 使用言語:maxima
f(r,d):=(a:d*4.*atan(1)/180,[float(r*cos(a)),float(r*sin(a))]);
(%i21) f(2,30);
(%o21) [1.732050807568877, 1.0]
(%i22) f(1,45);
(%o22) [0.70710678118655, 0.70710678118655]
>>207 使用言語:J
a=: 30 50 50 70 50 100 90 70 80 60
f=:>:@(+/"1)@(</~)
a,:f a
30 50 50 70 50 100 90 70 80 60
10 7 7 4 7 1 2 4 3 6
>>207 % Prolog
'10 人の成績を入力し,その順位を成績と共に表示する' :-
'要素数10の変数ならびを二本用意する'(L1,L2),
'L1に成績を入力する'(L1),
'L1の先頭から順位を対応するL2の位置にセット'(1,10,L1,L2),
二本のならびを順に表示(L1,L2).
'要素数10の変数ならびを二本用意する'(L1,L2) :-
length(L1,10),length(L2,10).
'L1に成績を入力する'(L1) :-
for(1,N,10),get_integer(_点数),list_nth(N,L1,_点数),N=10,!.
'L1の先頭から順位を対応するL2の位置にセット'(N,M,L1,L2) :- N > M,!.
'L1の先頭から順位を対応するL2の位置にセット'(N,M,L1,L2) :-
list_nth(N,L1,_点数),list_nth(N,L2,_順位),
count((member(_点数1,L1),_点数1 > _点数),_成績上位者数),_順位 is _成績上位者数 + 1,
N2 is N + 1,
'L1の先頭から順位を対応するL2の位置にセット'(N2,M,L1,L2).
二本のならびを順に表示(L1,L2) :-
for(1,N,10),
list_nth(N,L1,A),list_nth(N,L2,B),
write_formatted('%t,%t位\n',[A,B]),
N=10.
>>186 使用言語:Io
f:=method(r,d,a:=1 atan*4/180*d;list(a cos*r,a sin*r))
Io> f(2,30)
==> list(1.7320508075688774, 0.9999999999999999)
Io> f(1,45)
==> list(0.7071067811865476, 0.7071067811865475)
>>207 使用言語:Lua
a={30,50,50,70,50,100,90,70,80,60}
b={}
for i,v in pairs(a) do
r=1
for j,w in pairs(a) do
if v<w then r=r+1 end
end
b[i]=r
end
for i,v in pairs(b) do
print(a[i]..' '..v)
end
30 10
50 7
50 7
70 4
50 7
100 1
90 2
70 4
80 3
60 6
>>186 % Prolog
'極座標(r,θ)の値を入力すると、直交座標(x,y)に変換する'(_r,_θ,_x,_y) :-
_x is _r * cos(4 * atan(1) * _θ / 180),
_y is _r * sin(4 * atan(1) * _θ / 180).
http://pc12.2ch.net/test/read.cgi/tech/1276810079/457 # [1] 授業単元:プログラム演習
# [2] 問題文(含コード&リンク):
# 以下のプログラムに、下に示す二つの関数を実装し、組み込みなさい。
# ファイル中に保存するデータはアスキー形式でも、バイナリ形式でもどちらでも構わないものとする。
#
http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10778.txt # ・構造体Employee型のデータが順に保存されているファイルからデータを読み込む 数。
# ・作成したデータをファイルに書き出す関数。
# 例えば、構造体Employeeを下に示すものと同じ定義にしたとする。
# この構造体に従ったASCII形式のデータベースファイルを読み込み、
# 社員の追加や、給与の変更をした後、同様なデータベースファイルとして保存できるようにしなさい(もちろん、バイナリ形式のファイルにしても構わない)。 # [構造体Employeeの例]
# typedef struct {
# char name[16];
# int age;
# int salary;
# } Employee;
#
# [データベースファイルの例]
# TANAKA 32 620
# SUZUKI 25 500
# CHIBA 35 650
# NAKAMURA 50 1000
# IIDA 45 800
http://pc12.2ch.net/test/read.cgi/tech/1276810079/461 # [1] 授業単元: プログラミング実験
# [2] 問題文(含コード&リンク):
http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10780.zip # 【問題3-01】 50点 高速整列算法の挿入法の効率化
# 半乱順列に対する、クイック・マージ・ヒープの3つの高速整列算法の性能を評価する。再帰法を使った実装でよい。
# 計算量は、処理時間で計測する。データ数nを100〜10000の範囲で変更してみる。両対数グラフを描くとよい。
# 各条件で、10000回以上の試行を行い、平均と分散を求め、度数分布表も作成してみる。
# 必要なプログラムを作成し、データを用意する。シミュレーション実験を行い、実行結果を数表やグラフで示し、考察を述べる。
# (1) 確率指定 p の増大による処理時間 t への影響を調べる。各整列算法について、グラフを描き、増加の傾向を考察する。
# (2) 回数指定 m の増大による処理時間 t への影響を調べる。各整列算法について、グラフを描き、増加の傾向を考察する。
# 【問題3-02】 50点 クイックソートの効率化
# クイックソートの効率化を実装し、実行結果を考察する。
# (1) クイックソートは、振分処理の基準値によって、効率性が大きく変わってしまう。片寄った基準値では、非常に効率が悪くなる。
# そこで、部分列の先頭要素を選ぶのではなく、先頭・中央・末尾の要素の平均値または中央値を基準値にする手法が用いられる。
# この手法によって、平均計算量がどれくらい効率化されるか調べよ。
# (2) クイックソートは、データ数 nに対して、n×log(n) 程度の計算量となる
# データ数 が大きいときは効率的であるが、小さいときはかえって効率が悪くなる。
# そこで、データ数が m 以下になった部分列に対して、単純挿入法に切り替える手法が用いられる。
>>219 使用言語:J
f=:dyad def 'y{~<<<,(i.#x)+/~I.x E.y'
'ABC' f 'ABCDEFAABCDABC'
DEFAD
'ABA' f 'ABABABC'
BC
二番目の例のように検索文字列が重なった場合どこまで消す?
http://pc11.2ch.net/test/read.cgi/db/1274791771/243 # プログラム言語で以下の集約を定義しなさい。
# SELECT CASE pref_name
# WHEN '徳島' THEN '四国'
# WHEN '香川' THEN '四国'
# WHEN '愛媛' THEN '四国'
# WHEN '高知' THEN '四国'
# WHEN '福岡' THEN '九州'
# WHEN '佐賀' THEN '九州'
# WHEN '長崎' THEN '九州'
# ELSE 'その他' END AS district,
# SUM(population)
# FROM PopTbl
# GROUP BY CASE pref_name
# WHEN '徳島' THEN '四国'
# WHEN '香川' THEN '四国'
# WHEN '愛媛' THEN '四国'
# WHEN '高知' THEN '四国'
# WHEN '福岡' THEN '九州'
# WHEN '佐賀' THEN '九州'
# WHEN '長崎' THEN '九州'
# ELSE 'その他' END;
>>219 % Prolog
文字列中から削除文字列を除去する(_文字列,_削除する文字列,_削除された文字列) :-
sub_atom(_文字列,A,Len,B,_削除する文字列),
sub_atom(_文字列,0,A,_,S1),
sub_atom(_文字列,A+Len,B,_,S2),
文字列中から削除文字列を削除する(S2,_削除する文字列,S3),
concat_atom([S1,S3],_削除された文字列).
文字列中から削除文字列を除去する(S,_,S).
%
>>220 の第二番目の解釈、挑戦してみたが、結構複雑。
http://pc12.2ch.net/test/read.cgi/tech/1276810079/475 # [1] 授業単元:プログラミング
# [2]問題文:
# ファイルseiseki.txt から氏名と点数を読み込んで、成績順に並べ替え、結果を画
# 面に表示するプログラムを作成せよ。
# ・氏名は2次元配列、点数は1次元配列に格納する。
# ・ データの並べ替えには単純挿入法、単純選択法またはバブルソートを使用する。
# ・ 文字列 x[]と文字列y[]の入れ替えは、文字列操作関数strcpy を用いて行う。
# strcpy(z,x); strcpy(x,y); strcpy(y,z);
#
http://pc12.2ch.net/test/read.cgi/tech/1267796762/230 # 【 課題 】テキストファイルを読み込み行毎に出現頻度を統計するプログラムを作れ
# 【 形態 】1. Javaアプリケーション(main()で開始)
# 【 GUI 】4. 制限なし
# 【 期限 】7月6日
# 【 Ver 】"1.6.0_20"
# 【 補足 】
# 例:
# ああA1111あa1AAAa
# BBBbいbいbB2
#
# という2行のテキストファイルであれば
#
# 1. 1,5 A,4 あ,3 a,2
# 2. B,4 b,3 い,2 2,1
#
# という風に表示します。
>>225 % Prolog (その一)
テキストファイルを読み込み行毎に出現頻度を統計する(_テキストファイル) :-
get_lines(_テキストファイル,Lines),
行毎に出現頻度を統計する(Lines,_行統計ならび),
行統計ならびを表示する(_行統計ならび).
行毎に出現頻度を統計する([],[]) :- !.
行毎に出現頻度を統計する([_行文字列|R1],[_降順に整列した出現頻度ならび|R2]) :-
文字毎の出現頻度を調べる(Chars,[],_出現頻度ならび),
降順に整列(_出現頻度ならび,_降順に整列した出現頻度ならび),
行毎に出現頻度を統計する(R1,R2).
文字毎の出現頻度を調べる([],_出現頻度ならび,_出現頻度ならび) :-
文字毎の出現頻度を調べる([A|R1],L1,_出現頻度ならび) :-
\+(member([_,A],L1)),
文字毎の出現頻度を調べる(R1,[[1,A]|L1],_出現頻度ならび),!.
文字毎の出現頻度を調べる([A|R1],L1,_出現頻度ならび) :-
append(L0,[[N1,A]|L2],L1),
N2 is N1 + A,
append(L1,[[N2,A]|L2],L3),
文字毎の出現頻度を調べる(R1,L3,_出現頻度ならび),!.
>>225 % Prolog (その二)
降順に整列(L1,L2) :- sort(L1,L3),reverse(L3,L2).
行統計ならびを表示する(_行統計ならび) :-
append(L0,[_行統計|L1],_行統計ならび),
length(L0,Len),
_行番号 is Len + 1,write('%t.'),
行の統計を表示する(_行統計),
L1 = [].
行の統計を表示する([]) :- write('\n'),!.
行の統計を表示する([[N,A]|R]) :-
write_formatted(' %t,%t',[A,N]),
行の統計を表示する(R).
>>221 % Prolog
地方で集約する(_地方,_人口) :-
findsetof(_地方,(
'PopTbl'(_pref_name,_population),
地方(_地方,_pref_name)),
L1),
append(_,[_地方|_],L1),
findsum(_population,(
'PopTbl'(_pref_name,_population),
地方(_地方,_pref_name)),
_人口).
地方(四国,徳島).
地方(四国,香川).
地方(四国,愛媛).
地方(四国,高知).
地方(九州,福岡).
地方(九州,佐賀).
地方(九州,長崎).
>>229 % Prolog
program :-
M is truncate((3 - 0) / 0.1),
for(0,N,M),
_x is N * 0.1,
Y is exp(1) ^ (-1 * _x) * cos(2 * pi * _x),
write_formatted('%t\n',[Y]),
N = M .
>>229 % Prolog
[IF/Prolog]# prolog -c temp.pro >temp.txt
[SWI-Prolog]# pl -s temp.pro >temp.txt
% temp.pro
program :-
'c137_501:f(x)=e^{-x} cos(2πx) その関数を用いて0≦x≦3の間で0.1刻みで計算'.
'c137_501:f(x)=e^{-x} cos(2πx) その関数を用いて0≦x≦3の間で0.1刻みで計算' :-
M is truncate((3 - 0) / 0.1),
for(0,N,M),
_x is N * 0.1,
Y is exp(1) ^ (-1 * _x) * cos(2 * pi * _x),
write_formatted('%t\n',[Y]),
N = M .
http://pc12.2ch.net/test/read.cgi/tech/1276810079/504 # [1]授業単元:プログラミング演習
# [2]問題文;離散探索木(26進)と外部ハッシュ法の比較(探索関数)
# キー: 文字列
# 使用ファイル: wordE100KR.dat
# 上記ファイルを読み込み、通常の配列に格納する。
# この配列から要素を読み込み、分離連鎖法および離散探索木(26進)を生成する。
# 格納された要素と同一の要素集合すなわち、配列に格納された用語集合に対して、1万語毎に探索を行い、照合回数、および探索時間を測定する。
# 結果として、照合回数について20個のデータ(2×10)、同様に探索時間について20
個のデータ(2×10)が得られる。
# これらのデータをExcelに格納し、表、グラフを作成し、分析せよ。
>>232 % Prolog "-g program " が必要だった。
[SWI-Prolog]# pl -s temp.pro -g program >temp
http://pc12.2ch.net/test/read.cgi/tech/1267796762/233 # 【 課題 】部分一致文字列の探索関数の比較(配列‐二分探索とTrie(26進))
# 作成関数: 追加、探索
# キー: 文字列
# 使用ファイル: wordE100KR.dat
# ・二分探索法を改良し、前方一致(例: info?)を実現する関数を作成する。
# ・多分探索木の巡回関数に基づき、部分木出力関数をTrie(26進)に適用し、前方一致(例: info?)を実現する関数(部分木巡回‐出力関数)を作成する。
# ・特定の部分文字集合(100)に対し、比較(照合)回数、および出力時間を測定し、これらの結果を、表、グラフに表し、分析する。
# 【 形態 】1. Javaアプリケーション(main()で開始)
# 【 GUI 】4. 制限なし
# 【 期限 】7月12日
# 【 Ver 】1.6.0_15
# 【 補足 】参照ファイルはアップしてあります。
>>233 % Prolog (その一)
分離連鎖法による文字列の検索(_文字列,_付加情報) :-
atom_codes(_文字列,Codes),
加算(Codes,Y),
_ハッシュ値 is truncate(Y) mod 26,
分離連鎖(_ハッシュ値,L),
append(_,[[_文字列|_付加情報]|_],L).
分離連鎖法による文字列の追加(_文字列,_付加情報) :-
atom_codes(_文字列,Codes),
加算(Codes,Y),
_ハッシュ値 is truncate(Y) mod 26,
retract(分離連鎖(_ハッシュ値,L)),
asserta(分離連鎖(_ハッシュ値,[[_文字列|_付加情報]|L])).
分離連鎖(0,[]). 分離連鎖(1,[]). 分離連鎖(2,[]).
分離連鎖(3,[]). 分離連鎖(4,[]). 分離連鎖(5,[]).
分離連鎖(6,[]). 分離連鎖(7,[]). 分離連鎖(8,[]).
分離連鎖(9,[]). 分離連鎖(10,[]). 分離連鎖(11,[]).
分離連鎖(12,[]). 分離連鎖(13,[]). 分離連鎖(14,[]).
分離連鎖(15,[]). 分離連鎖(16,[]). 分離連鎖(17,[]).
分離連鎖(18,[]). 分離連鎖(19,[]). 分離連鎖(20,[]).
分離連鎖(21,[]). 分離連鎖(22,[]). 分離連鎖(23,[]).
>>233 % Prolog 最後一行が千切れてしまった。
分離連鎖(24,[]). 分離連鎖(25.[]).
>>233 % Prolog
分離連鎖の初期化(_ハッシュ表の長さ) :-
abolish(分離連鎖/2),
abolish(ハッシュ表の長さ/1),
assertz(ハッシュ表の長さ(_ハッシュ表の長さ)),
M is _ハッシュ表の長さ - 1,
for(0,N,M),
assertz(分離連鎖(N,[])),
N = M,!.
分離連鎖法による文字列の検索(_文字列,_付加情報) :-
atom_codes(_文字列,Codes),
加算(Codes,Y),
ハッシュ表の長さ(_ハッシュ表の長さ),
_ハッシュ値 is truncate(Y) mod _ハッシュ表の長さ,
分離連鎖(_ハッシュ値,L),
append(_,[[_文字列|_付加情報]|_],L).
分離連鎖法による文字列の追加(_文字列,_付加情報) :-
atom_codes(_文字列,Codes),
加算(Codes,Y),
ハッシュ表の長さ(_ハッシュ表の長さ),
_ハッシュ値 is truncate(Y) mod _ハッシュ表の長さ,
retract(分離連鎖(_ハッシュ値,L)),
asserta(分離連鎖(_ハッシュ値,[[_文字列|_付加情報]|L])).
>>229 使用言語:J
load 'plot'
f=:monad def '(^ -y) * cos 2p1 * y'
smoutput '10.5'(8!:2)(,.f)"0 range 0 3 0.1
exit ''
上のコードをコンソール版で実行すれば、標準出力に下のようなデータが出力される。
(8!:2)のformatは、マイナス符号を変換してくれるようだ。
0.00000 1.00000
0.10000 0.73203
0.20000 0.25300
0.30000 -0.22893
0.40000 -0.54230
:
2.90000 0.04451
3.00000 0.04979
J言語のグラフ機能をつかう場合は
load 'plot'
plot (range 0 3 0.1) ; '(^ -y) * cos 2p1 * y'
http://pc11.2ch.net/test/read.cgi/db/1274791771/248 # TABLE test
# id | data
# ---+------
# 100 | AAA
#
# TABLE hoge
# id | value
# ---+------
# 100 | 10
# 100 | 20
#
# TABLE 100
# id |val1| val2
# ---+---+----
# 100 | 20 | 40
#
# SELECT a.id, test.data, a.cnt + b.cnt + c.cnt
# FROM
# (SELECT id, SUM( aa.val1 ) cnt FROM (SELECT id, val1 FROM `100`)aa)a,
# (SELECT id, SUM( bb.val2 ) cnt FROM (SELECT id, val2 FROM `100`)bb)b,
# (SELECT id, SUM( value ) cnt FROM hoge WHERE id = 100)c,test
# WHERE a.id = c.id AND test.id = 100
#
# 欲しい結果
# id data a.cnt + b.cnt + c.cnt
# ----------------------------
# 100 AAA 180
#
>>243 % Prolog
'非負の整数値を読み込んで,その数を逆順に表示する' :-
催促付き整数入力('非負の整数を入力してください: ',N),
number_chars(N,L1),
reverse(L1,L2),
number_chars(L2,N2),
write_formatted(' %t を逆から読むと%t です.\n',[N,N2]).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
'非負の整数値を読み込んで,その数を逆順に表示する' :-
催促付き整数入力('非負の整数を入力してください: ',N),
非負の整数値から逆順整数を得る(N,0,N2),
write_formatted(' %t を逆から読むと%t です.\n',[N,N2]).
非負の整数値から逆順整数を得る(0,X,X).
非負の整数値から逆順整数を得る(N,Y1,X) :-
Y2 is Y1 * 10 + (N mod 10),
N1 is N // 10,
非負の整数値から逆順整数を得る(N1,Y2,X).
>>244 % Prolog
'非負の整数を次々と読み込んでいき,各値の二乗値の和を表示する' :-
write('整数を入力してください\n'),
findsum(S,(非負の整数を次々と読み込んでいき(1,X),(X < 0,!,fail;S is X *X)),_二乗和),
write_formatted('二乗値の合計は%t です.\n',[_二乗和]).
非負の整数を次々と読み込んでいき(N,X) :-
write_formatted('整数%t : ',[N]),get_integer(X).
非負の整数を次々と読み込んでいき(N,X) :-
N2 is N + 1,
非負の整数を次々と読み込んでいき(N2,X).
>>245 % Prolog
'行数と列数を読み込み,1 行目には1234567890…を列数の個数だけ,2 行目には2345678901…を列数の個数だけ,…と表示する' :-
'行数と列数を読み込み(_行数,_列数),
'1から始める数字循環を生成'(_行数,_列数,L),
length(L1,_列数),
append(L0,L2,L),
行数分表示する(L0,L1,L2).
行数と列数を読み込み(_行数,_列数) :-
write('行数を入力してください : '),get_integer(_行数),
write('列数を入力してください : '),get_integer(_列数).
'1から始める数字循環を生成'(_行数,_列数,L) :-
M is _行数 + _列数,
'数字循環を生成'(1,M,L).
'数字循環を生成'(N,M,[]) :- N > M,!.
'数字循環を生成'(N,M,[X|R]) :- X is N mod 10,N2 is N + 1,'数字循環を生成'(N2,M,R).
行数分表示する(L0,L0,L2) :- !.
行数分表示する(L0,L1,L2) :-
append(L1,_,L2),
concat_atom(L1,S),
write_formatted('%t\n',[S]),
fail.
>>252 (
>>245 )
% Prolog 行数分表示する/3に誤りがあった。
'行数と列数を読み込み,1 行目には1234567890…を列数の個数だけ,2 行目には2345678901…を列数の個数だけ,…と表示する' :-
'行数と列数を読み込み(_行数,_列数),
'1から始める数字循環を生成'(_行数,_列数,L),
length(L1,_列数),
append(L0,L2,L),
行数分表示をする(_行数,L0,L1,L2).
行数と列数を読み込み(_行数,_列数) :-
write('行数を入力してください : '),get_integer(_行数),
write('列数を入力してください : '),get_integer(_列数).
'1から始める数字循環を生成'(_行数,_列数,L) :-
M is _行数 + _列数,
'数字循環を生成'(1,M,L).
'数字循環を生成'(N,M,[]) :- N > M,!.
'数字循環を生成'(N,M,[X|R]) :- X is N mod 10,N2 is N + 1,'数字循環を生成'(N2,M,R).
行数分表示する(_行数,L0,_,_) :- length(L0,_行数),!.
行数分表示する(_,L0,L1,L2) :-
append(L1,_,L2),
concat_atom(L1,S),
write_formatted('%t\n',[S]),
fail.
>>248 % Prolog
'欲しい結果 id data a.cnt + b.cnt + c.cnt' :-
test(_id,_data),
findsum(U,(findsum(_value,hoge(_id,_value),U1),findsum(_val3,('100'(_id,_val1,_val2),_val3 is _val1 + _val2),U2),U is U1 + U2),S).
write('id data a.cnt + b.cnt + c.cnt\n'),
write_formatted('%t %t %t\n',[_id,_data,S]),!.
>>247 % Prolog 例によって、配列をリストに変更して解釈。
'data.txtに書かれている氏名と成績を読み込み、氏名を2次元配列、成績を1次元配列に格納する' :-
get_split_lines('data.txt',[' '],LL),
'氏名を2次元配列、成績を1次元配列に格納する'(LL,_氏名ならび,_成績ならび
),
氏名ならび・成績ならびを格納する(_氏名ならび,_成績ならび).
'氏名を2次元配列、成績を1次元配列に格納する'([],[],[]).
'氏名を2次元配列、成績を1次元配列に格納する'([[_氏名,_成績]|R1],[_氏名文字ならび|R2],[_成績|R3]) :-
atom_chars(_氏名,_氏名文字ならび),
'氏名を2次元配列、成績を1次元配列に格納する'(R1,R2,R3).
氏名ならび・成績ならびを格納する(_氏名ならび,_成績ならび) :-
assertz(氏名ならび(_氏名ならび)),
assertz(成績ならび(_成績ならび)).
>>255 (
>>247 )
% Prolog 表示方法をちょっと工夫してみる。
'data.txtに書かれている氏名と成績を読み込み、氏名を2次元配列、成績を1次元配列に格納する' :-
get_split_lines('data.txt',[' '],LL),
'氏名を2次元配列、成績を1次元配列に格納する'(LL,_氏名ならび,_成績ならび,
氏名ならび・成績ならびを格納する(_氏名ならび,_成績ならび).
'氏名を2次元配列、成績を1次元配列に格納する'([],[],[]).
'氏名を2次元配列、成績を1次元配列に格納する'([[_氏名,_成績]|R1],[_氏名文字ならび|R2],[_成績|R3]) :-
atom_chars(_氏名,_氏名文字ならび),
'氏名を2次元配列、成績を1次元配列に格納する'(R1,R2,R3).
氏名ならび・成績ならびを格納する(_氏名ならび,_成績ならび) :-
assertz(氏名ならび(_氏名ならび)),
assertz(成績ならび(_成績ならび)).
>>256 (
>>247 )
% Prolog 失敗。やり直し。やはり、うまくいかない。
'data.txtに書かれている氏名と成績を読み込み、氏名を2次元配列、成績を1次元配列に格納する' :-
get_split_lines('data.txt',[' '],LL),
'氏名を2次元配列、成績を1次元配列に格納する'(LL,_氏名ならび,_成績ならび,
氏名ならび・成績ならびを格納する(_氏名ならび,_成績ならび).
'氏名を2次元配列、成績を1次元配列に格納する'([],[],[]).
'氏名を2次元配列、成績を1次元配列に格納する'([[_氏名,_成績]|R1],[_氏名文字ならび|R2],[_成績|R3]) :-
atom_chars(_氏名,_氏名文字ならび),
'氏名を2次元配列、成績を1次元配列に格納する'(R1,R2,R3).
氏名ならび・成績ならびを格納する(_氏名ならび,_成績ならび) :-
assertz(氏名ならび(_氏名ならび)),
assertz(成績ならび(_成績ならび)).
>>257 Prologのプログラムを読む場合の注意は、引数の中にある論理変数の変化に集中するから、
そこの部分の桁位置を揃えるようにしてみたい。>>256-
>>257 は失敗。
http://pc11.2ch.net/test/read.cgi/db/1274791771/255 # 同一テーブルで、自分自身を除く前回の履歴を結合したいです
# SQLServer2005
#
# 設備
# X
#
# 生産履歴
# 履歴ID 設備 製造ロット ロット枝番 状態
# 10 X 002 2 生産中
# 09 X 002 1 完了
# 08 X 001 1 完了
#
# 設備と生産履歴から設備稼働状況を表示
# SELECT * FROM 設備
# LEFT OUTER JOIN 生産履歴
# ON 設備.設備=生産履歴.設備
# AND 生産履歴.状態='生産中'
#
# 設備稼働状況 ※これに前回ロットを表示したい。
# 設備 製造ロット ロット枝番 前回ロット
# X NULL NULL 002
# となる。
#
>>260 つづき
#
# LEFT OUTER JOIN
# SELECT MAX(製造ロット) AS MAX製造ロット
# FROM 生産履歴 生産履歴前回
# WHERE 製造ロット<>生産履歴.製造ロット※2
# GROUP BY 設備
#
# ※2で引っかかる。
# どなたか回答よろしくお願いします。
>>262 % Prolog
'1からの文字連鎖によって文字列を成長させながら表示する' :-
文字連鎖によって文字列を成長させながら表示する('1').
文字連鎖によって文字列を成長させながら表示する(_文字列) :- write_formatted('%t\n',_文字列]).
文字連鎖によって文字列を成長させながら表示する(_文字列) :-
sub_atom(_文字列,_,1,1,_最後の文字),
文字連鎖(_最後の文字,_次の文字),
atom_concat(_文字列,_次の文字,_付加された文字列),
文字連鎖によって文字列を成長させながら表示する(_付加された文字列).
文字連鎖('1','2'). 文字連鎖('2','3'). 文字連鎖('3','4'). 文字連鎖('4','5'). 文字連鎖('5','6').
文字連鎖('6','7'). 文字連鎖('7','8'). 文字連鎖('8','9'). 文字連鎖('9','0'). 文字連鎖('0','1').
>>263 (
>>262 )
% Prolog 一ヶ所、間違い。"["が抜けた。
'1からの文字連鎖によって文字列を成長させながら表示する' :-
文字連鎖によって文字列を成長させながら表示する('1').
文字連鎖によって文字列を成長させながら表示する(_文字列) :- write_formatted('%t\n',[_文字列]).
文字連鎖によって文字列を成長させながら表示する(_文字列) :-
sub_atom(_文字列,_,1,1,_最後の文字),
文字連鎖(_最後の文字,_次の文字),
atom_concat(_文字列,_次の文字,_付加された文字列),
文字連鎖によって文字列を成長させながら表示する(_付加された文字列).
文字連鎖('1','2'). 文字連鎖('2','3'). 文字連鎖('3','4'). 文字連鎖('4','5'). 文字連鎖('5','6').
文字連鎖('6','7'). 文字連鎖('7','8'). 文字連鎖('8','9'). 文字連鎖('9','0'). 文字連鎖('0','1').
>>264 (
>>262 )
% Prolog 終了指定を忘れてたw
:- op(600,xfx,が). :- op(700,xf,回現れるまで).
'ある文字がN回現れるまで1からの文字連鎖によって文字列を成長させながら表示する' :-
文字連鎖によって文字列を成長させながら表示する('5' が 1 回現れるまで,'1').
文字連鎖によって文字列を成長させながら表示する(_ が 0 回現れるまで,_) :- !.
文字連鎖によって文字列を成長させながら表示する(A が N 回現れるまで,_文字列) :-
write_formatted('%t\n',_文字列]).
文字連鎖によって文字列を成長させながら表示する(A が N 回現れるまで,_文字列) :-
sub_atom(_文字列,_,1,1,A),
文字連鎖(A,_次の文字),
atom_concat(_文字列,_次の文字,_付加された文字列),
N1 is N - 1,
文字連鎖によって文字列を成長させながら表示する(A が N1 回現れるまで,_付加された文字列).
文字連鎖によって文字列を成長させながら表示する(A が N 回現れるまで,_文字列) :-
sub_atom(_文字列,_,1,1,_最後の文字),
文字連鎖(_最後の文字,_次の文字),
atom_concat(_文字列,_次の文字,_付加された文字列),
文字連鎖によって文字列を成長させながら表示する(A が N 回現れるまで,_付加された文字列).
文字連鎖('1','2'). 文字連鎖('2','3'). 文字連鎖('3','4'). 文字連鎖('4','5'). 文字連鎖('5','6').
文字連鎖('6','7'). 文字連鎖('7','8'). 文字連鎖('8','9'). 文字連鎖('9','0'). 文字連鎖('0','1').
>>265 (
>>262 )
% Prolog さらに誤りがあったのでこの修正版は
http://nojiriko.asia/prolog/unix_shitsumon_83.html を参照してください。
% 12345 を数値と解釈するならば、
:- op(600,xfx,が).
:- op(700,xf,回現れるまで).
'ある数値がN回現れるまで1からの数値連鎖によって数値列を成長させながら表示する'(_ が 0 回現れるまで,_) :- !.
'ある数値がN回現れるまで1からの数値連鎖によって数値列を成長させながら表示する'(A が N 回現れるまで,M) :-
A is (M + 1) mod 10,
M10 is M * 10,
M2 is M10 + M1,
write_formatted('%t',[M2]),
N1 is N - 1,
'ある数値がN回現れるまで1からの数値連鎖によって数値列を成長させながら表示する'(A が N1 回現れるまで,M2).
'ある数値がN回現れるまで1からの数値連鎖によって数値列を成長させながら表示する'(A が N 回現れるまで,M) :-
M1 is (M + 1) mod 10,
M10 is M * 10,
M2 is M10 + M1,
write_formatted('%t',[M2]),
N1 is N - 1,
'ある数値がN回現れるまで1からの数値連鎖によって数値列を成長させながら表示する'(A が N 回現れるまで,M2).
>>246 % Prolog
:- op(300,xf,回).
:- op(700,xf,切る).
半乱順列の作成(_置換指定,_対象ならび,_半乱順列ならび) :-
整列(_対象ならび,_整列したならび),
整列したならび乱す(_置換指定,_整列したならび,_半乱順列ならび).
整列したならび乱す(最初と最後の要素を入れ替える,L1,L2) :-
[A|R]=L3,
append(L4,[B],R),
append([B|L4],[A],L2),!.
整列したならびを乱す(0 回 切る,L,L) :- !.
整列したならびを乱す(N 回 切る,L1,L2) :-
length(L1,Len),
N1 is random mod Len,
N2 is random mod Len,
ならびの交換(N1,N2,L1,L3),
N1 is N - 1,
整列したならびを乱す(N1 回 切る,L1,L2).
整列したならびを乱す([],L,L) :- !.
整列したならびを乱す([[N1,N2]|R],L1,L2) :-
ならびの交換(N1,N2,L1,L3),
整列したならびを乱す(R,L3,L2).
http://pc12.2ch.net/test/read.cgi/tech/1276810079/569 # コインの種類(例えば、1円、5円、8円、10円、15円)に対して、金額を入力すると
# その金額を払うのに最も枚数が少なくて済むコインの出し方を出力してくれる
# プログラム。
# 例えば、23円と入力すると、「10円1枚・8円1枚・5円1枚の計3枚」と出力できるプログラムです。
# ただし、「10円2枚・1円3枚の計5枚」は「最小」ではないため、上の出力を優先します。
# 入力された金額が負の場合は、「Error」を出力するようにします。
# そこで、下のようなプログラムを書いたのですが、うまく起動しません。
# このプログラムを、上の出力例のように出力してくれるように書きなおしてくれませんか??
# 下のプログラムでは合計枚数を出力する部分しか書いてません。
# ちなみに、再帰を使ってプログラミングお願いします。
http://pc12.2ch.net/test/read.cgi/tech/1276810079/595 # [1] 授業単元:プログラミング演習
# Q1. 問題文:4つの整数を入力し、それらを要素とする行列を求め、その値を以下のような
# 形式で表示するプログラムを作成せよ。
#
# 例 100 20 30 40と入力すれば
# | 100 20 | =3400
# | 30 40 | と表示される
#
# Q.2ディスカウントストアでどの商品でも5個以上買えば1割引、10個以上で2割引、20個以上で
# 4割引となっていた。キーボードから買う商品の単価と個数を入力し、合計金額を計算するプログラミングを
# 作成せよ。
#
>>269 % Prolog Q1
'4つの整数を入力し、それらを要素とする行列を求め、行列とその値を表示する' :-
get_split_line([' ',','],[A,B,C,D]),
正方行列の行列式の値([[A,B],[C,D]],_行列式の値),
write_formatted(' |%3d %3d| = %t\n',[A,B,_行列式の値]),
write_formatted(' |%3d %3d|\n',[C,D]).
正方行列の行列式の値(_正方行列,_行列式の値) :-
ガウス行列に変形(_正方行列,X,Y),
'行列式|C|の値'(X,Z1),
ならびの積(Y,Z2),
_行列式の値 is Z1 // Z2.
ならびの積([A],A) :- !.
ならびの積([A|R],X) :-
ならびの積(R,Y),
X is A * Y.
'行列式|C|の値'(_行列,_値) :-
length(_行列,Len),
findall(U,(for(1,N,Len),list_nth(N,_行列,_行),list_nth(N,_行,U)),L),
ならびの積(L,_値).
>>269 % Prolog Q2
:- op(700,xfx,は).
'ディスカウントストアでどの商品でも5個以上買えば1割引、10個以上で2割引、20個以上で4割引となっていた。キーボードから買う商品の単価と個数を入力し、合計金額を計算する' :-
write('商品単価と個数を入力してください : '),
get_split_line([' ',','],[_単価,_個数]),
合計金額を計算する(_単価,_個数,_合計金額).
合計金額を計算する(_単価,_個数,_合計金額) :-
abs(_個数) < 5,
_合計金額 は 四捨五入(_単価 * _個数).
合計金額を計算する(_単価,_個数,_合計金額) :-
abs(_個数) >= 5,abs(_個数) < 10,
_合計金額 は 四捨五入(_単価 * _個数 * (1 - 0.1)).
合計金額を計算する(_単価,_個数,_合計金額) :-
abs(_個数) >= 10,abs(_個数) < 20,
_合計金額 は 四捨五入(_単価 * _個数 * (1 - 0.2)).
合計金額を計算する(_単価,_個数,_合計金額) :-
abs(_個数) >= 20,
_合計金額 は 四捨五入(_単価 * _個数 * (1 - 0.4)).
_値 は 四捨五入(_式) :- _値_1 は _式,_値 is truncate(floor(_値_1 + 0.5)),!.
_値 は _式 :- _値 is _式.
272 :
デフォルトの名無しさん :2010/07/07(水) 08:33:41
>>271 (
>>269 )
% Prolog 訂正。
:- op(700,xfx,は).
_値 は 四捨五入(_式) :-
_値_1 は _式,
_値_1 >= 0.0,
_値 is truncate(floor(_値_1 + 0.5)),!.
_値 は 四捨五入(_式) :-
_値_1 は _式,
_値_1 < 0.0,
_値 is truncate(ceiling(_値_1 - 0.5)),!.
_値 は _式 :-
_値 is _式.
274 :
デフォルトの名無しさん :2010/07/07(水) 15:04:06
>>273 % Prolog
'0から7までの数字が描かれたカードがある。ただし、0だけ2枚で、合計9枚とする。こ
の中から4枚を選ぶ組合せを考える。ただし、6と7は同時に選ばない(両方選ばなくても
よい)。このような組合せを列挙する'(U) :-
findall(L,(
組み合わせ([0,0,1,2,3,4,5,6,7],4,L),
許される組み合わせ(L)),
X),
sort(X,Y),
append(_[U|R],Y).
許される組み合わせ(A) :- append(_[6|_],A),append(_,[7|_],A),!,fail.
許される組み合わせ(A) :- append(B,[0|C],A),append(D,[0|E],C),!,fail.
許される組み合わせ(A).
>>274 (
>>273 )
% Prolog 述語名の途中で改行してしまった。書き直し。
'0から7までの数字が描かれたカードがある。ただし、0だけ2枚で、合計9枚とする。この中から4枚を選ぶ組合せを考える。ただし、6と7は同時に選ばない(両方選ばなくてもよい)。このような組合せを列挙する'(U) :-
findall(L,(
組み合わせ([0,0,1,2,3,4,5,6,7],4,L),
許される組み合わせ(L)),
X),
sort(X,Y),
append(_[U|R],Y).
許される組み合わせ(A) :- append(_[6|_],A),append(_,[7|_],A),!,fail.
許される組み合わせ(A) :- append(B,[0|C],A),append(D,[0|E],C),!,fail.
許される組み合わせ(A).
>>273 % Prolog
'0から7までの数字が描かれたカードがある。ただし、0だけ2枚で、合計9枚とする。この中から4枚を選ぶ組合せを考える。ただし、6と7は同時に選ばない(両方選ばなくてもよい)。このような組合せは何通りあるか'(_何通り) :-
count(('0から7までの数字が描かれたカードがある。ただし、0だけ2枚で、合計9枚とする。この中から4枚を選ぶ組合せを考える。ただし、6と7は同時に選ばない(両方選ばなくてもよい)。このような組合せを列挙する'(U)),_何通り).
http://pc12.2ch.net/test/read.cgi/tech/1276810079/603 # [1] 授業単元: プログラミング演習
# [2] 問題文(含コード&リンク):
# 10人の成績を入力し、その順位を成績と共に表示したい。以下の考えに基づいたプログラムを作成せよ。
#
# 1. 2次元配列s[10][2]を用意する。
# 2. i=0〜9のfor文を用いて、s[i][0]に成績入力する。
# 3. s[0][0]とs[j][0], j=0〜9を比較し、s[0][0]より大きい数値の個数nを考える。
# その個数+1が成績順位になるので、s[0][1]にn+1を代入する。
# 4. 同様の操作をs[i][0]にi=0〜9に対して行えば、その成績順位がs[i][1]として求められるので、
# あとは成績と共に表示すればいい。
>>243 使用言語:J
load 'misc'
f=:monad define
a=.prompt '非負の整数を入力してください: '
smoutput a,' を逆から読むと ',(|.a),' です.'
)
f ''
非負の整数を入力してください: 1234
1234 を逆から読むと 4321 です.
>>244 使用言語:J
load 'misc'
f=:monad define
s=.0
n=.1
smoutput '整数を入力してください'
while. 0<a=.".prompt '整数',(":n),' : ' do.
n=.n+1
s=.s+ *:a
end.
smoutput '二乗値の合計は ',(":s),' です.'
)
f ''
整数を入力してください
整数1 : 3
整数2 : 5
整数3 : -1
二乗値の合計は 34 です.
>>245 使用言語:J
load 'misc'
f=:monad define
m=.".prompt '何行ですか: '
n=.".prompt '何列ですか: '
smoutput (8!:2)10|(i.m)+/>:i.n
)
f ''
何行ですか: 7
何列ですか: 12
123456789012
234567890123
345678901234
456789012345
567890123456
678901234567
789012345678
>>262 使用言語:J
smoutput@(8!:2)\>:i.5
1
12
123
1234
12345
http://pc12.2ch.net/test/read.cgi/tech/1276810079/618 # 【質問テンプレ】
# [1] 授業単元:プログラミング演習
# [2] 問題文(含コード&リンク):
# 円形テンプレートマッチングのプログラムを作成せよ。
#
# 白い楕円が複数書いてあるBMP画像を読み込み(適当にペイントで作成)画像左下からラスタ走査し、円形テンプレートマッチングをするプログラムを作成せよ。
# 円形テンプレートはサイズA〜Bまで変化させ、一致率(円形テンプレートの円周上に一致する白画素と一致している数/円形テンプレート円周のプロット数、円形テンプレート内の黒画素に一致している黒画素数/円形テンプレート内の黒画素数)
# 上位5つを色を変えて描画せよ。
#
# また、一致率上位5つの半径、一致率、座標(画像の左下をx=0、y=0とする)をdos窓上に標示せよ。
#
http://pc12.2ch.net/test/read.cgi/tech/1276810079/630 # [1] 授業単元:Cプログラミング
# [2] 問題文(含コード&リンク):
#
# 概要:数値を1つ(2〜9の数字)入力し、その個数分の"*"を1辺とする
# 完成図(*=★、空白=☆):
#
# 3を入力した場合
# ★★★
# ☆☆★
# ★★★
#
# 9を入力した場合
# ★★★★★★★★★
# ☆☆☆☆☆☆☆☆★
# ★★★★★★★☆★
# ★☆☆☆☆☆★☆★
# ★☆★★★☆★☆★
# ★☆★☆☆☆★☆★
# ★☆★★★★★☆★
# ★☆☆☆☆☆☆☆★
# ★★★★★★★★★
>>284 使用言語:J
NB. p1
(8!:2)#:1234
10011010010
NB. p2
bit_count=:monad def '+/(16#2)#:y'
a=:1234
bit_count a
5
>>269 使用言語:J
NB. Q1
f=:monad def '-/ .* 2 2 $ y'
f 100 20 30 40
3400
NB. Q2
f=:dyad define
s=.x*y
r=.0
if. (5<:y) *. (y<10) do. r=.0.1
elseif. (10<:y) *. (y<20) do. r=.0.2
elseif. 20<:y do. r=.0.4
end.
s=.s-<.s*r
)
100 f 2
200
100 f 5
450
100 f 10
800
100 f 20
1200
>>285 使用言語:J
f=:monad define
if. 0=2|y do.
b=.(,|.)i.-:y
else.
b=.(}:,|.)i.-:>:y
end.
c=.0=2|<./~b
d=.y{0 0 1 1 1 2 3 3 3 4
((d$0 1)(;/&.><"1(,.~>:)i.d)}c){ucp'☆★'
)
f 2
★★
☆★
f 4
★★★★
☆☆☆★
★☆☆★
★★★★
f 5
★★★★★
☆☆☆☆★
★★★☆★
★☆☆☆★
★★★★★
>>273 使用言語:J
comb=:dyad define
k=. i.>:d=.y-x
z=. (d$<i.0 0),<i.1 0
for. i.x do. z=. k ,.&.> ,&.>/\. >:&.> z end.
; z
)
f=:dyad define
a=. x comb y
(2 ~: +/ |: +/ 6 7 =/ a) # a
)
# 4 f 9
105
使用言語:pascal 以下の条件(仕様)を満たすプログラムを作成し, そのプログラム(Pascalプログラムソースファイル)とともに その解説書を提出すること. 逆ポーランド記法で入力された論理式の充足可能性を判定し, その式の値をtrueにする変数値を,通常の表記とともに出力すること. 可能な演算は論理積(and), 論理和(or), 否定(not), の3種類として, それぞれ 'a','o','n' で表現すること. 使用可能な論理変数は x0, x1, ..., x9 の10種類とし, それぞれ '0','1',...,'9' で表現すること. 例) (x1∧x2)∨(¬x1∧x3) ⇒ 12a1n3ao 使用できない文字が含まれる入力に対してエラーの旨を出力すること. 入力された論理式の充足可能性を判定, 式の値を true にする変数値を出力した後, 再度入力待ち状態になり, 空の文字列を入力するとプログラムが終了すること. padcalの宿題スレで返答がないのでこちらに書かせていただきました。 解説も出来たらお願いします。
>>245 使用言語:maxima
f(m, n) :=
for i thru m do (
for j thru n do printf(true, "~d", mod(i + j - 1, 10)),
newline()
);
(%i63) f(7,12);
123456789012
234567890123
345678901234
456789012345
567890123456
678901234567
789012345678
>>296 使用言語:Scilab
-->2:2:10
ans =
2. 4. 6. 8. 10.
>>296 使用言語:J
>:i.10
1 2 3 4 5 6 7 8 9 10
_2,\>:i.10
1 2
3 4
5 6
7 8
9 10
|:_2,\>:i.10
1 3 5 7 9
2 4 6 8 10
}.|:_2,\>:i.10
2 4 6 8 10
299 :
デフォルトの名無しさん :2010/07/18(日) 19:05:48
prologの問題で5本ハノイの塔を考えているのですが、効率のいいアルゴリズムがわかりません。 協力お願いします。 #使用言語:prolog #単元:演習問題 #a;b;c;d;eという5 本の棒があり、棒aに円盤1からnまでが存在している。 #棒aの1からnまでの円盤を棒eに移す。 #3本の時の例 move(N,A,B) :- display(N), display(' from '), display(A), display(' to '), display(B), nl. hanoi(1,A,B,C) :- move(1,A,C). hanoi(N,A,B,C) :- M is N-1, hanoi(M,A,C,B), move(N,A,C), hanoi(M,B,A,C). こんな感じでやりました。(見にくくてすみません)
300 :
デフォルトの名無しさん :2010/07/18(日) 19:26:52
↑の続きですが、試行回数を3本の時以下にする問題です。
書き込み規制中に100題以上進んでしまいました。順にアップしていくつもりですが、追いつかないかもしれない。C/C++の課題は上のアーカイブにc13[7-8]_*.htmlのファイル名でコピーしてあります。中には解答を含んでいるものもありますが、四分の一くらいかな。
http://pc12.2ch.net/test/read.cgi/tech/1276810079/648 # [1] 授業単元:
# [2] 問題文(含コード&リンク):
# 2〜9の数字を入力その数字に応じて図形を表示させる関数を作る
# 正方形 三角形 六角形 菱形 星 渦巻き
# 星と渦巻き以外できたからこの2つについて知りたい
# 例 7を入力したとき 左:渦 右:星
#
# ******* * * *
# * * * *
# ***** * ***
# * * * *******
# * *** * ***
# * * * * *
# ******* * * *
#
http://pc12.2ch.net/test/read.cgi/tech/1276810079/655 # [1] 授業単元:C言語
# [2] 問題文(含コード&リンク):
#
# 以下の仕様に従って,分数の四則演算を行うプログラムを作成せよ。
# [仕様1] 以下のような構造体を定義し,分数のデータ構造に利用すること。
# struct fraction{
# int parent; /* 分母(denominator) */
# int child; /* 分子(numerator) */
# };
# [仕様2] 以下の実行結果となるようなプログラムを作成せよ。
# プログラムの実行結果↓
# 1つ目の分数を入力して下さい。
# 3/4 ←キーボードより入力
# 2つ目の分数を入力して下さい。
# 1/4 ←キーボードより入力
# 演算方法(1.加算,2.減算,3.乗算,4.除算)を入力して下さい。
# 2 ←キーボードより入力
# 3/4 - 1/4 = 1/2
# 計算結果は約分をして表示
#
http://pc11.2ch.net/test/read.cgi/db/1274791771/276 # 以下のようなテーブルがあります。
#
# itemテーブル
# item_id name color
# 1 商品1 3
# 2 商品2 12
# 3 商品3 7
#
# colorテーブル
# color_id name
# 1 赤
# 2 青
# 4 緑
# 8 黒
#
# item.colorの部分は、ビット演算の概念を使って
# 3なら赤+青
# 12なら緑+黒
# 7なら赤+青+緑
# の色を持っていることを意味します。
>>307 のつづきです。
# これを結合の段階で、以下のように色名を取得することは可能なのでしょうか?
#
# 1 商品1 赤
# 1 商品1 青
# 2 商品2 緑
# 2 商品2 黒
# 3 商品3 赤
# 3 商品3 青
# 3 商品3 緑
#
これはまだ7月9日分です。この後140題くらい出題されています。
>>307 % Prolog
色名を取得する :-
item(_item_id,_name,_color),
色の割り当て(_color,_色名),
write_formatted('%t %t %t\n',[_item_id,_name,_色名]),
fail.
色名を取得する.
色の割り当て(_色番号,_色名) :-
findall([_color_id,_name],color(_color_id,_name),L),
sort(L,L1),
reverse(L1,L2),
色の割り当て(_色番号,L2,_色名).
色の割り当て(N,_,_) :- N =< 0,!,fail.
色の割り当て(N,[[C,_色名]|R1],_色名) :-
1 is N // C.
色の割り当て(N,[[C,_]|R1],_色名) :-
1 is N // C,
M is N mod C,
色の割り当て(M,R1,_色名).
色の割り当て(N,[[C,_]|R1],_色名) :-
0 is N // C,
M is N mod C,
色の割り当て(M,R1,_色名).
http://pc12.2ch.net/test/read.cgi/tech/1267796762/260 # 【 課題 】今月のカレンダ作成詳細は下に書きます
# 【 形態 】Javaアプリケーション(main()で開始)
# 【 期限 】7月14日日
# 【 Ver 】1.6.0_20
#
# 今月、7月のカレンダーを2次元配列に格納してください。
# 要素数は縦5横7の配列となります。(曜日は格納する必要がありません。)
# 週の先頭が日曜日はじまりで格納してください
# 配列のカレンダーを表示するコードを追加してください。
# 日にちを1つ入力するとその日が何曜日かを表示するコードに修正してください。
# よろしくお願いします
>>311 % Prolog
'今月、7月のカレンダーを2次元配列に格納する'(LL) :-
今日の日付と曜日番号(_日,_曜日番号),
カレンダーの構造を作る(_31日定数平坦ならび,_35日平坦ならび,_5週間ならび,
'全体の枠の中で1-31日の位置を確定する'(_日,_曜日番号,L0,_31日定数平坦ならび,L2,_35日平坦ならび),
変数として残った両端部分は空白に(L0,L2),
平坦化の逆変換(_5週間ならび,_35日平坦ならび).
今日の日付と曜日番号(_日,_曜日番号) :-
_時刻 is time,
localtime(_時刻,_年,_月,_日,_曜日番号,_累積日,_時,_分_秒).
カレンダーの構造を作る(_31日定数平坦ならび,_35日平坦ならび,_5週間ならび) :-
findall(N,for(1,N,31),_31日定数平坦ならび),
findall(_,for(1,N,35),_35日平坦ならび),
findall(L,(for(1,_,5),length(L,7)),_5週間ならび).
'全体の枠の中で1-31日の位置を確定する'(_日,_曜日番号,L0,_31日定数平坦ならび,L2,_35日平坦ならび) :-
append(L0,_31日定数平坦ならび,L2,_35日平坦ならび),
append(U,[J|_],_35日平坦ならび),\+(var(J)),J=_日,
length(U,Len),
_曜日番号 is Len mod 7,!.
変数として残った両端部分は空白に(L0,L2) :- all(L0,' '),all(L2,' ').
平坦化の逆変換(L1,L2) :- flat(L1,L2).
>>296 % Prolog 解答例その一
'1〜10までの偶数を出力' :-
for(1,N,10),
偶数(N),
write_formatted('%t\n',[N]),
fail.
'1〜10までの偶数を出力'.
>>296 % Prolog その二
'1〜10までの偶数を出力' :-
'1〜10までの偶数(非決定性)'(1,N),
write_formatted('%t\n',[N]),
fail.
'1〜10までの偶数'.
'1〜10までの偶数(非決定性)'(N,_) :- N > 10,!,fail.
'1〜10までの偶数(非決定性)'(N,N) :- 偶数(N).
'1〜10までの偶数(非決定性)'(N1,N) :-
N2 is N1 + 1,
'1〜10までの偶数(非決定性)'(N2,N).
>>296 % Prolog その三
'1〜10までの偶数を出力' :-
'1〜10までの偶数を出力'(1).
'1〜10までの偶数を出力'(N) :- N > 10,!.
'1〜10までの偶数を出力'(N) :-
偶数(N),
write_formatted('%t\n',[N]),
N2 is N + 1,
'1〜10までの偶数を出力'(N2).
'1〜10までの偶数を出力'(N) :-
奇数(N),
N2 is N + 1,
'1〜10までの偶数を出力'(N2).
>>296 % Prolog その四
'1〜10までの偶数を出力' :-
'1〜10までの偶数ならび'(1,L),
concat_atom(L,'\n',S),
write_formatted('%t\n',[S]).
'1〜10までの偶数ならび'(N,[]) :- N > 10,!.
'1〜10までの偶数ならび'(N,[N|R]) :-
偶数(N),
N2 is N + 1,
'1〜10までの偶数ならび'(N2,R).
'1〜10までの偶数ならび'(N,R) :-
奇数(N),
N2 is N + 1,
'1〜10までの偶数ならび'(N2,R).
>>296 % Prolog その五
'1〜10までの偶数を出力' :-
'1〜10までの偶数を出力'(1).
'1〜10までの偶数を出力'(N) :- N > 10,!.
'1〜10までの偶数を出力'(N) :-
偶数(N),
write_formatted('%t\n',[N]),
N2 is N + 1,
'1〜10までの偶数を出力'(N2).
'1〜10までの偶数を出力'(N) :-
奇数(N),
N2 is N + 1,
'1〜10までの偶数を出力'(N2).
>>296 % Prolog これは上記5個の '1〜10までの偶数を出力'/0 述語から呼び出されている定義です。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
'1〜10までの偶数を出力' :-
findall(N,(for(1,N,10),偶数(N)),L),
concat_atom(L,'\n',S),
write_formatted('%t\n',[S]).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
偶数(N) :- 0 is N mod 2.
奇数(N) :- 1 is N mod 2.
>>313-
>>318 Prologのプログラミングではほとんどの場合数個のプログラムパターンが選択可能だ。この点Pythonなどとはかなり性質のことなったプログラム言語だといえよう。
http://pc12.2ch.net/test/read.cgi/tech/1276810079/678 # [1] 授業単元:C言語
# [2] 問題文(含コード&リンク):
# 以下の機能を持つプログラムを作ること。
#
# -1から100の数字の中から素数を抽出する (配列に直接数字を指定することは不
# 可)
# -抽出した素数を大きい順(降順)にソートする
# -ソートした素数を1行につき5個表示する(6個目以降は次の行に表示する)
#
# 但し、以下の4つの機能を使ったプログラムにすること。
# -サブ関数
# -配列
# -if文
# -for文
#
# 以下の点に関して工夫をした場合は加点の対象とする
#
# -素数の計算時間の低減
# -見つけた素数の数のカウント
# -ソートのアルゴリズム高速化
# -実行時間の表示
http://pc12.2ch.net/test/read.cgi/tech/1267796762/262 # 【 課題 】自動販売機プログラム(レイアウトは自由)
# 【 形態 】 Servlet/JSP
# 【 GUI 】制限なし
# 【 期限 】7/13(最長7/16)
# 【 Ver 】1.6.0_15
# 【 補足 】
# 1. 商品は10種類、購入商品は選択可能。
# 2. 商品の価格は150円が3種類、130円が2種類、100円が5種類とする。
# 3. 使用できる硬貨は、500円、100円、50円、10円とし、紙幣は1000円のみ使用可能
とする。硬貨投入後に投入した硬貨の返却が出来る。
# 4. お釣り用の硬貨は初期値でそれぞれ10枚ずつ設定されている。
# 5. 500円硬貨が0になった場合に、100円硬貨が5枚以上存在した場合には100円硬貨を
返却する。また、100円硬貨以下についても、代替できるものは他の硬貨を用いて返却を
可能とする。
# 6. お釣りが返却できない硬貨投入時には、お釣りが無くなった旨を表示、購入不可
とする。
# 7. 商品は初期値でそれぞれ10個ずつ在庫があるものとする。
# 8. 商品の在庫が無くなった場合には、商品の在庫が無くなった旨を表示し、購入不
可とする。
int 型の配列に読み込んだ全要素を逆順に並べ替える # プログラムを作成せよ # # vx[ 0] : 58 # vx[ 1] : 32 # vx[ 2] : 17 # vx[ 3] : 46 # vx[ 4] : 22 # vx[ 5] : 73 # vx[ 6] : 69 # vx[ 0] = 69 # vx[ 1] = 73 # vx[ 2] = 22 # vx[ 3] = 46 # vx[ 4] = 17 # vx[ 5] = 32 # vx[ 6] = 58
http://pc12.2ch.net/test/read.cgi/tech/1267796762/367 # 組織のある部門にある能力を持つ人間を追加したり削除したりすることで,その組織全体もしくは部分的な部門の能力を計算するシステムを構築せよ.
# このシステムによって,組織内のニーズにあった人員配置を行なう支援をできると期待できる.
# 基本的にこのシステムは以下の機能を最低限有しなければならない.
#
# 1. 登録すべき部門や副部門を指定する.
# 2. 人物の名前(文字列),資格数(整数),勤務経験年数(整数),年齢を入力する.
# 3. もし,既に十分な人数がシステムに登録済の場合,そのデータと,前段階で入力された資格数,勤務経験年数,年齢に基づき,この人物の能力の値(high, middle or low)をシステムが予測し表示する.
# 4. システム(プログラム)を停止した際,現在,保持しているデータを保存できる.
# 5. システム(プログラム)を起動した際,既存のデータがあれば,それを読み込める.
#
# 単純化のため,能力は人物,組織どちらも金額(円)で表現されているとする.
# 人物も単純化のため,その氏名で区別することとし,同一氏名の人物は組織に追加できなくてもよい.
# 組織の中にある部門は階層的な構造となっており,その階層の深さは均一でない.
# 例えば「/秘書課/」という部門は組織の直下に位置するが,「/営業部/関東営業部/」,「/開発部/半導体課/」,「/研究部/先端科学課/タイムマシン開発グループ/」等2もしは3階層の場合もある.
# 尚,階層の深さ制限は無いものとする.
# ある部門の下に人物と副部門が同時に配置される場合もある.
# 例えば,営業部部長の田中さんは「/営業部/田中」と表現できるが,関東営業部に属する山田さんは,「/営業部/関東営業部/山田」となる.
# 尚,本システムでは日本語名は扱えなくてもよい.
http://pc12.2ch.net/test/read.cgi/tech/1279286575/398 # [1] 授業単元:OS
# [2] 問題文(含コード&リンク):サーバクライアント通信をFIFOで作る
# – 一つのサーバプロセスが,
# • FIFOを作る.
# • データを待つ.
# • SIGINTを受信したら,FIFOを削除してから終了する.
# – 複数のクライアントプロセスが,サーバにリクエストを送る.
# – 文字列を送るクライアントプロセスが複数(forkすればおk).
# – サーバプロセスは単に表示する
#
http://pc12.2ch.net/test/read.cgi/tech/1279286575/393 # [2] 問題文(含コード&リンク):
# ある差分方程式を、初期値から順々に予測していくプログラムを作ったのですが、
# それぞれの本当の値と予測した値の差を誤差としたとき、その誤差をフーリエ変換することによって、
# 発生する誤差に周期が存在するかを確認するプログラムを作りたいです。
# 条件としては、もともとファイル(ex. log.data)に誤差の値を入れておいて、それをプログラム内で参照するようなものが望ましいです。
# 簡単にたとえるなら誤差データ(log.data)が以下のような場合に
# 2.0
# 0.0
# 1.0
# -2.0
# 2.0
# 0.0
# 1.0
# -2.0
# 2.0
# 0.0
# 1.0
# -2.0
# フーリエ変換した結果をgnuplotなどで表示した際に周期が4のところにスペクトルが出るようなものを作りたいです。
http://pc12.2ch.net/test/read.cgi/tech/1276810079/786 # コンピュータ基礎1
# OS windows7 32bit
# gcc2.9.5
# 言語 c
# 期限 なし
# 課題でいくつかc言語の課題が出て、本当に簡単なのは何とか解いたのですが2つほど分からないものがあったので
# よろしければ教えていただきたいです。
#
# ?キーボードから1つの実数値xを入力し、絶対値を表示するプログラムを作りなさい
#
# ?キーボードからテストの得点m(0以上100以下)を入力し
# (1) m<60 の場合は「不合格」
# (2) 60≦m<80 の場合は「普通」
# (3) 80≦m の場合は「優秀」
# と表示するプログラムを作りなさい。
http://pc12.2ch.net/test/read.cgi/tech/1276810079/790 # 以下の入力をして、これを二次元配列に代入していく方法がわかりません。
# 当方scanf+Enterによる単純な入力しかしたことがありません。
# 空白を認識して代入先を変える方法?と考えて手が止まりました。
#
# /*以下入力*/
# 3 /*変数int nへ代入する。今から3*3行列を入力するという意味*/
# 3 5 7
# 2 5 8
# 6 8 1
# /*入力ここまで*/
#
# for(i=0;i<n;i++){
# for(j=0;j<n;j++){
# printf("%d ", a[i][j]);
# }printf("\n");
# }printf("\n");
# の結果は上記の
# 3 5 7
# 2 5 8
# 6 8 1
# を表示するように二次元配列aに代入する。
http://pc12.2ch.net/test/read.cgi/tech/1276810079/802 # [1] 授業単元:オペレーティングシステムプログラミング演習
# [2] 問題文
http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10820.txt #
# コマンドの引数xxxxで指定したファイルが更新されたら直ちに
# “Modified xxxxfile on Day Month date hh:mm:ss yyyy”
# というメッセージを表示するファイル更新を監視する常駐プログラムを作成せよ。
# 常駐プログラムは、kill pid コマンドが入力されるまで、動き続けるように作成すること。
#
# プログラムの作成は、サンプルプログラムを参考にして、ファイルのiノード情報の
# 最終更新日時を定期的(例えば、sleep で1秒間隔)にチェックし、最終更新日時が
# 書き換えられたらメッセージを表示し、プログラム自身では終了しない無限ループする
# プログラムを作成することになる。
# 常駐プログラムの実行方法の1つは、バックグランドで起動する。
# 直ちに、ps コマンドでプログラムが動作中であることを確認する。
# その後、touchコマンドを投入して自分自身のファイルのタイムスタンプを更新し、
# メッセージが出れば動作していることになる。
# このtouchコマンドの投入を繰り返すことによって、動作を継続していることも確認する。
>>342 % Prolog
'キーボードからテストの得点m(0以上100以下)を入力し(1) m<60 の場合は「不合格」(2) 60≦m<80 の場合は「普通」 (3) 80≦m の場合は「優秀」 と表示する' :-
'キーボードからテストの得点m(0以上100以下)を入力し'(_得点m),
'(1) m<60 の場合は「不合格」(2) 60≦m<80 の場合は「普通」 (3) 80≦mの場合は「優秀」'(_得点m,_判定),
表示する(_得点m,_判定).
'キーボードからテストの得点m(0以上100以下)を入力し'(_得点m) :-
write('テストの得点を入力してください : '),
get_line(Line),
'得点m(0以上100以下)を入力し、'(Line,_得点m).
'得点m(0以上100以下)を入力し、'(Line,_得点m) :-
atom_to_term(Line,X,_),
integer(X),
X >= 0,X =< 100,!.
実数値xを入力し、(Line,_得点m) :-
write_formatted('入力された値%tは得点として妥当なものではありません\n',[Line]),
'キーボードからテストの得点m(0以上100以下)を入力し'(_得点m).
'(1) m<60 の場合は「不合格」(2) 60≦m<80 の場合は「普通」 (3) 80≦m の場合は「優秀」'(_得点m,不合格) :- _得点m < 60,!.
'(1) m<60 の場合は「不合格」(2) 60≦m<80 の場合は「普通」 (3) 80≦m の場合は「優秀」'(_得点m,普通) :- 60 =< _得点m,_得点m < 80,!.
'(1) m<60 の場合は「不合格」(2) 60≦m<80 の場合は「普通」 (3) 80≦m の場合は「優秀」'(_得点m,優秀) :- _得点m >= 80,!.
表示する(_得点m,_判定) :-
write_formatted('得点%tの判定は %t です\n',[_得点m,_判定]).
>>343 % Prolog
キーボードから1つの実数値xを入力し、(_x) :-
write('実数値を入力してください : '),
get_line(Line),
実数値xを入力し、(Line,_x).
実数値xを入力し、(Line,_x) :- atom_to_term(Line,_x,_),real(_x),!.
実数値xを入力し、(Line,_x) :-
write_formatted('入力された値%tは実数値ではありません\n',[Line]),
キーボードから1つの実数値xを入力し、(_x).
絶対値を(_x,_xの絶対値) :-
_x >= 0.0,
_x = _xの絶対値,!.
絶対値を(_x,_xの絶対値) :-
_x =< 0.0,
_xの絶対値 is _x * (-1).
表示する(_x,_xの絶対値) :-
write_formatted('|%t| = %t\n',[_x,_xの絶対値]).
>>325 % Prolog
'2.71 < (1 + 1/N) ^ N < 2.72 を満たす最小の整数Nを求める'(N) :-
for(1,N,maxint),((1 + 1/N) ^ N) > 2.71,!.
>>320 % Prolog
'1から100の数字の中から素数を抽出する (配列に直接数字を指定することは不可)-抽出した素数を大きい順(降順)にソートする-ソートした素数を1行につき5個表示する(6個目以降は次の行に表示する)' :-
'1から100の数字の中から素数を抽出する'(L1),
'抽出した素数を大きい順(降順)にソートする'(L1,L2),
'ソートした素数を1行につき5個表示する'(L2).
'1から100の数字の中から素数を抽出する'(L1) :- findall(M,for(2,M,N),L),'エラトステネスの篩'(L,L1),!.
'抽出した素数を大きい順(降順)にソートする'(L1,L2) :- sort(L1,L3),reverse(L3,L2).
'ソートした素数を1行につき5個表示する'(L) :-
'5個切り取り表示'(L,R),
length(R,Len),
Len < 5,
'最終行は5個に満たないかもしれない(R),!.
'5個切り取り表示'(R,R) :- length(R,Len),Len < 5,!.
'5個切り取り表示'(L,R) :-
'N個組'(5,L,X,R),
concat_atom(X,' ',S1),
write_formatted('%t\n',[S1]).
'N個組'(N,L,X,R) :-
length(X,N),
append(L0,X,R,L),
length(L0,Len1),
0 is Len1 mod N.
最終行は5個に満たないかもしれない(R) :- concat_atom(R,' ',S),write_formatted('%t\n',[S]).
http://pc12.2ch.net/test/read.cgi/tech/1276810079/811 # [1] C言語プログラミング演習
# [2] 問題文(含コード&リンク):
http://ime.nu/www.dotup.org/uploda/www.dotup.org1025743.jpg #
# 100未満の素数を表示するプログラムを作りなさい。
# 0から99までの配列を用意し、10までの素数の倍数を
# 素数でないとしていく。以下、実行例。
# 2の倍数を消去 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 56 58 60 62 64 66 68 70 72 74 76 78 80 82 84 86 88 90 92 94 96 98
# 3の倍数を消去 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 6669 72 75 78 81 84 87 90 93 96 99
# 5の倍数を消去 5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90 95
# 7の倍数を消去 7 14 21 28 35 42 49 56 63 70 77 84 91 98
http://pc12.2ch.net/test/read.cgi/tech/1276810079/819 #
# 整数を各要素の値とする、2つの2次元ベクトルが与えられたときに、それらの内積を計算する関数innerProduct()を使って、この2つのベクトルが直行しているかどうかを判定するプログラムを作成せよ。
#
# 2つの2次元ベクトル U(ux,uy)とv(vx,vy) の内積は,
# ux × uy + vx + vy
# で計算でき、2つのベクトルが作る角度は、
# 内積が正なら90°より小さく 内積が0なら 90° 内積が負なら90°より大きい
# この考え方は3次元のベクトルでも同じである。上記のプログラムを、3次元のベクトルにも対応したものにすぐに修正できるようにするには、マクロを使うことが有効である。
# どのようにすればよいかを考えよ。
# 2次元の場合
# % ./innerProduct
# input u[0]: 2 input u[1]: 6 input v[0]: 9input v[1]: -1
# u=[ 2 6 ], v=[ 9 -1 ]
# inner product is 12
# The angle of the vectors is less than 90 degree.
# %
# 3次元の場合
# % ./innerProduct
# input u[0]:input u[1]: 1input u[2]: 2input v[0]: 6input v[1]: 3input v[2]:-2
# u=[ 0 1 2 ], v=[ 6 3 -2 ]
# inner product is -1
# The angle of the vectors is greater than 90 degree.
# %
http://pc12.2ch.net/test/read.cgi/tech/1276810079/815 # [1] C言語プログラミング演習
# [2] 問題文
#
# name(名前: char型配列), height(身長: float型変数), bloodType(血液型: char型変数)をメンバに持つ構造体を宣言し, 128名分が記憶可能になるようその構造体の配列を定義せよ.また,その配列に対して値を入力し,
# さらに表示できるようにせよ.構造体のメンバ値を表示するには、ひとつの構造体の各メンバの値を表示する関数を作成すること。
#
#
# % ./bodyData
# 1人目のデータ: 立命太郎 175.5 A
# 2人目のデータ: 野路花子 169.0 B
# 3人目のデータ: 衣笠一郎 180.4 O
# 4人目のデータ: 0 0 0 ← 0 0 0 と入力すると終わる.
# 名前 身長 血液型
# 立命太郎 175.5 A
# 野路花子 169.0 B
# 衣笠一郎 180.4 O
# %
#
# ヒント: 各人の名前、身長、血液型のデータを1行で入力するためには、参考12.1に示されたfgets()関数で、これらを1度に取り込み、最初の空白までを名前とみなし、次の空白までを身長とみなし、
# 次に改行までを血液型をみなせばよい。これらを別々の文字列として、必要に応じて整数や浮動小数点数に変換し、構造体のメンバに設定すること。
#
# ヒント: ひとつの構造体の各メンバの値を表示する関数に構造体を引渡すことを繰り返えせばよい。
http://pc12.2ch.net/test/read.cgi/tech/1276810079/820 # [1] C言語プログラミング演習
# [2] 問題文(含コード&リンク
# 標準入力から正の整数値を読み込み,0が入力されたらそれらの整数を小さい順に表示するプログラムを作成せよ.
#
# 以下のような処理の流れでプログラムを作成すること。
#
# 数字を読み込むごとに, それまでに入力された数値が格納された配列の最後の要素から, 先頭に向かって順に大小の比較を行う. これにより、読み込んだ数字の方が入るべき位置がわかる.
# 読み込んだ数字が入るべき箇所を空けるために、 既に記憶されている配列の要素のうち、 この数字よりも大きな数字をひとつ後ろにずらす。 空いた箇所に読み込んだ数字を代入する.
# 次に入力される数字の処理へ移る.
#
# % ./ordering
# 正整数: 17
# 正整数: 3
# 正整数: 9
# 正整数: 4
# 正整数: 0
# 入力された整数は小さい順に 0, 3, 4, 9, 17 です.
http://pc12.2ch.net/test/read.cgi/tech/1276810079/821 # [1] C言語プログラミング演習
# [2] 問題文(含コード&リンク
# 文字列yを文字列xの最後に連結する関数stringcat(char [], char [])を作成せよ.この関数を用いて、入力された2つの文字列を連結するプログラムを作成せよ。
#
# 注意: stringcat()を呼び出すときは,連結後の文字列がxの配列長を超えないように注意すること.
#
#
# % ./catenate
# 文字列x (20字まで)? linux
# 文字列y (20字まで)? kadai
# 連結後のx: linuxkadai ←全部で20字以内なので連結可能
# 20字を超える場合は連結不可能とする
http://pc12.2ch.net/test/read.cgi/tech/1276810079/822 # [1] C言語プログラミング演習
# [2] 問題文(含コード&リンク
# 文字列xに文字列yが含まれるかどうかを判定する関数str_comp(char [], char [])を作成せよ.
# この関数を用いて、入力されたひとつめの文字列にふたつめの文字列が含まれているかを判定するプログラムを作成せよ。
#
#
# % ./compare
# 文字列x (64字まで)? kadaigakitui
# 文字列y (64字まで)? dai
# "kadaigakitui"に"dai"は含まれます.
#
# % ./compare
# 文字列x (64字まで)? kadaigakitui
# 文字列y (64字まで)? ycx
# "kadaigakitui"に"ycx"は含まれません.
http://pc12.2ch.net/test/read.cgi/tech/1276810079/851 # 実数xを入力し、xの平方根を計算するプログラムを作りなさい。平方根は次のアルゴリズムで計算されるものとする。 動作例(1回実行) x = 2 2.000000の平方根は1.414207
# (1) a = 0.0、b = xとし、c = ( a + b ) / 2.0を計算する。
# (2) c2 < x ならばa = c、そうでなければb = cとし、計算を繰り返す。
# (3) b – aが収束値0.00001以下になったときのcを平方根とする。
# プログラムヒント:実数の型はfloatもしくはdoubleを用いること。整数を入力するにはatoi関数を使ったが、実数を入力するにはatof関数を使う。
# これお願いします。
#
http://pc12.2ch.net/test/read.cgi/tech/1267796762/288 # 【 課題 】入力したテキストファイルを行毎にUTF-8の文字コードに変換してファイルに出力するプログラムを作成せよ
# 【 形態 】Javaアプリケーション(main()で開始)
# 【 GUI 】制限なし
# 【 期限 】7/16
# 【 Ver 】 1.6.0_20
# 【 補足 】
# あいうえお
# アイウエオ
#
# という2行のファイルを入力させた場合
#
# E38182E38184E38186E38188E3818A
# E382A2E382A4E382A6E382A8E382AA
#
# というファイルを出力させたいです。よろしくお願いします。
>>363 % Prolog (その一)
'1000以下の完全数をすべて出力する' :-
for(1,N,1000),
完全数(N),
write_formatted('%t\n',[N]),
N = 1000,!.
'1000以下の完全数をすべて出力する'.
>>363 % Prolog (その二)
完全数(N) :-
'1以外の最初の約数は'(N,N1),
NX is N // N1,
N2 is N1 + 1,
S1 is N1 + NX + 1,
完全数(N2,S1,N),!.
完全数(N1,N,N) :- (N // N1) < N1,!.
完全数(N1,S1,N) :- (N // N1) >= N1,
0 is N mod N1,
Y is N // N1,
S2 is S1 + N1 + Y,
N2 is N1 + 1,
完全数(N2,S2,N).
完全数(N1,S,N) :- (N // N1) >= N1,
\+(0 is N mod N1),
N2 is N1 + 1,
完全数(N2,S,N).
'1以外の最初の約数は'(N,N1) :-
N > 1,
for(2,N1,N // 2 + 1),
0 is N mod N1,!.
http://pc12.2ch.net/test/read.cgi/tech/1276810079/870 # プロギラミング技術は苦手なので教えてください。
# 演習5-1
#
# テキストファイルの各行の最後には,復帰・改行を示すASCIIコードが付加されて
# いる.即ち,ファイルのもつ行数は復帰・改行の数をカウントすることによって
# 計算できる.
#
# 上記性質を利用して,テキストファイルの行数を計算するプログラムを開発せよ.
# 但し,復帰・改行に対応するASCIIコードは10である.
#
# テキストファイルの読み込み方法は講義資料でも解説したように,./a.out < hoge.txtとすればよい.
#
http://pc12.2ch.net/test/read.cgi/tech/1276810079/880 # [1] 授業単元: プログラミング
# [2] 問題文(含コード&リンク):
#
# 関数u(x,y)は、0<x<1,0<y<1の範囲のあらゆる点で方程式
#
# (∂^2)*u/(∂*x^2)+(∂^2)*u/(∂*y^2)=2(x^2+y^2)
#
#
# を満たし、境界上でu(0,y)=u(x,0),u(1,y)=y^2,u(x,1)=x^2である。
# この差分方程式を用いてu(x,y)を求め、キーボードから入力した
# 指定座標の値を表示するプログラムを作成せよ。
# 刻み幅は0.05とする(キーボードから入力する値はこの倍数とする)。
#
http://pc12.2ch.net/test/read.cgi/tech/1276810079/887 # [1] 授業単元:プログラミング演習
# [2] 問題文(含コード&リンク):
# fgets() を使って50文字以下の文字列を入力し,文字列中の各
# 文字の出現回数を数えるプログラムを作成せよ。
# 実行例
# 文字列は? abcdef,abb(ccc110)
# a : 2
# b : 3
# c : 4
# d : 1
# e : 1
# f : 1
# , : 1
# ( : 1
# 1 : 2
# 0 : 1
# ) : 1
#
>>376 % Prolog
'50文字以下の文字列を入力し,文字列中の各文字の出現回数を数える' :-
get_chars(Chars),
length(Chars,Len),
Len =< 50,
findsetof(C,meber(C,Line),L1),
findall([Count,C],(member(C,L1),count(member(C,Chars),Count)),LL),
append(_,[[Count,C]|R],LL),
write_formatted('%t : %t\n',[C,Count]),
R = [].
http://pc12.2ch.net/test/read.cgi/tech/1276810079/890 # [2]課題:C言語による「High and Low」のゲーム作成
#
http://ime.nu/www.dotup.org/uploda/www.dotup.org1028847.txt.html # テキストファイルに詳細を書き留めました
#
# 【仕様の補足】
# ・1〜13までの各数値が4枚ずつ、計52枚のカードを使用
# ただし、ハートやスペードなどのマークの概念は問わない。
# ・必ず「シャッフルする」という手順が含まれてなければいけない。
# ・ユーザからの入力においてscanf関数を利用してはならない。
# ・掛金指定において条件に満たない入力がされた場合入力を反復させる。
#
# 【定数と変数について】
# ・定数:素材ソースプログラムで指定されたものを適切に利用すること
# ・変数:
# ・inputBuffer(文字型配列)キーボードからの入力行を格納する
# ・user_money(整数型)持金情報を格納する
# ・user_bet(整数型)掛金情報を格納する
# ・cards(整数型配列)カード情報を格納する
# ・current(整数型)現在のカード位置を格納する
# (cards[current]が現在のカードを意味する)
# ・user_choice(文字型)ユーザの予想を格納する
# (Highを示す"H"や"h"、Lowを示す"L"と"l"、それ以外はパス)
# ・上記以外の変数については必要に応じて自由な名前で用いること
http://pc12.2ch.net/test/read.cgi/tech/1276810079/916 # [1] 授業単元:プログラミング
# [2] 問題文(含コード&リンク):県から国、及び国から県に換算する関数を作成し、
# main関数でキーボードから数値とその値が国であるか県であるかを入力し、県ならば国に、
# 国ならば県に換算した値を小数点以下1桁までで出力するプログラムを作成しなさい。
# 値を引数とする関数で計算させ(関数名は nation とする)、出力は main関数で行うこと。
#
# 関係は以下の通り
# 県(A):(B+2)*5 国(B):A/3+25
# <例>
# 数値を入力してください: 75
# 75 が「県」なら "A" を「国」なら "B" を入力してください: B
#
# 県 75.0 = 国 50.0
#
>>379 % Prolog
'キーボードから数値とその値が国であるか県であるかを入力し、県ならば国に、国ならば県に換算した値を小数点以下1桁までで出力する' :-
'キーボードから数値とその値が国であるか県であるかを入力し、'(N),
'県ならば国に、国ならば県に換算した値を小数点以下1桁までで出力する'(N,L).
'キーボードから数値とその値が国であるか県であるかを入力し、'(N,_AまたはB) :-
write('数値を入力してください: '),
get_integer(N),
write_formatted('%t が「県」なら "A" を「国」なら "B" を入力してください: ',[N]),
get_split_line(['"',' '],[_AまたはB]),!.
'県ならば国に、国ならば県に換算した値を小数点以下1桁までで出力する'(N,'A') :-
A is N * 1.0,
B is A / 3 + 25,
write_formatted('県 %t = 国 %t\n',[A,B]),!.
'県ならば国に、国ならば県に換算した値を小数点以下1桁までで出力する'(N,'B') :-
B is N * 1.0,
A is (B + 2) * 5,
write_formatted('県 %t = 国 %t\n',[A,B]),!.
http://pc12.2ch.net/test/read.cgi/tech/1276810079/918 # [1] C言語プログラミング演習
# [2] 問題文(含コード&リンク
# char型配列xに格納された文字列を1文字ごとに空白を空けて逆順に出力する関数reverse_array(char [])を作成せよ.変換後の文字列の長さがもとの文字列よりも長くなっているので、長さの検査が必要であることに注意せよ。
# この関数を用いて、入力された文字列を並び替え、その結果を印字するプログラムを作成せよ。
#
#
# % ./reverse
# 処理前の文字列 (64字まで)? kimatutest
# 関数reverse_array()を呼び出しました
# 処理後の文字列 "t s e t u t a m i k"
#
>>381 % Prolog
文字列を1文字ごとに空白を空けて逆順に出力する(_文字列) :-
文字列を1文字ごとに空白を空けて逆順に出力する(_文字列,_1文字ごとに空白
を空けた逆順文字列),
write_formatted('%t',[_1文字ごとに空白を空けた逆順文字列]).
文字列を1文字ごとに空白を空けて逆順に出力する(_文字列,_1文字ごとに空白を空けた
逆順文字列) :-
atom_chars(_文字列,Chars),
concat_atom(Chars,' ',_1文字ごとに空白を空けた逆順文字列).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
文字列を1文字ごとに空白を空けて逆順に出力する(_文字列,_1文字ごとに空白を空けた
逆順文字列) :-
atom_chars(_文字列,Chars),
文字列を1文字ごとに空白を空けて逆順に出力する(Chars,Chars2),
atom_chars(_1文字ごとに空白を空けた逆順文字列,Chars2).
文字列を1文字ごとに空白を空けて逆順に出力する([],[]).
文字列を1文字ごとに空白を空けて逆順に出力する([A],[A]).
文字列を1文字ごとに空白を空けて逆順に出力する([A|R1],[A,' '|R2]) :-
文字列を1文字ごとに空白を空けて逆順に出力する(R1,R2).
http://pc12.2ch.net/test/read.cgi/tech/1276810079/919 # [1] C言語プログラミング演習
# [2] 問題文(含コード&リンク
# char型配列xに格納された英単語からなる文字列が回文(逆から読んでも同じ)であるかをチェックする関数anagram(char [])を作成せよ.ただし,チェック対象の文字列はソースコードのmain()関数内で記述するものとする(キーボードから入力しない).
#
#
# % ./checkAnagaram
# 文字列 "spainyuusyou" は回文ではありません.
#
# % ./checkAnagaram
# 文字列 "Was it a cat I saw?" は回文です.
#
# ヒント: 回文のルールは以下の通り.
#
# (i)
# 前から読んでも後ろから読んでも同じアルファベットの並びとな る,
# (ii)
# 記号「?」,「.」,「,」,「-」,「 」(空白)は無視する,
# (iii)
# 大文字と小文字は区別をしない.
>>383 % Prolog
回文(A) :- atom_chars(A,Chars),回文(Chars,[],X,X).
回文([],X,X,[]) :- !.
回文([A|R1],L1,X,R2) :- member(A,['?','.',',','-',' ']),回文(R1,L1,X,R2),!.
回文([A|R1],L1,X,[B|R2]) :- to_upper(A,B),回文(R1,[B|L1],X,R2),!.
http://pc12.2ch.net/test/read.cgi/tech/1276810079/920 # [1] C言語プログラミング演習
# [2] 問題文(含コード&リンク
# ATM(Automated Teller Machine; 現金自動預け払い機)システムを実現するプログラムを考える。
#
# 氏名,口座番号,暗証番号,預金残高を要素とする構造体を宣言し, 512人分の口座が作成可能なようにせよ.また,初期値として次のように構造体の内容を設定せよ.
#
# 立命太郎の口座番号は1234で,預金残高を1,234,560円に設定する.
# 野路花子の口座番号は5678で,預金残高を987,600円に設定する.
# 衣笠一郎の口座番号は9012で,預金残高を538,600円に設定する.
# 暗証番号は口座番号に1111を足して10000で割った余りに設定する.
# ここで暗証番号は、口座番号を引数としてとり、それに1111を足して10000で
# 割った余りを計算する関数を作成して設定すること.
# 上記の方法で初期値を設定し、設定された3人の預金残高を画面へ出力する
# プログラムを作成せよ.ただし、ひとり分の預金残高を表示する関数を作成して、
# これを繰り返し使って3人の預金残高を出力すること.
#
# % ./initAccount
# 預金残高は次のとおりです.
# 立命太郎 (1234) 1234560 円
# 野路花子 (5678) 987600 円
# 衣笠一郎 (9012) 538600 円
# %
>>385 % Prolog
預金口座の初期設定(_ファイル) :-
w3c('
http://pc12.2ch.net/test/read.cgi/tech/1276810079/920 ',Lines),
append(_,[Line|R],Lines),
split(Line,[の口座番号は,'で,貯金残高を,円に設定する.'],[_氏名,_口座番
号,_預金残高]),
assertz(預金口座(_氏名,_口座番号,_預金残高)),
_暗証番号 is (_口座番号 + 1111) mod 10000,
assertz(預金口座暗証番号(_口座番号,_暗証番号)),
R = [],!.
預金口座の初期設定(_).
設定された3人の預金残高を画面へ出力する :-
findsetof(_口座番号,預金口座(_,_口座番号,_),_口座番号ならび),
write('預金残高は次のとおりです.\n'),
append(_,[_口座番号|R],_口座番号ならび),
ひとり分の預金残高を表示する(_口座番号),
R = [].
ひとり分の預金残高を表示する(_口座番号) :-
預金口座(_氏名,_口座番号,_預金残高),
write_formatted('%t (%t) %t 円\n',[_氏名,_口座番号,_預金残高]),!.
http://pc12.2ch.net/test/read.cgi/tech/1276810079/922 # [2] 問題文(含コード&リンク
# <<920の課題を基に「引出し」の機能を追加せよ.具体的には,
# 口座番号の入力,暗証番号の入力と確認,支払額の入力,預金残高の更新をする
# プログラムを追加すればよい.機能の選択は,起動時できるようにすること.
#
# % ./withdraw
# [0]終了 [1]残高表示 [2]引出し: 2
# 口座番号を入力してください: 5000 ← 存在しない
# 暗証番号を入力してください: 0123
# 口座番号または暗証番号が間違っています.
# 口座番号を入力してください: 9012
# 暗証番号を入力してください: 5555 ← 間違っている
# 口座番号または暗証番号が間違っています.
# 口座番号を入力してください: 9012
# 暗証番号を入力してください: 0123
# 引出し額を入力してください: 1000000 ← 預金額より多い
# 預金額が不足しています.
# 口座番号を入力してください: 9012
# 暗証番号を入力してください: 0123
# 引出し額を入力してください: 20000
# ありがとうございました.残高は 518600 円です.
# [0]終了 [1]残高表示 [2]引出し: 2 ← 始めに戻る
>>387 % Prolog (その一)
'「引出し」の機能を追加せよ.具体的には,口座番号の入力,暗証番号の入力と確認,支払額の入力,預金残高の更新をするプログラムを追加すればよい.'(_引き出し_または_口座残高表示) :-
「引出し」または「口座残高表示」(_引き出し_または_口座残高表示).
「引出し」または「預金残高表示」(引き出し) :-
repeat,
口座番号の入力(_口座番号),
暗証番号の入力と確認(_口座番号),
支払い(_口座番号),!.
「引出し」または「預金残高表示」(預金残高表示) :-
repeat,
口座番号の入力(_口座番号),
暗証番号の入力と確認(_口座番号),
「預金残高表示」(_口座番号),!.
支払い(_口座番号,_預金残高1,_引出額) :-
_引出額 > _預金残高1,
write('口座残高が不足です\n御支払いできません\n'),!.
支払い(_口座番号,_預金残高1,_引出額) :-
_引出額 =< _預金残高,
支払いオペレーション,
預金残高の更新(_口座番号,_引出額,_預金残高),
預金残高を画面へ出力する(_口座番号),!.
>>387 % Prolog (その二)
口座番号の入力(_口座番号) :-
write('口座番号を入力してください : '),
get_integer(_口座番号1),
口座番号の入力(_口座番号1,_口座番号).
口座番号の入力(_口座番号,_口座番号) :-
預金口座(_,_口座番号,_),!.
口座番号の入力(_口座番号1,_口座番号) :-
write_formatted('口座番号%tは正しい口座番号ではありません \nもう一度、',[_口座番号1]),
口座番号の入力(_口座番号).
暗証番号の入力と確認(_口座番号) :-
rawmode,
write('暗証番号を入力してください : '),
findall(C,(for(1,N,4),get_char(C),put_char(*)),L),
norawmode,
number_chars(_暗証番号,L),
_暗証番号 is (_口座番号 + 1111) mod 10000,!.
暗証番号の入力と確認(_口座番号) :-
write('暗証番号が一致しませんでした\n'),
fail.
>>387 % Prolog (その三)
支払額の入力(_引出額) :-
write('引出額を入力してください : '),
get_integer(_引出額),
預金残高の更新(_口座番号,_引出額,_預金残高) :-
retract(預金口座(_氏名,_口座番号,_預金残高1)),
_預金残高 is _預金残高1 - _引出額,
assertz(預金口座(_氏名,_口座番号,_預金残高)),!.
預金残高を画面へ出力する :-
ひとり分の預金残高を表示する(_口座番号),!.
支払いオペレーション.
http://pc12.2ch.net/test/read.cgi/tech/1276810079/936 # 問題
#
# 複数の文字列を読み込み,さらに,それらの文字列を繋ぎ合わせる順番を入力し結果を出力するプログラムを作成せよ.
#
# 【実行例】
#
# 何個の文字列を入力しますか?:4
# 入力文字列[1]:Computer
# 入力文字列[2]:Science
# 入力文字列[3]:Tarou
# 入力文字列[4]:Tanaka
#
# 繋ぎ合わせる順番:
# 2
# 4
# 3
# 1
#
# 結果:ScienceTanakaTarouComputer
#
>>391 % Prolog
'複数の文字列を読み込み,さらに,それらの文字列を繋ぎ合わせる順番を入力し結果を出力する' :-
催促付き整数入力('何個の文字列を入力しますか?: ',N),
write_formatted('文字列を%t行連続して入力してください\n',[N]),
findall(Line,(for(1,M,N),get_line(Line)),L1),
write('入力した文字列を繋ぎ合わせる順番を入力してください\n'),
findall(Nth,(for(1,M,N),get_integer(Nth)),L2),
findall(A,(member(Nth,L2),list_nth(Nth,L1,A)),L3),
concat_atom(L3,S),
write_formatted('繋ぎ合わせた文字列は: %t\n',[S]).
>>393 % Prolog
'入力したDNA塩基配列中にある塩基 t, c, a, gそれぞれの個数をカウントする' :-
get_chars(Chars),
count(member(t,Chars),_t),
count(member(c,Chars),_c),
count(member(a,Chars),_a),
count(member(g,Chars),_g),
write_formatted('Thymine (t) : %t \nCytosine (c) : %t \nAdenine (a) :%t \nGuanine (g) : %t \n',[_t,_c,_a,_g]).
>>395 % Prolog
'入力したDNA塩基配列中に,atgという並びがいくつあるか調べるプログラムを作成せよ.但し,入力には t, c, a, g以外の文字も入っている.塩基以外の文字は無視すること':-
get_chars(Chars),
atgという並びがいくつあるか(Chars,_いくつ).
atgという並びがいくつあるか([],0).
atgという並びがいくつあるか([a|R1],_いくつ) :-
atgという並び(R1,R2),
atgという並びがいくつあるか(R2,_いくつの一),
_いくつ is _いくつの一 + 1,!.
atgという並びがいくつあるか([_|R1],_いくつ) :-
atgという並びがいくつあるか(R1,_いくつ).
atgという並び(R1,R2) :-
append(_,[t|L1],[g|R2],R1),
\+((member(A,[a,t,c,g]),member(A,L1))),!.
atgという並び(_,[]).
>>397 % Prolog (その一)
学籍番号による検索(_学籍番号) :-
seiseki(_学籍番号,_名前,_国語,_数学,_理科),
write_formatted('%t,%t,%t,%t,%t\n',[_学籍番号,_名前,_国語,_数学,_理科] .
名前による検索(_名前) :-
seiseki(_学籍番号,_名前,_国語,_数学,_理科),
write_formatted('%t,%t,%t,%t,%t\n',[_学籍番号,_名前,_国語,_数学,_理科]).
国語の成績による検索(_国語,_国語成績) :-
seiseki(_学籍番号,_名前,_国語,_数学,_理科),
_国語成績.
数学の成績による検索(_数学,_数学成績) :-
seiseki(_学籍番号,_名前,_数学,_数学,_理科),
_数学成績.
理科の成績による検索(_理科,_理科成績) :-
seiseki(_学籍番号,_名前,_理科,_数学,_理科),
_理科成績.
>>399 >>397 ではなくて
>>398 でした
% Prolog (その二)
成績の追加(_学籍番号,_名前,_国語,_数学,_理科) :-
学籍番号(_学籍番号),
名前(_名前),
国語(_国語),
数学(_数学),
理科(_理科),
assertz(seiseki(_学籍番号,_名前,_国語,_数学,_理科)).
成績の変更(_学籍番号,_名前,_国語,_数学,_理科) :-
学籍番号(_学籍番号),
名前(_名前),
国語(_国語),
数学(_数学),
理科(_理科),
retract(seiseki(_学籍番号,_,_,_,_)),
assertz(seiseki(_学籍番号,_名前,_国語,_数学,_理科)).
成績の削除(_学籍番号) :-
retract(seiseki(_学籍番号,_,_,_,_)).
>>398 % Prolog (その三)
学籍番号(_学籍番号) :-
atom_length(_学籍番号,Len),
Len =< 14,
atom_chars(_学籍番号,Chars),
すべてが数字(Chars),!.
すべてが数字([]) :- !.
すべてが数字([A|R]) :-
member(A,['0','1','2','3','4','5','6','7','8','9']),
すべてが数字(R).
名前(_名前) :-
atom(_名前),
atom_length(_名前,Len),
Len =< 30,!.
国語(_国語) :- integer(_国語).
数学(_数学) :- integer(_数学).
理科(_理科) :- integer(_理科).
http://pc12.2ch.net/test/read.cgi/tech/1267796762/302 # 【 課題 】10個の国旗を表示するプログラム(日本、アメリカ、イギリス、フランス、ジャマイカ、ベトナム、セネガル、スウェーデン、アイスランド、南アフリカ)
# 指定された国旗を画面に表示する。少なくても8種類以上。 国旗の指定にはマウスでメニューのボタンとかを指定して、選択させること。
# 国旗は図形として描くこと。画像を貼り付けたりしてはならない。
# 【 形態 】1. Javaアプリケーション(main()で開始)
# 【 GUI 】4. 制限なし
# 【 期限 】7月22日までに
# 【 Ver 】1.6.0
# 【 補足 】国旗はそこまで高い完成度は求められない?と思います。
http://pc12.2ch.net/test/read.cgi/tech/1267796762/311 # 【 課題 】1.ビンゴカードをPlayerの人数分作成できる。
# 2.1〜75の数字が書かれた玉をランダムに取り出せる。
# 3.カードにその数字があるかをチェックし、あれば数字の枠にマークすることができる。
# 4.リーチ、ビンゴ時に表示することができる。
# 以上の機能を備えたビンゴゲームシュミレーターを作成しなさい。
# 【 補足 】カードは1列目1〜15、2列目は16〜30……5列目で61〜75、というよう
な形が指定されています。
# Freeの有無は指定なしです。
# 丸投げ申し訳ないです。長く複雑かもしれませんが、どうぞよろしくお願いします。
# 初心者故、できましたら軽い注釈を付けてくれると幸いです。
>>403 % Prolog 何をするのかわからないな。
みかか定義 :-
L = ['1' - 'ぬ','2' - 'ふ','3' - 'あ','4' - 'う','5' - 'え','6' - 'お','7' - 'や','8' - 'ゆ','9' - 'よ','0' - 'わ',(-) - (ほ),(^) - ('へ'),
'Q'-た,'W'-て,'E'-い,'R'-す,'T'-か,'Y'-ん,'U'-な,'I'-に,'O'-ら,'P'-せ,
('@')-゛,('[')-゜,'A'-ち,'S'-と,'D'-し,'F'-は,'G'-き,'H'-く,'J'-ま,'K'-の,
'L'-り,(';')-れ,(':')-け,(']')-む,'Z'-つ,'X'-さ,'C'-そ,'V'-ひ,'B'-こ,'N'-み,
'M'-も,(',')-ね,('.')-る,('/')-め],
member(A-B,L),
assertz(みかか(A,B)),fail;true.
みかか :-
rawmode,
repeat,
get_char(A),
みかか(A,B),
putchar(B),
A = '\n',
norawmode.
http://pc12.2ch.net/test/read.cgi/tech/1276810079/956 # 問2) 配列データの平均を求める ユーザ関数 を使ってプログラムを作成しなさい。
# 条件 プロトタイプ宣言 : double Average(int *p)
# 引数 : 数値が格納された配列の先頭アドレス
# 戻り値 : 平均
# 実行画面例
# 1) 整数[0] ==> 100
# 整数[1] ==> 80
# 整数[2] ==> 60
# 整数[3] ==> 75
# 整数[4] ==> 89
# 整数[5] ==> 62
# 整数[6] ==> 71
# 整数[7] ==> 50
# 整数[8] ==> 49
# 整数[9] ==> 90
#
# 平均 : 72.6
#
# 2) 整数[0] ==> 100
# 整数[1] ==> 80
# 整数[2] ==> 60
# 整数[3] ==> 75
# 整数[4] ==> 89
# 整数[5] ==> 64
# 整数[6] ==> -1
#
# 平均 : 78.0
>>406 % Prolog
検索する文字列を入力し、その位置を返す(_検索対象文字列,_検索文字列,_位置,_検索副文字列) :-
sub_atom(_検索対象文字列,A,B,C,_検索文字列),
_位置 is A + 1,
_残り長さ is B + C,
sub_atom(_検索対象文字列,A,_残り長さ,_,_検索副文字列),!.
検索する文字列を入力し、その位置を返す(_,_,_,_) :-
write('検索したい文字はありませんでした\n'),
!,fail.
>>407 % Prolog
入力されたデータの平均を求める :-
findavg(M,(
for(0,N,maxint),
write_formatted('整数[%t] ==> ',[N]),
get_integer(M),
( M = -1,!,fail;true)),
_平均),
write_formatted('平均 = %t\n',[_平均]).
http://pc12.2ch.net/test/read.cgi/tech/1279286575/55 # [1] 授業単元:プログラミング基礎I
# [2] 問題文(含コード&リンク):
#
# nを読み込み,n個のint型配列を動的に確保,n個の配列はn人の勇者とする.以下仕様に従ったプログラムを作成せよ.
#
# ?それぞれの勇者にヒットポイントを与える.
# ?敵のヒットポイントを与える.
# ?乱数を発生し,誰の攻撃かを決定する.
# ?攻撃をする際に,会心の一撃,普通の攻撃,ミスを乱数で決定する.
# ?相手に与えるダメージを乱数で決定する.
# ?敵の攻撃の場合,何人にどれだけ攻撃をするかを乱数で決定する.
# ?敵のヒットポイントが無くなるか,勇者が全滅したら終了とする.
#
http://pc12.2ch.net/test/read.cgi/tech/1279286575/74 # 【質問テンプレ】
# [1] 授業単元:情報処理課題
# [2] 問題文(含コード&リンク):英語の文章で構成されるテキストファイルに対して、その中に含まれる総文字数と異なる文字ごとの出現回数とを数え上げよ。
# [3.3] 言語:C
# [4] 期限:2010年07月19日00:00まで
# [5] その他の制限:Xcodeを使用しています。読み込むファイルは"/Users/user/Desktop/data.txt"で。
#
# 似たようなプログラムを作った時は「数列を入力し総文字数と数字ごとに出現回数とを数え上げグラフで表示」というような課題で
# 数字だったので0〜9までを表示することが簡単に出来ましたがアルファベットなのでa-zをどう表示したものか
# またstrlenだと半角空白も数えてしまうので総"文字"数とずれてくるのではないかと悩んでいます。
# よろしくお願いします。
http://pc11.2ch.net/test/read.cgi/db/1274791771/283 # MYSQL5で
# テーブルA
# create table A( id int , name_id int, word varchar(128) , primary key ( id ), index ( name_id ) )
# テーブルB
# create table B( id int, cid1 int, cid2 int , cid3 int , primary key ( id )
# テーブルC
# create table C( id int, name varchar(128) , primary key ( id ) , unique ( name ) )
# こんな感じのテーブルを作成しました。テーブルAのname_idはテーブルBのidと、テーブルCのidはテーブルBのcid1〜cid3と関連します。
# テーブルAのname_id,wordとテーブルBのcd1〜cd3をテーブルCのnameで置き換えた値で取り出したいのですが、どう書けばいいでしょうか?
>>413 % Prolog
'テーブルAのname_id,wordとテーブルBのcd1〜cd3をテーブルCのnameで置き換えた値で取り出す'(_name_id,_word,_name_1,_name_2,_name_3) :-
'A'(_,_name_id,_word),
'B'(_name_id,_cid1,_cid2,_cid3),
'C'(_cid1,_name_1),
'C'(_cid2,_name_2),
'C'(_cid3,_name_3).
>>414 の間違いでした
% Prolog
'テーブルAのname_id,wordとテーブルBのcd1〜cd3をテーブルCのnameで置き換えた値で取り出す'(_name_id,_word,_name_1,_name_2,_name_3) :-
'A'(_,_name_id,_word),
'B'(_name_id,_cid1,_cid2,_cid3),
'C'(_cid1,_name_1),
'C'(_cid2,_name_2),
'C'(_cid3,_name_3).
>>413 % Prolog
英語の文章で構成されるテキストファイルに対して、その中に含まれる総文字数と異なる文字ごとの出現回数とを数え上げる(_総文字数,_文字ごとの出現度数ならび) :-
get_chars('/Users/user/Desktop/data.txt',Chars),
length(Chars,_総文字数),
findsetof(C,member(C,Chars),L1),
findall([C,_出現度数],(member(C,L1),count(member(C,Chars),_出現度数)),_文字ごとの出現度数ならび).
findsetof(A,B,L) :-
findall(A,B,C),
setof(A,member(A,C),L).
http://pc12.2ch.net/test/read.cgi/tech/1274998754/225 # 今迷路を作成しているのですが
# 前、右、左から1つ方向を選んで、
# 1歩進むたびに宝物、通路、落とし穴を表示させたいんです。
# 途中からですが・・・
# int ret = 0;
# char *message;
# switch (c) {
# case '1':
# message = "左に進む";
# break;
# case '2':
# message = "右に進む";
# break;
# case '3':
# message = "前進する";
# break;
# default:
# message = "進め!";
# ret = 1;
# }
# printf("%s\n", message);
# }
# printf("%s\n", message);
# return ret;
# }
# ここに進行方向にあるものを表示させたいときってどうしたらいいんでしょうか?
http://pc12.2ch.net/test/read.cgi/tech/1279286575/128 # [1] 授業単元:プログラミング基礎I
# [2] 問題文(含コード&リンク):
#
# 文字列xに文字列yが含まれるかどうかを判定する関数str_compWithPointer(char *,char *)を作成せよ.この関数を用いて、入力されたひとつめの文字列にふたつめの文字列が含まれているかを判定するプログラムを作成せよ。
#
#
# % ./compare
# 文字列x (64字まで)? Ritsumeikan-University
# 文字列y (64字まで)? Univ
# "Ritsumeikan-University"に"Univ"は含まれます.
#
# % ./compare
# 文字列x (64字まで)? Ritsumeikan-University
# 文字列y (64字まで)? city
# "Ritsumeikan-University"に"city"は含まれません.
http://pc12.2ch.net/test/read.cgi/tech/1279286575/129 # [1] 授業単元:プログラミング基礎I
# [2] 問題文(含コード&リンク):
# 標準入力から正の整数値を読み込み,0が入力されたらそれらの整数を小さい順に表示するプログラムを作成せよ.
#
# 以下のような処理の流れでプログラムを作成すること。
#
# 数字を読み込むごとに, それまでに入力された数値が格納された配列の最後の要素から, 先頭に向かって順に大小の比較を行う. これにより、読み込んだ数字の方が入るべき位置がわかる.
# 読み込んだ数字が入るべき箇所を空けるために、 既に記憶されている配列の要素のうち、 この数字よりも大きな数字をひとつ後ろにずらす。 空いた箇所に読み込んだ数字を代入する.
# 次に入力される数字の処理へ移る.
#
# % ./ordering
# 正整数: 17
# 正整数: 3
# 正整数: 9
# 正整数: 4
# 正整数: 0
# 入力された整数は小さい順に 0, 3, 4, 9, 17 です.
http://pc12.2ch.net/test/read.cgi/tech/1279286575/130 # [1] 授業単元:プログラミング基礎I
# [2] 問題文(含コード&リンク):
# 文字列xに文字列yが含まれるかどうかを判定する関数str_comp(char [], char [])を作成せよ.この関数を用いて、入力されたひとつめの文字列にふたつめの文字列が含まれているかを判定するプログラムを作成せよ。
#
#
# % ./compare
# 文字列x (64字まで)? Ritsumeikan-University
# 文字列y (64字まで)? Univ
# "Ritsumeikan-University"に"Univ"は含まれます.
#
# % ./compare
# 文字列x (64字まで)? Ritsumeikan-University
# 文字列y (64字まで)? city
# "Ritsumeikan-University"に"city"は含まれません.
http://pc12.2ch.net/test/read.cgi/tech/1279286575/132 # [1] 授業単元:プログラミング基礎I
# [2] 問題文(含コード&リンク):
# char型配列xに格納された文字列を1文字ごとに空白を空けて逆順に出力する関数reverse_array(char [])を作成せよ.変換後の文字列の長さがもとの文字列よりも長くなっているので、長さの検査が必要であることに注意せよ。
# この関数を用いて、入力された文字列を並び替え、その結果を印字するプログラムを作成せよ。
#
#
# % ./reverse
# 処理前の文字列 (64字まで)? Ritsumeikan
# 関数reverse_array()を呼び出しました
# 処理後の文字列 "n a k i e m u s t i R"
>>383 使用言語:J
f=:(-:|.)@toupper@(-.&'?.,- ')
f 'spainyuusyou'
0
f 'Was it a cat I saw?'
1
http://pc12.2ch.net/test/read.cgi/tech/1279286575/133 # [1] 授業単元:C++プログラミング
# [2] 問題文(含コード&リンク): 航空会社が持っている小型航空機(座席数:24)のフライトに座席を割り当てるシステムをプログラミングせよ。
# この航空機の座席は中央に通路を挟み左右にそれぞれ2座席ずつの列が計6列ある。
# 座席は 1A, 1B, 1C, 1D, ..., 6A, 6B, 6C, 6D で表示され、 1, 2列目が喫煙区画で、 A, D が窓側、 B, C が通路側を示している。
#
# プログラムはまず最初に次の選択メニューを表示する。
#
# 喫煙席を希望する方は 1 をタイプしてください。
# 禁煙席を希望する方は 2 をタイプしてください。
#
# 喫煙/禁煙の選択が終わると、 窓側か通路側かの選択を求める。
#
# 窓側を希望する方は 1 をタイプしてくださ。
# 通路側を希望する方は 2 をタイプしてください。
#
# 希望に沿える席がすべて予約済みで割り当てられない場合には、窓側又は通路側の希望については無視して割り当てる。
# ただし, 「窓側(あるいは通路側)はすでに満席のため通路側(窓側)で予約します」というメッセージを出力し、
# 以下のように座席番号と喫煙席/禁煙席の区分が書かれた搭乗券を(この課題では画面上に)出力する。
#
# --------
# 2A 禁煙
# --------
>>350 使用言語:J
g=:monad def :'1,.(|."0 1(2&+))i.<:y'
h=:monad def :',<"1|:({.,:|.@{:)(--:#y)[\y'
f=:monad def :'1|.h"1 g y'
f 6
+---+---+---+
|1 2|3 6|4 5|
+---+---+---+
|1 3|4 2|5 6|
+---+---+---+
|1 4|5 3|6 2|
+---+---+---+
|1 5|6 4|2 3|
+---+---+---+
|1 6|2 5|3 4|
+---+---+---+
http://pc12.2ch.net/test/read.cgi/tech/1279286575/408 # [2] 問題文(含コード&リンク):自動座席予約システムの作成せよ。
# その航空会社が持っている小型航空機(座席数:24)のフライトに座席を割り当てるシステムをプログラミングしなければならない。
# この航空機の座席は中央に通路を挟み左右にそれぞれ2座席ずつの列が計6列ある。
# 座席は 1A, 1B, 1C, 1D, ..., 6A, 6B, 6C, 6D で表示され, 1, 2列目が喫煙区画で,A, D が窓側, B, C が通路側を示している。
# このプログラムはまず最初に次の選択メニューを表示する。
#
# 喫煙席を希望する方は ● をタイプしてください.
#
# 禁煙席を希望する方は × をタイプしてください.
#
# 喫煙/禁煙の選択が終わると, 窓側か通路側かの選択を求める。
#
# 窓側を希望する方は ! をタイプしてください.
# 通路側を希望する方は # をタイプしてください.
# もし希望に沿える席がすべて予約済みで割り当てられないときには, 窓側/通路側の希望については無視して割り当てる。
# ただし, 「窓側(あるいは通路側)はすでに満席のため通路側(窓側)で予約します」というメッセージを出力し, 以下の
# ように座席番号と喫煙席/禁煙席の区分が書かれた搭乗券を(この課題では画面上に)出力する。
# --------
# 4A 禁煙
# --------
# また, 禁煙区画(あるいは喫煙区画)が窓側/通路側ともに満席のときには喫煙区画(禁煙区画)でも良いかどうか乗客に尋ねなければならない。
# 乗客がOKすれば(窓側/通路側の希望はできるだけ尊重した上で)空いている座席を割り当て搭乗券を出力し, OKしなければ
# 「3時間後に次のフライトがあります.」というメッセージを出力して終了する。
http://pc12.2ch.net/test/read.cgi/tech/1279286575/141 # [1] 授業単元:プログラミング基礎I
# [2] 問題文(含コード&リンク):
# 発展課題 13..3
# 発展課題13.2を基に,「振込み」の機能を実現せよ.
# 具体的には,利用者の口座番号・暗証番号・振込額の指定と確認,振込先の口座番号の指定と確認,両者の預金残高の更新をするプログラムを作成せよ.
# なお,以下の例では省略するが,口座番号や暗証番号を間違った場合のチェックや,預金額が不足する場合のチェックもすること.
# % ./transfer
# [0]終了 [1]残高表示 [2]引出し [3]振込み: 3
# 口座番号を入力してください: 9012
# 暗証番号を入力してください: 0123
# 振込先の口座番号を入力してください: 1000
# 口座番号をご確認ください. ← 存在しない
# 口座番号を入力してください: 9012
# 暗証番号を入力してください: 0123
# 振込先の口座番号を入力してください: 5678
# 振込み額を入力してください: 30000
# 野路花子 様に 30000 円振り込みました.
# ありがとうございました.残高は 508600 円です.
# [0]終了 [1]残高表示 [2]引出し [3]振込み: ← 始めに戻る
#
# 振り込まれた先の口座の金額が増えていることを、デバッガで確認せよ。この例では
、「野路花子」の残高は 1017600 円のはずである。
http://pc12.2ch.net/test/read.cgi/tech/1279286575/149 # [1] 授業単元:プログラミング基礎I
# [2] 問題文(含コード&リンク):
# ../test/read.cgi/tech/1279286575/141 を基に 口座を表現した構造体を struct accountとする。以下の関数を作成し、発展課題 13.3と同じ機能をもつプログラムを作成せよ。
#
# 指定された口座番号に対応する口座情報を探索する関数
# struct account *search_account(int id)
#
# 指定された口座番号に相当する講座がないとき、この関数は NULL を返すものとする。
#
# 口座内容を印字する関数
# void print_account(struct account *account)
#
# 振込み元の講座から振込先の口座へ指定された金額だけ振り込む関数
# int transfer(struct account *from, struct account *to, int amount)
#
# この関数は成功した場合1を、失敗した場合は負の整数を返すものとする.
#
# これらの関数の中では printf() や fgets() などの入出力関数は用いないようにせよ。
http://pc12.2ch.net/test/read.cgi/tech/1279286575/153 # [1] 授業単元:プログラミング基礎I
# [2] 問題文(含コード&リンク):
# name(名前: char型配列), height(身長: float型変数), bloodType(血液型: char型変数)をメンバに持つ構造体を宣言し, 128名分が記憶可能になるようその構造体の配列を定義せよ.また,その配列に対して値を入力し,
# さらに表示できるようにせよ.構造体のメンバ値を表示するには、ひとつの構造体の各メンバの値を表示する関数を作成すること。
# % ./bodyData
# 1人目のデータ: 立命太郎 175.5 A
# 2人目のデータ: 野路花子 169.0 B
# 3人目のデータ: 衣笠一郎 180.4 O
# 4人目のデータ: 0 0 0 ← 0 0 0 と入力すると終わる.
# 名前 身長 血液型
# 立命太郎 175.5 A
# 野路花子 169.0 B
# 衣笠一郎 180.4 O
# %
# ヒント: 各人の名前、身長、血液型のデータを1行で入力するためには、参考12.1に示されたfgets()関数で、これらを1度に取り込み、最初の空白までを名前とみなし、次の空白までを身長とみなし、次に改行までを血液型をみなせばよい。これらを別々の文字列として、
# 必要に応じて整数や浮動小数点数に変換し、構造体のメンバに設定すること。
#
# ヒント: ひとつの構造体の各メンバの値を表示する関数に構造体を引渡すことを繰り返えせばよい。
http://pc12.2ch.net/test/read.cgi/tech/1279286575/154 # [1] 授業単元:プログラミング基礎I
# [2] 問題文(含コード&リンク):
# ../test/read.cgi/tech/1279286575/153を基にデータを身長の高い順に出力するよう変更せよ.
# % ./orderByHeight
# … ← 入力は前課題と同じなので省略.
# 名前 身長 血液型
# 衣笠一郎 180.4 O
# 立命太郎 175.5 A
# 野路花子 169.0 B
# %
#
http://pc12.2ch.net/test/read.cgi/tech/1279286575/156 # [1] 授業単元:プログラミング基礎I
# [2] 問題文(含コード&リンク):
# 入力したDNA塩基配列中に,atgという並びがいくつあるか調べるプログラムを作成せよ.但し,入力には t, c, a, g以外の文字も入っている.塩基以外の文字は無視すること.
#
# 【実行例】
# % ./a.out
# 1gattatgtga
# 11tgccgatatc
# 21gatatgattc
# (ここで ^D を押す)
# #ATG is 3
# %
http://pc12.2ch.net/test/read.cgi/tech/1279286575/157 # [1] 授業単元:プログラミング基礎I
# [2] 問題文(含コード&リンク):
# 入力したDNA塩基配列中にある塩基 t, c, a, gそれぞれの個数をカウントするプログラムを作成せよ.
#
# 【実行例】
# % ./a.out
# tataatccg ← 入力し,リターンを押して ^D
# Thymine (t) : 3
# Cytosine (c) : 2
# Adenine (a) : 3
# Guanine (g) : 1
# %
http://pc12.2ch.net/test/read.cgi/tech/1279286575/193 # [1] 授業単元:アルゴリズム
# [2] 問題文(含コード&リンク):
# 文字列sの中の文字の順番を逆にコピーした文字列dを作るc言語の関数str_revcopy(d,s)を書け。
# 関数の返す値はコピーをした先のdとする。
# ただし文字列sを逆順にコピーするのに十分な記憶領域があらかじめ確保されていて、その先頭がdで指されていると仮定する。
# さらに、dとsの記憶領域には重なりがないとする。例えば
# str_revcopy(d,"ABCDE")は文字列"EDCBA"を返し、
# str_revcopy(d,"This is a pen")は文字列".nep a si sihT"を返し、
# str_revcopy(d,"")は文字列""を返す。
#
http://pc12.2ch.net/test/read.cgi/tech/1267796762/331 # 【 課題 】ババ抜きプログラム
# ・52枚+ジョーカーを4人に均等に配り分ける。ジョーカーはランダムで誰かに入るようにする。
# ・コンソール上においてキーボードで動かせるPlayerと、プログラムにより
# 自動で動くA,B,Cの対戦相手を用意。
# ・手札に同じ数字が揃えば、2枚とも捨てる。
# ・順番はI,A,B,Cとし、A,B,Cがカードを引く時はランダムに引くこととする。
# ・Playerの手持ちは、各数字で表し、A,B,Cの残り手持ちは記号等で何枚あるか表示できる。
# 例)Playerの手持ち:A,2,7,10,Q
# 例)Aの手持ち:*****(5)
# ・ A,B,Cは自分の手札から引かれる前に自動的にシャッフルする。
# ・Playerの手札はシャッフルするかしないかを選択できる。
# 例)1,シャッフルする 2,シャッフルしない:(キーボードからの入力
# ・一人でも上がればゲームを終了とし、勝利者と、最初に捨てられたカードの枚数、
# 4人がカードを引いた合計数を表示する。
#
# *Playerが引く時の例
# 例)左から?番目を引く:(キーボードからの入力)
http://pc12.2ch.net/test/read.cgi/tech/1279286575/225 # 1] 授業単元: C言語プログラミング
# [2] 問題コード
#
# 三角形の3頂点の座標,(x1,y1),(x2,y2),(x3,y3)を読み込んで 3つの内角の角度θ1,θ2,θ3をdeg単位(°)で計算し,印字するプログラムを作成せよ.
# 但し,double型変数 θ1,θ2,θ3へのポインタ変数とdouble型変数 x1,y1,x2,y2,x3,y3を引数とする関数を作成し,main関数では同関数を呼び出すようにせよ
言語プログラミング # [2] 問題コード # nを読み込み,n個のint型配列を動的に確保,n個の配列はn人の勇者とする.以下仕様に従ったプログラムを作成せよ. # # •それぞれの勇者にヒットポイントを与える. # •敵のヒットポイントを与える. # •乱数を発生し,誰の攻撃かを決定する. # •攻撃をする際に,会心の一撃,普通の攻撃,ミスを乱数で決定する. # •相手に与えるダメージを乱数で決定する. # •敵の攻撃の場合,何人にどれだけ攻撃をするかを乱数で決定する. # •敵のヒットポイントが無くなるか,勇者が全滅したら終了とする # #
http://pc12.2ch.net/test/read.cgi/tech/1267796762/346 # 明日までの宿題なんですがどうしても、できそうにありません
# 丸投げしますのでお願いします
# 【 課題 】
# 電車の券売機シュミレーションプログラム
# Mainクラスで投入金額を入力する
# Machineクラス購入可能切符の中から購入する切符を選択させる
# Ticketクラスで入金額による購入可能切符を出力
# Safeクラスでおつり金種枚数計算(1000円・500円・100円・50円・10円は初期設定で100枚ずつ用意しておく)
# おつりの枚数を初期値より減らす
# Mainで最後にお釣り金額&各枚数
# 購入金額切符を出力して終了
# Main以外のクラスはすべてパッケージ化する
#
http://pc12.2ch.net/test/read.cgi/tech/1279286575/273 # [1] 授業単元:プログラミング?
# [2] 問題文(含コード&リンク):以下に示す2つのプログラムを作成せよ
# 1)文字配列の文字列の順序を逆にする関数toReverseを作成せよ。
# また、関数toReverseを用いて入力した文字列の順序を逆にした
# 文字列を表示するプログラムを作成せよ。
# void toReverse(char[]); とする
# 実行例:abcde
# edcba
#
# 2)文字配列の文字列に含まれる小文字を大文字にする関数toUpperを作成し、
# 入力した文字列の小文字を大文字に変換して表示するプログラムを作成せよ。
# 実行例:This is a pen.
# THIS IS A PEN.
#
>>448 使用言語:J
calctime=: 24 60 60 & #:
calctime 3725
1 2 5
http://pc12.2ch.net/test/read.cgi/tech/1267796762/353 # 【 課題 】
# 1. アルファベット(a〜z)までの出現個数を数える。なお,大文字は小文字に変えて,数える。もし,出現個数が0個の場合は,出力しない。
#
# 2. 1つの単語を入力すると,1文字目の大文字に,それ以外を小文字に変換して,出力する。 例 kyoto→Kyoto 複数行の入力できるようにして,!記号を入れると,入力が終わるようにする。
#
# 3. 各単語の1文字目を大文字に,2文字目以降を小文字に変換する。 例 Once upon a time ・・・ → Once Upon A Time ・・・
#
http://pc12.2ch.net/test/read.cgi/tech/1279286575/334 # [1] 授業単元: 情報(C++)
# [2] 問題文:2つの値 x と y の差を(非負の整数として)返す関数形式マクロ diff(x, y) を定義し, main関数で
# 4つの整数 a, b, c, d をキーボードから読み込み, diff(a, b) * diff(c, d) を出力するようなプログラムを作成せよ。
# また, 出力結果が正しいことを確認するため, 関数として diff2(x, y) も作成し,結果が同じになることを同じソースコード内で確認できるようにしなさい。
http://pc12.2ch.net/test/read.cgi/tech/1279286575/348 # [1] 授業単元: 情報処理(C言語)
# [2] 問題文:関数y=-X二乗+2X+5におけるXとYの対応表を出力するプログラムを作成せよ。
# ただし(-2<= X <=4)の範囲でXの値が整数の出力すること。
# 縦方向、横方向2パターン作成せよ。
#
# 縦方向の表示結果の例
# X | Y
# ---+---
# -2 |-3
# -1 | 2
# 0 | 5
# 1 | 6
# 2 | 5
# 3 | 2
# 4 |-3
#
# 横方向の表示結果の例
# X| -2 -1 0 1 2 3 4
# --+---------------------
# Y| -3 2 5 6 5 2 -3
#
>>466 % Prolog
program :-
入力ファイルと出力ファイル名をコマンドラインから入力してコピーする.
入力ファイルと出力ファイル名をコマンドラインから入力してコピーする :-
user_parameters([_入力ファイル,_出力ファイル]),
open(_入力ファイル,read,Input,[type(binary)]),
open(_出力ファイル,write,Output,[type(binary)]),
コピーする(Input,Output),
close(Output),
close(Input).
コピーする(Input,Output) :- 終了(Input),!.
コピーする(Input,Output) :-
get_byte(Input,C),
put_byte(Output,C),
コピーする(Input,Output).
終了(Stream) :- at_end_of_stream(Stream).
http://pc12.2ch.net/test/read.cgi/tech/1267796762/367 # 組織のある部門にある能力を持つ人間を追加したり削除したりすることで,その組織全体もしくは部分的な部門の能力を計算するシステムを構築せよ.
# このシステムによって,組織内のニーズにあった人員配置を行なう支援をできると期待できる.
# 基本的にこのシステムは以下の機能を最低限有しなければならない.
#
# 1. 登録すべき部門や副部門を指定する.
# 2. 人物の名前(文字列),資格数(整数),勤務経験年数(整数),年齢を入力する.
# 3. もし,既に十分な人数がシステムに登録済の場合,そのデータと,前段階で入力された資格数,勤務経験年数,年齢に基づき,この人物の能力の値(high, middle or low)をシステムが予測し表示する.
# 4. システム(プログラム)を停止した際,現在,保持しているデータを保存できる.
# 5. システム(プログラム)を起動した際,既存のデータがあれば,それを読み込める.
#
# 単純化のため,能力は人物,組織どちらも金額(円)で表現されているとする.
# 人物も単純化のため,その氏名で区別することとし,同一氏名の人物は組織に追加できなくてもよい.
# 組織の中にある部門は階層的な構造となっており,その階層の深さは均一でない.
# 例えば「/秘書課/」という部門は組織の直下に位置するが,「/営業部/関東営業部/」,「/開発部/半導体課/」,「/研究部/先端科学課/タイムマシン開発グループ/」等2もしは3階層の場合もある.
尚,階層の深さ制限は無いものとする.
# ある部門の下に人物と副部門が同時に配置される場合もある.
# 例えば,営業部部長の田中さんは「/営業部/田中」と表現できるが,関東営業部に属
する山田さんは,「/営業部/関東営業部/山田」となる.
# 尚,本システムでは日本語名は扱えなくてもよい.
http://pc12.2ch.net/test/read.cgi/tech/1279286575/408 # [2] 問題文(含コード&リンク):自動座席予約システムの作成せよ。
# その航空会社が持っている小型航空機(座席数:24)のフライトに座席を割り当てるシステムをプログラミングしなければならない。
# この航空機の座席は中央に通路を挟み左右にそれぞれ2座席ずつの列が計6列ある。
# 座席は 1A, 1B, 1C, 1D, ..., 6A, 6B, 6C, 6D で表示され, 1, 2列目が喫煙区画で,A, D が窓側, B, C が通路側を示している。
# このプログラムはまず最初に次の選択メニューを表示する。
# 喫煙席を希望する方は ● をタイプしてください.
# 禁煙席を希望する方は × をタイプしてください.
# 喫煙/禁煙の選択が終わると, 窓側か通路側かの選択を求める。
# 窓側を希望する方は ! をタイプしてください.
# 通路側を希望する方は # をタイプしてください.
# もし希望に沿える席がすべて予約済みで割り当てられないときには, 窓側/通路側の希望については無視して割り当てる。
# ただし, 「窓側(あるいは通路側)はすでに満席のため通路側(窓側)で予約します」というメッセージを出力し, 以下の
# ように座席番号と喫煙席/禁煙席の区分が書かれた搭乗券を(この課題では画面上に)出力する。
# --------
# 4A 禁煙
# --------
# また, 禁煙区画(あるいは喫煙区画)が窓側/通路側ともに満席のときには喫煙区画(禁煙区画)でも良いかどうか乗客に尋ねなければならない。
# 乗客がOKすれば(窓側/通路側の希望はできるだけ尊重した上で)空いている座席を割り当て搭乗券を出力し, OKしなければ
# 「3時間後に次のフライトがあります.」というメッセージを出力して終了する。
http://pc11.2ch.net/test/read.cgi/db/1274791771/311 #
# テーブルAとテーブルBがあり、
# テーブルAには、1〜1000万までの連番を格納しています。連番はキーです。
# テーブルBの方には、その連番の開始値と連番数が格納されています。
#
# 開始値 | 連番数
# ---------------
# 1001 | 100 ←1001から1100までの意味
# 5001 | 100 ←5001から5100までの意味
# 9001 | 100 ←9001から9100までの意味
#
# テーブルBで指定されている連番に一致するレコードを
# テーブルAから取得するにはどのように書けばよいでしょうか。
# 上記の例だと300件取得する形になりますが、
# テーブルBにも1万件程度のレコードがあります。
>>459 使用言語:J
f=:dyad define
c=.'*'
c,.(c,(((x, y)-2)$'_'),c),.c
)
4 f 7
*******
*_____*
*_____*
*******
475 :
デフォルトの名無しさん :2010/07/29(木) 14:46:30
Drschemeでの課題です。 「フィボナッチ数列を返すfibsを作りなさい。ただし引数として項の値の上限limitを与えるものとする。 たとえば項の上限を100とすると (fibs 100)→(1 1 2 3 5 8 13 21 34 55 89)」 (define (fibs limit) (fibs2 1 1 limit)) (define (fibs2 a b limit) (空欄 (fibs(?) b (+ a b) limit) ここまでは先生が教えてくれました。 他にもやりかたがあるらしいのですが、 これが一番処理が早いそうです。 空欄の所を埋めればできると先生が言ってました。 たぶんfilter関数を使うんじゃないかなと思ってます。 あともしかしたら(?)の部分は先生の間違いじゃないかなと思ってます。 どなたかお願いします。
476 :
デフォルトの名無しさん :2010/08/14(土) 20:35:35
Prologの解答アーカイブである
http://nojiriko.asia/prolog/サイトのIPアドレスが 変更になっています。今後アクセスは219.165.50.177ではなく上記ドメイン表記で
お願いします。
またこのサイトそのものではありませんが、ほぼ完全にコピーされた
anonymous ftpサイトを用意しました。
ftp://nojiriko.asia/prolog/以下で アクセスできるはずです。
ところで、私は先月から、コピーしての出題、Prologによる解答ともに停止しています。
これは、大量に出題、解答しようとすると、どうしてもアクセス規制がかかって
しまって、どう工夫しても結果として連続投稿になったりして動きが取れなくなった
からです。
しばらくは、上記のアーカイブサイトでの解答の追加や、機能別索引の整備を
進めたいと思っています。
477 :
デフォルトの名無しさん :2010/09/07(火) 20:39:13
478 :
デフォルトの名無しさん :2010/09/07(火) 21:13:29
マジレスしてるひとがいてわろす
http://hibari.2ch.net/test/read.cgi/db/1274791771/443 # ひとつのテーブルで各レコードは他のレコードと1:Nの親子関係にあります
# コード 親コード データ
# 1 1 A
# 2 1 B
# 3 2 C
# 4 3 D
# 5 1 E
# 6 2 F
#
# まあこんな感じで1以外は全部親を1つ持ち親はひとつ以上の子を持ちます(子が無い親も居ますが)
# これである親の子レコード以下を下記のような感じで全部抽出したいのでが
# SQLだけで出来ますでしょうか
#
# コード=2のときの抽出結果
# コード データ 世代
# 3 C 1
# 4 D 2
# 6 F 1
#
# 世代は2から何世代下にいるかです、子なら1孫なら2…ということです
#
# また無理ならこうゆうことを可能にするデータ構造を教えてください
# DBはFireBird1.5を想定していますがフリーのDBなら何でも良いです
#
>>481 % Prolog
ある親の子孫を世代番号付きですべて調べる(_親番号,_コード,_データ,_世代) :-
子孫(_親番号,_コード,_データ,_世代).
子孫(_親,_子,_データ,1) :- テーブル(_子,_親,_データ).
子孫(A,B,_データ,_世代) :-
テーブル(C,A,_),
子孫(C,B,_データ,_世代の二),
_世代 is _世代の二 + 1.
>>484 使用言語:J
a=:10000 5000 1000 500 100 50 10 5 1
b=:,;._1',一万,五千, 千,五百, 百,五十, 十, 五, 一'
f=:}:@;@(((}:@>@{.,({.@>@}.)#:{:@>@{.);}.@>@{:)^:(#@>@}.))
g=:3 :'(b,"1''円:''),.(":,.f y;a),"1''枚'''
g 12345
一万円:1枚
五千円:0枚
千円:2枚
五百円:0枚
百円:3枚
五十円:0枚
十円:4枚
五円:1枚
一円:0枚
>>488 % Prolog ならびの要素は画素であるとした。
左下を原点として一次元のならびで表現された画像の区画変換(N,_原画像,_並び替えた画像) :-
Len1 is N // 2,
findall([_区画番号,_行単位の区画],member_L(1,_区画番号,Len1,_行単位の区画,_原画像),LL),
区画要素のみ取り出す(4,LL,LL4),
区画要素のみ取り出す(3,LL,LL3),
区画要素のみ取り出す(1,LL,LL1),
区画要素のみ取り出す(2,LL,LL2),
一次元ならびの写像(LL4,LL3,Y),
一時元ならびの写像(LL1,LL2,Z),
append(Y,Z,_並び替えた画像).
一次元ならびの写像([],[],[]) :- !.
一次元ならびの写像([L1|R1],[L2|R2],[L3|R3]) :- append(L1,L2,L3),一次元ならびの写像(R1,R2,R3).
区画の要素のみ取り出す(_初期区画番号,LL,X) :- findall(L,member([_初期区画番号,L],LL),X).
member_L(M,M,N,Lx,L) :-
length(Lx,N),
append(Lx,R,L).
member_L(4,M,N,Lx,L) :-
length(L1,N),
append(L1,R,L),
member_L(1,M,N,Lx,R),!.
member_L(M1,M,N,Lx,L) :-
length(L1,N),
append(L1,R,L),
M2 is M + 1,
member_L(M2,M,N,Lx,R).
>>489 訂正
一時元ならびの写像(LL1,LL2,Z), -> 一次元ならびの写像(LL1,LL2,Z),
>>488 使用言語:J
変換部分だけ。
f=:monad def',/;"1|."1 a<\"1>|.(a=.--:{.$y)<\y'
]a=:i.2 2
0 1
2 3
f a
3 2
1 0
]b=:i.4 4
0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15
f b
10 11 8 9
14 15 12 13
2 3 0 1
6 7 4 5
>>484 使用言語:maxima
f(x):=(k:[10000,5000,1000,500,100,50,10,5,1],
for i in k do (printf(true,"~5dyen:~dmai~%",i,fix(x/i),x:mod(x,i))));
(%i69) f(12345);
10000yen:1mai
5000yen:0mai
1000yen:2mai
500yen:0mai
100yen:3mai
50yen:0mai
10yen:4mai
5yen:1mai
1yen:0mai
>>484 使用言語:Io
f:=method(x,
list(10000,5000,1000,500,100,50,10,5,1)map(v,
writeln(v,"yen:",(x/v)floor,"mai")
x=x%v
)
)
Io> f(12345)
10000yen:1mai
5000yen:0mai
1000yen:2mai
500yen:0mai
100yen:3mai
50yen:0mai
10yen:4mai
5yen:1mai
1yen:0mai
http://hibari.2ch.net/test/read.cgi/tech/1284632294/944 # [1] 授業単元:基礎プログラミング
# [2] 問題文(含コード&リンク)
# 下記の様に、料理名の入力や材料名をキーボードより入力して、人数分の料理のレシピを計算して表示するプログラムを作成しなさい.
# 今日の料理名は何ですか:(料理名)
#
材料名は何ですか:( 材料)
# ( 材料) は一人当たり何グラム必要ですか:(分量)
#
何人分の料理を作りますか:(人数)
#
==レシピ==
# 今日は、(料理名)を作りましょう。
#
「(料理名)を(人数)人分作るには,(改行)
#
( 材料) が ( 分量×人数 ) グラム必要です」
# *()内の料理名や材料には自分の好きな名前を考えてください。
* 人数、分量はキーボードから入力した値を使用してください。
# printf 関数内で%sや%dを使用して、文字列(料理名・材料名)や整数値(人数・分量)を表示すること。
#
>>495 % Prolog その一
'以下の式(send+more=money)が成り立つように英字に数字をあてはめよ。ただし同じ英字には同じ数字が当ては
まる。'(_数1,_数2,_数3) :-
abolish(アルファベット数値対応/2),
アルファベットを得る([send,more,money],_アルファベット),
アルファベット対応数値候補表の定義(_アルファベット),
語彙に対応する数を得る(send,_数1),
語彙に対応する数を得る(more,_数2),
語彙に対応する数を得る(money,_数3),
_数3 is _数1 + _数2.
アルファベット対応数値候補表の定義(_アルファベット) :-
append(_,[_文字|R],_アルファベット),
for(0,N,9),
assertz(アルファベット数値対応(_文字,N)),
R = [],!.
語彙に対応する数を得る(_語彙,_数) :-
atom_chars(_語彙,_文字ならび),
アルファベットを基礎に数のならびを得る(_文字列ならび,_数ならび),
数字ならびから10進数を得る(_数ならび,_,_数).
アルファベットを基礎に数のならびを得る([],[]) :- !.
アルファベットを基礎に数のならびを得る([A|R1],[N|R2]) :-
アルファベット数値対応(A,N),
アルファベットを基礎に数のならびを得る(R1,R2).
>>495 % Prolog その二
数字ならびから10進数を得る([N],0,N) :- !.
数字ならびから10進数を得る([M|R],J,N) :-
数字ならびから10進数を得る(R,J1,N1),
J is J1 + 1,
N is M * truncate(10 ^ J1) + N1.
アルファベットを得る(_語彙ならび,_アルファベット) :-
concat_atom(_語彙ならび,S),
atom_hcars(S,Chars),
setof(_文字,member(_文字,Chars),_アルファベット).
http://hibari.2ch.net/test/read.cgi/tech/1286978599/22 # 口頭で説明されたものを書くので分かりづらかったらごめんなさい
# 【質問テンプレ】
# [1] 授業単元:プログラミング?
# [2] 問題文(含コード&リンク):
# 5種類の通貨(a,b,c,d,e)が存在する
# 最初に幾らかのお金を渡されるそのお金はa,b,c,d,e以外にも
# aとしてもbとしても使えるものbとしてもdとしても使えるものなどがある
# そのお金を持って商品を買うが商品には特定の通貨しか使えない
# ただし、a,bどちらでも払える商品やb,dどちらでも払える商品もある
# それらの商品の合計が渡されるのでソレを手持ちのお金で変えるかどうかを答えよ
# 合計は配列p[15]として辞書順で与えられる(例えばaで払えるものp[0]bとcで払えるものはp[7])
# ex)p={3,2,0,0,0,0,2,0,0,0,0,0,0,0,0}
# だとa=3,ab=2,bc=2なので
# 手持ちが{5,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0}
# a=5,b=2ならはらえる
#
>>502 % Prolog
'0未満の数が入力されるまで入力を求め、その入力した回数と入力した数値の合計値を表示する' :-
'0未満の数が入力されるまで入力を求め、その入力した回数と入力した数値の合計値を表示する'(_入力した回数,_合計値),
write_formatted('入力した回数 = %t, 合計値 = %t\n',[_入力した回数,_合計値]),!.
'0未満の数が入力されるまで入力を求め、その入力した回数と入力した数値の合計値を表示する'(_入力した回数,_合計値) :-
数の入力(I),
'0未満の数が入力されるまで入力を求め、その入力した回数と入力した数値の合計値を表示する'(I,_入力した回数,_合計値).
'0未満の数が入力されるまで入力を求め、その入力した回数と入力した数値の合計値を表示する'(J,0,0) :- J< 0,!.
'0未満の数が入力されるまで入力を求め、その入力した回数と入力した数値の合計値を表示する'(J,_回数,_合計値) :-
数の入力(I),
'0未満の数が入力されるまで入力を求め、その入力した回数と入力した数値の合計値を表示する'(I,_回数_1,_合計値_1),
_回数 is _回数_1 + 1,
_合計値 is _合計値_1 + J.
数の入力(I) :-
write('数を入力してください(終了するには0未満の数を入力) : '),
get_line(Line),
数の入力診断(Line,I),!.
数の入力(I) :- 数の入力(I).
数の入力診断(Line,I) :- atom_to_term(Line,I,_),number(I),!.
数の入力診断(Line,I) :-
write_formatted('入力された %t から適切な数が得られませんでした\n再入力をお願いします\n',[Line]),
fail.
>>504 % Prolog
'入力された数値を逆順に表示せよ。なお、この動作は0未満の値が入力されるまで 繰り返すものとする。' :-
数の入力(_数値),
number_chars(_数値,_数値文字ならび),
reverse(_数値文字ならび,_逆順にされた数値文字ならび),
concat_atom(_逆順にされた数値文字ならび,_逆順にした数値表現),
write_formatted('逆順にされた数値表現は %t\n',[_逆順にした数値表現]),!.
数の入力(I) :-
write('数を入力してください(終了するには0未満の数を入力) : '),
get_line(Line),
数の入力診断(Line,I),!.
数の入力(I) :- 数の入力(I).
数の入力診断(Line,I) :- atom_to_term(Line,I,_),number(I),!.
数の入力診断(Line,I) :-
write_formatted('入力された %t から適切な数が得られませんでした\n再入力をお願いします\n',[Line]),
fail.
http://hibari.2ch.net/test/read.cgi/tech/1268979408/572 # ●正規表現の使用環境 php5
# ●検索か置換か? 置換
# ●説明 tableタグ内の改行(<br />)を全て削除したい
#
# ●対象データ
# <table border="1" cellpadding="5" cellspacing="0" class="xx" id="xx"><br />
# <tbody><br />
# <tr><br />
# <td><br />
# </td><br />
# </tr><br />
# </tbody><br />
# </table>
#
# ●希望する結果
# <table border="1" cellpadding="5" cellspacing="0" class="xx" id="xx">
# <tbody>
# <tr>
# <td>
# </td>
# </tr>
# </tbody>
# </table>
>>509 % Prolog
'tableタグ内の改行タグを全て削除したい'(_ファイル) :-
get_chars(_ファイル,Chars),
'tableタグ内の改行タグを全て削除したい'(Chars,L),
put_chars(_ファイル,L).
'tableタグ内の改行タグを全て削除したい'([],[]) :- !.
'tableタグ内の改行タグを全て削除したい'(L1,L2) :-
append(L0,[<,t,a,b,l,e,>|R],L1),
append(L2,[<,/,t,a,b,l,e,>|R2],R),
'改行タグの削除'(L2,L3),
'tableタグ内の改行タグを全て削除したい'(R2,L4),
append(L0,[<,t,a,b,l,e,>|L3],L4,L2),!.
'tableタグ内の改行タグを全て削除したい'(L,L).
'改行タグの削除'([],[<,/,t,a,b,l,e,>]) :- !.
'改行タグの削除'([<,b,r,' ',/,>|R1],R2) :-
'改行タグの削除'(R1,R2),!.
'改行タグの削除'([A|R1],[A|R2]) :-
'改行タグの削除'(R1,R2),!.
>>510 それは正規表現を使っていないのでダメでしょう
>>508 % Prolog (その一)
簡単なスタックマシン(Stack1,Stack2) :-
rawmode,
write('?- '),
get_char(_文字),
評価(_文字,Stack1,Stack3),
簡単なスタックマシン(Stack3,Stack2).
評価('\n',Stack1,Stack2) :-
get_char(_文字),
評価(_文字,Stack1,Stack2),!.
評価(_文字,Stack1,Stack2) :-
append(_,[_文字|_],['+','-','*','/','%','^']),
式評価(_文字,Stack1,Stack2,U),
評価(_文字,Stack1,Stack2) :-
\+(append(_,[_文字|_],['+','-','*','/','%','^'])),
数値の切り取り(_文字,L,_次の文字),
number_chars(_数値,L),
push(_数値,Stack1,Stack3),
評価(_次の文字,Stack3,Stack2).
>>508 % Prolog (その二)
式評価('%',Stack1,Stack4,U) :- 式評価(mod,Stack1,Stack4,U),!.
式評価(_文字,Stack1,Stack2,U) :-
pop(_値2,Stack1,Stack3),
pop(_値1,Stack3,Stack4),
_式 =.. [_文字,_値1,_値2],
U is _式,
write_formatted('%t\n',[U]),
push(U,Stack4,Stack2),!.
式評価(_文字,Stack1,Stack2,_) :-
write('ERROR\n'),
get_char(_文字),
評価(_文字,Stack1,Stack2).
数値の切り取り('\n',[],'\n') :- !.
数値の切り取り(_次の文字,[],_次の文字) :-
\+(member(_次の文字,['0','1','2','3','4','5','6','7','8','9','.'])),!.
数値の切り取り(_文字,[_文字|R],_次の文字) :-
get_char(_文字2),
数値の切り取り(_文字2,R,_次の文字).
push(A,Stack,[A|Stack]).
pop(A,[A|Stack],Stack).
# 100、200、250、300、350、500、 # 550、600、700、1,000、1,200、 # 1,500、2,500、3,000円の商品を # 売っている店がある。 # x円でお釣りが最も少なくなるよう買うには # どう買えば良いか? # # 例: 手持ち8,520円の場合 # 3,000円の商品を2個=6,000円 # 2,500円の商品を1個=2,500円 # と買えば合計8,500円、釣り20円
# [つづき] # 重みの和は*** # 有向グラフ('V0','V1',1). # 有向グラフ('V1','V2',2). # 有向グラフ('V2','V3',5). # 有向グラフ('V3','V4',8). # 有向グラフ('V4','V5',2). # 有向グラフ('V5','V6',1). # 有向グラフ('V7','V6',2). # 有向グラフ('V8','V7',1). # 有向グラフ('V9','V8',5). # 有向グラフ('V10','V9',2). # 有向グラフ('V10','V11',6). # 有向グラフ('V11','V12',5). # 有向グラフ('V12','V13',1). # 有向グラフ('V0','V10',3). # 有向グラフ('V1','V11',1). # 有向グラフ('V2','V12',4). # 有向グラフ('V8','V5',6). # 有向グラフ('V9','V12',7). # 有向グラフ('V9','V13',1). # 有向グラフ('V11','V9',3). # 有向グラフ('V12','V3',8). # 有向グラフ('V12','V5',2). # 有向グラフ('V13','V8',3). # 有向グラフ('V13','V3',1). #
518 :
デフォルトの名無しさん :2010/11/07(日) 18:33:28
http://hibari.2ch.net/test/read.cgi/tech/1288531658/780 # よろしくお願いいたします。
# [1] 授業単元:C++言語入門
# [2] 問題文(含コード&リンク):
#
# ネットワークのルートアドレスとネットマスク、そしてチェックしたいIPアドレスを
# 渡して、チェックしたいIPアドレスがそのネットワークに含まれているかどうかを
# チェックする関数int checkIPAddress(unsigned int root,unsigned int mask,unsigned
# int address)を以下のように書いた。空欄をうめよ。
# ただし、あるIPアドレスがネットワークに含まれているかどうかチェックするには、
# ネットワークのルートアドレス(root)と、チェックしたいIPアドレス(address)の
# ネットワークIDを比較してその値が同じであったら、そのネットワークに含まれていると
# 判定します。IPアドレス中のネットワーク部は、ネットマスクのビットパターンが1である部分と
# 考えます。IPアドレスからネットワークIPを取り出すには、IPアドレスをネットマスクの
# ビットごとのANDを取り出します。詳細はインターネットの検索エンジンで「ネットマスク」
# をキーワードに調べてください。
#
# int checkIPAddress(unsigned int root,unsigned int mask,unsigned int address)
# {
# return(root 空欄? 空欄?)==(root 空欄? 空欄?)
# }
#
520 :
デフォルトの名無しさん :2010/11/27(土) 02:30:19
>>520 % Prolog
'ニュートン法を用いて実数の平方根を求める'(_実数,_平方根) :-
'ニュートン法を用いて実数の平方根を求める'(0,5,_実数,1.0,_平方根),!.
'ニュートン法を用いて実数の平方根を求める'(Max,Max,_実数,X,X) :- !.
'ニュートン法を用いて実数の平方根を求める'(N,Max,_実数,X1,X) :-
Y is X1 * X1 - _実数,
Y2 is 2 * X1,
X2 is X1 - Y / Y2,
N2 is N + 1,
'ニュートン法を用いて実数の平方根を求める'(N2,Max,_実数,X2,X).
>>519 % Prolog
'ノートを7冊ずつ配ると28冊余り,10冊ずつ配ると最後の一人にわたすノートは他の半分にも達しませんでした。ノートの数と人数を求めなさい。'(_ノートの数,_人数) :-
'10冊ずつ配るとひとり少ない人数分だけは完全にあるということです',
これを_10冊を完全に配ることのできる人数とすると,
'一旦最後ひとり分(7個)も取り崩して',
'28冊に加えてからこれを(10-7)個ずつ確実に渡すことのできる人数が_10冊を完全に配ることのできる人数ということになります'(_10冊を完全に配ることのできる人数),
余りが最後の人が受け取る冊数になり、これは10冊の半分未満でないといけません,
人数はそれに1を加えたものであり(_10冊を完全に配ることのできる人数,_人数),
本の冊数は(_人数,_本の冊数).
'28冊に加えてからこれを(10-7)個ずつ確実に渡すことのできる人数が_10冊を完全に配ることのできる人数ということになります'(_10冊を完全に配ることのできる人数) :-
_10冊を完全に配ることのできる人数 is (28 + 7) // (10 - 7).
余りが最後の人が受け取る冊数になり、これは10冊の半分未満でないといけません :-
_最後の人が受け取る冊数 is (28 + 7) mod (10 - 7),
_最後の人が受け取る冊数 < 10 // 2.
人数はそれに1を加えたものであり(_10冊を完全に配ることのできる人数,_人数) :-
_人数 is _10冊を完全に配ることのできる人数 + 1.
本の冊数は(_人数,_本の冊数) :-
_本の冊数 is 7 * _人数 + 28.
'10冊ずつ配るとひとり少ない人数分だけは完全にあるということです' :- true.
これを_10冊を完全に配ることのできる人数とすると :- true.
'一旦最後ひとり分(7個)も取り崩して' :- true.
523 :
522 :2010/11/30(火) 07:50:09
>>522 定義洩れ
余りが最後の人が受け取る冊数になり、これは10冊の半分未満でないといけません :- true.
525 :
お題 :2010/12/14(火) 16:08:37
echoサーバを作れ
http://ja.wikipedia.org/wiki/Guarded_Horn_Clauses # 以下の指示に従い、エラストテネスのふるいを使い素数生成を行うプログラムを書きなさい。
#
# エラストテネスの篩を実行すると、整数生成と篩の2つのプロセスが生成される。
# 整数生成は指定最大値までの自然数のストリームを生成し、篩はそれをふるいにかけ
# 素数のストリームを素数ストリームに返す。
# 整数生成と篩とはそれぞれ並行して動き、整数生成で生成された自然数のストリームは
# 引数の変数を介して順次篩に渡される。
# プロセス間の同期は、ストリームの各要素が具体化されるまで待つ、という形で自然に表現される。
#
# 整数生成、篩の各プログラムはそれぞれ以下のようになる。
# 整数生成は、自然数のストリームを順次生成し指定最大値を超えたら終了する。
# 篩は、2,3,5,7,..などの各素数の倍数をストリームから取り除く"ふるい"を順に
# 生成しながら、求まった素数を順次ストリームの要素として返す。
# 各"ふるい"は変数を介して直列につながれていくため、自然数のストリームから素数のみの
# ストリームを求めることができる。
#
# 注意.. 漢字の"篩"とかなの"ふるい"を使い分けている。
http://hibari.2ch.net/test/read.cgi/tech/1294061094/358 # [1] 授業単元:プログラミングC++入門
# [2] 問題文:問1・以下のクラスを作り、オブジェクトを生成して、全てのメンバ関数を実行せよ。ただし、体力は整数形の変則とする。
# クラス名ねずみ メンバ変数 名前 種族 体力 メンバ関数 コンストラクタ 自己紹介 体力を上げる 体力を下げる 体力の値を返す
# 問2・問1で作ったクラスから、以下のような派生クラスを作り、そのオブジェクトを生成して、派生クラスが持つ全てのメンバ関数を実行せよ。
# ただし、職業はコンストラクタにより、ディズニーキャラクターとせよ。また、自己紹介は名前の他に職業も紹介させよ。
# それから、踊ったら体力が回復するようにせよ。体力の増減量は決めていい。
# 問3・上記の派生クラスおよび期底クラスにおいて、体力の上限を設け、その上限に達した場合、IF文を使ってそれ以上値が増加しないようにせよ。
# また同様に、体力が負の値にならないようにせよ。そして体力がゼロならば踊れないようにせよ。
# 問4・問3で改良したオブジェクトに対して、WHILE文やFOR文を使って、体力がゼロになって踊れなくなるまで繰り返し躍らせよ。
# 問5・今までの問で作ってきたクラスのオブジェクトを、配列を使って2つ生成せよ。そして、それぞれに異なる名前を与え、全てのメンバ関数を実行せよ。
>>526 F#
open System.Threading
type Msg = int * AsyncReplyChannel<bool>
let sift =
MailboxProcessor.Start (fun inbox ->
let rec loop (filters : MailboxProcessor<Msg> list) = async {
let! n = inbox.Receive()
if filters |> List.forall (fun f -> f.PostAndReply(fun r -> (n, r))) then
printfn "素数発見 : %d" n
let filter = MailboxProcessor<Msg>.Start (fun inbox ->
let rec loop'() = async {
let! (m, r) = inbox.Receive()
m % n <> 0 |> r.Reply
return! loop'() }
loop'())
return! loop (filter::filters)
else
return! loop filters }
loop [])
let gen maximum =
Async.Start(async {
printfn "2 〜 %d の素数探索開始" maximum
seq {2 .. maximum} |> Seq.iter (fun n ->
sift.Post(n); Thread.Sleep(200))
printfn "素数探索終了" })
gen 100
System.Console.ReadKey() |> ignore
>>525 echoサーバ(Port) :-
socket(internet,stream,Socket),
socket_bind(Socket,Port),
socket_listen(Socket),
socket_accept(Socket,Host:Port2,NewSocket),
open(NewSocket,read,Instream),
open(NewSocket,write,Outstream),
get_char(Instream,Char),
echo(Instream,Outstream,Char),
close(Outstream),
close(Instream),
socket_shutdown(Socket),
socket_shutdown(NewSocket).
echo(_,_,end_of_file) :- !.
echo(Instream,Outstream,Char) :-
put_char(Outstream,Char),
flush_output(Outstream),
get_char(Instream,Char2),
echo(Instream,Outstream,Char2).
>>529 F# リンク先の回答を移植しただけ
let leastBorders xs ys rs xy1 xy2 =
let checkInside (x1, y1, r) (x2, y2) =
pown (x1 - x2) 2 + pown (y1 - y2) 2 <= r * r
Array.zip3 xs ys rs |> Array.sumBy (fun xyr ->
if [xy1; xy2] |> List.map (checkInside xyr) |> List.reduce (<>) then 1 else 0)
532 :
デフォルトの名無しさん :2011/02/24(木) 22:38:54.50
>>525 #! /usr/bin/awk -f
#echo server
BEGIN {
echoC = "/inet/tcp/10000/0/0"
while((echoC |& getline) > 0) {
print "受理日時: "strftime("%Y年%m月%d日 %H:%M:%S") ": " $0
print "受理: " $0 |& echoC
close(echoC)
}
}
533 :
532 :2011/02/24(木) 22:40:00.23
gawkでしか動かんのでシバンがまずかった。 以下のように訂正。 #! /usr/bin/gawk -f
534 :
デフォルトの名無しさん :2011/03/26(土) 23:42:54.23
テキストボックスに A222BあああA555BえええAおおおB55A454B と入っていたとします。 この文字列の AとBとその間の文字を1セットにして、AとBの間の文字に5が入っていたときだけ、AとBを削除する このようなロジックをつくっていただけないでしょうか?
正規表現が使えると超ラク 正規表現の例は置いておくからテキストボックスからテキスト拾ってきてうんぬんとかは自分でどうにかしろ Ruby 1.9.2 # coding: windows-31J s="A222BあああA555BえええAおおおB55A454B" s.gsub!(/(A5+B)|(B5+A)/, "") puts s
>>534 % Prolog
'AとBとその間の文字を1セットにして、AとBの間の文字に5が入っていたときだけ、AとB
を削除する'(_文字列,_置換文字列) :-
atom_chars(_文字列,Chars),
文字ならびの置換(Chars,Chars2),
atom_chars(_置換文字列,Chars2).
文字ならびの置換([],[]) :- !.
文字ならびの置換(['A'|R1],L) :-
最初に現れるBの間に5が存在する(R1,L0,R2),
文字ならびの置換(R2,L2),
append(L0,L2,L).
文字列ならびの置換([_文字|R1],[_文字|R2]) :-
文字ならびの置換(R1,R2).
最初に現れるBの間に5が存在する(R1,L0,L2) :-
append(L0,['B'|L2],R1),!,
\+(append(_,['A'|_],L0)),
append(_,['5'|_],L0),!.
% Prolog 行途中で改行されてしまったので書きなおし。 'AとBとその間の文字を1セットにして、AとBの間の文字に5が入っていたときだけ、AとBを削除する'(_文字列,_置換文字列) :- atom_chars(_文字列,Chars), 文字ならびの置換(Chars,Chars2), atom_chars(_置換文字列,Chars2). 文字ならびの置換([],[]) :- !. 文字ならびの置換(['A'|R1],L) :- 最初に現れるBの間に5が存在する(R1,L0,R2), 文字ならびの置換(R2,L2), append(L0,L2,L). 文字列ならびの置換([_文字|R1],[_文字|R2]) :- 文字ならびの置換(R1,R2).
538 :
537 :2011/03/27(日) 06:52:31.59
% ごめんなさい。適切でない部分があった。 % Prolog 'AとBとその間の文字を1セットにして、AとBの間の文字に5が入っていたときだけ、AとBを削除する'(_文字列,_置換文字列) :- atom_chars(_文字列,Chars), '間に5を含むAとBを削除する'(Chars,Chars2), atom_chars(_置換文字列,Chars2). '間に5を含むAとBを削除する'([],[]) :- !. '間に5を含むAとBを削除する'(['A'|R1],L) :- 最初に現れるBの間に5が存在する(R1,L0,R2), '間に5を含むAとBを削除する'(R2,L2), append(L0,L2,L),!. '間に5を含むAとBを削除する'([_文字|R1],[_文字|R2]) :- '間に5を含むAとBを削除する'(R1,R2). 最初に現れるBの間に5が存在する(R1,L0,L2) :- append(L0,['B'|L2],R1),!, \+(append(_,['A'|_],L0)), append(_,['5'|_],L0),!.
539 :
538 :2011/03/27(日) 07:31:13.78
あと、 _置換文字列 を _削除された文字列 に直してください。
vb.netの勉強をしています。独学です。 [問題] 2値化した画像の輪郭追跡処理をする。 できたら、 (1)getpixel等を使った、時間はかかるが初心者でも理解しやすいもの (2)処理がはやくなるように工夫したもの の2種類作っていただけるとありがたいです。
javaプログラムの質問儲けつけていただけるでしょうか?
>>542 ありがとうございます。
そちらの方で質問しても回答を期待できますか?
無理してJavaプログラミングの講座を取ったのですが行くなり苦戦しています。
>>543 「JAVAの宿題片付けます」というようなスレが
あったのですが、今は新スレが作られていない
ようですね。新学期が始まるとまた作られると
思いますが。
このスレは例えばJAVAの宿題スレから問題を
貰ってきて、別の言語で解答を出し合い、
言語表現の違いを楽しむためのスレです。
横入りですが、できましたらJavaで以下をお願いします。 【課題】キーボードから入力された1〜9までを九九にし、 答えを1行に3個ずつ表示する。半角数字以外が入力された場合、 任意のエラーメッセージを表示させること。 【形態】public class Kuku1{で始める 【期限】4月11日 【Ver 】jdk1.6.0_24 【注】変数、if,for,whileまで学習。 単なる九九の計算のプログラムはできるのですが、例えば、3と入力して 3の段の答えだけを表示するやり方、エラーを表示させるやり方、 3つずつというのが全くわかりません。 よろしくお願いします。
ここは質問スレではないよ?
いや質問スレでしょ
ボールが描画領域内で壁に反射しながら2 次元平面内で 等速直線運動するプログラムをJavaを用いて作成せよ. お願いします。
色んな言語なのにjava指定ってのが多いな。。。 javaで宿題スレって無いのか?
javaで画像を配列で読み込み、3×3で打ち込んだマスク、フィルタ処理をしてくれるプログラムを作りたいのですが フィルター部分はできたのですが、画像を配列に読み込み書き出す方法が分かりません。 どなたかプログラムしてくれませんか?
>>545 % Prolog
'キーボードから入力された1〜9までを九九にし、答えを1行に3個ずつ表示する' :-
'キーボードから入力された1〜9までを'(_1〜9までの数),
append(_,[[N1,N2,N3]|R],[[1,2,3],[4,5,6],[7,8,9]]),
M1 is N1 * _1〜9までの数,
M2 is N2 * _1〜9までの数,
M3 is N3 * _1〜9までの数,
writef('%t %t %t\n',[M1,M2,M3]),
R = [].
'キーボードから入力された1〜9までを'(_1〜9までの数) :-
get_line(Line),
'キーボードからの入力診断'(Line,_1〜9までの数),!.
'キーボードから入力された1〜9までを'(_1〜9までの数) :-
'キーボードから入力された1〜9までを'(_1〜9までの数).
'キーボードからの入力診断'(Line,_1〜9までの数) :-
atom_to_term(Line,_1〜9までの数,_),
integer(_1〜9までの数),
_1〜9までの数 >= 1,
_1〜9までの数 =< 9,!.
'キーボードからの入力診断'(Line,_1〜9までの数) :-
writef('入力された %t からは1〜9までの数が得られません。再入力をお願いします\n',[Line]),
fail.
>>549 ざっと見渡した限り、通常の質問スレはあるが
宿題スレや丸投げ系のスレは無さそうだな
>>549 このスレたったころはJava用の宿題スレあったからね〜
スレ落ちしてから誰も立ててないだけでしょ
555 :
デフォルトの名無しさん :2011/10/13(木) 10:13:59.94
Z80アセンブラで7セグメントLEDに表示できる 簡易電卓をlinux作成したいのですが全くわかりません。 どなたかよろしければプログラムを作成しては いただけませんでしょうか? よろしくお願いします。
556 :
デフォルトの名無しさん :2011/10/13(木) 10:17:48.83
>>555 の続きなのですが
RAM EQU 8000H
ROM EQU 0000H
ORG RAM
LED_1: BLOCK 1
LED_2: BLOCK 1
LED_3: BLOCK 1
LED_4: BLOCK 1
XL: BLOCK 1
XH: BLOCK 1
といったような書き方をしたいのですが、
是非宜しくお願いします。
それだけじゃ入出力のさせ方がわからないよ
558 :
デフォルトの名無しさん :2011/10/14(金) 00:18:23.46
>>557 さん
説明不足ですいません。
PIO_INIT:
PUSH AF
LD A,0CFH
OUT (PIO_AC),A
LD A,000H
OUT (PIO_AC),A
LD A,007H
OUT (PIO_AC),A
LD A,0CFH
OUT (PIO_BC),A
LD A,00FH
OUT (PIO_BC),A
LD A,007H
OUT (PIO_BC),A
LD A,000H
LD (LED_1),A
LD (LED_2),A
LD (LED_3),A
LD (LED_4),A
POP AF
RET
といった感じなのですが・・・。
どのI/Oアドレスが読み/書きでそれぞれどういう働きをするのか 書いてもらわんとわからんよ ビット単位で細かく指定されてる場合も多いし
>>558 聞きたいのはZ80の文法ではなく、使っている教材の仕様だからね
外観的にはLEDが4つくらいあるだろう事はわかったけど
561 :
デフォルトの名無しさん :2011/10/14(金) 03:05:41.42
すいません。仕様について失念しまして 朝学校で確かめてきます。 D7 D6 D5 D4 D3 D2 D1 D0 DS群 ▼ ▼ ▲ ▲ ▼ ▲ ▲ ▼ ▼は上下できるスイッチで WRやCLKはボタンで操作するやつです
562 :
デフォルトの名無しさん :2011/10/14(金) 03:17:31.73
>>560 さん
558=561です。
マイクロプロセッサは
TMPZ84C015Aということまで
自分の持っている資料でわかりました。
563 :
デフォルトの名無しさん :2011/10/14(金) 18:54:09.36
564 :
デフォルトの名無しさん :2011/10/14(金) 19:21:39.38
仕様分からないんじゃ誰にもやりようないじゃん・・・
566 :
デフォルトの名無しさん :2011/10/14(金) 20:33:26.93
>>564 です
マイクロプロセッサは
TMPZ84C015AでZ80CPUを核としてCTC、シリアルI/Oポート(SIO)
パラレルI/Oポート(PIO)、CGC、WDTを内蔵してて
PIOは2組の独立した8bitポートで、
教材のPIOのI/Oアドレスは
ポートA;データレジスタ(01CH)
ポートA;コントロールレジスタ(01DH)
ポートB;データレジスタ(01EH)
ポートA;コントロールレジスタ(01FH)
として設定されてます
そのI/Oポートをどう操作すれば入出力ができるのかが重要なんですが それを割愛されると手を出せませんよ さらっと目を通しましたが、CALL〜RETの中にPOPが紛れ込んでますがそれは大丈夫なんですか?
568 :
デフォルトの名無しさん :2011/10/14(金) 20:48:12.13
RAMは256kbitまたは32byteの読み書き できるメモリ容量 データバス8本 ポート ・8ビットパラレルポート×2 ・シリアルポート×1
569 :
デフォルトの名無しさん :2011/10/14(金) 21:19:15.19
570 :
デフォルトの名無しさん :2011/10/15(土) 02:46:06.58
あ
571 :
デフォルトの名無しさん :2011/10/17(月) 10:42:31.88
>>571 どうやら I/O は
・PIOポートA ⇒ 7Seg LED (4連 = 16bit分)
・PIOポートB ⇒ キー(トグルSW?) (4キー * 4連 = 16bit分)
って事っぽいね。入出力共に、I/O 1回で 4bit みたいだから、完成までには少なくとも
1. 4bit (LED 1つ分) 出力するサブルーチンを作成
2. 1. を4回繰り返して 16bit (全 LED 分) 出力するサブルーチンを作成
3. キーから 4bit (キー1連分) 読み込むサブルーチンを作成し、2. を使って出力テスト
4. 3. を4回繰り返して 16bit (全キー分) 読み込むサブルーチンを作成し、2. を使って出力テスト
5. 足し算実装
6. 引き算実装
7. 掛け算実装
8. 割り算実装
位のステップは踏むと思うんだけど、どこまで出来てんの?
ちなみに、>555と同一人物?
573 :
572 :2011/10/18(火) 17:06:20.95
そもそもZ80のアセンブラ自体組んだことが無いから、 動かなくたって知らんよ。
学校で宿題が出ました、助けて下さい>< 実行すると下記のような動作をするバッチファイルスクリプトを作成したいです。 よろしくお願いいたします。 実行するバッチファイルが現在存在するディレクトリにある全てのテキストファイルを書き換えるバッチを作成しなさい。 テキストファイルの中に、pass = "C:\Users\users\Documents\workspace\test.txt"というような パスを変数に代入する記述があった場合 そのパスの部分を、pass = "現在のバッチファイルの存在するディレクトリ\test.txt" という風にディレクトリ名だけを(ファイル名は書き換えない)書き換えるバッチを作成しなさい。
576 :
デフォルトの名無しさん :2011/10/29(土) 23:55:49.97
集合で、条件を満たす部分集合の数を数える計算をC言語かwxmaximaでやりたいと思ってます。 例えば3個の要素からなる集合{a,b,c}でa,b,cは0〜24の任意の数をとるとします。 また一方で{0+i,3+i}(i<=24,i++)のものをredと定義します。 そして、{a,b,c}の中で部分集合{a,b}{b,c}{c,a}がすべてredであるような{a,b,c}の数はいくつあるか計算する方法を教えてください。
>>576 Haskellで、その問題をそのまま書いてみたけど、空リスト(空集合)が返ってきたぞ
[[a,b,c]| a <- [0..24], b <- [0..24], c <- [0..24], isRed a b, isRed b c, isRed c a]
isRed i i' | i <= 24 && i' == (i+3) = True
isRed _ _ = False
単純に考えても、{a,b}, {b,c}でa < b < cが確定するのに、それを満たしつつc < aを満たすのは不可能。 (c < a?) < b < c
579 :
デフォルトの名無しさん :2011/12/04(日) 11:12:03.99
P型記述子によるフーリエ変換をするプログラムがまったくできずに困っています どなたか教えていただけないでしょうか
って一ヶ月以上前かよ
582 :
営利利用に関するLR審議中@詳細は自治スレへ :2012/03/30(金) 10:58:57.35
586 :
デフォルトの名無しさん :2012/06/14(木) 23:26:40.21
問題 円Cの半径r、中心の座標(x,y)が与えられたとき 円の面積の第1象限の部分、第2象限の部分、第3象限の部分、第4象限の部分を求めよ。
588 :
587 :2012/06/15(金) 06:46:49.90
589 :
587 :2012/06/15(金) 08:48:34.17
591 :
デフォルトの名無しさん :2012/06/18(月) 01:49:34.73
問題 どの桁の数字も右隣の桁の数字よりも大きい2桁以上の10進数をすべて求めよ。 例 76 3210 951
>>591 F#
[for i in 9L .. -1L .. 0L -> [i]]
|> Seq.unfold
(List.collect (fun (x::xs) -> [for i in 9L .. -1L .. x + 1L -> i::x::xs])
>> function [] -> None | r -> Some(r, r))
|> Seq.concat |> Seq.map (Seq.reduce (fun x y -> x * 10L + y))
|> Seq.iter (printfn "%d")
595 :
デフォルトの名無しさん :2012/06/18(月) 23:31:43.84
JAVAの課題です。KEYをつかった集計方法教えてください。 【 課題 】DB上に給与の支給テーブルがあります。 支店・部・課・社員番号・基本給・役職手当・残業時間 これらの情報をDBから読み込んだJYOUHOUDATA.javaから、 各支店ごとの部、課の合計、支店合計 総合計を求めなさい。最後に全ての合計を印字する事。 集計項目は基本給・役職手当・残業手当・総支給額の4項目とする。 【 形態 】1. Javaアプリケーション(main()で開始すること) 【Ver 】java version "1.7.0_02" 【 補足 】残業手当 =(基本給+役職手当)/160*1.2 総支給額 = 基本給+役職手当+残業手当 で計算します。 よろしくお願いします。
>>595 データ用意するのが面倒だけど
こんな感じじゃね?
select 支店,部,sum((基本給+役職手当)*(1.0+1.2*残業時間/160)) from 給与の支給 group by 支店,部
597 :
デフォルトの名無しさん :2012/06/21(木) 22:20:55.86
>>591 maxima
for i in rest(powerset({0,1,2,3,4,5,6,7,8,9})) do
(a:sreverse(simplode(i,"")),if slength(a)>1 then print(a));
598 :
デフォルトの名無しさん :2012/06/22(金) 00:20:27.35
>>591 Io
for(i,1,1023,a:="";for(j,0,9,a=if(i at(j)==1,j,"").. a);if(a size>1,a println))
1から2^10-1の10bitを0から9に対応させて1が立っているものを連結して2桁以上を出力。
599 :
デフォルトの名無しさん :2012/06/22(金) 18:13:42.05
>>591 SWI-Prolog
d0(''). d0(0). d1(''). d1(1). d2(''). d2(2). d3(''). d3(3).
d4(''). d4(4). d5(''). d5(5). d6(''). d6(6). d7(''). d7(7).
d8(''). d8(8). d9(''). d9(9).
q591:-d0(A0),d1(A1),d2(A2),d3(A3),d4(A4),d5(A5),d6(A6),d7(A7),d8(A8),d9(A9),
concat_atom([A9,A8,A7,A6,A5,A4,A3,A2,A1,A0],'',X),
name(X,Y),length(Y,Z),Z>1,writeln(X),fail.
600 :
デフォルトの名無しさん :2012/06/22(金) 20:19:56.06
#include <stdio.h> #include <math.h> int main (int argc, const char * argv[]) { double a, b, c, x1, x2; printf("ax^2+bx+c=0 の係数a,b,cは?"); scanf("%lf%lf%lf",&a,&b,&c); if (a=0) {printf("aには0を代入できません");} if ((b*b-4*a*c) > 0) {x1=(-b + sqrt(b*b-4*a*c))/(2*a); x2=(-b - sqrt(b*b-4*a*c))/(2*a); printf("x1=%lf\n",x1); printf("x2=%lf\n",x2);} if ((b*b-4*a*c) == 0) {x1=(-b+sqrt(b*b-4*a*c))/(2*a); printf("x1=%lf\n",x1);} if ((b*b-4*a*c) < 0) {x1=(-b/(2*a)); x2=(sqrt(b*b-4*a*c)/(2*a); printf("x1=%lf+%lf",x1,x2); printf("x2=%lf-%lf",x1,x2); return 0; } どこがいけないのかなあ(泣) もう初心者のぼくにはむりぽ
>>600 HSP
a_buf="1.0" : input a_buf
b_buf="0.0" : input b_buf
c_buf="0.0" : input c_buf
button "計算", *calc
stop
*calc
a=double(a_buf)
b=double(b_buf)
c=double(c_buf)
if absf(a)=0.0 : mes "aには0を代入できません" : stop
d=b*b-4.0*a*c
if d>0.0 {
mes strf("x1=%f x2=%f", (-b+sqrt(d))/(2.0*a), (-b-sqrt(d))/(2.0*a))
} else : if d<0.0 {
mes strf("x1=%f%+fi x2=%f%+fi", -b/(2.0*a), sqrt(-d)/(2.0*a), -b/(2.0*a), -sqrt(-d)/(2.0*a))
} else {
mes strf("x1=%f", -b/(2.0*a))
}
stop
602 :
デフォルトの名無しさん :2012/06/22(金) 21:12:25.61
問題 辺の長さがa,b,c,dの四角形の面積の最大値を求めよ。
>>602 #module
#defcfunc calc double a, double b, double c, double d, \
local s, local e, local w, local p1, local p2, local s1, local s2
s=absf(a-b)
if s<absf(c-d) : s=absf(c-d)
e=a+b
if e>d+c : e=d+c
repeat 100
w=e-s
p1=s+0.1*w
p2=s+0.9*w
s1=heron(a,b,p1)+heron(c,d,p1)
s2=heron(a,b,p2)+heron(c,d,p2)
if s1>s2 : e=p2 : else : s=p1
loop
return s1
#defcfunc heron double a, double b, double c, local s
s=(a+b+c)*0.5
return sqrt(s*(s-a)*(s-b)*(s-c))
#global
mes calc(1,1,1,1)
>>603 は対角線の長さxに対して四角形の面積yは
十分なだらかで且つピークとなる箇所が一箇所だけだろうという思い込みでできてます
正しいかどうか分かりません
605 :
デフォルトの名無しさん :2012/06/23(土) 07:31:32.51
>>591 J
(#~9&<),/:~x:".(#:i.2^10)#'9876543210'
>>591 Prolog (
>>592 と全く同じ内容ですが、短い素敵なコードが並んだので直接貼ります)
どの桁の数字も右隣の桁の数字よりも大きい2桁以上の10進数をすべて求める(_どの桁の数字も右隣の桁の数字よりも大きい2桁以上の10進数) :-
どの桁の数字も右隣の桁の数字よりも大きい(['9','8','7','6','5','4','3','2','1','0'],_どの桁の数字も右隣の桁の数字よりも大きい数字ならび),
'2桁以上の10進数'(_どの桁の数字も右隣の桁の数字よりも大きい数字ならび,_どの桁の数字も右隣の桁の数字よりも大きい2桁以上の10進数).
どの桁の数字も右隣の桁の数字よりも大きい([A],[A]) :- !.
どの桁の数字も右隣の桁の数字よりも大きい([A|R1],[A|R2]) :-
どの桁の数字も右隣の桁の数字よりも大きい(R1,R2).
どの桁の数字も右隣の桁の数字よりも大きい([_|R1],R2) :-
どの桁の数字も右隣の桁の数字よりも大きい(R1,R2).
'2桁以上の10進数'([A,B|R],_2桁以上の10進数) :-
number_chars(_2桁以上の10進数,[A,B|R]).
607 :
デフォルトの名無しさん :2012/06/23(土) 13:04:34.04
>>602 J
f=:%:@(*/)@:-~-:@(+/)
f 5 3 4 5
17.4123
f 2 2 2 2
4
f 2 3 3 2
6
>>602 F#
let maxSquareArea a b c d =
let abcd = [a; b; c; d]
let s = List.sum abcd / 2.
abcd |> List.map ((-) s) |> List.reduce (*) |> sqrt
> maxSquareArea 5. 3. 4. 5.;;
val it : float = 17.41228015
> maxSquareArea 2. 2. 2. 2.;;
val it : float = 4.0
> maxSquareArea 2. 3. 3. 2.;;
val it : float = 6.0
609 :
デフォルトの名無しさん :2012/06/23(土) 20:49:25.53
>>602 maxima
f(a,b,c,d):=(w:(a+b+c+d)/2,sqrt((a-w)*(b-w)*(c-w)*(d-w)));
610 :
デフォルトの名無しさん :2012/06/23(土) 21:58:11.67
>>602 R
f <- function(x){sqrt(prod(x - sum(x) / 2))}
> f(c(5,3,4,5))
[1] 17.41228
> f(c(2,2,2,2))
[1] 4
> f(c(2,3,3,2))
[1] 6
611 :
デフォルトの名無しさん :2012/06/23(土) 23:44:13.82
問題 与えられた文字列の奇数番目を大文字に偶数番目を小文字にせよ。 例 Hello => HeLlO end => EnD
>>611 HSP
#module
#defcfunc solve str buf_, local buf, local moji
buf=buf_
repeat strlen(buf)
moji=peek(buf, cnt)
if cnt\2 {
if 'A'<=moji and moji<='Z' : poke buf, cnt, moji-'A'+'a'
} else {
if 'a'<=moji and moji<='z' : poke buf, cnt, moji-'a'+'A'
}
loop
return buf
#global
mes solve("Hello")
mes solve("end")
>>611 % Prolog
'与えられた文字列の奇数番目を大文字に偶数番目を小文字にせよ。'(_与えられた文字列,_奇数番目を大文字に偶数番目を小文字にした文字列) :-
findall(_変換した文字,(
sub_atom(_文字列,_0起点位置,1,_,_文字),
奇数番目を大文字に偶数番目を小文字に(_0起点位置,_文字,_変換した文字)),
_奇数番目を大文字に偶数番目を小文字にした文字ならび),
atom_chars(_奇数番目を大文字に偶数番目を小文字にした文字列,_奇数番目を大文字に偶数番目を小文字にした文字ならび).
奇数番目を大文字に偶数番目を小文字に(_0起点位置,_文字,_小文字) :-
奇数番目を(_0起点位置),
小文字に(_文字,_小文字).
奇数番目を大文字に偶数番目を小文字に(_0起点位置,_文字,_大文字) :-
偶数番目を(_0起点位置),
大文字に(_文字,_大文字).
奇数番目を(_0起点位置) :-
1 is (_0起点位置 + 1) mod 2.
偶数番目を(_0起点位置) :-
0 is (_0起点位置 + 1) mod 2.
小文字に(_文字,_小文字) :-
to_lower(_文字,_小文字).
大文字に(_文字,_大文字) :-
to_upper(_文字,_大文字).
614 :
デフォルトの名無しさん :2012/06/24(日) 07:59:00.58
>>611 J
f=:3 :'((#y)$0 1)}(toupper,:tolower)y'
f 'Hello'
HeLlO
f 'end'
EnD
>>611 Haskell
import Data.Char
f = zipWith ($) (cycle [toUpper, toLower])
main = do
print $ f "Hello"
print $ f "end"
616 :
デフォルトの名無しさん :2012/06/24(日) 09:24:22.78
>>611 Maxima
f(s):=(w:charlist(supcase(s)),
for i:2 thru slength(s) step 2 do w[i]:sdowncase(w[i]),simplode(w,""));
(%i33) f("Hello");
(%o33) HeLlO
(%i34) f("end");
(%o34) EnD
617 :
デフォルトの名無しさん :2012/06/24(日) 13:10:59.12
>>611 Io
f:=method(s,w:="";s foreach(i,v,w=w .. if(i%2==0,v&223,v|32)asCharacter))
Io> f("Hello")
==> HeLlO
Io> f("end")
==> EnD
618 :
デフォルトの名無しさん :2012/06/24(日) 16:21:34.28
>>611 D
enum f = (string s) => zip(cycle([0, 1]), s).map!(x => (x[0])? x[1].toLower: x[1].toUpper);
f("Hello").writeln;
f("end").writeln;
619 :
デフォルトの名無しさん :2012/06/24(日) 16:59:08.08
>>611 Gauche
(use gauche.sequence)
(define (f s)
(list->string (map-with-index (^(n x) (if (even? n) (char-upcase x) (char-downcase x))) s)))
(print (f "Hello"))
(print (f "end"))
>>611 F#
open System
let f = String.mapi (function i when i % 2 = 0 -> Char.ToUpper | _ -> Char.ToLower)
> f "Hello";;
val it : string = "HeLlO"
> f "end";;
val it : string = "EnD"
>>602 C言語
なんでこれで解けるんだ???
#include<stdio.h>
#include<math.h>
double calc_area(double a, double b, double c, double d)
{
double s=(a+b+c+d)/2;
return sqrt((s-a)*(s-b)*(s-c)*(s-d));
}
int main(void)
{
printf("%f\n", calc_area(5,3,4,5));
printf("%f\n", calc_area(2,2,2,2));
printf("%f\n", calc_area(2,3,3,2));
return 0;
}
623 :
デフォルトの名無しさん :2012/06/25(月) 05:32:55.77
問題 東京スカイツリーのてっぺんから硬式野球ボールを落としたら地表での時速は?
落下距離 h 634m [重力加速度 g 9.80665m/s2] 経過時間 t 11.371016480755 秒 その時の落下速度 v 111.511578771 m/s = 401.44168357558 km/h
>>623 C言語
空気抵抗に関する係数 μ をいい加減に決定
本当は野球ボールの形状および空気の粘性係数によって要変更
#include<stdio.h>
double solve(double h, double g, double m, double myu, double delta)
{
double y=0.0, v=0.0, t=0.0;
while(y<h)
{
v+=(g-myu*v*v/m)*delta;
y+=v*delta;
}
return v;
}
int main(void)
{
double h=634, g=9.8, m=0.145, myu=0.005, delta=0.001;
printf("%.3f km/h\n", solve(h, g, m, myu, delta)*60*60/1000);
return 0;
}
> 60.690 km/h
>>627 投手が投げるボールが 初速140km/h のとき 終速132km/h 程度ということから
μ 0.00045 くらい
> 200.313 km/h
629 :
デフォルトの名無しさん :2012/06/25(月) 18:26:15.99
問題 長針と短針の間の角度がX度のとき、可能性のある時刻をすべて挙げよ。
http://toro.2ch.net/test/read.cgi/tech/1339338438/364 # [1] 授業単元:
# [2] 問題文(含コード&リンク):
# ∀m; n ∈ Z に対して次の(14) - (16) 式が成り立つことを
# 区分求積法によって確認するためのプログラムを作成せよ.
# S1 :=∫ −sin nx sinmx dx = mn (14)
# S2 :=∫ −cos nx cosmx dx = mn (15)
# S3 :=∫ −sin nx cosmx dx = 0 (16)
# ただしmn はクロネッカーのデルタ
# 1 (m = n)
# mn ={
# 0 (m ̸= n) (17)
# である.
#
633 :
デフォルトの名無しさん :2012/06/26(火) 19:04:05.43
問題 13桁のISBNコードを検査せよ。 例 9784062772211 => OK 9784150315684 => NG
>>633 HSP
#module
#defcfunc ISBN13_is_ok str isbn_, local isbn, local sum, local moji, local ret
isbn=isbn_
if strlen(isbn)!13 : return 0
ret=1
repeat 13
moji=peek(isbn, cnt)-'0'
if moji<0 or 9<moji : ret=0 : break
sum+=moji*((cnt\2)*2+1)
loop
if sum\10 : ret=0
return ret
#global
result_msg="NG", "OK"
mes result_msg.ISBN13_is_ok("9784062772211")
mes result_msg.ISBN13_is_ok("9784150315684")
>>632 問題の読み方が分からん
x について 0〜2π で積分したら -π か 0 かのいずれかになってしまう
636 :
デフォルトの名無しさん :2012/06/26(火) 22:14:22.74
633>> Maxima f(s):=is(mod(lsum(i,i,map(eval_string,charlist(s))*[1,3,1,3,1,3,1,3,1,3,1,3,1]),10)=0); (%i63) f("9781234567897"); (%o63) true (%i64) f("9784150315684"); (%o64) false
>>629 % Prolog
'長針と短針の間の角度がX度のとき、可能性のある時刻をすべて挙げよ'(_X度,_時,_分,秒) :-
between(0,11,N),
可能性のある時刻(N,_X度,_可能性のある時刻),
'時・分・秒に分解'(_可能性のある時刻,_時,_分,_秒).
可能性のある時刻(N,_X度,_角度差までの接近時刻) :-
角度差までの接近時刻(N,_X度,_角度差までの接近時刻).
可能性のある時刻(N,_X度,_角度差までの接近時刻) :-
長針が短針を追い越し角度差を付ける時刻(N,_X度,_角度差をつける時刻).
角度差までの接近時刻(N,_X度,_角度差までの接近時刻) :-
_X度 < (30 * N),
_追い付き時間 is _X度 / 330 + N,
_角度差までの接近時刻 is N + _追い付き時間.
長針が短針を追い越し角度差を付ける時刻(N,_X度,_角度差をつける時刻) :-
_追い付き時間 is (30 * N + _X度) / 330,
_追い付き時間 < 1.0,
_角度差をつける時刻 is N + _追い付き時間.
'時・分・秒に分解'(_時刻_時,_時,_分,_秒) :-
_時 is truncate(_時刻_時) // 3600,
_余り秒 is truncate(_時刻_時) mod 3600,
_分 is _余り秒 // 60,
_秒 is _余り秒 mod 60.
638 :
629 :2012/06/27(水) 16:56:19.01
% Prolog % 一行目の一番最後の引数のアンダースコアが落ちてしまった。ただ、秒となっている。 % 訂正。 '長針と短針の間の角度がX度のとき、可能性のある時刻をすべて挙げよ'(_X度,_時,_分,_秒) :- between(0,11,N), 可能性のある時刻(N,_X度,_可能性のある時刻), '時・分・秒に分解'(_可能性のある時刻,_時,_分,_秒).
639 :
デフォルトの名無しさん :2012/06/28(木) 00:27:59.15
>>633 Gauche
(define (f s)
(let* ((xs (map digit->integer (string->list s #\-) ""))
(ns (drop-right xs 1))
(cd (last xs))
(r (fold (^(a b) (+ b (* (car a) (cadr a)))) 0 (zip ns (circular-list 1 3)))))
(= (- 10 (mod r 10)) cd)))
(print (f "9784062772211")) ; #t
(print (f "9784150315684")) ; #f
640 :
デフォルトの名無しさん :2012/06/28(木) 22:06:17.12
delphiで四則演算ができる電卓を作成してください。 ボタン0〜9 +、=、*、−、c、ac、/、 が最低限、ほかになにか機能がついてるとうれしいです。
>>639 よけいなの入ってたので修正
(let* ((xs (map digit->integer (string->list s)))
642 :
デフォルトの名無しさん :2012/07/03(火) 11:40:23.74
問題 数字がひとつ不明な13桁のISBNコードを復元せよ。 例(不明な所を?とする) 9784062?72211 => 9784062772211 978415031?684 => 9784150310684
>>642 HSP
#module
#defcfunc solve str isbn_, local isbn, local sum, local x
isbn=isbn_
repeat 13
moji=peek(isbn, cnt)
if moji='?' {
x=cnt
} else {
sum+=((cnt\2)*2+1)*(moji-'0')
}
loop
if x\2 {
poke isbn, x, (sum*3)\10+'0'
} else {
poke isbn, x, (sum*9)\10+'0'
}
return isbn
#global
mes solve("9784062?72211")
mes solve("978415031?684")
645 :
デフォルトの名無しさん :2012/07/04(水) 07:15:32.03
>>642 Maxima
f(s):=is(mod(lsum(i,i,map(eval_string,charlist(s))*[1,3,1,3,1,3,1,3,1,3,1,3,1]),10)=0);
g(s):=for i:0 thru 9 do if f(a:ssubst(string(i),"?",s)) then return(a);
(%i35) g("9784062?72211");
(%o35) 9784062772211
(%i36) g("978415031?684");
(%o36) 9784150310684
646 :
デフォルトの名無しさん :2012/07/04(水) 17:16:51.27
問題 与えられた文字列を先頭と末尾から削除していき二文字以下にせよ。 例 world => r konokodokonokodokonokokonoko => od
>>646 HSP
#module
#defcfunc solve str msg_, local msg, local len
msg=msg_
len=strlen(msg)
return strmid(msg, (len-1)/2, len-(len-1)/2*2)
#global
mes solve("world")
mes solve("konokodokonokodokonokokonoko")
>>646 % Prolog
与えられた文字列を先頭と末尾から削除していき二文字以下にする(_文字列_1,_文字列) :-
sub_atom(_文字列_1,1,_文字列の文字数,1,_文字列_2),
_文字列の文字数 > 2,
与えられた文字列を先頭と末尾から削除していき二文字以下にする(_文字列_2,_文字列).
与えられた文字列を先頭と末尾から削除していき二文字以下にする(_文字列,_文字列).
>>646 % Prolog プログラマが指定して削除していくのではなく、処理系がそんなことしてることになるかも、という話。
与えられた文字列を先頭と末尾から削除していき二文字以下にする(_与えられた文字列,_二文字以下の文字列) :-
sub_atom(_与えられた文字列,N,_文字列の文字数,N,_二文字以下の文字列),
_文字列の文字数 =< 2.
>>646 HSP
再帰
#module
#defcfunc solve str msg_, local msg, local len
msg=msg_
len=strlen(msg)
if len<=2 : return msg
return solve(strmid(msg, 1, len-2))
#global
mes solve("world")
mes solve("konokodokonokodokonokokonoko")
>>646 -- Haskell
f s = if (length s) < 3 then s else f $ (tail . init) s
main = do
print $ f "world"
print $ f "konokodokonokodokonokokonoko"
652 :
デフォルトの名無しさん :2012/07/05(木) 12:29:12.38
問題 整数nが与えられたとき、1からnの数すべてを1桁に分解して集計せよ。 例 n=15のとき 1+2+3+4+5+6+7+8+9+(1+0)+(1+1)+(1+2)+(1+3)+(1+4)+(1+5) = 66
>>652 % Prolog
% こういうことは、絶対にやってはいけません。そういう作品。
'整数nが与えられたとき、1からnの数すべてを1桁に分解して集計せよ。'(_n,_集計値) :-
一桁ずつ四項に分解した加算文字列ならび(_n,_一桁ずつ四項に分解した加算文字列ならび),
atomic_list_concat(_一桁ずつ四項に分解した加算式文字列ならび,'+',_評価式文字列),
atom_to_term(_評価式文字列,_評価式,_),
_集計値 is _評価式.
一桁ずつ四項に分解した加算文字列ならび(_n,_一桁ずつ四項に分解した加算文字列ならび) :-
findall(_一桁ずつ四項に分解した加算式文字列,(
between(1,_n,_整数),
number_chars(_整数,_一桁ずつ四項に分解した数字ならび),
atomic_list_concat(_一桁ずつ四項に分解した数字ならび,'+',_一桁ずつ四項に分解した加算式文字列)),
_一桁ずつ四項に分解した加算式文字列ならび).
>>652 % Prolog すみません。一ヶ所間違えた。書き直し。
'整数nが与えられたとき、1からnの数すべてを1桁に分解して集計せよ。'(_n,_集計値) :-
一桁ずつ四項に分解した加算文字列ならび(_n,_一桁ずつ四項に分解した加算文字列ならび),
atomic_list_concat(_一桁ずつ四項に分解した加算式文字列ならび,'+',_評価式文字列),
atom_to_term(_評価式文字列,_評価式,_),
_集計値 is _評価式.
一桁ずつ四項に分解した加算文字列ならび(_n,_一桁ずつ四項に分解した加算式文字列ならび) :-
findall(_一桁ずつ四項に分解した加算式文字列,(
between(1,_n,_整数),
number_chars(_整数,_一桁ずつ四項に分解した数字ならび),
atomic_list_concat(_一桁ずつ四項に分解した数字ならび,'+',_一桁ずつ四項に分解した加算式文字列)),
_一桁ずつ四項に分解した加算式文字列ならび).
>>652 HSP
#module
#defcfunc calc int x_, local x, local ret
x=x_
repeat
ret+=x\10
x/=10
if x=0 : break
loop
return ret
#defcfunc solve int n, local sum
repeat n, 1
sum+=calc(cnt)
loop
return sum
#global
mes solve(15)
>>655 質問者じゃないけど俺は感動した!これがPrologのコードというものなのか.
多分かなりの腕の方なんだろうけど,いつもPrologでどういう問題の
プログラム書いてるの?汎用言語として使っているのか,ルールベースの
かなり特化した問題についてだけ使っているのか知りたい.興味本位だけど.
しかし
>>655 さんなら問題の種類によらずPrologで書けそうですねうらやましい
>>633 と
>>642 Haskell
import Data.Char
replace s t r
| s == [] = []
| head s == t = r : replace (tail s) t r
| otherwise = head s : replace (tail s) t r
check s = cd == last ns
where ns = map digitToInt s
cd = 10 - (sum $ map (\x -> fst x * snd x) $ zip (cycle [1, 3]) $ init ns) `mod` 10
comp s = head $ filter check $ map (\x -> replace s '?' x) ['0'..'9']
main = do
print $ check "9784062772211"
print $ check "9784150315684"
print $ comp "9784062?72211"
print $ comp "978415031?684"
>>652 Haskell
import Data.Char
f n = sum $ map sum $ map (map digitToInt) $ map show [0 .. n]
main = print $ f 15
>>659 の修正
map多すぎわろた
import Data.Char
f n = sum $ map (sum . (map digitToInt) . show) [0 .. n]
main = print $ f 15
>>652 % Prolog 数値演算を排し、すべて匿名変数のリストの要素数で集計するプログラム。Prologでは
% 遊びとして使われるテクニックだが、私は実務でも結構使う。リストの割り算が定義済みであることが前提。
http://nojiriko.asia/prolog/ironnagengo5_652_2_2.html >>657 23年くらい前にCOBOLで書かれていたシステムをPrologに置き換えて、以後現在までこの
言語だけ使用しています。COBOLで中途半端にしかできなかった、冗長なプログラム表現を
Prologで露悪的なまでに実現して見せているのが私のスタイル。
Prologが究極のモジュラープログラミングであることを感じていただけたら、嬉しい。
>>652 Haskellで別解
f n = sum [sum [read [c]| c <- show x]| x <- [1..n]]
main = print $ f 15
>652 Pythonで参加してもいいですか? n = int(raw_input('n=')) print sum( sum(ord(e)-ord('0') for e in str(i) ) for i in xrange(1, n+1) )
>>661 ご回答いただきありがとうございました.
やはり実務で,しかも汎用的に使っていらっしゃるんですね.
Prologは何度か挑戦しましたが全く歯が立たなかったので
Prolog脳からの問題の見かたには非常に興味があります.
多分他の言語を使うのとは全く違う考えかたで取りかかられる
のだと思いますが,アプローチの方向が異なることが問題解決
の新たな可能性につながるのではないかと想像します.
多分COBOLコードの書き直しもその一例なんでしょうね.
>652 Scalaでワンライナー scala> for(in <- io.Source.stdin.getLines)println((1 to in.toInt).map(_.toString./:(0)(_ + _.toString.toInt)).sum) 15 66
2段ともfoldLeftで回した方が入力値が大きい際、heap的に優しいでしょうかね 本気で気にする場合にはIteratorで遅延評価するべきでしょうが scala> for(in <- io.Source.stdin.getLines)println((1 to in.toInt)./:(0)(_ + _.toString./:(0)(_ + _.toString.toInt))) 15 66
(defun calc (n) (loop for i to n sum (loop for j = i then (floor (/ j 10)) until (zerop j) sum (mod j 10)))) 99までは正しいバージョン (defun calc2 (n) (/ (+ (expt (+ n 41) 2) (* 9 (expt (- (mod (1+ n) 10) 5) 2)) -1825) 20))
668 :
デフォルトの名無しさん :2012/07/07(土) 19:11:50.36
最適化スレは此処でいいのかな? だれがコレの最適化を頼む。俺じゃこれぐらいしかできない。 A=データ、re=regular expression A[0]に配列のindexの最後が入ってる、C[0]は開始index、tは最後 array A,C; int i,k,t,p; k=0;C[0]=0;t=0; for(i=1;i<=A[0];i++){ if(C[0]){ while((k+1)<i){ A[k+=1]=C[C[0]++]; if(C[0]>t){C[0]=0;t=0;break;}; } } p=1; while(match(substr(A[i],p),re)){ p+=RSTART-1; if((k+1)<i){ A[k+=1]=substr(A[i],p,RLENGTH); }else{ C[t+=1]=substr(A[i],p,RLENGTH); if(!C[0])C[0]=1; } p+=RLENGTH; }; }; A[0]=k; if(C[0]){while(C[0]<= t )A[A[0]+=1]=C[C[0]++];}
>669 ありがとう。
>>652 C#
Func<int, int> f = (n) => (from i in Enumerable.Range(1, n)
select (from c in i.ToString().ToCharArray() select c - 48).Sum()
).Sum();
Console.Write(f(15));
672 :
デフォルトの名無しさん :2012/07/09(月) 23:33:08.74
問題 「"Hello, world!"を標準出力に出力するJavaプログラムのソースコード」を 標準出力に出力するプログラムをいろんな言語でかけ。
>672 Python 何の捻りもないけど。。 print 'public class Hello {' print ' public static void main(String[] args) {' print ' System.out.println("Hello, World!");' print ' }' print '}'
674 :
デフォルトの名無しさん :2012/07/10(火) 08:09:40.46
>>652 octave
function z=f(n)
z=sum(sprintf("%d",1:n)-48);
end
> f(1234567)
ans = 32556016
> f(12345678)
error: memory exhausted or requested size too large for range of Octave's index type -- trying to return to prompt
>>672 print "\"Hello, world!\"を標準出力に出力するJavaプログラムのソースコード";
676 :
デフォルトの名無しさん :2012/07/10(火) 15:15:10.25
問題 n番目のフィボナッチ数を求める関数f(n)を再帰的に定義した場合に この関数を呼び出す回数を求めよ。 例 n=10のときの関数fの呼び出し回数=109 n=30のときの関数fの呼び出し回数=1664079
scala> :paste def fn(n: Int) = { var x = 0 def f(n: Int): Int = n match { case n if n < 2 => { x += 1; n } case n => { x += 1; f(n - 1) + f(n - 2) } } f(n - 1) x } // Exiting paste mode, now interpreting. scala> fn(10) res0: Int = 109 scala> fn(30) res1: Int = 1664079
こたえを無理矢理合わせたけど 問題がおかしくないか?
C# int n = 0; Func<int, int> f = null; f = i => { n++; return (i == 1 || i == 2) ? 1 : f(i - 1) + f(i - 2); }; Console.WriteLine(f(30)); Console.WriteLine(n);
呼び出し回数は f(n)*2-1だよ
>>676 HSP
#module
#defcfunc fib int n, var count
count++
if n<2 : return n
return fib(n-1, count)+fib(n-2, count)
#defcfunc fib_count int n, local count, local dummy
dummy=fib(n, count)
return count
#global
mes fib_count(10) ; 177
mes fib_count(10-1) ; 109
mes fib_count(30) ; 2692537
mes fib_count(30-1) ; 1664079
f(2) を f(1)+f(0)にするか1にするかだね
scala> def f(xs: Seq[Int], n:Int = 0): Int = xs match { case Nil => n case xs => f(xs.filter(2<)./:(List.empty[Int])((xs, x) => x - 1 :: x - 2 :: xs), n + xs.size) } scala> f(10 :: Nil) res0: Int = 109 scala> f(30 :: Nil) res1: Int = 1664079
>>679 (defun g (n)
(if (< n 3)
1
(+ (h (decf n)) (h (decf n)) 1)))
(g 10) => 109
(g 30) => 1664079
>>684 C#
Func<int, int> f = i => (i < 3) ? 1 : 1 + f(i - 1) + f(i - 2);
Console.WriteLine(f(30));
>>676 % Prolog
'n番目のフィボナッチ数を求める述語を再帰的に定義した場合にこの述語を呼び出す回数を求め'(_n番目,_フィボナッチ数,_呼び出す回数) :-
'帰納を使い、フィボナッチ数を得る'(_n番目,_フィボナッチ数,1,_呼び出す回数).
'帰納を使い、フィボナッチ数を得る'(0,0,S,S).
'帰納を使い、フィボナッチ数を得る'(1,0,S,S).
'帰納を使い、フィボナッチ数を得る'(2,1,S,S).
'帰納を使い、フィボナッチ数を得る'(N,X,S_1,S) :-
N > 2,
N_1 is N - 1,
N_2 is N - 2,
S_2 is S_1 + 2,
'帰納を使い、フィボナッチ数を得る'(N_1,X_1,S_2,S_3),
'帰納を使い、フィボナッチ数を得る'(N_2,X_2,S_3,S),
X is X_1 + X_2,!.
687 :
686 :2012/07/10(火) 19:45:12.22
% Prolog トップの述語名が '・・・回数を求め' ではマズいですね。'・・・求める' に変更してください。 'n番目のフィボナッチ数を求める述語を再帰的に定義した場合にこの述語を呼び出す回数を求める'(_n番目,_フィボナッチ数,_呼び出す回数) :- '帰納を使い、フィボナッチ数を得る'(_n番目,_フィボナッチ数,1,_呼び出す回数).
>>685 修正
Func<int, int> f = null; f = i => (i < 3) ? 1 : 1 + f(i - 1) + f(i - 2);
フィボナッチ数そのものは求めずに 再帰回数だけ計算すれば良いの?
>676 Python 無理矢理にも程がある。 def fibo_count(n): global s s += 1 if n < 3: return n return fibo_count(n-1) + fibo_count(n-2) def fibo(n): if n < 2: return n return fibo(n-1) + fibo(n-2) print fibo(10) # 55 s = 0 fibo_count(10) # 109 print s print fibo(10) * 2 - 1 # 109 print fibo(30) # 832040 s = 0 fibo_count(30) # 1664079 print s print fibo(30) * 2 - 1 # 1664079
>>676 Haskell
import Control.Monad.State
import Control.Applicative
fib n = runState (f n) 0
where
f m = modify (+ 1) >>
if m < 3 then return 1 else (+) <$> f (m - 1) <*> f (m - 2)
main = do
print $ fib 10 -- (55,109)
print $ fib 30 -- (832040,1664079)
あと次のように再帰定義した場合には
再帰回数は 2*n-1 (n > 0) になるはず
fibs = 0 : 1 : zipWith (+) fibs (tail fibs)
fib n = fibs !! n
>>676 OCaml
let rec f n = match n with
| _ when n < 3 -> 1
| _ -> f (n-1) + f (n-2) + 1;;
let main =
Printf.printf "%d\n" (f 10);
Printf.printf "%d\n" (f 50);
693 :
デフォルトの名無しさん :2012/07/11(水) 04:13:59.15
問題 左端からn桁目の数のn乗を合計したものが元の数に等しい4桁以下の数をすべて求めよ。 例 89 => 8^1 + 9^2 = 89 OK 123 => 1^1 + 2^2 + 3^3 = 14 NG
>>693 % Prolog
'左端からn桁目の数のn乗を合計したものが元の数に等しい4桁以下の数をすべて求める'(_4桁以下の数) :-
between(0,9999,_4桁以下の数),
number_codes(_4桁以下の数,Codes),),
findsum(_左端からn桁目の数のn乗,(
append(L0,[_左端からn桁目のcode|_],Codes),
length([_|L0],_n),
_左端からn桁目の数のn乗 is truncate((_左端からn桁目のcode-48) ^ _n),
_4桁以下の数).
findsum(_選択項,_項,_合計値) :-
findall(_選択項,_項,_値ならび),
sum(_値ならび,_合計値).
sum([],0).
sum([N|R],S) :-
sum(R,S_1),
S is S_1 + N.
695 :
694 :2012/07/11(水) 05:13:26.17
% Prolog
>>694 二ヶ所訂正。すみません。
'左端からn桁目の数のn乗を合計したものが元の数に等しい4桁以下の数をすべて求める'(_4桁以下の数) :-
between(0,9999,_4桁以下の数),
number_codes(_4桁以下の数,Codes),
findsum(_左端からn桁目の数のn乗,(
append(L0,[_左端からn桁目のcode|_],Codes),
length([_|L0],_n),
_左端からn桁目の数のn乗 is truncate((_左端からn桁目のcode-48) ^ _n)),
_4桁以下の数).
findsum(_選択項,_項,_合計値) :-
findall(_選択項,_項,_値ならび),
sum(_値ならび,_合計値).
sum([],0).
sum([N|R],S) :-
sum(R,S_1),
S is S_1 + N.
>>693 % Prolog
'左端からn桁目の数のn乗を合計したものが元の数に等しい4桁以下の数をすべて求める'(_4桁以下の数) :-
between(0,9999,_4桁以下の数),
'4要素以下の数ならび'(_4桁以下の数,[],_4要素以下の数ならび),
'左端からn桁目の数のn乗を合計したものが元の数に等しい'(_4要素以下の数ならび,_4桁以下の数).
'4要素以下の数ならび'(0,L,L) :- !.
'4要素以下の数ならび'(N,L_1,L) :-
M is N mod 10,
N_1 is N // 10,
'4要素以下の数ならび'(N_1,[M|L_1],L).
'左端からn桁目の数のn乗を合計したものが'([N_1],N_1).
'左端からn桁目の数のn乗を合計したものが'([N_1,N_2],S) :-
S is N_1 + N_2 * N_2.
'左端からn桁目の数のn乗を合計したものが'([N_1,N_2,N_3],S) :-
S is N_1 + N_2 * N_2 + N_3 * N_3 * N_3.
'左端からn桁目の数のn乗を合計したものが'([N_1,N_2,N_3,N_4],S) :-
S is N_1 + N_2 * N_2 + N_3 * N_3 * N_3 + N_4 * N_4 * N_4 * N_4.
>693 Python for t in xrange(10000): if t == sum( int(str(t)[i])**(i+1) for i in xrange(len(str(t))) ): print t
Haskell import Data.Char xs = [n | n <- [0..9999], (sum $ zipWith ((^) . digitToInt) (show n) [1..]) == n]
>>693 #module
#include "hspmath.as"
#deffunc check int n, local buf, local x
buf=str(n)
repeat strlen(buf)
x+=pow(peek(buf, cnt)-'0', cnt+1)
loop
return n=x
#global
repeat 10000
check cnt
if stat : mes cnt
loop
>>691 ふつくしい...
> fibs = 0 : 1 : zipWith (+) fibs (tail fibs)
>701 遅延評価のおかげで循環数列が綺麗かつ少ない計算量でできて良いですね scala> lazy val fib: Stream[Int] = Stream.cons(0, Stream.cons(1, fib.zip(fib.tail).map(p => p._1 + p._2)))
>>693 1^1 + 2^2 + 3^3 = 14 ??
704 :
デフォルトの名無しさん :2012/07/11(水) 12:39:44.82
>>693 >>703 すみません。例が間違っていました。
>
>>693 > 1^1 + 2^2 + 3^3 = 14 ??
123 => > 1^1 + 2^2 + 3^3 = 32 NG
でした。
>>693 C#
foreach (var n in Enumerable.Range(0, 9999))
if (n == (from i in n.ToString().ToCharArray().Select(c => c - 48)
.Select((val, index) => new { val, index })
select Math.Pow(i.val, (i.index + 1))
).Sum())
Console.WriteLine(n);
>>693 scala> def f(n: Int) = for {
x <- 0 to n;
if x == x.toString.zip(1 to n.toString.length).map{t => math.pow(t._1 - '0', t._2)}.sum
} yield x
scala> f(9999)
res0: scala.collection.immutable.IndexedSeq[Int] =
Vector(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 89, 135, 175, 518, 598, 1306, 1676, 2427)
707 :
デフォルトの名無しさん :2012/07/11(水) 18:19:29.30
問題 明日が何曜日なのか表示せよ。
>>707 HSP
wday_name="日","月","火","水","木","金","土"
mes strf("明日は %s曜日", wday_name((gettime(2)+1)\7))
>>707 C#
Console.WriteLine ( DateTime.Today.AddDays(1).ToString("明日は dddd"));
明日は 木曜日
# [1] 授業単元: Visual C# ソフトウェア開発 # [2] 問題文(含コード&リンク): #指定した親フォルダ下のbin、objフォルダ内のDebug、Rleaseフォルダを全て削除するプログラムを作成
>707 Python # -*- coding: utf-8 -*- import datetime w = [u'月', u'火', u'水', u'木', u'金', u'土', u'日'] print u'明日は' + w[(datetime.date.today() + datetime.timedelta(days=1)).weekday() % 7] + u'曜日'
>>707 Haskell
import Data.Time.Calendar
import Data.Time.Clock
import Data.Time.Format
import System.Locale
main = getCurrentTime >>= putStrLn . formatTime defaultTimeLocale "%a" . addDays 1 . utctDay
>>693 ; Common Lisp
(loop for i to 9999
when (= i
(loop for c across (write-to-string i)
and n upfrom 1
sum (expt (digit-char-p c) n)))
collect i)
>>693 J
f=:3 :'+/(^1+i.@#)"."0":y'
(#~(=f)"0)i.10000
0 1 2 3 4 5 6 7 8 9 89 135 175 518 598 1306 1676 2427
715 :
デフォルトの名無しさん :2012/07/11(水) 22:21:35.21
>>707 scala> :paste
import java.util.Calendar
val cal = Calendar.getInstance
cal.add(Calendar.DAY_OF_YEAR, 1)
println("明日は" + new java.text.SimpleDateFormat("E").format(cal.getTime) + "曜日")
明日は木曜日
Jサッパリだ :3ってなにさ。
>>707 REBOL
>> print pick system/locale/days now/weekday + 1
Thursday
>>693 Gauche
(define (f)
(let1 g (lambda (n)
(let1 l ((.$ (map$ digit->integer) string->list number->string) n)
(= (apply + (map (^x (apply expt x)) (zip l (iota 5 1)))) n)))
(filter g (iota 10000))))
(print (f))
>>707 Gauche
(use srfi-19)
(print (vector-ref #(Sun Mon Tue Wed Thu Fri Sat) (date-week-day (current-date))))
>>719 修正
(print (vector-ref #(Sun Mon Tue Wed Thu Fri Sat) (mod (+ (date-week-day (current-date)) 1) 7)))
>>710 % Prolog
'指定した親フォルダ下のbin、objフォルダ内のDebug、Rleaseフォルダを全て削除する'(_指定した親フォルダ) :-
append(_,[_フォルダ_1|R],[bin,obj]),
member(_フォルダ_2,['Debug','Rlease']),
atomic_list_concat(['rm -R ',_指定した親フォルダ,/,_フォルダ_1,/,_フォルダ_2],S),
shell(S),
R = [].
>>710 Z Shell
#!/usr/bin/zsh
# NOTE: Rleaseは要求仕様に依るものでReleaseのTYPOではない。
if [ $# -eq 1 ]; then
rm -rf $1/**/{bin,obj}/**/{Debug,Rlease}/
fi
>>707 % Prolog SWI-Prologで明日をズバリ入手する方法があるのか調査中。
明日が何曜日なのか表示する :-
date(date(_今日の年,_今日の月,_今日の日)),
翌日(_今日の年,_今日の月,_今日の日,_翌日の年,_翌日の月,_翌日の日),
day_of_the_week(date(_翌日の年,_翌日の月,_翌日の日),_曜日番号),
nth0(_曜日番号,[日曜,月曜,火曜,水曜,木曜,金曜,土曜],_曜日),
writef('%t',[_曜日]).
翌日(_今日の年,12,31,_翌日の年,1,1) :-
_翌日の年 is _今日の年 + 1,!.
翌日(_年,_今日の月,_今日の日,_年,_翌日の月,1) :-
月末日(_年,_今日の月,_今日の日),
_翌日の月 is _今日の月 + 1,!.
翌日(_年,_月,_今日の日,_年,_月,_翌日の日) :-
_翌日の日 is _今日の日 + 1.
月末日(_,2,29) :- !.
月末日(_年,2,28) :- \+(うるう年(_年)),!.
月末日(_,_今日の月,31) :- !.
月末日(_,_今日の月,30) :- member(_今日の月,[4,6,9,11]),!.
うるう年(_年) :- 0 is _年 mod 400,!.
うるう年(_年) :- 0 is _年 mod 100,!,fail.
うるう年(_年) :- 0 is _年 mod 4.
724 :
721 :2012/07/12(木) 11:00:30.42
>>710 % Prolog ごめんなさい。間違っていました。
'指定した親フォルダ下のbin、objフォルダ内のDebug、Rleaseフォルダを全て削除する'(_指定した親フォルダ) :-
append(_,[_フォルダ_1|R],[bin,obj]),
append(_,[_フォルダ_2|R_2],['Debug','Rlease']),
atomic_list_concat(['rm -R ',_指定した親フォルダ,/,_フォルダ_1,/,_フォルダ_2],S),
shell(S),
R_2 = [],
R = [].
% でした。
>>721 だと obj/Rlease が対象になる前に終了してしまいます。
>>707 % Prolog 「明日は何曜日」は今日は何曜日の次の曜日と考えたら
% よいではないかという助言をいただきました。確かに・・
明日が何曜日なのか表示する :-
date(_今日),
day_of_the_week(_今日,_今日の曜日番号),
_明日の曜日番号 is (_今日の曜日番号 + 1) mod 7,
nth0(_明日の曜日番号,[日曜,月曜,火曜,水曜,木曜,金曜,土曜],_曜日),
writef('%t',[_曜日]).
>>717 >>707 間違えました。訂正します。
REBOL
>> print pick system/locale/days (mod now/weekday 7) + 1
Friday
>>707 octave
> disp(strftime("%A",localtime(time+86400)))
Friday
>>724 もし bin/Rlease や obj/Debug という*ファイル*があったら消えてしまいますね
>710 Python import os def func(rootdir): for (root, dirs, files) in os.walk(rootdir, topdown=False): for d in dirs: path = os.path.normpath(os.path.join(root, d)) os.rmdir(path) print path + ' ... deleted.' for f in files: path = os.path.normpath(os.path.join(root, f)) os.remove(path) print path + ' ... deleted.' root = raw_input('input the root directory: ') func(root + '/bin/') func(root + '/obj/Debug/') func(root + '/obj/Rlease/')
730 :
729 :2012/07/12(木) 14:01:12.07
失礼。 func(root + '/bin/Debug/') func(root + '/bin/Rlease/') func(root + '/obj/Debug/') func(root + '/obj/Rlease/') ですね。
>>728 >>710 % Prolog 確かに。削除が失敗することも想定すると
>>724 はダメで、
'指定した親フォルダ下のbin、objフォルダ内のDebug、Rleaseフォルダを全て削除する'(_指定した親フォルダ) :-
'指定した親フォルダ下のbin、objフォルダ内の'(_フォルダ_1),
'Debug、Rleaseフォルダを'(_フォルダ_2),
'全て削除する'(_指定した親フォルダ,_フォルダ_1,_フォルダ_2).
'指定した親フォルダ下のbin、objフォルダ内のDebug、Rleaseフォルダを全て削除する'(_).
'指定した親フォルダ下のbin、objフォルダ内の'(_フォルダ_1) :-
member(_フォルダ_1,[bin,obj]).
'Debug、Rleaseフォルダを'(_フォルダ_2) :-
member(_フォルダ_2,['Debug','Rlease']).
'全て削除する'(_指定した親フォルダ,_フォルダ_1,_フォルダ_2) :-
atomic_list_concat([_指定した親フォルダ,/,_フォルダ_1,/,_フォルダ_2],_フォルダ),
\+(exists_file(_フォルダ)),
atomic_list_concat(['rm -R ',_フォルダ],S),
shell(S),
fail.
732 :
デフォルトの名無しさん :2012/07/12(木) 15:06:25.42
問題 文字列が与えられたとき、この文字列を出力するBrainf*ckプログラムを生成せよ。
>>710 Haskell
import System.Directory
import System.Environment
main = do
roots <- getArgs
mapM_ (\dir -> removeDirectoryRecursive dir `catch` print)
[x ++ "/" ++ y ++ "/" ++ z | x <- roots, y <- ["bin", "obj"], z <- ["Debug", "Rlease"]]
735 :
デフォルトの名無しさん :2012/07/12(木) 17:01:21.29
問題 三本のまっすぐな棒の長さ a, b, c (1<= a,b,c <=1000 の整数)が与えられたとき 三本の棒で作ることの出来る三角形の最大面積を求めよ(計算誤差は 0.001以下とする) 棒は切断したり曲げたりすることは出来ない また棒の太さは十分細く無視できるものとする
>>732 % Prolog
'文字列が与えられたとき、この文字列を出力するBrainf*ckプログラムを生成する'(_文字列) :-
atom_length(_文字列,_文字列の長さ),
文字列をセルに書き込む(_文字列),
セルの文字列を出力する(_文字列の長さ).
文字列をセルに書き込む(_文字列) :-
write(>),
sub_atom(_文字列,_,1,R,_文字),
一文字セルに書く(_文字),write(>),
R = 0,!.
セルの文字列を出力する(_文字列の長さ) :-
ポインターを戻す(_文字列の長さ),
セルから文字を順に取り出し出力する(_文字列の長さ).
一文字セルに書く(_文字) :-
char_code(_文字,_文字コード),
between(1,_文字コード,N),write(+),N = _文字コード.
ポインターを戻す(_文字列の長さ) :-
between(1,N,_文字列の長さ),write(<),N = _文字列の長さ.
セルから文字を順に取り出し出力する(_文字列の長さ) :-
between(1,N,_文字列の長さ),
write('.>'),
N = _文字列の長さ.
>>735 意味がよくわからない。それだと、ヘロンの公式を適用するだけのように思うが。
>>732 Scala
scala> def encode_bf(s: String) = s.flatMap("+" * _.toInt + ">") + "<" * s.length + ".>" * s.length
scala> :paste
object BrainfuckDecorder extends util.parsing.combinator.JavaTokenParsers {
val memory = Array.fill(4096)(0)
var pointer = 0
var counter = 0
def read: Int = memory(pointer)
def write(x: Int) = memory(pointer) = x
def exec(in: String) = parseAll(exprs, in)
def exprs = rep(incPtr | decPtr | incMem | decMem | output | input)
def incPtr = ">" ^^ { case ">" => {pointer += 1; counter += 1} }
def decPtr = "<" ^^ { case "<" => {pointer -= 1; counter += 1} }
def incMem = "+" ^^ { case "+" => write(read + 1) }
def decMem = "-" ^^ { case "-" => write(read - 1) }
def output = "." ^^ { case "." => print(read.toChar) }
def input = "," ^^ { case "," => {print(">"); write(readChar); println} }
}
scala> BrainfuckDecorder.exec(encode_bf("hoge\n"))
hoge
与えられた長さと、三角形になりうる範囲の長さ(短く使う)の組み合わせで 面積計算して最大だせばいいのかな? 短く使うときは辺の長さは整数とは限らないのかな?
>>735 HSP
#module
#deffunc swap var a, var b, local t
t=a
a=b
b=t
return
#defcfunc calc int a_, int b_ , int c_, local a, local b, local c, local s, local area
a=a_
b=b_
c=c_
if a<b : swap a, b
if a<c : swap a, c
if b<c : swap b, c
if a*a>b*b+c*c {
area=0.5*b*c
} else {
s=0.5*(a+b+c)
area=sqrt(s*(s-a)*(s-b)*(s-c))
}
return area
#global
mes calc(30,40,49) ; 599.489314
mes calc(30,40,50) ; 600.000000
mes calc(30,40,51) ; 600.000000
mes calc(1,1,10) ; 0.500000
>>732 Io
f:=method(s,
a:=0;w:="";
s foreach(v,b:=v-a;w=w ..(if(b>0,"+","-")repeated(b abs)..".");a=a+b);
w)
Io> f("ACB")
==> +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.++.-.
>732 Python import sys write = sys.stdout.write s = raw_input() cur = 0 dif = 0 for e in s: code = ord(e) dif = code - cur cur = code for _ in xrange(abs(dif)): write('-' if dif < 0 else '+') write('.')
>735 Python a, b, c = sorted(map(int, raw_input().split())) if a + b <= c: print -1 else: s = (a + b + c) / 2. S = (s * (s-a) * (s-b) * (s-c)) ** .5 print S
744 :
737 :2012/07/12(木) 21:14:17.17
>>735 すみません。わかりました。私が考えたように単純な話ではなかった。
745 :
デフォルトの名無しさん :2012/07/12(木) 22:39:33.27
問題 1が連続しない2進数を1から小さい順に1000個求めよ。 例 10 => OK 110 => NG 10101 =>OK 11011 =>NG
>>745 HSP
buf=""
repeat 1000,1
buf+=str(cnt\2)
mes buf
loop
>>745 Haskell
import Data.List
b 0 = "0"
b 1 = "1"
b n = b x ++ b y where (x,y) = n `divMod` 2
main = print $ take 1000 $ filter (not . isInfixOf "11") $ map b [1..]
>>745 C#
public static IEnumerable<string> bin()
{
for (int i = 0; ; ++i) yield return Convert.ToString(i, 2);
}
static void Main() {
Regex regex = new Regex("1{2,}");
foreach (var s in (from s in bin() where !regex.IsMatch(s) select s).Take(1000))
Console.WriteLine(s);
}
1からだった i=0を1に
>>745 HSP
#module
#defcfunc num2bin int x_, local x, local buf
x=x_
buf=""
repeat
if x=0 : break
buf=strf("%d%s", x&1, buf)
x>>=1
loop
return buf
#global
result.0="1"
repeat -1, 2
buf=num2bin(cnt)
if instr(buf, 0, "11")<0 {
result.length(result)=buf
if length(result)>=1000 : break
}
loop
buf=""
repeat 1000
buf+=result.cnt+"\n"
loop
mesbox buf, ginfo_sx, ginfo_sy
>>710 この問題の元の答え教えてもらえませんか?
もしくはC#で書ける人いたらお願いします
>>754 4フォルダに
System.IO.Directory.Deleteで trueつければいいんじゃねーの?
>>732 Gauche
(define (gen s)
(list->string (apply append (map (^x (append (take (circular-list #\+) (char->integer x)) '(#\. #\>))) (string->list s)))))
>754 普段C#なんて殆ど書かないし、仕様を履き違えてるかもしれないし、バグがあるかもしれないけど、どうぞ。 使うのは自己責任で。ディレクトリを削除するツールなので念押ししておきます。 using System; using System.IO; public class Labo_1276873238_710 { private void doIt() { Console.Write("input your root directory: "); string root = Console.In.ReadLine(); Directory.Delete(root + @"\bin\Debug\", true); Directory.Delete(root + @"\bin\Release\", true); Directory.Delete(root + @"\obj\Debug\", true); Directory.Delete(root + @"\obj\Release\", true); } static void Main(string[] args) { new Labo_1276873238_710().doIt(); } }
>745 Python l = ['1', '0'] * 500 for i in xrange(1000): s = ''.join(l)[0:i+1] print int(s, 2)
>>745 Gauche
(use srfi-13)
(use srfi-43)
(define (f)
(letrec ((itr (lambda (n vs)
(if (= (vector-length vs) 1000) vs
(if (string-scan (format "~b" n) "11") (itr (+ n 1) vs)
(itr (+ n 1) (vector-append vs (vector n))))))))
(itr 0 (make-vector 0))))
(print (f))
1000個も出力する前に まずプログラムの出力が"100"を含むかどうか チェックしろと言いたい
>>745 % Prolog
'1が連続しない2進数を1から小さい順に1000個求めよ。' :-
'1が連続しない2進数を1から小さい順に1000個求めよ。'([1],1).
'1が連続しない2進数を1から小さい順に1000個求めよ。'([1|L],_度数) :-
atomic_list_concat([0,b|[1|L]],S),
atom_to_term(S,X,_),
writef('%t: %t=%t\n',[_度数,X,S]),
_度数 = 1000,!.
'1が連続しない2進数を1から小さい順に1000個求めよ。'([1|L],_度数_1) :-
_度数_2 is _度数_1 + 1,
'1が連続しない2進数を1から小さい順に1000個求めよ。'([0|[1|L]],_度数_2).
'1が連続しない2進数を1から小さい順に1000個求めよ。'([0|L],_度数) :-
member(N,[1,0]),
'1が連続しない2進数を1から小さい順に1000個求めよ。'([N|[0|L]],_度数).
>>745 % Prolog
'1が連続しない2進数を1から小さい順に1000個求めよ。'(_1000個の数ならび) :-
findall(_10進数,(
'1が連続しない2進数を1から小さい順に'([1],1,_度数,_ビットならび),
( _度数 > 1000,!,fail;
'ビットならびを10進数に変換'(_ビットならび,_10進数))),
_1000個の数ならび).
'1が連続しない2進数を1から小さい順に'([1|L],_度数,_度数,[1|L]).
'1が連続しない2進数を1から小さい順に'([1|L],_度数_1,_度数,_ビットならび) :-
_度数_2 is _度数_1 + 1,
'1が連続しない2進数を1から小さい順に'([0,1|L],_度数_2,_度数,_ビットならび).
'1が連続しない2進数を1から小さい順に'([0|L],_度数_1,_度数,_ビットならび) :-
member(N,[1,0]),
'1が連続しない2進数を1から小さい順に'([N,0|L],_度数_1,_度数,_ビットならび).
'ビットならびを10進数に変換'(L,_10進数) :-
atomic_list_concat([0,b|L],_二進数表示),
atom_to_term(_二進数表示,_10進数,_).
763 :
762 :2012/07/13(金) 09:18:07.48
>>745 % Prolog 最初の述語の終止条件は以下が適切でした。
'1が連続しない2進数を1から小さい順に1000個求めよ。'(_1000個の数ならび) :-
findall(_10進数,(
'1が連続しない2進数を1から小さい順に'([1],1,_度数,_ビットならび),
( _度数 = 1000,! ;
'ビットならびを10進数に変換'(_ビットならび,_10進数))),
_1000個の数ならび).
%
% findall(X,(
% read(X),
% ( X=end_of_file,!,fail; true )),
% L).
%
% のような場合はLの中にend_of_fileを蒐集したくないから、failを入れます。上の場合は、
% 1000番目を含めたいから、 _度数 = 1000,!,true; でよい。(trueは省略可)
>>763 すみません。訂正。repeatを落としました。
%
% findall(X,(
% repeat,
% read(X),
% ( X=end_of_file,!,fail; true )),
% L).
誠に恐縮です。
>>763 -
>>764 はなかったことにしてください !!!
正しく実行されるためには、二箇所に 'ビットならびを10進数に変換' を書く必要がありました。
これを入れないと1000番目の要素だけ数値ではなく変数になってしまいます。
'1が連続しない2進数を1から小さい順に1000個求めよ。'(_1000個の数ならび) :-
findall(_10進数,(
'1が連続しない2進数を1から小さい順に'([1],1,_度数,_ビットならび),
( _度数 = 1000,!,'ビットならびを10進数に変換'(_ビットならび,_10進数);
'ビットならびを10進数に変換'(_ビットならび,_10進数))),
_1000個の数ならび).
766 :
758 :2012/07/13(金) 09:58:01.95
>745修正 cnt = 0 n = 1 while 1: b = format(n, 'b') if not '11' in b: cnt += 1 print b if cnt == 1000: break n += 1
768 :
デフォルトの名無しさん :2012/07/13(金) 18:10:13.97
問題 ある数xの立方根を求めよ。 例 x=4のとき1.587401
>>768 HSP
#module
#include "hspmath.as"
#defcfunc calc double x
return pow(x, 1.0/3)
#global
mes calc(4)
>768 Python n = float(raw_input('n=')) print n ** (1./3)
【 課題 】迷路の最短経路を与えるプログラムを考えよ. 壁は#, 通路は.で表されている. また迷路の外側は全て壁(即ち#)となっている. スタート地点はS, ゴール地点はGである. スタートからゴールまでの道のりを表わせ. 上へ移動する場合にはu, 同様に下はd, 右はr, 左はlとせよ. 最短経路が複数ある場合は, それらのうちどれかひとつを出力せよ。 例1) ####### #..S..# #.....# #..G..# ####### 答え) dd 例2) ####### #.....# #.G.#.# #..#..# #.#.S.# #.....# ####### 答え) ldlluuru
772 :
771 :2012/07/13(金) 19:04:32.72
たぶん1レスに収まらないと思うので、必要に応じてideoneを使ってください。
ttp://ideone.com/ 自分の言語がないときは、"Text"を選ぶとプレーンテキストとして表示されるようです。
>>735 Gauche
(define (f a b c)
(if (and (< a (+ b c)) (< b (+ a c)) (< c (+ a b)))
(let ((s (/ (+ a b c) 2)))
(sqrt (* s (- s a) (- s b) (- s c))))
-1))
>>759 - (itr 0 (make-vector 0))))
+ (itr 1 (make-vector 0))))
なぜいつも問題文が読めないのか
>>768 Gauche
(define (f n) (expt n (/ 1 3)))
>776 ######## #......# #.G....# #......# #....S.# #......# ######## このときは5文字が正解なんですが, 7文字出力してますね.
>>771 % Prolog
出発点(2,4).
終着点(4,4).
迷路の定義(L) :-
nth0(Y,L,S),
sub_atom(S,X,1,_,A),
\+(A = '#'),
assertz(道(Y,X)),
fail;true.
最短経路(_最短経路) :-
出発点(Y0,X0),
findmin([_通過距離,_経路],(
道に迷う([[Y0,X0]],Y0,X0,_方向ならび),
length(_方向ならび,_通過距離),
atom_chars(_経路,_方向ならび)),
[_,_最短経路]).
道に迷う(_,Y,X,[]) :- 終着点(Y,X).
道に迷う(L,Y_1,X_1,[_方向|R]) :-
隣接点を得る(L,Y_1,X_1,Y_2,X_2,_方向),
道に迷う(L_2,Y_2,X_2,R).
隣接点を得る(L,Y_1,X_1,Y_2,X_2,_方向) :-
member([_方向,A,B],[[r,1,0],[l,-1,0],[d,0,1],[u,0,-1]]),
Y_2 is Y_1 + B, X_2 is X_1 + A,
道(Y_2,X_2),
\+(member([Y_2,X_2],L_1)).
780 :
779 :2012/07/14(土) 08:20:54.47
>>745 Perl
use feature qw(say);
my @list = (1);
foreach(1..1000){
say @list;
my $p = $#list;
while(1){
if ($p < 0){
unshift(@list, 1);
last;
}
if ($list[$p] ^= 1){
$list[--$p] or last;
$list[$_] = 0 foreach($p..$#list);
}
--$p;
}
}
32bit IEEE754 単精度浮動小数点数の内部表現を2進数で表示するプログラムを作成せよ. 単精度浮動小数点数はIEEE 754形式では (-1) ** 符号部 * (1 + 仮数部) * 2 ** (指数部 - 127) で表現します. 符号部が上位1bit, 指数部が次の8bit, 仮数部が残りです. 例) 1 0011 1111 1000 0000 0000 0000 0000 0000 1.5 0011 1111 1100 0000 0000 0000 0000 0000 5.23 0100 0000 1010 0111 0101 1100 0010 1001 -1.25 1011 1111 1010 0000 0000 0000 0000 0000 -3.888 1100 0000 0111 1000 1101 0100 1111 1110 -100.0099 1100 0010 1100 1000 0000 0101 0001 0010
>>784 HSP
#module
#defcfunc int2bin int value, local buf
buf=""
repeat 32
buf+=strf("%c", '0'+((value>>(31-cnt))&1))
if (cnt\4)=3 : buf+=" "
loop
return buf
#defcfunc solve str num_str, local value, local x, local buf, local sign
value=double(num_str)
dupptr x, varptr(value), 8, vartype("int")
if x.1 & $80000000 : sign=1
flp_d=((x.1 & $7ff00000)
>>20 )-$3ff
flp_f=((flp_d+$7f) & $ff)<<23
if flp_d<-$7f : flp_f=0
if flp_d>$7f : flp_f=$ff<<23
y=(sign<<31)|flp_f|((x.1<<3)&$007ffff8)|((x.0
>>29 )&$00000007)
return int2bin(y)
#global
mes solve("1")
mes solve("1.5")
mes solve("5.23")
mes solve("-1.25")
mes solve("-3.888")
mes solve("-100.0099")
mes solve("0")
>>745 ; Common Lisp
(loop for binary upfrom #2r1
until (= (length list) 1000)
unless (search "11" (format nil "~b" binary))
collect binary into list
finally (return list))
>>784 Perl
use feature qw(say);
sub ieee754_32bit {
my ($n) = @_;
my $s = ($n < 0 ? 1 : 0);
$n = abs($n);
my $e = 0;
if ($n == 0){
$n = 1;
$e = -127;
}
while($n >= 2){
$n /= 2;
$e++;
}
while($n < 1){
$n *= 2;
--$e;
}
my $d = ($s << 31) | ((127 + $e) << 23) | int(($n - 1) * (1 << 23) + 0.5);
return unpack('B*', pack('N', $d));
}
foreach(1, 1.5, 5.23, -1.25, -3.888, -100.0099){
say $_;
say join(' ', ieee754_32bit($_) =~ /([01]{4})/g);
}
>>784 ; Common Lisp
(defun ieee754 (x)
(format t "~39,'0,' ,4:b"
(multiple-value-bind (signif expon sign)
(integer-decode-float (float x))
(+ (if (plusp sign) 0 (expt 2 31))
(* (+ expon 150) (expt 2 23))
(- signif (expt 2 23))))))
>>787 丸めを訂正してみる。
my $f = ($n - 1) * (1 << 23);
my $r = ((($f - int($f) == 0.5) and ((int($f) & 1) == 0)) ? 0 : 0.5);
my $d = ($s << 31) | ((127 + $e) << 23) | int($f + $r);
>>784 Gauche
(use util.list)
(use binary.io)
(use gauche.uvector)
(define (f x)
(let ((v (make-u32vector 1))) (put-f32le! v 0 x)
(string-join (map list->string (slices (string->list (format "~32,'0b" (ref v 0))) 4)))))
>>784 C#
Action<float> f = x => BitConverter.GetBytes(x).Reverse().ToList().ForEach( b=>Console.Write( Convert.ToString(b,2).PadLeft(8,'0')));
f(-100.0099F);
アルゴリズムの概要の問題で、コードは不要です。 2点が与えられたときその2点を結ぶ単純な経路(同じ頂点を通らない経路) が2つ以上存在するかを判定するアルゴリズムと計算量を述べよ。 深さ優先探索で|V|+|E| とかでしょうか?
>>792 1.全ての経路情報について グラフ G0、頂点 V0 とする
2.指定された2点間を接続する最小木について グラフG1,、頂点 V1 とする
3.G0 について V1 以外の頂点を可能な限りクラスタリングしてグラフ G2、頂点 V2 とする
4.G2 に閉路があれば、経路が2つ以上存在する
正の整数mとn(1<=n<=9)を入力し, m桁の1以上n以下の数字を組み合わせてできる全ての数列を出力するプログラムを作れ. mが3でnが2の場合の例: 111 112 121 122 211 212 221 222
>>794 HSP
#module
#deffunc hoge int m, int n, int d, var result
if d>=m : mes result : return
repeat n
poke result, d, cnt+'1'
hoge m, n, d+1, result
loop
return
#deffunc solve int m, int n, local result
sdim result, m+1
hoge m, n, 0, result
return
#global
solve 3, 2
797 :
デフォルトの名無しさん :2012/07/21(土) 08:54:43.15
問題 長方形ABCDの二辺ABとBCが与えられたとき(AB>BC) L=AE=BF=CF=DE=EFとなるLを求めよ。 A■■■■■■■■■■■■■B ■■□□□□□□□□□□□■■ ■□■□□□□□□□□□■□■ ■□□■□□□□□□□■□□■ ■□□□E■■■■■F□□□■ ■□□■□□□□□□□■□□■ ■□■□□□□□□□□□■□■ ■■□□□□□□□□□□□■■ D■■■■■■■■■■■■■C 例 AB=11、BC=8のとき、L=5
>>797 HSP
#module
#defcfunc calc double AB, double BC
return (-AB+sqrt(4.0*AB*AB+3.0*BC*BC))/3.0
#global
mes calc(11, 8)
F#で
>>771 http://ideone.com/ZLxkM >>794 let f m n =
let rec series result = function
| 0 -> result
| m -> series [for r in result do for x in 1 .. n -> r + string x] (m - 1)
series [""] m
>>797 F#
let f AB BC = sqrt (4./9. * AB ** 2. + 1./3. * BC ** 2.) - 1./3. * AB
>>794 Gauche
(define (p xs n)
(if (= n 0) '(())
(apply append (map (^x (map (pa$ cons x) (p xs (- n 1)))) xs))))
(define (f m n)
(p (iota n 1) m))
(print (f 3 2))
>>794 J
f=:4 :'1":1+#.inv i.y^x'
3 f 2
111
112
121
122
211
212
221
222
>>794 HSP
#include "sqlele.hsp"
#module
#defcfunc solve int m, int n, local src, local dest, local ret
sql_open ":memory:"
sql_q "CREATE TABLE base (s TEXT)"
repeat n,1
sql_q strf("INSERT INTO base (s) VALUES('%d')", cnt)
loop
repeat m
if cnt=0 {
dest=strf("%c.s", 'A'+cnt)
src=strf("base %c", 'A'+cnt)
} else {
dest+=strf("||%c.s", 'A'+cnt)
src+=strf(",base %c", 'A'+cnt)
}
loop
sql_q strf("SELECT %s result FROM %s", dest, src)
ret=""
repeat stat
ret+=strf("%s\n", sql_v("result"))
sql_next
loop
sql_close
return ret
#global
buf=solve(3, 2)
mesbox buf, ginfo_sx, ginfo_sy
>>802 >>794 J
間違えました。802はn=2のときしかうまくいきませんでした。
f=:4 :'1":1+y#.inv i.y^x'
4 f 3
1111
1112
1113
1121
(略)
3323
3331
3332
3333
>>797 % Prolog
'長方形ABCDの二辺ABとBCが与えられたとき(AB>BC)L=AE=BF=CF=DE=EFとなるLを求めよ。'(AB,BC,L) :-
between(0,100000,N),
L is AB * N / 100000,
L^2 >= 0.25 * (BC^2 + (AB - L)^2),!.
Σlog(k) = n log n ってどういう風に証明するんでしたっけ?
イコールっていってもオーダーのことですけど
2次元パッキング問題
敷き詰める矩形は後述の52種のうちから選択し90度回転を認め、各一回だけ使用できる
解は厳密解でなくてもよいが、計算時間は一分以内を目安とせよ
問題.1 50x50 の領域になるべく隙間なく矩形を並べたとき、隙間の総面積を出力せよ。またそのときの並べ方を出力せよ。
問題.2 200x100 の領域になるべく隙間なく矩形を並べたとき、隙間の総面積を出力せよ。またそのときの並べ方を出力せよ。
52種の矩形表記順は 名前 矩形幅 矩形高さ の順である
http://www1.axfc.net/uploader/Sc/so/365046.txt
809 :
808 :2012/07/25(水) 20:09:30.84
補足 矩形が領域外にはみ出さないようにすること 矩形同士が重ならないようにすること
>>732 >,[>,]<[<]+++++++++++++++++++++++++++++++++++++++++++>[[-<.>]++++++++++++++++++++++++++++++++++++++++++++++.++++++++++++++++.------------------->]
>>768 ニワン語
dt(x.pow(1/3))
#
http://toro.2ch.net/test/read.cgi/tech/1342966104/302 # [1] 授業単元: C言語実習
# [2] 問題文(含コード&リンク):
# 「分母と分子にある同じ数字を消す」という間違った約分を行うと、
# 正しく約分した値と同じになる分数が存在する。
# (例えば「187/748」は、普通に約分すると1/4に、分母と分子で重複している7と8を消すと1/4となる)
# このような分数は無限に存在するので、下のような条件を付ける。
#
# (1)分母と分子で同じ数字があればそのペアは必ず消す
# (2)消されるペアは、分母と分子に1文字ずつしか入っていない。つまり消すペアは一意に決まり、
# また、同じ数字で複数のペアが存在することもない
# (3)最終的に分母分子がそれぞれ1桁でできた、1未満の既約分数となる
# (4)数字の0(ゼロ)は使わない
# (5)負の分数は考えない
#
# この条件で、上記の間違った約分を行った結果が、正しく約分した値と同じになる分数は
# 何通りあるか。
#
>>732 F#
各文字について、前の文字との差分をとるか次のポインタに進めるか、
より短く表現できる方を使っていく
let toBF (input : string) =
let diff x y =
let c, s = if x - y < 128uy then x - y, "-" else y - x, "+"
String.replicate (int c) s + "."
let bytes = System.Text.Encoding.UTF8.GetBytes input
let prevs = bytes |> Seq.append [0uy] |> Seq.pairwise |> Seq.map ((<||) diff)
let zeros = bytes |> Seq.map (diff 0uy >> (+) ">")
Seq.zip prevs zeros |> Seq.map (fun (prev, zero) -> [prev; zero] |> Seq.minBy String.length)
|> String.concat ""
すいません…テキストの問題なのですが何回やってもわかりません どなたか教えていただけませんか? 最初に「文字列を入力してください.」と表示して文字列を読みこみ、 次に「確認のため、もう一度入力してください.」と表示して 再び文字列を読み込み、二つの文字列が同じなら「OK」と表示して終了し、 違っている場合は「文字列の照合に失敗しました. もう一度入力してください」と表示して、照合に成功するまで聞き続けるプログラムをex07-3-02.rbで保存して実行してください.
817 :
デフォルトの名無しさん :2012/08/09(木) 18:57:09.32
るびーはわからん
>816 Rubyなんて久しぶりに書いたわ. ソースコードはUTF-8で保存してください. # vim:set fileencoding=utf-8: while 1 puts '文字列を入力してください.' s1 = gets puts '確認のため, もう一度入力してください.' s2 = gets if s1 == s2 puts 'OK' break else puts '文字列の照合に失敗しました. もう一度入力してください.' end end
819 :
デフォルトの名無しさん :2012/08/09(木) 19:18:13.12
>>818 できましたあああああマジありがとうございます!!!
# 【質問テンプレ】
# [1] 授業単元: 計算量理論
# [2] 問題文:
Merkle-Hellmanの公開鍵暗号系をJava言語で実装せよ.
ヒント: Javaには,大きな整数を表すためにBigInteger という
クラスが用意されている.そのクラスに,大きな整数間
の算術演算を行うためのインスタンス・メソッドが用意
されている.
C言語でプログラムを書きたい場合は,
多倍長計算用のライブラリ(GMP)のインストールが必要.
インストールする際,下記のサイトを参考にするように.
http://homepage2.nifty.com/m_kamada/math/gmp_ja.htm よろしくおねがいします><
>820 Javaの宿題スレに行ってください.
>>821 本来のこのスレの使い方は、最初にJavaスレで課題が解決されて、
その後、このスレにコピーさせてもらって出題。
みんなで、いろんな言語で回答し合って楽しむというもの。
>>822 ごめん、「Javaの宿題」スレですね。
824 :
821 :2012/08/10(金) 11:05:30.65
>822 ??? だからJavaの宿題スレに誘導したんだけど.
825 :
デフォルトの名無しさん :2012/08/10(金) 14:32:39.06
誰かこれ教えてください… 問題1 最初に「文字列を入力してください.」と表示して文字列を読みこみ、 次に「数字を入力してください.」と表示して数字を読み込み、 入力文字列を入力した数字の回数分だけ一行ずつ表示するプログラムを ex07-3-03.rbで保存して実行してください. 問題2 問題1で作成したプログラムは、数字の読み込みについてバグがある 可能性があります(数字でないものが入力されたとき、 どうなるでしょうか?).もしバグがある場合、 それを修正したプログラムをex07-3-04.rbで保存して実行してください.
int num; Console.Write("文字列を入力してください."); var inputText = Console.ReadLine(); Console.Write("数字を入力してください."); var inputNum = Console.ReadLine(); if (int.TryParse(inputNum, out num)) for (int i = 0; i < num; i++) Console.WriteLine(inputText);
>825 # vim:set fileencoding=utf-8: puts '文字列を入力してください.' s = gets puts '数字を入力してください.' n = gets.to_i n.times { print s } # vim:set fileencoding=utf-8: puts '文字列を入力してください.' s = gets s1 = '' while s1 !=~ /\d+/ puts '数字を入力してください.' s1 = gets begin n = Integer(s1) n.times { print s } break rescue end end
問題 数独の解答が9行9列の文字列で与えられたとき正しいかどうか判定せよ。
誰か助けて 問題1 はじめに変数に適当な数の文字列による配列をあらかじめ設定しておき、入力された数字を受け取ったら、そのスロットの文字列を表示するプログラムをex08-02.rbで保存して実行してください. 問題2 問題1のプログラムは、nilのスロットが指定されると、そのままnilを返します.このときには「そのスロットには文字列はありません.」と表示されるように、書き換えて、ex08-03.rbで保存して実行してください. 問題3 はじめに文字列の値を設定した配列変数の各スロットについて、その文字列の文字数を表示するプログラムをex08-04.rbで保存して実行してください.たとえばstrings=[’dog’,’cat’,’mouse’]の場合、以下のように出力させます. dogは3文字 catは3文字 mouseは5文字 問題4 はじめに文字列の値を設定した配列変数の各スロットの内容を3回ずつ表示するプログラムをex08-05.rbで保存して実行してください.
問題5 以下のように入力したいだけの文字列を入力するよう求めて、Enterが押されたらそれを入力した順につなげて1行に出力するプログラムをex08-07.rbで保存して実行してください. 文字列を入力してください dog[Enter] 文字列を入力してください cat[Enter] 文字列を入力してください elephant[Enter] 文字列を入力してください [Enter] あなたの入力した文字列は dog,cat,elephant です. 問題6 問題5のプログラムを、文字列を入力とは逆順に出力するように書き換えたプログラムをex08-08.rbで保存して実行してください. 問題7 問題5のプログラムを、3文字の文字列のみを出力するように書き換えたプログラムをex08-09.rbで保存して実行してください.
>>829 F#
let checkSudoku (numberTable : string[][]) =
let valid = List.sort >> (=) ([1 .. 9] |> List.map string)
[ [ for y in 0 .. 8 -> [ for x in 0 .. 8 -> y, x ] ]
[ for x in 0 .. 8 -> [ for y in 0 .. 8 -> y, x ] ]
[ for i in 0 .. 3 .. 8 do for j in 0 .. 3 .. 8 -> [ for y in 0 .. 2 do for x in 0 .. 2 -> y + i, x + j ] ] ]
|> List.concat |> List.forall (List.map (fun (y, x) -> numberTable.[y].[x]) >> valid)
>>829 HSP
#module
#defcfunc check array map, local x, local y, local f, local t
dim f, 9, 3
for y, 0, 9
for x, 0, 9
t=1<<map(x, y)
f(y, 0)|=t
f(x, 1)|=t
f((y/3)*3+(x/3), 2)|=t
next
next
for y, 0, 3
for x, 0, 9
if f(x, y)!$3fe : return 0
next
next
return 1
#global
dim map, 9, 9
map(0,0)=4,1,5,6,3,8,9,7,2
map(0,1)=3,6,2,4,7,9,1,8,5
map(0,2)=7,8,9,2,1,5,3,6,4
map(0,3)=9,2,6,3,4,1,7,5,8
map(0,4)=1,3,8,7,5,6,4,2,9
map(0,5)=5,7,4,9,8,2,6,3,1
map(0,6)=2,5,7,1,6,4,8,9,3
map(0,7)=8,4,3,5,9,7,2,1,6
map(0,8)=6,9,1,8,2,3,5,4,7
mes check(map)
大学生の課題やらされててワロタwwwwwww OS壊すコードいれとけよwwwwwwwwwww
回答はF#やHSPだしスレチ質問者のレベルじゃRubyに翻訳もできんよ
このスレの趣旨を分かってない人がチョット前からいるみたいだな
>>830-831 F# nilはoptionで代用
open System
let slot = [|Some "dog"; Some "cat"; None; Some "mouse"|]
let get nil = Console.ReadLine >> int >> Array.get slot >> (fun x -> defaultArg x nil)
let io f =
Seq.unfold (fun _ -> printfn "文字列を入力してください"; match Console.ReadLine() with "" -> None | x -> Some(x, ()))
>> f >> printfn "あなたの入力した文字列は\n%s\nです."
let 問題1 = get "nil" >> printfn "%s"
let 問題2 = get "そのスロットには文字列はありません" >> printfn "%s"
let 問題3() = slot |> Seq.choose id |> Seq.iter (fun x -> printfn "%sは%d文字" x x.Length)
let 問題4() = for _ in 1 .. 3 do slot |> Seq.choose id |> Seq.iter (printfn "%s")
let 問題5 = String.concat "," |> io
let 問題6 = Seq.toList >> List.rev >> String.concat "," |> io
let 問題7 = Seq.map (fun (x : string) -> x.[.. min 3 x.Length - 1]) >> String.concat "," |> io
839 :
838 :2012/08/12(日) 22:23:36.05
840 :
デフォルトの名無しさん :2012/08/13(月) 13:36:46.10
rubyで入力した自然数nの階乗n!を表示するプログラムが何でか知らんができない 誰か暇なときでいいんで教えて
>840 ここはそういうスレじゃないんです.
>>840 % Prolog
'自然数nの階乗n!を表示する'(_n,X) :-
'自然数nの階乗n!を表示する'(1,_n,1,X).
'自然数nの階乗n!を表示する'(_n,_n,Y,X) :-
X is _n * Y.
'自然数nの階乗n!を表示する'(_m,_n,Y_1,X) :-
_m < _n,
Y_2 is _m * Y_1,
_m_2 is _m + 1,
'自然数nの階乗n!を表示する'(_m_2,_n,Y_2,X).
>>840 % Prolog 一部変更
'自然数nの階乗n!を表示する'(_n,_自然数nの階乗) :-
'自然数nの階乗n!を表示する'(1,_n,1,_自然数nの階乗).
'自然数nの階乗n!を表示する'(_n,_n,Y,_自然数nの階乗) :-
_自然数nの階乗 is _n * Y.
'自然数nの階乗n!を表示する'(_m,_n,Y_1,_自然数nの階乗) :-
_m < _n,
Y_2 is _m * Y_1,
_m_2 is _m + 1,
'自然数nの階乗n!を表示する'(_m_2,_n,Y_2,_自然数nの階乗).
% _自然数nの階乗n! とできないのが辛い所
>>840 % すみません。課題の読み違えを直します。
% Prolog
'自然数nの階乗n!を表示する'(_n) :-
'自然数nの階乗n!を表示する'(1,_n,1,_自然数nの階乗).
'自然数nの階乗n!を表示する'(_n,_n,Y,_自然数nの階乗) :-
_自然数nの階乗 is _n * Y,
writef('自然数%tの階乗は %t です\n',[_n,_自然数nの階乗]).
'自然数nの階乗n!を表示する'(_m,_n,Y_1,_自然数nの階乗) :-
_m < _n,
Y_2 is _m * Y_1,
_m_2 is _m + 1,
'自然数nの階乗n!を表示する'(_m_2,_n,Y_2,_自然数nの階乗).
845 :
デフォルトの名無しさん :2012/08/13(月) 15:37:49.79
書いてある言語に固執しないというだけ
>>845 スレチでもこちらは歓迎。勝手に好きな言語で解答を書くスレです。
ただ、Rubyと指定してRuby解が戻ってくるかは疑問。
問題 自然数nの二重階乗を求めよ。 例 0!! = 1 5!! = 15 15!! = 2027025
>>849 HSP
#module
#defcfunc calc int n
if n<=1 : return 1
return n*calc(n-2)
#global
mes "0!! = "+calc(0)
mes "5!! = "+calc(5)
mes "15!! = "+calc(15)
>849 Python n = int(raw_input('n=')) res = 1 for i in xrange(n, 0, -2): res *= i print res
>>849 R
> f <- function(n)ifelse(n<1,1,prod(seq(n,1,-2)))
> f(0)
[1] 1
> f(5)
[1] 15
> f(15)
[1] 2027025
>>849 Octave
function z=f(n)
z=prod(n:-2:1)
end
>>840 ,849 F#
let multiFactorial d n =
Seq.initInfinite (fun i -> bigint(n - i * d)) |> Seq.takeWhile ((<) 0I) |> Seq.fold (*) 1I
let factorial = multiFactorial 1
let doubleFactorial = multiFactorial 2
問題 整数nが与えられたとき、nより大きい最小の偶数を求めよ。 例 n=2 のとき 4 n=-6 のとき -4
>>859 #module
#defcfunc calc int n
return n+2-(n&1)
#global
mes calc(2)
mes calc(-6)