このディレクトリの索引

% 以下のサイトは # 課題8 暗号文を作成するプログラム ファイル名(AxP21xxx_kadai8_angou.java) # 適当な文字列を入力して、暗号化するプログラムである。 # 暗号キーは2桁とし、暗号文は奇数番目と偶数番目の文字位置を、 # 暗号キーの値だけ交互にずらして作成する。 # なお使用する文字種は[!]から[z]までの90 個とする(0x21〜0x7A) # 。またzを越えたら!に戻すこと。 # (例)暗号キーが「16」のとき # 元の文字列 暗号文字列 # b u n k y o → c ! o q z u # +1 +6 +1 +6 +1 +6 文字列の暗号化(_鍵整数,_元の文字列,_暗号文字列) :- integer(_鍵整数), _鍵整数>=10 _鍵整数=<99, atom_codes(_元の文字列,Codes), _奇数番目の鍵 is _鍵整数 // 10, _偶数番目の鍵 is _鍵整数 mod 10, 文字コードによる暗号化(_奇数番目の鍵,_偶数番目の鍵,Codes,_暗号Codes), atom_codes(_暗号文字列,_暗号Codes). 文字コードによる暗号化(_,_,[],[]) :- !. 文字コードによる暗号化(_鍵1,_鍵2,[A|R1],[B|R2]) :- 一文字の暗号化(_鍵1,A,B), 文字コードによる暗号化(_鍵2,_鍵1,R1,R2). 一文字の暗号化(_変位,_文字コード,_暗号化された文字コード) :- _文字コード+_変位 =< 122,!, _暗号化された文字コード is _文字コード+_変位. 一文字の暗号文字化(_変位,_文字コード,_暗号化された文字コード) :- _文字コード+_変位 >122,!, _暗号化された文字コード is _文字コード+_変位-90. % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1250204272/758 # [1] 授業単元:基礎プログラミング # [2] 問題文(含コード&リンク): # カエサル暗号(A〜Z)の暗号文を入力して平文を含んだリストを出力しなさい。 # # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9972.txt# アルファベット(['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']). カエサル暗号(_ずらし,_平文,_暗号文) :- atomic(_平文), アルファベット(_アルファベット), ならびの回転(左方向,_ずらし,_アルファベット,_アルファベットの二), atom_chars(_平文,Chars), findall(C2,(member(C1,Chars),list_nth(N,_アルファベット,C1),list_nth(N,_アルファベットの二,C2)),Chars2), atom_chars(_暗号文,Chars2). カエサル暗号(_ずらし,_平文,_暗号文) :- var(_平文), atomic(_暗号文), アルファベット(_アルファベット), ならびの回転(右方向,_ずらし,_アルファベット,_アルファベットの二), atom_chars(_暗号文,Chars), findall(C2,(member(C1,Chars),list_nth(N,_アルファベット,C1),list_nth(N,_アルファベットの二,C2)),Chars2), atom_chars(_平文,Chars2). ならびの回転(左方向,1,[A|R],L) :- append(R,[A],L). ならびの回転(左方向,N,[A|R],L) :- N > 1, append(R,[A],L1), N1 is N - 1, ならびの回転(左方向,N1,L1,L). ならびの回転(右方向,1,L1,L2) :- append(L0,[A],L1), append([A],L0,L2). ならびの回転(右方向,N,L1,L2) :- N > 1, append(L0,[A],L1), append([A],L0,L3), N1 is N - 1, ならびの回転(右方向,N1,L3,L2). % 以下のサイトは http://chomework.sakura.ne.jp/log1/1135125328_02.html # 問題文 # データを読み込み2進、8進、10進、16進で表示せよ。 # ただし、読み込みはgetchar()で4桁入力。表示はputchar()で必要桁数表示する。 # データが0の時処理を終了、データ入力はXXXXとする。 'データを読み込み2進、8進、10進、16進で表示' :- repeat, write('4桁の数字を入力してください : '), get_char(Line), atom_to_term(Line,_10進数,_), 'データを読み込み2進、8進、10進、16進で表示'(_10進数). 'データを読み込み2進、8進、10進、16進で表示'(0) :- !. 'データを読み込み2進、8進、10進、16進で表示'(_10進数) :- 'N進数'(2,_10進数,_2進数文字列), 'N進数'(8,_10進数,_8進数文字列), 'N進数'(16,_10進数,_16進数文字列), writef('%tの 2進数表示は %t, 8進数表示は %t, 16進数表示は %t,です\n',[_2進数文字列,_8進数文字列,_16進数文字列]), fail. 'N進数'(N,_10進数,_N進数文字列) :- 'N進数'(N,_10進数,[],X), atomic_list_concat(X,_N進数文字列). 'N進数'(N,J,Y,[M|Y]) :- J < N,'N進数利用文字'(J,M),!. 'N進数'(N,J,Y,X) :- J >= N, J2 is J // N, M is J mod N, 'N進数利用文字'(M,M2), 'N進数'(N,J2,[M2|Y],X). 'N進数利用文字ならび'(N,_利用文字ならび) :- length(L1,N), findall(A,'N進数利用文字'(_,A),L), append(L1,_,L). 'N進数剰余数利用文字ならび'(N,_剰余数利用文字ならび) :- length(L1,N), findall([M,A],'N進数利用文字'(M,A),L), append(L1,_,L). 'N進数を利用した簡単な暗号化'(N,_文,_暗号化された文) :- atom_codes(_文,Codes), Y is 65536 // N, atomic_length(Y,_桁数), 'N進数を利用した簡単な暗号化'(N,_桁数,Codes,_暗号化された文字ならび), atomic_list_concat(_暗号化された文字ならび,' ',_暗号化された文). 'N進数を利用した簡単な暗号化'(_,_,[],[]). 'N進数を利用した簡単な暗号化'(N,_桁数,[A|R1],[C|R2]) :- 'N進数'(N,A,[],L), '頭部に零を詰める'(_桁数,L,L2), atom_chars(C,L2), 'N進数を利用した簡単な暗号化'(N,_桁数,R1,R2). 'N進数利用文字'(0,'0'). 'N進数利用文字'(1,'1'). 'N進数利用文字'(2,'2'). 'N進数利用文字'(3,'3'). 'N進数利用文字'(4,'4'). 'N進数利用文字'(5,'5'). 'N進数利用文字'(6,'6'). 'N進数利用文字'(7,'7'). 'N進数利用文字'(8,'8'). 'N進数利用文字'(9,'9'). 'N進数利用文字'(10,'A'). 'N進数利用文字'(11,'B'). 'N進数利用文字'(12,'C'). 'N進数利用文字'(13,'D'). 'N進数利用文字'(14,'E'). 'N進数利用文字'(15,'F'). 'N進数利用文字'(16,'G'). 'N進数利用文字'(17,'H'). 'N進数利用文字'(18,'I'). 'N進数利用文字'(19,'J'). 'N進数利用文字'(20,'K'). 'N進数利用文字'(21,'L'). 'N進数利用文字'(22,'M'). 'N進数利用文字'(23,'N'). 'N進数利用文字'(24,'O'). 'N進数利用文字'(25,'P'). 'N進数利用文字'(26,'Q'). 'N進数利用文字'(27,'R'). 'N進数利用文字'(28,'S'). 'N進数利用文字'(29,'T'). 'N進数利用文字'(30,'U'). 'N進数利用文字'(31,'V'). 'N進数利用文字'(32,'W'). 'N進数利用文字'(33,'X'). 'N進数利用文字'(34,'Y'). 'N進数利用文字'(35,'Z'). 'N進数利用文字'(36,'a'). 'N進数利用文字'(37,'b'). 'N進数利用文字'(38,'c'). 'N進数利用文字'(39,'d'). 'N進数利用文字'(40,'e'). 'N進数利用文字'(41,'f'). 'N進数利用文字'(42,'g'). 'N進数利用文字'(43,'h'). 'N進数利用文字'(44,'i'). 'N進数利用文字'(45,'j'). 'N進数利用文字'(46,'k'). 'N進数利用文字'(47,'l'). 'N進数利用文字'(48,'m'). 'N進数利用文字'(49,'n'). 'N進数利用文字'(50,'o'). 'N進数利用文字'(51,'p'). 'N進数利用文字'(52,'q'). 'N進数利用文字'(53,'r'). 'N進数利用文字'(54,'s'). 'N進数利用文字'(55,'t'). 'N進数利用文字'(56,'u'). 'N進数利用文字'(57,'v'). 'N進数利用文字'(58,'w'). 'N進数利用文字'(59,'x'). 'N進数利用文字'(60,'y'). 'N進数利用文字'(61,'z'). % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1200175247/713 # シーザー暗号を解くプログラムを作り,以下の暗号文を解きな # さい. # Hwduytlwfumd nx ymj uwfhynhj fsi xyzid tk mninsl # nsktwrfynts. Ns rtijws ynrjx, hwduytlwfumd nx htsxnijwji f # gwfshm tk gtym rfymjrfynhx fsi htruzyjw xhnjshj, fsi nx # fkknqnfyji hqtxjqd bnym nsktwrfynts ymjtwd, htruzyjw # xjhzwnyd, fsi jslnsjjwnsl. # Hwduytlwfumd nx zxji ns fuuqnhfyntsx uwjxjsy ns # yjhmstqtlnhfqqd fiafshji xthnjynjx; jcfruqjx nshqzij ymj # xjhzwnyd tk FYR hfwix, htruzyjw ufxxbtwix, fsijqjhywtsnh # htrrjwhj, bmnhm fqq ijujsi ts hwduytlwfumd. # # # 暗号を解く関数は problem2 とし,関数 problem2 の引数を暗 # 号の文字列とする.(例: def problem2(str)) # カエサル暗号のずらし(5). 与えられた暗号文('Hwduytlwfumd nx ymj uwfhynhj fsi xyzid tk mninsl \nnsktwrfynts. Ns rtijws ynrjx, hwduytlwfumd nx htsxnijwji f \ngwfshm tk gtym rfymjrfynhx fsi htruzyjw xhnjshj, fsi nx \nfkknqnfyji hqtxjqd bnym nsktwrfynts ymjtwd, htruzyjw \nxjhzwnyd, fsi jslnsjjwnsl. \nHwduytlwfumd nx zxji ns fuuqnhfyntsx uwjxjsy ns \nyjhmstqtlnhfqqd fiafshji xthnjynjx; jcfruqjx nshqzij ymj \nxjhzwnyd tk FYR hfwix, htruzyjw ufxxbtwix, fsijqjhywtsnh \nhtrrjwhj, bmnhm fqq ijujsi ts hwduytlwfumd. \n'). c2_713 :- 与えられた暗号文(_暗号文), カエサル暗号の復号(_暗号文,_平文), write_formatted('元の平文は\n%t\n',[_平文]),!. カエサル暗号の復号(_暗号文,_平文) :- カエサル暗号のずらし(_ずらし), カエサル暗号(_ずらし,_平文,_暗号文). アルファベット(大文字,['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']). アルファベット(小文字,[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z]). カエサル暗号(_ずらし,_平文,_暗号文) :- atomic(_平文), アルファベット(大文字,_アルファベット大文字), アルファベット(小文字,_アルファベット小文字), ならびの回転(左方向,_ずらし,_アルファベット大文字,_アルファベットの二), ならびの回転(左方向,_ずらし,_アルファベット小文字,_アルファベットの三), append(_アルファベット大文字,_アルファベット小文字,_アルファベット), append(_アルファベットの二,_アルファベットの三,_アルファベットの四), atom_chars(_平文,Chars), findall(C2,カエサル暗号解読(Chars,_アルファベット,_アルファベットの四,C2),Chars2), atom_chars(_暗号文,Chars2). カエサル暗号(_ずらし,_平文,_暗号文) :- var(_平文), atomic(_暗号文), アルファベット(大文字,_アルファベット大文字), アルファベット(小文字,_アルファベット小文字), ならびの回転(右方向,_ずらし,_アルファベット大文字,_アルファベットの二), ならびの回転(右方向,_ずらし,_アルファベット小文字,_アルファベットの三), append(_アルファベット大文字,_アルファベット小文字,_アルファベット), append(_アルファベットの二,_アルファベットの三,_アルファベットの四), atom_chars(_暗号文,Chars), findall(C2,カエサル暗号解読(Chars,_アルファベット,_アルファベットの四,C2),Chars2), atom_chars(_平文,Chars2). カエサル暗号解読(Chars,_アルファベット,_アルファベットの二,C2) :- member(C1,Chars), カエサル暗号一文字解読(C1,_アルファベット,_アルファベットの二,C2). カエサル暗号一文字解読(C1,_アルファベット,_アルファベットの二,C2) :- list_nth(N,_アルファベット,C1), list_nth(N,_アルファベットの二,C2),!. カエサル暗号一文字解読(C1,_,_,C1). ならびの回転(左方向,1,[A|R],L) :- append(R,[A],L). ならびの回転(左方向,N,[A|R],L) :- N > 1, append(R,[A],L1), N1 is N - 1, ならびの回転(左方向,N1,L1,L). ならびの回転(右方向,1,L1,L2) :- append(L0,[A],L1), append([A],L0,L2). ならびの回転(右方向,N,L1,L2) :- N > 1, append(L0,[A],L1), append([A],L0,L3), N1 is N - 1, ならびの回転(右方向,N1,L3,L2). % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1258158172/664 # [1] C言語 # [2] 問題文(含コード&リンク): # 問題3  # 標準入力からの入力に対して、アルファベットの文字を3文字ず # らして標準出力に出力するシーザー暗号化プログラムを作成し # て、rep09.c として提出せよ。具体的には, 小文字に対しては # a -> d, b -> e, ..., w -> z, x -> a, y -> b, z -> c なる # 変換である。もちろん大文字に関しても同様の変換処理をしな # ければならない。 # アルファベット(小文字,[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z]). アルファベット(大文字,['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']). program :- rep03. rep03 :- get_char(Char), アルファベットならびの選択(Char,L),rep03(Char,L). rep03(end_of_file,_). rep03(Char,L) :- list_nth(N,L,Char), ならびの回転(左方向,3,L,L3), list_nth(N,L3,A), put_char(A), get_char(Char2), アルファベットならびの選択(Char2,L2), rep03(Char2,L2). アルファベットならびの選択(Char,L) :- Char @>= a,Char @=< z,アルファベット(小文字,L). アルファベットならびの選択(Char,L) :- Char @>= 'A',Char @=< 'Z',アルファベット(大文字,L). % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1197620454/543 # C#の宿題助けてくださしあ><お願いします。 # Visual Studio 2005使用です。 # 問題文などはzipの中に入っています。説明不足等がありましたら補足します。 # http://ime.nu/uproda11.2ch-library.com/11213069.zip.shtml # DLキーは2chです。 # 問い1 # ・二次元配列arrayを使ってユーザーのログインページを作りなさい。 # ・ユーザー名、パスワードのエラーメッセージを表示させること # 問い2 # 問い1のプログラムを応用して、新規ユーザー登録ボタンを作りなさい。kadai_06_02_01ユーザー登録は配列を利用すること # あらかじめユーザ登録用配列は3ユーザー分の名前とパスワードをセットしておくこと。 # ユーザー登録は10名までとする。10ユーザーを超えた場合はエラーを表示させなさい。 # つまり残り7枠を登録さればよい。 # プログラムはfor、while、do whileのどれかひとつでよい。 # ユーザー名のエラーはフラグを作って表示させたいです。でないと長くなると思うので ・・・。 # デザインは作成済みです。イメージがつかみにくいかもしれませんがよろしくお願いします・・・。 # slnファイルの名前がフォルダ名と違っていますが気にしないでください。 # 配列を使わないユーザー認証ページを作ってみたのでそちらを参考にしていただければと思います。 ttylogin :- write('\nlogin: '), get_line(_ユーザー名), write('password: '), system('stty -echo raw'), get_char(X),put_char('*'), パスワードを得る(X,Password), system('stty echo -raw'), ユーザ管理(_ユーザー名,Password,_診断), assertz(ログイン情報(_ユーザー名,Password,_診断)), シェル(_ユーザー名,_診断), ttylogin. パスワードを得る('\r',[]) :- !. パスワードを得る(C,[C|R]) :- get_char(C2), put_char('*'), パスワードを得る(C2,R). ユーザ管理(_ユーザー名,Password,ok) :- concat_atom(Password,PasswordAtom), カエサル暗号(17,PasswordAtom,_暗号文), user_password(_ユーザ名,_暗号文),!. ユーザ管理(_ユーザー名,Password,'UserPassword Error') :- user_passwork(_ユーザー名,_),!. ユーザ管理(_ユーザー名,Password,S) :- concat_atom([ユーザー名,_ユーザー名,は登録がありません],S),!. user_password(tama,'Jrslif'). シェル(_,S) :- \+(S==ok),!. シェル(_,_) :- system. adduser :- write('username : '),get_line(_ユーザー名), rawmode,write('password : '),get_char(Char),put_char(*), パスワードを得る(Char,Password),norawmode, write('Retype Password : '),get_char(Char2),put_char(*), パスワードを得る(Char2,Password2), パスワードは一致する(Password,Password2), 定義枠の限界を越えていない, ユーザー登録(_ユーザー名,Password), パスワードは一致する(A,A) :- !. パスワードは一致する(A,B) :- \+(A,B),write('タイプされたパスワードは一致しません\n'),fail. ユーザー登録(_ユーザー名,Password) :- concat_atom(Password,PasswordAtom), カエサル暗号(17,PasswordAtom,PasswordAtom2), assertz(user_password(_ユーザ-名,PasswordAtom2)). 定義枠の限界を越えていない :- 定義数の数(user_password/2,N),N < 10,!. 定義枠の限界を越えていない :- write('登録ユーザーが10を越えています。\n登録できません。\n'),fail. 定義節の数(Functor / Arity,N) :- functor(P,Functor,Arity),findsum(1,clause(P,_),F),N is truncate(F). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1301553333/69 # 文字列を最初と最後から交互に入れ替える暗号プログラムを作ろうとしていますが上手く行きません # 例「hello」→「holel」 # # #include<stdio.h> # #include<string.h> # # int main(void){ # char str[80];char str2[80]; # int i,j,k=0; # printf("文字列を入力してください"); # gets(str); # j=strlen(str); # for(i=0;i<strlen(str);i++){ # if(!i%2) # str2[i]=str[k++]; # else # str2[i]=str[j--]; # } # printf(str2); # # return 0; # } # # 文字列を最初と最後から交互に入れ替える :- get_line(_文字列), atom_chars(_文字列,Chars), ならびの最初と最後から交互に取り出す(Chars,L), atom_chars(_暗号文字列,L), writef('%t\n',[_暗号文字列]). ならびの最初と最後から交互に取り出す([],[]) :- !. ならびの最初と最後から交互に取り出す([A],[A]) :- !. ならびの最初と最後から交互に取り出す(L,[A,B|R2]) :- append([A|R],[B],L), ならびの最初と最後から交互に取り出す(R,R2). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1339338438/136 # [1] 授業単元: 情報B # [2] 問題文: アルファベット1文字目は1文字、2文字目は2文字、n文字目はn文字…分ずれるシーザー暗号を暗号・復号化それぞれ作りなさい。 # アルファベット(['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z]). 'アルファベット1文字目は1文字、2文字目は2文字、n文字目はn文字…分ずれるシーザー暗号を暗号化する'(_文字列,_暗号化した文字列) :- findall(_暗号化した文字,( sub_atom(_文字列,S,1,_,_文字), S_2 is S + 1, 文字の暗号化(S_2,_文字,_暗号化した文字)), _暗号化した文字ならび), atomic_list_concat(_暗号化した文字ならび,_暗号化した文字列). 'アルファベット1文字目は1文字、2文字目は2文字、n文字目はn文字…分ずれるシーザー暗号を復号化する'(_文字列,_復号化した文字列) :- findall(_暗号化した文字,( sub_atom(_文字列,S,1,_,_文字), S_2 is S + 1, 文字の復号化(S_2,_文字,_暗号化した文字)), _暗号化した文字ならび), atomic_list_concat(_暗号化した文字ならび,_暗号化した文字列). 文字の暗号化(S,_文字,_暗号化した文字) :- アルファベット(L), nth1(Nth,L,_文字), ならびの回転(左方向,S_2,L,L1), nth1(Nth,L1,_暗号化した文字),!. 文字の復号化(S,_文字,_復号化した文字) :- アルファベット(L), nth1(Nth,L,_文字), ならびの回転(右方向,S_2,L,L1), nth1(Nth,L1,_復号化した文字),!. % ならびの回転/4 % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1339338438/533 # [1] 授業単元: C # [2] 問題文: # アルファベットから成る文字列strをJISコード表にしたがいn文字ずつ # ずらして暗号文cryptogramを作成する関数を作成さなさい。 # このような暗号化をシーザー暗号と言う。 # 数字は数字内で同様にずらすこと。 # ただし、それ以外の記号や空白はそのまま無変換とする。 # 平文とnを引数にとり、暗号文を返す関数を作りなさい。 # 実行例には、平文を暗号化した場合と、 # その暗号文を平文に戻した場合を含めること。 # % % 数値コードを計算して求めるシーザー暗号 % シーザー暗号(_n文字ずらし,_平文,_暗号文) :- atom_codes(_平文,_文字コードならび), 文字コードならびを変換する(_n文字ずらし,_文字コードならび,_変換された文字コードならび), atom_codes(_暗号文,_変換された文字コードならぴ). シーザー暗号の平文化(_n文字ずらし,_暗号文,_平文) :- _n_1 is _n文字ずらし * (-1), シーザー暗号(_n_1,_暗号文,_平文). 文字コードならびを変換する(_,[],[]). 文字コードならびを変換する(_n文字ずらし,[_文字コード|R1],[_変換された文字コード|R2]) :- 文字コードを変換する(_n文字ずらし,_文字コード,_変換された文字コード), 文字コードならびを変換する(_n文字ずらし,R1,R2). 文字コードを変換する(_n文字ずらし,_文字コード,_変換された文字コード) :- between(65,90,_文字コード), _変換された文字コード is ((_文字コード-65+_n文字ずらし) mod 26) + 65,!. 文字コードを変換する(_n文字ずらし,_文字コード,_変換された文字コード) :- between(97,122_文字コード), _変換された文字コード is ((_文字コード-97+_n文字ずらし) mod 26) + 97,!. 文字コードを変換する(_n文字ずらし,_文字コード,_変換された文字コード) :- between(48,57,_文字コード), _変換された文字コード is ((_文字コード-48+_n文字ずらし) mod 10) + 48,!. 文字コードを変換する(_,_文字コード,_文字コード). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1339338438/849 # [1] 授業単元: プログラミング # [2] 問題文: # 1文字を引数として受け取り、AならばZ,BならばY,aならばz,bならばy,0ならば9,1ならば8 # というように入れ替えた文字を戻り値とする関数をsymmetry()という名前で作成する。 # キーボードから80文字以内の英文を1行入力し、1行の全ての文字をsymmetry()で変換した # 文字列を1行に表示する。同じ操作を更にもう一度繰り返し、結果的に入力された英文と # 同じ文字列が表示されるようにする。 # 例:I was born in 1956.と打ち込んだ場合、R dzh ylim rm 8043.と表示されるようにする。 # 'キーボードから80文字以内の英文を1行入力し、1行の全ての文字をsymmetry述語で変換した文字列を1行に表示する。' :- 'キーボードから80文字以内の英文を1行入力し、'(_80文字以内の文字列), '1行の全ての文字をsymmetry述語で変換した文字列を'(_80文字以内の文字列,_変換した文字列), 表示する(_変換した文字列). 'キーボードから80文字以内の英文を1行入力し、'(_80文字以内の文字列) :- get_line(_文字列), '80文字以内の'(_文字列,_80文字以内の文字列). '80文字以内の'(_文字列,_80文字以内の文字列) :- sub_atom(_文字列,0,80,_,_80文字以内の文字列),!. '80文字以内の'(_文字列,_文字列). '1行の全ての文字をsymmetry述語で変換した文字列を'(_80文字以内の文字列,_変換した文字列) :- findall(_暗号文字,( sub_atom(_80文字以内の文字列,_,1,_,_文字), symmetry(_文字,_暗号文字)), _変換した文字ならび), atom_chars(_変換した文字列,_変換した文字ならび). 表示する(_変換した文字列) :- writef('%t\n',[_変換した文字列]). symmetry(_文字,_暗号文字) :- 暗号文字へずらす(_文字,_暗号文字),!. summetry(_文字,_文字). 暗号文字へずらす(_文字,_暗号文字) :- 文字種(_,_文字コード下限,_文字コード上限,L), nth0(_nth0,L,_文字), _シフト数 is _nth0 + (_文字コード上限 - _文字コード下限 + 1) // 2, ならびの回転(左方向,_シフト数,L,[_暗号文字|_]),!. 文字種(英小文字,97,122,[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z]). 文字種(英大文字,65,90,['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']). 文字種(数字,48,57,['0','1','2','3','4','5','6','7','8','9']). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1339338438/872 # [1] 授業単元: C言語 # [2] 問題文: # 簡単な暗号化関数の作成 # 英文字を第1引数、正整数値のシフト幅nを第2引数として受け取り、第一 # 引数をASC競魁璽匹韮遒蘯分先に進めた文字を返す関数を作成せよ。 # たとえば第1引数が'b'(十進数の98)、第2引数6であった場合は戻り値は'h'(十進数の104)となる。 #  ただし、大文字を進めた場合に'z'より大きくなる場合には'A'に折り返す。たとえば、'W'を指定し # た場合は'C'が戻り値となる。小文字についても同様に、'z'を超える場合は'a'に折り返す。また、英大 # 文字・小文字以外が第一引数に与えられた場合は、第1引数をそのまま戻り値とする。 #  このような関数をcharshift()という名前で作成した上で、この関数を用いて以下の機能を持つプログ # ラムを作成せよ。 # # 「最初にキーボードから80文字以内の英文を1行入力し、次に正整数のシフト幅を入力する。 # そして、英文字のすべての文字を指定されたシフト幅だけcharsshift()で変換した文字列を1行に # 出力する」 # # このプログラムでは以下のような結果が得られる # Input English words. # UDU was established in 1907. (←キーボードからの入力) # Input shift number. # 6 (←キーボードからの入力) # AJA cgy kyzghroynkj ot 1907. # '英文字を第1引数、正整数値のシフト幅nを第2引数として受け取り、第一引数をASCIIコードでn進めた文字を返す'(_英文字,_シフト幅n,_第一引数をASCIIコードでn進めた文字) :- charsshift(_英文字,_シフト幅n,_第一引数をASCIIコードでn進めた文字). charsshift(_英文字,_シフト幅n,_第一引数をASCIIコードでn進めた文字) :- member(L,[[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z],['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']]), nth0(_nth0,L,_文字), _シフト is 26 + _シフト幅n - _nth0, ならびの回転(左方向,_シフト,L,_第一引数をASCIIコードでn進めた文字),!. '最初にキーボードから80文字以内の英文を1行入力し、次に正整数のシフト幅を入力する。そして、英文字のすべての文字を指定されたシフト幅だけcharsshift()で変換した文字列を1行に出力する' '最初にキーボードから80文字以内の英文を1行入力し'(_80文字以内の英文), '次に正整数のシフト幅を入力する'(_シフト幅), '英文字のすべての文字を指定されたシフト幅だけcharsshift()で変換した文字列を'(_80文字以内の文字列,_シフト幅,_変換された文字列), 一行で出力する(_変換された文字列). '最初にキーボードから80文字以内の英文を1行入力し'(_80文字以内の英文) :- get_line(_文字列), '診断: 最初にキーボードから80文字以内の英文を1行入力し'(_文字列,_80文字以内の英文),!. '診断: 最初にキーボードから80文字以内の英文を1行入力し'(_文字列,_80文字以内の英文) :- sub_atom(_文字列,0,80,_,_80文字以内の英文),!. '診断: 最初にキーボードから80文字以内の英文を1行入力し'(_80文字以内の英文,_80文字以内の英文). '次に正整数のシフト幅を入力する'(_シフト幅) :- 整数を得る(正整数のシフト幅,_シフト幅). '英文字のすべての文字を指定されたシフト幅だけcharsshiftで変換した文字列を'(_80文字以内の文字列,_シフト幅,_変換された文字列) :- findall(_変換された文字,( sub_atom(_80文字以内の英文,_,1,_,_英文字), charsshift(_英文字,_シフト幅,_変換された文字)), _変換された文字ならび), atomic_list_concat(_変換された文字ならび,_変換された文字列). 一行で出力する(_変換された文字列) :- writef('%t\n',[_変換された文字列]). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1342966104/466 # # [1] 授業単元:C言語 # [2] 問題文:プレイフェア暗号の作成 #       参考:http://ime.nu/www.tamagaki.com/math/PlayfairCipher.html # # #  プレイフェア暗号(Playfair cipher) # # プレイフェア暗号はイギリス人サー・チャールズ・ホイートストン(Sir Charles Wheatstone)により開発されライアン・プレイフェア(Lyon Playfair)が普及させました。プレイフェア暗号を用いて暗号化するとき、まずキーワードまたはキーフレーズをあらかじめ決めておきます。仮にキーワードをPlayfairとします。次にこのキーワードをアルファベットが重複することなく下の5×5の表に入れていきます。 # # ここで残りのセルに余ったアルファベットを挿入していくわけですが、アルファベットは26文字あって5×5では一字余ります。そこで I と J は同じセルに入れるとあらかじめ決めておきます。そこで新たに作られた表が下のようになります。 # # 準備ができたところで、次のメッセージを暗号化してみましょう。 # # メッセージ Abandon hope, all ye who enter here. # # このメッセージをまず二文字ずつ区切っていきます。 # # Ab-an-do-nh-op-ea-ll-ye-wh-oe-nt-er-he-re # # ここで7番目に ll と同じ文字が重複しているので間に x を入れます。 # # Ab-an-do-nh-op-ea-lx-ly-ew-ho-en-te-rh-er-e # # そうすると最後に e が一つ余ります。ここにもやはり x を入れておきます。 # # Ab-an-do-nh-op-ea-lx-ly-ew-ho-en-te-rh-er-ex # # まず最初の二文字 ab を暗号化してみましょう。ab は先ほど作った表では同じ列にあります。このときは ab の列のすぐ下の文字で置き換えます。 # # つまり ab は BH に変わります。ただし一番下の文字例えば w は一番上の文字 A に変換されます。 # # 同様に同じ行に入る二文字も出てきたとします。例えば ap などは右隣の文字に置き換えます。 # # つまり ap は YL になるわけですね。この場合も一番右の文字例えば f は一番左の文字 p に変換されます。 # # 最後に行も列も違う二文字が出てきた場合は次のようにします。例えば an を考えます。下の表のように a n それぞれの行および列を塗り分け、その交点となる文字を見ます。この場合、P と Q になります。 # # そこで a は、a h と同じ行の P に、n は、n と同じ行の Q に変換します。つまり、 # # do → RT # # nh → QE # # op → NL # # となるわけです。このルールに従って、先ほどのメッセージを暗号化すると、 # # 平文  Ab-an-do-nh-op-ea-lx-ly-ew-ho-en-te-rh-er-ex # # 暗号文 BH PQ RT QE NL HP YV AF HU GQ NU NM BG GI KU # # これでプレイフェア暗号による暗号化が終了したわけです。 # # この暗号はイギリスがボーア戦争(ブール戦争 BoreWar)で使用したといわれています。 プレイフェア暗号表の作成(_鍵文,_暗号表) :- 鍵文を25要素のならびに拡張して(_鍵文,_25要素ならび,_鍵文字以外の変数ならび), 'Jを除いたA-Zならびを切る'(_Jを除いたA_Zならび), 変数を埋める(_Jを除いたA_Zならび,Chars,_鍵文字以外の変数ならび), 'N個組'(5,_25要素のならび,_暗号表). 鍵文を25要素のならびに拡張して(_鍵文,_25要素ならび,_鍵文字ならび,_鍵文字以外の変数ならび) :- length(_25要素ならび,25), atom_chars(_鍵文,_鍵文字ならび), append(_鍵文字ならび,_鍵文字以外の変数ならび,_25要素ならび). 'A-Zならびを切る'(_Jを除いたA_Zならび) :- _切る回数 is random(113) + 1, トランプを切るようにならびを切る(_切る回数,25,['A','B','C','D','E','F','G','H','I','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'],_Jを除いたA_Zならび). 変数を埋める(_,_,[]). 変数を埋める(L_1,Chars,[V|R]) :- select(V,L_1,L_R), \+(member(V,Chars)), 変数を埋める(L_R,Chars,R). プレイフェア暗号による暗号化(_平文,_暗号文) :- メッセージをまず二文字ずつ区切っていきます(_平文,_二文字ずつに区切られたならび), プレイフェア暗号化(_二文字ずつに区切られたならび,_暗号文字ならび), atomic_list_concat(_暗号文字ならび,_暗号文). メッセージをまず二文字ずつ区切っていきます(_平文,_二文字ずつに区切られたならび) :- atom_chars(_平文,Chars), すべての文字を大文字に変換(Chars,_大文字の文字ならび), メッセージをまず二文字ずつ区切っていきます(_大文字の文字ならび,_二文字ずつに区切られたならび). メッセージをまず二文字ずつ区切っていきます([],[]). メッセージをまず二文字ずつ区切っていきます(['J'|R1],[['J','J']|R2]) :- メッセージをまず二文字ずつ区切っていきます(R1,R2). メッセージをまず二文字ずつ区切っていきます([A],[[A,'X']]). メッセージをまず二文字ずつ区切っていきます([A,A|R1],[[A,'X']|R2]) :- メッセージをまず二文字ずつ区切っていきます([A|R1],R2). メッセージをまず二文字ずつ区切っていきます([A,B|R1],[[A,B]|R2]) :- \+(A=B), メッセージをまず二文字ずつ区切っていきます(R1,R2). プレイフェア暗号化(_二文字ずつに区切られたならび,_暗号文字ならび) :- 暗号表(_暗号表), 転置(_暗号表,_転置された暗号表), プレイフェア暗号化(_二文字ずつに区切られたならび,_暗号表,_転置された暗号表,_暗号文字ならび). プレイフェア暗号化([],_,_,[]). プレイフェア暗号化([['J','J']|R1],_暗号表,_転置された暗号表,['J'|R2]) :- プレイフェア暗号化(R1,_暗号表,_転置された暗号表,R2). プレイフェア暗号化([[A,B]|R1],_暗号表,_転置された暗号表,[C,D|R2]) :- 暗号に変換(A,B,_暗号表,C,D), プレイフェア暗号化(R1,_暗号表,_転置された暗号表,R2). 暗号に変換(A,B,_暗号表,_転置された暗号表,C,D) :- member(L,_転置された暗号表), 'A,Bが暗号表の同一行または列にある'(A,B,L,C,D). 暗号に変換(A,B,_暗号表,_転置された暗号表,C,D) :- member(L,_暗号表), 'A,Bが暗号表の同一行にある'(A,B,L,C,D). 暗号に変換(A,B,_暗号表,_転置された暗号表,C,D) :- 暗号コードは矩形を仮想した時の他の二角(A,B,_暗号表,C,D). 'A,Bが暗号表の同一行または列にある'(A,B,L,C,D) :- member(A,L), member(B,L), 'A,Bの次の要素'(L,A,C), 'A,Bの次の要素'(L,B,D). 'A,Bの次の要素'(L,X,Y) :- append([Y|_],[X],L). 'A,Bの次の要素'(L,X,Y) :- append(_,[X,Y|_],L). 暗号コードは矩形を仮想した時の他の二角(A,B,_表,C,D) :- 'A,Bの行と列位置を得る'(A,B,_表,L_1,_列_A,L_2,_列_B), nth1(_列_B,L_1,C), nth1(_列_A,L_2,D). 'A,Bの行と列位置を得る'(A,B,_表,L_1,_列_A,L_2,_列_B) :- nth1(_行_A,_表,L_1), nth1(_列_A,L_1,A), nth1(_行_B,_表,L_2), nth1(_列_B,L_2,B). % 以下のサイトは # p=1231, q=4567を選びます。 # eに65537 # e^-1=d mod φ(n) のdを計算して求めます。 #     d=3988493 # となります。 # # 暗号化と複合化の手順 # 公開鍵:N = 1231 * 4567 # E = 65537 # d = 3988493 # 文字コード:「a〜z」=01〜26、「A〜Z」=27〜52、空白=53 # 文書:This Anser p(1231). q(4567). 'E'(65537). d(3988493). n(5621977). 'RSA暗号化'(_文書,_暗号文字コードならび) :- 文書を文字コードで数値化します(_文書,_文字コードならび), 'RSA方式によるコード暗号化'(_文字コードならび,_暗号文字コードならび). 'RSA復号化'(_暗号文字コードならび,_文書) :- 'RSA方式によるコード復号化'(_暗号文字コードならび,_文字コードならび), 文字コードならびから文書を復元します(_文字コードならび,_文書). 'RSA方式によるコード暗号化'(_文字コードならび,_暗号コードならび) :- 'E'(_E), n(_n), findall(_暗号コード,( member(_文字コード,_文字コードならび), _暗号コード is _文字コード ^ _E mod _n), _暗号コードならび). 'RSA方式によるコード復号化'(_暗号文字コードならび,_文字コードならび) :- d(_d), n(_n), findall(_複合コード,( member(_暗号文字コード,_暗号文字コードならび), _複合コード is _暗号文字コード ^ _d mod _n), _文字コードならび). 文書を文字コードで数値化します(_文書,_文字コードならび) :- findall(_文字コード,( sub_atom(_文書,_,1,_,_文字), 文字コード(_文字,_文字コード)), _文字コードならび). 暗号コードを暗号文に変換(_暗号コードならび,_暗号文) :- findall(_暗号文字,( member(_暗号コード,_暗号コードならび), 文字コード(_暗号文字,_暗号コード)), _暗号文字ならび), atom_chars(_暗号文,_暗号文字ならび). 文字コードならびから文書を復元します(_文字コードならび,_文書) :- findall(_文字,( member(_文字コード,_文字コードならび), 文字コード(_文字,_文字コード)), _文字ならび), atom_chars(_文書,_文字ならび). 文字コード(_文字,_コード) :- char_code(_文字,_コード). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1354393458/ # # お題:ヴィジュネル暗号で暗号・復号化する関数を作成せよ。 # ・平文は "programming" とする。 # ・鍵は任意とする。 # ヴィジュネル復号化(_平文,_鍵,_暗号文) :- \+(atom(_平文)), atom_chars(_暗号文,_暗号文文字ならび), atom_chars(_鍵,_鍵文字ならび), ヴィジュネル暗号(_平文文字ならび,_鍵文字ならび,_暗号文文字ならび), atom_chars(_平文,_平文文字ならび). ヴィジュネル暗号化(_平文,_鍵,_暗号文) :- atom(_平文), atom_chars(_平文,_平文文字ならび), atom_chars(_鍵,_鍵文字ならび), ヴィジュネル暗号(_平文文字ならび,_鍵文字ならび,_暗号文文字ならび), atom_chars(_暗号文,_暗号文文字ならび). ヴィジュネル暗号([],_,[]). ヴィジュネル暗号([_文字|R1],_鍵文字ならび,[_暗号文字|R3]) :- ヴィジュネル暗号の文字変換(_文字,_鍵文字ならび,_一文字回転した鍵文字ならび,_暗号文字), ヴィジュネル暗号(R1,_一文字回転した鍵文字ならび,R3). ヴィジュネル暗号の文字変換(_文字,[_鍵文字|R2],_一文字回転した鍵文字ならび,_暗号文字) :- ならびの回転(左方向,_,['B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','A'],[_鍵文字|R]), nth1(_nth1,[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z],_文字), nth1(_nth1,[_鍵文字|R],_暗号文字), ならびの回転(左方向,1,[_鍵文字|R2],_一文字回転した鍵文字ならび),!. % 以下のサイトは # 出典: プログラミングのお題スレ Part4 #525 # お題:バイトごとに固定値とのXORでバイナリが暗号化される。正しい # バイナリを引数として指定するとtrueを返すような関数examがある。 # 正しいバイナリを暗号化した後、examを使って暗号化されたバイナ # リを解読するプログラムを作れ。正しいバイナリは{0x20,0x11,0x03,0x11}とし、 # 暗号化に使う固定値はプログラムの起動時にランダムに選ぶものとする。 'バイトごとに固定値とのXORでバイナリが暗号化される。 正しいバイナリを引数として指定するとtrueを返すような関数examがある。 正しいバイナリを暗号化した後、examを使って暗号化されたバイナリを解読するプログラムを作れ。 正しいバイナリは{0x20,0x11,0x03,0x11}とし、 暗号化に使う固定値はプログラムの起動時にランダムに選ぶものとする。'(_固定値,_正しいバイナリ,_暗号化されたバイナリ) :- _固定値 is random(255), '正しいバイナリを暗号化された後、'(_正しいバイナリ,_固定値,_暗号化されたバイナリ), exam(_正しいバイナリ). '正しいバイナリを暗号化された後、'(_正しいバイナリ,_固定値,_暗号化されたバイナリ) :- findall(_暗号化された値,( member(_値,_正しいバイナリ), _暗号化された値 is _値 # _固定値), _暗号化されたバイナリ), assertz(固定値(_固定値)), assertz(暗号化されたバイナリ(_暗号化されたバイナリ)). exam(_正しいバイナリ) :- 正しいバイナリを引数として指定すると(_正しいバイナリ), 暗号化されたバイナリ(_暗号化されたバイナリ), 固定値(_固定値), 各バイナリを固定値とXORすることによって復号化する(_暗号化されたバイナリ,_固定値,_正しいバイナリ). 正しいバイナリを引数として指定すると(_正しいバイナリ) :- \+(var(_正しいバイナリ)). 各バイナリを固定値とXORすることによって復号化する(_暗号化されたバイナリ,_固定値,_正しいバイナリ) :- findall(_復号化された値,( member(_値,_暗号化されたバイナリ), _復号化された値 is _値 # _固定値), _正しいバイナリ).