このディレクトリの索引

% 以下のサイトは fizzbuzz(_数,_FizzBuzz) :- '_FizzBuzzが変数でないときは、Fizz,Buzz,FizzBuzzの何れか、或いは自然数でなくてはならない'(_FizzBuzz), '_数を生成し_FizzBuzzを得る'(_数,_FizzBuzz). '_FizzBuzzが変数でないときは、Fizz,Buzz,FizzBuzzの何れか、或いは自然数でなくてはならない'(_FizzBuzz) :- '_FizzBuzzが変数でないときは、'(_FizzBuzz), 'Fizz,Buzz,FizzBuzzの何れか、或いは自然数でなくてはならない'(_FizzBuzz). '_FizzBuzzが変数でないときは、Fizz,Buzz,FizzBuzzの何れか、或いは自然数でなくてはならない'(_FizzBuzz) :- '_FizzBuzzが変数のときはこの条件検査の対象外である'(_FizzBuzz). '_FizzBuzzが変数でないときは、'(_FizzBuzz) :- \+(var(_FizzBuzz)). 'Fizz,Buzz,FizzBuzzの何れか、或いは自然数でなくてはならない'(_FizzBuzz) :- 'Fizz,Buzz,FizzBuzzの何れか、'(_FizzBuzz). 'Fizz,Buzz,FizzBuzzの何れか、或いは自然数でなくてはならない'(_FizzBuzz) :- 自然数でなくてはならない(_FizzBuzz). 'Fizz,Buzz,FizzBuzzの何れか、'(_FizzBuzz) :- member(_FizzBuzz,['Fizz','Buzz','FizzBuzz']). 自然数でなくてはならない(_FizzBuzz) :- integer(_FizzBuzz), _FizzBuzz > 0. '_FizzBuzzが変数のときはこの条件検査の対象外である'(_FizzBuzz) :- var(_FizzBuzz). '_数を生成し_FizzBuzzを得る'(_数,_FizzBuzz) :- '_数を生成し'(_数), ('_FizzBuzzが整数のときは_数 > _FizzBuzzの場合打ち切る'(_数,_FizzBuzz),!,fail; '_FizzBuzzを得る'(_数,_FizzBuzz)). '_数を生成し'(_数) :- nth1(_数,_,_). '_FizzBuzzが整数のときは_数 > _FizzBuzzの場合打ち切る'(_数,_FizzBuzz) :- integer(_FizzBuzz), _数 > _FizzBuzz. '_FizzBuzzを得る'(_数,'Fizz') :- '_数は3で割り切れて、5では割り切れない'(_数). '_FizzBuzzを得る'(_数,'Buzz') :- '_数は5で割り切れて、3では割り切れない'(_数). '_FizzBuzzを得る'(_数,'FizzBuzz') :- '_数は3でも5でも割り切れる'(_数). '_FizzBuzzを得る'(_数,_FizzBuzz) :- '_数が3でも5でも割り切れないときは_FizzBuzzには_数を返す'(_数,_FizzBuzz). '_数は3で割り切れて、5では割り切れない'(_数) :- '_数は3で割り切れて、'(_数), '5では割り切れない'(_数). '_数は3で割り切れて、'(_数) :- 0 is _数 mod 3. '5では割り切れない'(_数) :- \+(0 is _数 mod 5). '_数は5で割り切れて、3では割り切れない'(_数) :- '_数は5で割り切れて、'(_数), '3では割り切れない'(_数). '_数は5で割り切れて、'(_数) :- 0 is _数 mod 5. '3では割り切れない'(_数) :- \+(0 is _数 mod 3). '_数は3でも5でも割り切れる'(_数) :- 0 is _数 mod 3, 0 is _数 mod 5. '_数が3でも5でも割り切れないときは_FizzBuzzには_数を返す'(_数,_数) :- '_数が3でも割り切れない'(_数), '_数が5でも割り切れない'(_数). '_数が3でも割り切れない'(_数) :- \+(0 is _数 mod 3). '_数が5でも割り切れない'(_数) :- \+(0 is _数 mod 5). % 以下のサイトは fizzbuzz(_数,_FizzBuzz) :- '_FizzBuzzが変数でないときは、"Fizz","Buzz","FizzBuzz"の何れか、或いは自然数でなくてはならない'(_FizzBuzz), '_数を生成し_FizzBuzzを得る'(_数,_FizzBuzz). '_FizzBuzzが変数でないときは、"Fizz","Buzz","FizzBuzz"の何れか、或いは自然数でなくてはならない'(_FizzBuzz) :- '_FizzBuzzが変数でないときは、'(_FizzBuzz), '"Fizz","Buzz","FizzBuzz"の何れか、或いは自然数でなくてはならない'(_FizzBuzz). '_FizzBuzzが変数でないときは、"Fizz","Buzz","FizzBuzz"の何れか、或いは自然数でなくてはならない'(_FizzBuzz) :- '_FizzBuzzが変数のときはこの条件検査の対象外である'(_FizzBuzz). '_FizzBuzzが変数でないときは、'(_FizzBuzz) :- \+(var(_FizzBuzz)). '"Fizz","Buzz","FizzBuzz"の何れか、或いは自然数でなくてはならない'(_FizzBuzz) :- '"Fizz","Buzz","FizzBuzz"の何れか、'(_FizzBuzz). '"Fizz","Buzz","FizzBuzz"の何れか、或いは自然数でなくてはならない'(_FizzBuzz) :- 自然数でなくてはならない(_FizzBuzz). '"Fizz","Buzz","FizzBuzz"の何れか、'(_FizzBuzz) :- member(_FizzBuzz,["Fizz","Buzz","FizzBuzz"]). 自然数でなくてはならない(_FizzBuzz) :- integer(_FizzBuzz), _FizzBuzz > 0. '_FizzBuzzが変数のときはこの条件検査の対象外である'(_FizzBuzz) :- var(_FizzBuzz). '_数を生成し_FizzBuzzを得る'(_数,_FizzBuzz) :- '_数を生成し'(_数,_FizzBuzz), '_FizzBuzzを得る'(_数,_FizzBuzz). '_数を生成し'(_数,_FizzBuzz) :- nth1(_数,_,_). '_FizzBuzzを得る'(_数,"Fizz") :- '_数は3で割り切れて、5では割り切れない'(_数). '_FizzBuzzを得る'(_数,"Buzz") :- '_数は5で割り切れて、3では割り切れない'(_数). '_FizzBuzzを得る'(_数,"FizzBuzz") :- '_数は3でも5でも割り切れる'(_数). '_FizzBuzzを得る'(_数,_FizzBuzz) :- '_数が3でも5でも割り切れないときは_FizzBuzzには_数を返す'(_数,_FizzBuzz). '_数は3で割り切れて、5では割り切れない'(_数) :- '_数は3で割り切れて、'(_数), '5では割り切れない'(_数). '_数は3で割り切れて、'(_数) :- 0 is _数 mod 3. '5では割り切れない'(_数) :- \+(0 is _数 mod 5). '_数は5で割り切れて、3では割り切れない'(_数) :- '_数は5で割り切れて、'(_数), '3では割り切れない'(_数). '_数は5で割り切れて、'(_数) :- 0 is _数 mod 5. '3では割り切れない'(_数) :- \+(0 is _数 mod 3). '_数は3でも5でも割り切れる'(_数) :- 0 is _数 mod 3, 0 is _数 mod 5. '_数が3でも5でも割り切れないときは_FizzBuzzには_数を返す'(_数,_数) :- '_数が3でも割り切れない'(_数), '_数が5でも割り切れない'(_数). '_数が3でも割り切れない'(_数) :- \+(0 is _数 mod 3). '_数が5でも割り切れない'(_数) :- \+(0 is _数 mod 5). % 以下のサイトは fizzbuzz(_数,_FizzBuzz) :- '_数を生成し_FizzBuzzを得る'(_数,_FizzBuzz). '_数を生成し_FizzBuzzを得る'(_数,_FizzBuzz) :- '_数を生成し'(_数,_FizzBuzz), '_FizzBuzzを得る'(_数,_FizzBuzz). '_数を生成し'(_数,_FizzBuzz) :- nth1(_数,_,_). '_FizzBuzzを得る'(_数,"Fizz") :- '_数は3で割り切れて、5では割り切れない'(_数). '_FizzBuzzを得る'(_数,"Buzz") :- '_数は5で割り切れて、3では割り切れない'(_数). '_FizzBuzzを得る'(_数,"FizzBuzz") :- '_数は3でも5でも割り切れる'(_数). '_FizzBuzzを得る'(_数,_FizzBuzz) :- '_数が3で5でも割り切れないときは_数を返す'(_数,_FizzBuzz). '_数は3で割り切れて、5では割り切れない'(_数) :- 0 is _数 mod 3, \+(0 is _数 mod 5). '_数は5で割り切れて、3では割り切れない'(_数) :- 0 is _数 mod 5, \+(0 is _数 mod 3). '_数は3でも5でも割り切れる'(_数) :- 0 is _数 mod 3, 0 is _数 mod 5. '_数が3で5でも割り切れないときは_数を返す'(_数,_数) :- \+(0 is _数 mod 3), \+(0 is _数 mod 5). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1411227287/18 # 優先順位が文脈として矛盾・混乱しているようだ、優先度の高い順に # # 5で割り切れる場合は何も出力するな # 出力ごとに改行も入れろ # 4と6で割り切れる場合はFizzBuzzを出力しろ # 4で割り切れる場合はFizzを出力しろ # 6で割り切れる場合はBuzzを出力しろ # それ以外は数字を出力しろ # # ということか? # '5で割り切れる場合は何も出力するな 出力ごとに改行も入れろ 4と6で割り切れる場合はFizzBuzzを出力しろ 4で割り切れる場合はFizzを出力しろ 6で割り切れる場合はBuzzを' :- between(1,100,_数字), '5で割り切れる場合は何も出力するな 出力ごとに改行も入れろ 4と6で割り切れる場合はFizzBuzzを出力しろ 4で割り切れる場合はFizzを出力しろ 6で割り切れる場合はBuzzを出力しろ それ以外は数字を出力しろ'(_数字), _数字 = 100. '5で割り切れる場合は何も出力するな 出力ごとに改行も入れろ 4と6で割り切れる場合はFizzBuzzを出力しろ 4で割り切れる場合はFizzを出力しろ 6で割り切れる場合はBuzzを出力しろ それ以外は数字を出力しろ'(_数字) :- '5で割り切れた時は何も出力するな'(_数字,_表示), '5では割り切れず、Fizz、Buzz、またはFizzBuzzを表示するのは4または6で割り切れる時'(_数字,_表示), 'それ以外は数字を'(_数字,_表示), '出力しろ(出力ごとに改行も入れろ)'(_表示). '5で割り切れた時は何も出力するな'(_数字,'') :- '5で割り切れた'(_数字),!. '5で割り切れた時は何も出力するな'(_,_). '5では割り切れず、Fizz、Buzz、またはFizzBuzzを表示するのは4または6で割り切れる時'(_数字,_表示) :- '5では割り切れず、4と6で割り切れる場合はFizzBuzzを'(_数字,_表示),!. '5では割り切れず、Fizz、Buzz、またはFizzBuzzを表示するのは4または6で割り切れる時'(_数字,_表示) :- '5では割り切れず、4で割り切れる場合はFizzを'(_数字,_表示),!. '5では割り切れず、Fizz、Buzz、またはFizzBuzzを表示するのは4または6で割り切れる時'(_数字,_表示) :- '5では割り切れず、6で割り切れる場合はBuzzを'(_数字,_表示),!. '5では割り切れず、Fizz、Buzz、またはFizzBuzzを表示するのは4または6で割り切れる時'(_,_). '5では割り切れず、4と6で割り切れる場合はFizzBuzzを'(_数字,'FizzBuzz') :- '5では割り切れず'(_数字), '4と6で割り切れる'(_数字),!. '5では割り切れず、4で割り切れる場合はFizzを'(_数字,'Fizz') :- '5では割り切れず、4で割り切れる'(_数字). '5では割り切れず、6で割り切れる場合はBuzzを'(_数字,'Buzz') :- '5では割り切れず、6で割り切れる'(_数字). '5では割り切れず、4で割り切れる'(_数字) :- '5では割り切れず'(_数字), '4で割り切れる'(_数字), \+('6で割り切れる'(_数字)). '5では割り切れず、6で割り切れる'(_数字) :- '5では割り切れず'(_数字), '6で割り切れる'(_数字), \+('4で割り切れる'(_数字)). '5で割り切れた'(_数字) :- 0 is _数字 mod 5. '5では割り切れず'(_数字) :- \+(0 is _数字 mod 5). '4と6で割り切れる'(_数字) :- '4で割り切れる'(_数字), '6で割り切れる'(_数字). '4で割り切れる'(_数字) :- 0 is _数字 mod 4. '6で割り切れる'(_数字) :- 0 is _数字 mod 6. 'それ以外は数字を'(_数字,V) :- var(V), _数字=V,!. 'それ以外は数字を'(_,_). '出力しろ(出力ごとに改行も入れろ)'('') :- !. '出力しろ(出力ごとに改行も入れろ)'(_表示) :- writef('%t\n',[_表示]). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1411227287/18 # 優先順位が文脈として矛盾・混乱しているようだ、優先度の高い順に # # 5で割り切れる場合は何も出力するな # 出力ごとに改行も入れろ # 4と6で割り切れる場合はFizzBuzzを出力しろ # 4で割り切れる場合はFizzを出力しろ # 6で割り切れる場合はBuzzを出力しろ # それ以外は数字を出力しろ # # ということか? # '5で割り切れる場合は何も出力するな 出力ごとに改行も入れろ 4と6で割り切れる場合はFizzBuzzを出力しろ 4で割り切れる場合はFizzを出力しろ 6で割り切れる場合はBuzzを出力しろ それ以外は数字を出力しろ'(_数字) :- '5で割り切れる場合は何も出力するな'(_数字),!. '5で割り切れる場合は何も出力するな 出力ごとに改行も入れろ 4と6で割り切れる場合はFizzBuzzを出力しろ 4で割り切れる場合はFizzを出力しろ 6で割り切れる場合はBuzzを出力しろ それ以外は数字を出力しろ'(_数字) :- '4と6で割り切れる場合はFizzBuzzを出力しろ(出力ごとに改行も入れろ)'(_数字),!. '5で割り切れる場合は何も出力するな 出力ごとに改行も入れろ 4と6で割り切れる場合はFizzBuzzを出力しろ 4で割り切れる場合はFizzを出力しろ 6で割り切れる場合はBuzzを出力しろ それ以外は数字を出力しろ'(_数字) :- '4で割り切れる場合はFizzを出力しろ(出力ごとに改行も入れろ)'(_数字),!. '5で割り切れる場合は何も出力するな 出力ごとに改行も入れろ 4と6で割り切れる場合はFizzBuzzを出力しろ 4で割り切れる場合はFizzを出力しろ 6で割り切れる場合はBuzzを出力しろ それ以外は数字を出力しろ'(_数字) :- '6で割り切れる場合はBuzzを出力しろ(出力ごとに改行も入れろ)'(_数字),!. '5で割り切れる場合は何も出力するな 出力ごとに改行も入れろ 4と6で割り切れる場合はFizzBuzzを出力しろ 4で割り切れる場合はFizzを出力しろ 6で割り切れる場合はBuzzを出力しろ それ以外は数字を出力しろ'(_数字) :- 'それ以外は数字を出力しろ(出力ごとに改行も入れろ)'(_数字). '5で割り切れる場合は何も出力するな'(_数字) :- 0 is _数字 mod 5. '4と6で割り切れる場合はFizzBuzzを出力しろ(出力ごとに改行も入れろ)'(_数字) :- 0 is _数字 mod 4, 0 is _数字 mod 6, write('FizzBuzz\n'). '4で割り切れる場合はFizzを出力しろ(出力ごとに改行も入れろ)'(_数字) :- 0 is _数字 mod 4, write('Fizz\n'). '6で割り切れる場合はBuzzを出力しろ(出力ごとに改行も入れろ)'(_数字) :- 0 is _数字 mod 6, write('Buzz\n'). 'それ以外は数字を出力しろ(出力ごとに改行も入れろ)'(_数字) :- writef('%t\n',[_数字]). % 以下のサイトは 'FizzBuzzはやさしい課題です。やさしいからこそどのプログラム言語でも 書けますし、それぞれの言語の特長が微妙に表れます。それで最近好まれる課題です。 課題としてのFizzBuzzは、整数を1からある数まで数え上げて、その数が、 3で割り切れたらFizzを5で割り切れたらBuzzをどちらでも割り切れない時はその数を 表示します。3と5の両数で割り切れる場合はFizzBuzzと続けて表示することになります。 ひとつの数を表示したら改行し、ある数まで表示し終わったら終了します。'(_ある数) :- '整数を1からある数まで数え上げて'(_ある数,_数), '数が、3で割り切れたらFizzを 5で割り切れたらBuzzを どちらでも割り切れない時はその数を'(_数,_Fizzの表示枠,_Buzzの表示枠,_数の表示枠), '表示します。ひとつの数を表示したら改行し、'(_Fizzの表示枠,_Buzzの表示枠,_数の表示枠), 'ある数まで表示し終わったら終了します。'(_ある数,_数). '整数を1からある数まで数え上げて'(_ある数,_数) :- between(1,_ある数,_数). '数が、3で割り切れたらFizzを 5で割り切れたらBuzzを どちらでも割り切れない時はその数を'(_数,_Fizzの表示枠,_Buzzの表示枠,_数の表示枠) :- '数が、3で割り切れたらFizzを'(_数,_Fizzの表示枠), '数が、5で割り切れたらBuzzを'(_数,_Buzzの表示枠), 'どちらでも割り切れない時はその数を'(_数,_数の表示枠). '数が、3で割り切れたらFizzを'(_数,'Fizz') :- 0 is _数 mod 3,!. '数が、3で割り切れたらFizzを'(_,''). '数が、5で割り切れたらBuzzを'(_数,'Buzz') :- 0 is _数 mod 5,!. '数が、5で割り切れたらBuzzを'(_,''). 'どちらでも割り切れない時はその数を'(_数,_数の表示枠) :- \+(0 is _数 mod 3), \+(0 is _数 mod 5), swritef(_数の表示枠,'%t',[_数]),!. 'どちらでも割り切れない時はその数を'(_,''). '表示します。ひとつの数を表示したら改行し、'(_Fizzの表示枠,_Buzzの表示枠,_数の表示枠) :- writef('%t%t%t',[_Fizzの表示枠,_Buzzの表示枠,_数の表示枠]), nl. 'ある数まで表示し終わったら終了します。'(_数,_数). % 以下のサイトは # 出題: http://toro.2ch.net/test/read.cgi/tech/1390525149/231 # 出題補足: http://toro.2ch.net/test/read.cgi/tech/1390525149/238 # [1] 授業単元名:FizzBuzzクイズ # [2] 問題文(含コード&リンク): # [3] 環境 #  [3.1] OS: (Windows/Linux/等々)特に問わない #  [3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等)特に問わない #  [3.3] 言語: (C/C++/どちらでも可 のいずれか)C++/Java # # (p)http://kohada.2ch.net/test/read.cgi/prog/1209467166/401 # FizzBuzzクイズ # # 1.fizz.buzz #=> 1 # 3.fizz.buzz #=> "Fizz" # 5.fizz.buzz #=> "Buzz" # 15.fizz.buzz #=> "FizzBuzz" # 999.fizz.buzz #=> 999 # # となるようなメソッドfizz、buzzは定義可能か? # 可能である場合、同様にgizzを追加定義し、 # 7.fizz.buzz.gizz #=> "Gizz" # 21.fizz.buzz.gizz #=> "FizzGizz" # 35.fizz.buzz.gizz #=> "BuzzGizz" # 105.fizz.buzz.gizz #=> "FizzBuzzGizz" # 105.fizz.gizz.buzz #=> "FizzGizzBuzz" と拡張・応用ができるか? # # メソッドのコールに()が必須の言語では 3.fizz().buzz() 形式でも構わない。 # オープンクラス機構やメソッドのない言語では関数(buzz(fizz(3)) #=> "Fizz" など)で。 fizzbuzzgizz(N) :- fizzbuzzgizz([],N,['','','Fizz'],['','','','','Buzz'],['','','','','','','Gizz']). fizzbuzzgizz(L,N,_,_,_) :- length(L,N),!. fizzbuzzgizz(Ln,N,[_31,_32,_33],[_51,_52,_53,_54,_55],[_71,_72,_73,_74,_75,_76,_77]) :- fizzbuzzgizz_1(_31,_51,_71,Ln,A), writef('%t%t%t%t ',[_31,_51,_71,A]), fizzbuzzgizz([_|Ln],N,[_32,_33,_31],[_52,_53,_54,_55,_51],[_72,_73,_74,_75,_76,_77,_71]). fizzbuzzgizz_1('','','',Ln,M) :- length([_|Ln],M),!. fizzbuzzgizz_1(_,_,_,_,''). % 以下のサイトは # # フィボナッチ数列によるFizzBuzz # フィボナッチ数列を表示してのFizzBuzz(N) :- fibfizzbuzz(N). fibfizzbuzz(N) :- fibfizzbuzz_2(1,0,1,Y,FizzBuzz), writef('%t ',[FizzBuzz]), Y = N. fibfizzbuzz(N,_1,_2,Y,FizzBuzz) :- _4 is _1 + _2, fibfizzbuzz_2(N,_2,_4,Y,FizzBuzz). fibfizzbuzz_2(1,0,1,1,1). fibfizzbuzz_2(N,_2,_4,N,FizzBuzz) :- N > 1, fizzbuzz診断(N,_4,FizzBuzz). fibfizzbuzz_2(N,_2,_4,Y,FizzBuzz) :- N_2 is N + 1, fibfizzbuzz(N_2,_2,_4,Y,FizzBuzz). fizzbuzz診断(_,_4,'FizzBuzz') :- 0 is _4 mod 15,!. fizzbuzz診断(_,_4,'Fizz') :- 0 is _4 mod 3,!. fizzbuzz診断(_,_4,'Buzz') :- 0 is _4 mod 5,!. fizzbuzz診断(_,_4,_4). % 以下のサイトは # # フィボナッチ数列によるFizzBuzz # フィボナッチ数列番号と見てのFizzBuzz(N) :- fibfizzbuzz(N). fibfizzbuzz(N) :- fibfizzbuzz_2(1,0,1,Y,FizzBuzz), writef('%t ',[FizzBuzz]), Y = N. fibfizzbuzz(N,_1,_2,Y,FizzBuzz) :- _4 is _1 + _2, fibfizzbuzz_2(N,_2,_4,Y,FizzBuzz). fibfizzbuzz_2(1,0,1,1,1). fibfizzbuzz_2(N,_2,_4,N,FizzBuzz) :- N > 1, fizzbuzz診断(N,_4,FizzBuzz). fibfizzbuzz_2(N,_2,_4,Y,FizzBuzz) :- N_2 is N + 1, fibfizzbuzz(N_2,_2,_4,Y,FizzBuzz). fizzbuzz診断(_,_4,'FizzBuzz') :- 0 is _4 mod 15,!. fizzbuzz診断(_,_4,'Fizz') :- 0 is _4 mod 3,!. fizzbuzz診断(_,_4,'Buzz') :- 0 is _4 mod 5,!. fizzbuzz診断(N,_4,N). % 以下のサイトは % % @Di_GlassさんによるFizzBuzz % % 2013/11/04 fizzbuzz(0). fizzbuzz(N):-N1 is N-1, F is N/3, integer(F), B is N/5, integer(B), fizzbuzz(N1), print('FizzBuzz'),nl. fizzbuzz(N):-N1 is N-1, F is N/3, integer(F), fizzbuzz(N1), print('Fizz'),nl. fizzbuzz(N):-N1 is N-1, F is N/5, integer(F), fizzbuzz(N1), print('Buzz'),nl. fizzbuzz(N):-N1 is N-1, fizzbuzz(N1), print(N),nl. % 以下のサイトは # [1] 授業単元:プログラミング # [2] 問題文 # ・1から100までの数をプリントするプログラムを書け。ただしフェルマー素数のときは # 数の代わりに「Fizz」と、オイラー素数のときは「Buzz」とプリントし、フェルマー素数とオイラー素数両方の倍数の場合には「FizzBuzz」とプリントすること。 # '1から100までの数をプリントするプログラムを書け。ただしフェルマー素数のときは数の代わりに「Fizz」と、オイラー素数のときは「Buzz」とプリントし、フェルマー素数とオイラー素数両方の倍数の場合には「FizzBuzz」とプリントすること。' :- '1から100までの範囲のフェルマー素数とオイラー素数を得る'(_フェルマー素数ならび,_オイラー素数ならび), '1から100までの範囲のフェルマー素数とオイラー素数両方の倍数を得る'(_フェルマー素数ならび,_オイラー素数ならび,_フェルマー素数とオイラー素数両方の倍数ならび), '1から100までの数をプリントする。ただしフェルマー素数のときは数の代わりに「Fizz」と、オイラー素数のときは「Buzz」とプリントし、フェルマー素数とオイラー素数両方の倍数の場合には「FizzBuzz」とプリントすること。'(_フェルマー素数ならび,_オイラー素数ならび,_フェルマー素数とオイラー素数両方の倍数ならび,_n), write(' '), _n = 100. '1から100までの範囲のフェルマー素数とオイラー素数を得る'(_フェルマー素数ならび,_オイラー素数ならび) :- '1から100までの範囲のフェルマー素数を得る'(_フェルマー素数ならび), '1から100までの範囲のオイラー素数を得る'(_オイラー素数ならび). '1から100までの範囲のフェルマー素数を得る'(_フェルマー素数ならび) :- findall(_n,( between(1,100,_n), フェルマー素数(_n)), _フェルマー素数ならび). '1から100までの範囲のオイラー素数を得る'(_オイラー素数ならび) :- findall(_n,( between(1,100,_n), オイラー素数(_n)), _オイラー素数ならび). '1から100までの範囲のフェルマー素数とオイラー素数両方の倍数を得る'(_フェルマー素数ならび,_オイラー素数ならび,_フェルマー素数とオイラー素数両方の倍数ならび) :- findall(_n,( between(1,100,_n), フェルマー素数とオイラー素数両方の倍数(_n,_フェルマー素数ならび,_オイラー素数ならび)), _フェルマー素数とオイラー素数両方の倍数ならび). フェルマー素数とオイラー素数両方の倍数(_n,_フェルマー素数ならび,_オイラー素数ならび) :- member(_フェルマー素数,_フェルマー素数ならび), member(_オイラー素数,_オイラー素数ならび), 0 is _n mod _フェルマー素数, 0 is _n mod _オイラー素数,!. '1から100までの数をプリントする。ただしフェルマー素数のときは数の代わりに「Fizz」と、オイラー素数のときは「Buzz」とプリントし、フェルマー素数とオイラー素数両方の倍数の場合には「FizzBuzz」とプリントすること。'(_フェルマー素数ならび,_オイラー素数ならび,_フェルマー素数とオイラー素数両方の倍数ならび,_n) :- '1から100までの'(_n), '数をプリントする。ただしフェルマー素数のときは数の代わりに「Fizz」と、オイラー素数のときは「Buzz」とプリントし、フェルマー素数とオイラー素数両方の倍数の場合には「FizzBuzz」とプリントすること。'(_n,_フェルマー素数ならび,_オイラー素数ならび,_フェルマー素数とオイラー素数両方の倍数ならび). '1から100までの'(_n) :- between(1,100,_n). '数をプリントする。ただしフェルマー素数のときは数の代わりに「Fizz」と、オイラー素数のときは「Buzz」とプリントし、フェルマー素数とオイラー素数両方の倍数の場合には「FizzBuzz」とプリントすること。'(_n,_,_,_フェルマー素数とオイラー素数両方の倍数ならび) :- 'フェルマー素数とオイラー素数両方の倍数の場合には「FizzBuzz」と'(_n,_フェルマー素数とオイラー素数両方の倍数ならび),!. '数をプリントする。ただしフェルマー素数のときは数の代わりに「Fizz」と、オイラー素数のときは「Buzz」とプリントし、フェルマー素数とオイラー素数両方の倍数の場合には「FizzBuzz」とプリントすること。'(_n,_フェルマー素数ならび,_,_) :- 'フェルマー素数のときは数の代わりに「Fizz」と'(_n,_フェルマー素数ならび),!. '数をプリントする。ただしフェルマー素数のときは数の代わりに「Fizz」と、オイラー素数のときは「Buzz」とプリントし、フェルマー素数とオイラー素数両方の倍数の場合には「FizzBuzz」とプリントすること。'(_n,_,_オイラー素数ならび,_) :- 'オイラー素数のときは「Buzz」と'(_n,_オイラー素数ならび),!. '数をプリントする。ただしフェルマー素数のときは数の代わりに「Fizz」と、オイラー素数のときは「Buzz」とプリントし、フェルマー素数とオイラー素数両方の倍数の場合には「FizzBuzz」とプリントすること。'(_n,_,_,_) :- writef('%t',[_n]). 'フェルマー素数とオイラー素数両方の倍数の場合には「FizzBuzz」と'(_n,_フェルマー素数とオイラー素数両方の倍数ならび) :- member(_n,_フェルマー素数とオイラー素数両方の倍数ならび), write('FizzBuzz'),!. 'フェルマー素数のときは数の代わりに「Fizz」と'(_n,_フェルマー素数ならび) :- member(_n,_フェルマー素数ならび), write('Fizz'). 'オイラー素数のときは「Buzz」と'(_n,_オイラー素数ならび) :- member(_n,_オイラー素数ならび), write('Buzz'). オイラー素数(_オイラー素数) :- between(0,39,_n), _オイラー素数 is _n * _n + _n + 41. フェルマー素数(_フェルマー素数) :- between(0,4,_n), _フェルマー素数 is truncate(2 ^ (2 ^ _n) + 1). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1361082416/59 # # ../test/read.cgi/tech/1361082416/48 # http://kohada.2ch.net/test/read.cgi/prog/1209467166/401 # FizzBuzzクイズ # # 1.fizz.buzz #=> 1 # 3.fizz.buzz #=> "Fizz" # 5.fizz.buzz #=> "Buzz" # 15.fizz.buzz #=> "FizzBuzz" # 997.fizz.buzz #=> 997 # # となるようなメソッドfizz、buzzは定義可能か? # 可能である場合、同様にgizzを追加定義し、 # 7.fizz.buzz.gizz #=> "Gizz" # 21.fizz.buzz.gizz #=> "FizzGizz" # 35.fizz.buzz.gizz #=> "BuzzGizz" # 105.fizz.buzz.gizz #=> "FizzBuzzGizz" # と拡張・応用ができるか? # # メソッドのコールに()が必須の言語では 3.fizz().buzz() 形式でも構わない。 # オープンクラス機構やメソッドのない言語では関数(buzz(fizz(3)) #=> "Fizz" など)で。 # # 'FizzBuzzGizz' :- 'FizzBuzzGizz'([],['','','Fizz'],['','','','','Buzz'],['','','','','','','Gizz']). 'FizzBuzzGizz'(Ln,_,_,_) :- length(Ln,100),!. 'FizzBuzzGizz'(Ln,L1,L2,L3) :- 'FizzBuzzGizz'([_|Ln],L1,L2,L3,_表示情報), writef('%t\n',[_表示情報]), 三つのリストの左シフト(L1,L2,L3,L1_2,L2_2,L3_2), 'FizzBuzzGizz'([_|Ln],L1_2,L2_2,L3_2). 'FizzBuzzGizz'(Ln,[''|_],[''|_],[''|_],_数値) :- length(Ln,_数値),!. 'FizzBuzzGizz'(Ln,[A|_],[B|_],[C|_],_FizzBuzzGizz文字列) :- atomic_list_concat([A,B,C],_FizzBuzzGizz文字列). 三つのリストの左シフト([A|R1],[B|R2],[C|R3],L1,L2,L3) :- append(R1,[A],L1), append(R2,[B],L2), append(R3,[C],L3). % 以下のサイトは % % PrologというのはFizzBuzz問題向きなのだろうか。 % fizzbuzz(N) :- findall(M,between(1,N,M),L), fizzbuzz([_],[_],L). fizzbuzz([_,_,_],[_,_,_,_,_],[_|R]) :- fizzbuzz([],[],['FizzBuzz'|R]). fizzbuzz([_,_,_],L2,[_|R]) :- fizzbuzz([],L2,['Fizz'|R]). fizzbuzz(L1,[_,_,_,_,_],[_|R]) :- fizzbuzz(L1,[],['Buzz'|R]). fizzbuzz(L1,L2,[A|R]) :- writef('%t ',[A]), fizzbuzz([_|L1],[_|L2],R). fizzbuzz(_,_,[]). fizzbuzz(N) :- fizbuzz(1,N,['','','Fizz'],['','','','','Buzz']). fizzbuzz(M,N,_,_) :- M > N,!. fizzbuzz(M,N,[_31,_32,_33],[_51,_52,_53,_54,_55]) :- 出力情報(_31,_51,M,_N), writef('%t%t%t ',[_31,_51,_N]), fizzbuzz(M,N,[_32,_33,_31],[_52,_53,_54,_55,_51]). 出力情報('','',_N,_N) :- !. 出力情報(_,_,_,''). fizzbuzz(N) :- findall(M,between(1,N,M),L), forall(fizzbuzz(['','','Fizz'],['','','','','Buzz'],L),true). fizzbuzz([A|R1],[B|R2],[N|R3]) :- fizzbuzz(A,B,N,C), writef('%t%t%t ',[A,B,C]). fizzbuzz([A|R1],[B|R2],[_|R3]) :- append(R1,[A],L1), append(R2,[B],L2), fizzbuzz(L1,L2,R3). fizzbuzz('','',N,N) :- !. fizzbuzz(A,B,_,''). % PrologによるFizzBuzz問題プログラムの比較 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1361082416/48 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # FizzBuzz問題の要領で、1から100までの整数を、かいぎょう区切りで出力せよ、ただし、 # 3の倍数なら「Fizz」を、7の倍数なら「Buzz」を、13の倍数なら「hoge」を、 # 数値の代わりに出力することとする # '1から100までの整数をかいぎょう区切りで出力せよ、ただし、3の倍数なら「Fizz」を、7の倍数なら「Buzz」を、13の倍数なら「hoge」を、数値の代わりに出力することとする' :- 'かいぎょう区切りで出力せよ、ただし、3の倍数なら「Fizz」を、7の倍数なら「Buzz」を、13の倍数なら「hoge」を、数値の代わりに出力することとする'([],['','','Fizz'],['','','','','','','Buzz'],['','','','','','','','','','','','','hoge']). 'かいぎょう区切りで出力せよ、ただし、3の倍数なら「Fizz」を、7の倍数なら「Buzz」を、13の倍数なら「hoge」を、数値の代わりに出力することとする'(Ln,_,_,_) :- length(Ln,100),!. 'かいぎょう区切りで出力せよ、ただし、3の倍数なら「Fizz」を、7の倍数なら「Buzz」を、13の倍数なら「hoge」を、数値の代わりに出力することとする'(Ln,L1,L2,L3) :- '3の倍数なら「Fizz」を、7の倍数なら「Buzz」を、13の倍数なら「hoge」を、数値の代わりに'([_|Ln],L1,L2,L3,_表示情報), writef('%t\n',[_表示情報]), 三つのならびの左方向へ回転(L1,L2,L3,L1_2,L2_2,L3_2), 'かいぎょう区切りで出力せよ、ただし、3の倍数なら「Fizz」を、7の倍数なら「Buzz」を、13の倍数なら「hoge」を、数値の代わりに出力することとする'([_|Ln],L1_2,L2_2,L3_2). '3の倍数なら「Fizz」を、7の倍数なら「Buzz」を、13の倍数なら「hoge」を、数値の代わりに'(Ln,[''|_],[''|_],[''|_],_数値) :- length(Ln,_数値),!. '3の倍数なら「Fizz」を、7の倍数なら「Buzz」を、13の倍数なら「hoge」を、数値の代わりに'(Ln,[A|_],[B|_],[C|_],_FizzBuzzhoge文字列) :- atomic_list_concat([A,B,C],_FizzBuzzhoge文字列). 三つのならびの左方向へ回転([A|R1],[B|R2],[C|R3],L1,L2,L3) :- append(R1,[A],L1), append(R2,[B],L2), append(R3,[C],L3). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1361082416/48 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # FizzBuzz問題の要領で、1から100までの整数を、かいぎょう区切りで出力せよ、ただし、 # 3の倍数なら「Fizz」を、7の倍数なら「Buzz」を、13の倍数なら「hoge」を、 # 数値の代わりに出力することとする # '1から100までの整数をかいぎょう区切りで出力せよ、ただし、3の倍数なら「Fizz」を、7の倍数なら「Buzz」を、13の倍数なら「hoge」を、数値の代わりに出力することとする' :- '1から100までの整数を'(_整数), 'かいぎょう区切りで出力せよ、ただし、3の倍数なら「Fizz」を、7の倍数なら「Buzz」を、13の倍数なら「hoge」を、数値の代わりに出力することとする'(_整数), _整数 = 100. '1から100までの整数を'(_整数) :- between(1,100,_整数). 'かいぎょう区切りで出力せよ、ただし、3の倍数なら「Fizz」を、7の倍数なら「Buzz」を、13の倍数なら「hoge」を、数値の代わりに出力することとする'(N) :- 0 is N mod 3, writef('%t',['Fizz']), fail. 'かいぎょう区切りで出力せよ、ただし、3の倍数なら「Fizz」を、7の倍数なら「Buzz」を、13の倍数なら「hoge」を、数値の代わりに出力することとする'(N) :- 0 is N mod 7, writef('%t',['Buzz']), fail. 'かいぎょう区切りで出力せよ、ただし、3の倍数なら「Fizz」を、7の倍数なら「Buzz」を、13の倍数なら「hoge」を、数値の代わりに出力することとする'(N) :- 0 is N mod 13, writef('%t',[hoge]), fail. 'かいぎょう区切りで出力せよ、ただし、3の倍数なら「Fizz」を、7の倍数なら「Buzz」を、13の倍数なら「hoge」を、数値の代わりに出力することとする'(N) :- \+(0 is N mod 3), \+(0 is N mod 7), \+(0 is N mod 13), writef('%t',[N]), fail. 'かいぎょう区切りで出力せよ、ただし、3の倍数なら「Fizz」を、7の倍数なら「Buzz」を、13の倍数なら「hoge」を、数値の代わりに出力することとする'(_) :- write('\n'). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/998 # # [1] 授業単元: # [2] 問題文(含コード&リンク): # FizzBuzz問題の要領で、1から100までの整数を、かいぎょう区切りで出力せよ、ただし、 # 3の倍数なら「Fizz」を、5の倍数なら「Buzz」を、7の倍数なら「hoge」を、 # 数値の代わりに出力することとする # 'FizzBuzz問題の要領で、1から100までの整数を、かいぎょう区切りで出力せよ、ただし、 3の倍数なら「Fizz」を、5の倍数なら「Buzz」を、7の倍数なら「hoge」を、 数値の代わりに、かいぎょう区切りで出力することとする' :- '1から100までの整数を、'(_整数), '3の倍数なら「Fizz」を、5の倍数なら「Buzz」を、7の倍数なら「hoge」を、数値の代わりに、かいぎょう区切りで出力することとする'(_整数), _整数 = 100. '1から100までの整数を、'(_整数) :- between(1,100,_整数). '3の倍数なら「Fizz」を、5の倍数なら「Buzz」を、7の倍数なら「hoge」を、数値の代わりに、かいぎょう区切りで出力することとする'(_整数) :- '3の倍数なら「Fizz」を、5の倍数なら「Buzz」を、7の倍数なら「hoge」を、該当しない時は数値を'(_整数,_出力値), writef('%t\n',[_出力値]). '3の倍数なら「Fizz」を、5の倍数なら「Buzz」を、7の倍数なら「hoge」を、該当しない時は数値を'(_整数,_出力文字列) :- '3の倍数なら「Fizz」を、5の倍数なら「Buzz」を、7の倍数なら「hoge」のどれかが該当したとき'(_整数,_表示ならび), atomic_list_concat(_表示ならび,_表示文字列),!. '3の倍数なら「Fizz」を、5の倍数なら「Buzz」を、7の倍数なら「hoge」を、該当しない時は数値を'(_整数,_整数). '3の倍数なら「Fizz」を、5の倍数なら「Buzz」を、7の倍数なら「hoge」のどれかが該当したとき'(_整数,_表示ならび) :- findall(A,( '3の倍数なら「Fizz」を、5の倍数なら「Buzz」を、7の倍数なら「hoge」の'(_整数,A)), _表示ならび), どれかが該当したとき(_表示ならび). '3の倍数なら「Fizz」を、5の倍数なら「Buzz」を、7の倍数なら「hoge」の'(_整数,A) :- member([_除数,A],[[3,'Fizz'],[5,'Buzz'],[7,hoge]]), 0 is _整数 mod _除数. どれかが該当したとき([_|_]). % 以下のサイトは # FizzBuzzは有名問題すぎるので良くないという話があったので、 # じゃあちょっと問題を変えて、 # x1..xnとnを入力にとり、xiのいずれかで割り切れる自然数のうち # 小さいものからn番目の数を出力とかどうだろう。 'x1..xnとnを入力にとり、xiのいずれかで割り切れる自然数のうち小さいものからn番目の数を出力する'(XL,_n) :- 'XLの何れかで割り切れる自然数のうち小さいものからn番目の数'(XL,_n,_n番目の数), 'n番目の数を出力する'(_n,_n番目の自然数). 'XLの何れかで割り切れる自然数のうち小さいものからn番目の数'(XL,_n,_n番目の自然数) :- length([_n番目の数|R],_n), 'XLの任意の要素で割り切れる自然数ならびを要素数nまで成長させる'(XL,1,[],[_n番目の自然数|R]),!. 'XLの任意の要素で割り切れる自然数ならびを要素数nまで成長させる'(_,_,L,L) :- !. 'XLの任意の要素で割り切れる自然数ならびを要素数nまで成長させる'(XL,M,L1,L) :- 'MはXLの任意の要素で割り切れる'(M,XL), M2 is M + 1, 'XLの任意の要素で割り切れる自然数ならびを要素数nまで成長させる'(XL,M2,[M|L1],L). 'XLの任意の要素で割り切れる自然数ならびを要素数nまで成長させる'(XL,M,L1,L) :- M2 is M + 1, 'XLの任意の要素で割り切れる自然数ならびを要素数nまで成長させる'(XL,M2,L1,L). 'NはXLの任意の要素で割り切れる'(N,[M|R]) :- 0 is N mod M,!. 'NはXLの任意の要素で割り切れる'(N,[_|R]) :- 'NはXLの任意の要素で割り切れる'(N,R). 'n番目の数を出力する'(_n,_n番目の自然数) :- writef('%t番目の自然数は %t です\n',[_n,_n番目の自然数]),!. % 以下のサイトは # FizzBuzzは有名問題すぎるので良くないという話があったので、 # じゃあちょっと問題を変えて、 # x1..xnとnを入力にとり、xiのいずれかで割り切れる自然数のうち # 小さいものからn番目の数を出力とかどうだろう。 'x1..xnとnを入力にとり、xiのいずれかで割り切れる自然数のうち小さいものからn番目の数を出力する'(XL,_n) :- length([_n番目の自然数|R],_n), 'XLの何れかで割り切れる自然数のうち小さいものからn番目の数'(XL,1,[],[_n番目の自然数|R]), writef('%番目の自然数は %t です\n',[_n,_n番目の自然数]). 'XLの何れかで割り切れる自然数のうち小さいものからn番目'(XL,N,L,L) :- !. 'XLの何れかで割り切れる自然数のうち小さいものからn番目'(XL,N,L1,L) :- 'NはXLの任意の要素で割り切れる'(N,XL), N2 is N + 1, 'XLの何れかで割り切れる自然数のうち小さいものからn番目'(XL,N2,[N|L1],L). 'XLの何れかで割り切れる自然数のうち小さいものからn番目'(XL,N,L1,L) :- N2 is N + 1, 'XLの何れかで割り切れる自然数のうち小さいものからn番目'(XL,N2,L1,L). 'NはXLの任意の要素で割り切れる'(N,[M|R]) :- 0 is N mod M,!. 'NはXLの任意の要素で割り切れる'(N,[_|R]) :- 'NはXLの任意の要素で割り切れる'(N,R). % 以下のサイトは # http://d.hatena.ne.jp/JunichiIto/touch/20111007/1317976730 # # Fizz-Buzz問題の例はこんな感じだ。 # # 1から100までの数をプリントするプログラムを書け。 # ただし3の倍数のときは数の代わりに「Fizz」と、 # 5の倍数のときは「Buzz」とプリントし、 # 3と5両方の倍数の場合には「FizzBuzz」とプリントすること。 # # ちゃんとしたプログラマであれば、 # これを実行するプログラムを2分とかからずに紙に書き出せるはずだ。 # 怖い事実を聞きたい? コンピュータサイエンス学科卒業生の過半数には # それができないのだ。 # 自称上級プログラマが答えを書くのに10-15分もかかっているのを見たこともある。 # 'Fizz-Buzz問題の例' :- '1から100までの数をプリントするプログラムを書け。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントすること。'. '1から100までの数をプリントするプログラムを書け。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントすること。' :- for(1,N,100), '1から100までの数をプリントする。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントする'(N), N = 100. '1から100までの数をプリントする。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントする'(N) :- 'ただし3の倍数のときは数の代わりに「Fizz」と'(N,_表示アトム), プリントする(_表示アトム),!. '1から100までの数をプリントする。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントする'(N) :- 'ただし5の倍数のときは数の代わりに「Buzz」と'(N,_表示アトム), プリントする(_表示アトム),!. '1から100までの数をプリントする。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントする'(N) :- '3と5両方の倍数のときは数の代わりに「FizzBuzz」と'(N,_表示アトム), プリントする(_表示アトム),!. '1から100までの数をプリントする。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントする'(N) :- '3の倍数でなく、5の倍数でもない場合は数字をそのまま'(N,_表示アトム), プリントする(_表示アトム),!. 'ただし3の倍数のときは数の代わりに「Fizz」と'(N,'Fizz') :- 0 is N mod 3, \+(0 is N mod 5). 'ただし5の倍数のときは数の代わりに「Buzz」と'(N,'Buzz') :- 0 is N mod 3, \+(0 is N mod 5). '3と5両方の倍数の場合には「FizzBuzz」'(N,'FizzBuzz') :- 0 is N mod 3, 0 is N mod 5. '3の倍数でなく、5の倍数でもない場合は数字をそのまま表示する'(N,_表示アトム) :- \+(0 is N mod 3), \+(0 is N mod 5), swritef(_表示アトム,'%t',[N]). プリントする(_表示アトム) :- writef('%t',[_表示アトム]). % 少考 % % このプログラムの問題点はプリントが複数箇所に分散していること。 % 普通は for(1,N,100) と N=100. の間で表示アトムを受け取って % プリントするように書く。 % 私のプログラミングスタイルでは、述語名に沿って本体(:- の後)を記述することを % 旨としているため、敢えて将来のメンテナンスの難しさ覚悟で % このような記述にした。 % % カットはなくてもよいのですが、「書き手の意志」を示すものとして入れることを % 勧めます。 % 以下のサイトは # Fizz-Buzz問題の例はこんな感じだ。 # # 1から100までの数をプリントするプログラムを書け。 # ただし3の倍数のときは数の代わりに「Fizz」と、 # 5の倍数のときは「Buzz」とプリントし、 # 3と5両方の倍数の場合には「FizzBuzz」とプリントすること。 # # ちゃんとしたプログラマであれば、 # これを実行するプログラムを2分とかからずに紙に書き出せるはずだ。 # 怖い事実を聞きたい? コンピュータサイエンス学科卒業生の過半数には # それができないのだ。 # 自称上級プログラマが答えを書くのに10-15分もかかっているのを見たこともある。 # '1から100までの数をプリントするプログラムを書け。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントすること。' :- for(1,N,100), 表示アトムの選択(N,_表示アトム), writef('%t',[_表示アトム]), N = 100. 表示アトムの選択(N,_表示アトム) :- 'ただし3の倍数のときは数の代わりに「Fizz」と'(N,_表示アトム). 表示アトムの選択(N,_表示アトム) :- 'ただし5の倍数のときは数の代わりに「Buzz」と'(N,_表示アトム). 表示アトムの選択(N,_表示アトム) :- '3と5両方の倍数のときは数の代わりに「FizzBuzz」と'(N,_表示アトム). 表示アトムの選択(N,_表示アトム) :- \+(0 is N mod 3), \+(0 is N mod 5), swritef(_表示アトム,'%t',[N]). 'ただし3の倍数のときは数の代わりに「Fizz」と'(N,'Fizz') :- 0 is N mod 3, \+(0 is N mod 5). 'ただし5の倍数のときは数の代わりに「Buzz」と'(N,'Buzz') :- 0 is N mod 5, \+(0 is N mod 3). '3と5両方の倍数の場合には「FizzBuzz」'(N,'FizzBuzz') :- 0 is N mod 3, 0 is N mod 5. % 以下のサイトは fizzbuzz(N) :- between(1,N,M), fizzbuzz_2(M,S), writef('%t ',[S]), N = N. fizzbuzz_2(N,'FizzBuzz') :- 0 is N mod 3, 0 is N mod 5,!. fizzbuzz_2(N,'Fizz') :- 0 is N mod 3,!. fizzbuzz_2(N,N,'Buzz') :- 0 is N mod 5,!. fizzbuzz_2(N,N). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- between(1,N,M), fizzbuzz(M,X), writef('%t ',[X]), M = N. fizzbuzz(N,'Fizz') :- 0 is N mod 3,\+(0 is N mod 3). fizzbuzz(N,'Buzz') :- 0 is N mod 5,\+(0 is N mod 5). fizzbuzz(N,'FizzBuzz') :- 0 is N mod 3,0 is N mod 5. fizzbuzz(N,N) :- \+(0 is N mod 3),\+(0 is N mod 5). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(0) :- !. fizzbuzz(N) :- fizzbuzz(N,X), N_1 is N - 1, fizzbuzz(N_1), writef('%t ',[X]). fizzbuzz(M,'FizzBuzz') :- 0 is M mod 15,!. fizzbuzz(M,'Fizz') :- 0 is M mod 3,!. fizzbuzz(M,N,'Buzz') :- 0 is M mod 5,!. fizzbuzz(M,M). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- fizzbuzz(1,N). fizzbuzz(M,N) :- M > N,!. fizzbuzz(M,N) :- fizzbuzz_2(M,X), writef('%t ',[X]). M_2 is M + 1, fizzbuzz(M_2,N). fizzbuzz_2(M,'FizzBuzz') :- 0 is M mod 15,!. fizzbuzz_2(M,'Fizz') :- 0 is M mod 3,!. fizzbuzz_2(M,N,'Buzz') :- 0 is M mod 5,!. fizzbuzz_2(M,M). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- forall(( between(1,N,M), fizzbuzz_2(M,S), writef('%t ',[S])), true). fizzbuzz_2(M,'FizzBuzz') :- 0 is M mod 15,!. fizzbuzz_2(M,'Fizz') :- 0 is M mod 3,!. fizzbuzz_2(M,N,'Buzz') :- 0 is M mod 5,!. fizzbuzz_2(M,M). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- between(1,M,N), fizzbuzz(N,[[1,N],[3,'Fizz'],[5,'Buzz']],L2), fizzbuzz_2(L2,S), writef('%t ',[S]), N = M. fizzbuzz(N,L1,L2) :- findall(S,( member([U,S],L1), 0 is N mod U), L2). fizzbuzz_2([N],N). fizzbuzz_2([_,A|L],S) :- atomic_list_concat([A|L],S). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- between(1,N,_n), findall(A,( member([_m,A],[[1,_n],[3,'Fizz'],[5,'Buzz']]), 0 is _n mod _m), L), fizzbuzz_2(L,S), writef('%t ',S), N = _n. fizzbuzz_2([N],N). fizzbuzz_2([_,A|L],S) :- atomic_list_concat([A|L],S). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- fizzbuzz(1,N). fizzbuzz(M,N) :- M > N,!. fizzbuzz(M,N) :- fizzbuzz表示(M), M_2 is M + 1, fizzbuzz(M_2,N). fizzbuzz表示(M) :- fizzbuzz表示(M,_表示), writef('%t ',[_表示]). fizzbuzz表示(M,'FizzBuzz') :- 0 is M mod 3, 0 is M mod 5,!. fizzbuzz表示(M,'Fizz') :- 0 is M mod 3,!. fizzbuzz表示(M,'Buzz') :- 0 is M mod 5,!. fizzbuzz表示(M,M). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- fizzbuzz(1,N). fizzbuzz(N,Max) :- N > Max. fizzbuzz(N,Max) :- fizzbuzz_2(N,C), nth0(C,[N,'Fizz','Buzz','FizzBuzz'],X), writef('%t ',[X]), N_2 is N + 1, fizzbuzz(N_2,Max). fizzbuzz_2(N,C) :- 0 is N mod 3 -> A=1;A=0. 0 is N mod 5 -> B=1;B=0, C is A + 2 * B. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- findall(M,between(1,N,M),L), fizzに置換する(L,L1), buzzに置換する(L1,L2), 表示する(L2),!. fizzに置換する([_1,_2,_3|R1],[_1,_2,fizz|R2]) :- fizzに置換する(R1,R2). fizzに置換する(L,L). buzzに置換する([_1,_2,_3,_4,fizz|R1],[_1,_2,_3,_4,fizzbuzz|R2]) :- buzzに置換する(R1,R2). buzzに置換する([_1,_2,_3,_4,_5|R1],[_1,_2,_3,_4,buzz|R2]) :- buzzに置換する(R1,R2). buzzに置換する(L,L). 表示する(L) :- atomic_list_concat(L,' ',_表示文字列), writef('%t\n',[_表示文字列]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- fizzbuzz(N,_fizzbuzzならび), fizzbuzzならびを表示する(_fizzbuzzならび),!. fizzbuzz(N,L2) :- 最初に自然数ならびを作り(N,_自然数ならび), fizzに置換する(_自然数ならび,L1), buzzに置換する(L1,L2). 最初に自然数ならびを作り(N,_自然数ならび) :- findall(M,between(1,N,M),_自然数ならび). fizzに置換する([_1,_2,_3|R1],[_1,_2,fizz|R2]) :- fizzに置換する(R1,R2). fizzに置換する(L,L). buzzに置換する(L1,L2) :- fizzbuzzも考慮しつつbuzzに置換する(L1,L2). buzzに置換する(L,L). fizzbuzzも考慮しつつbuzzに置換する([_1,_2,_3,_4,fizz|R1],[_1,_2,_3,_4,fizzbuzz|R2]) :- buzzに置換する(R1,R2). fizzbuzzも考慮しつつbuzzに置換する([_1,_2,_3,_4,_5|R1],[_1,_2,_3,_4,buzz|R2]) :- buzzに置換する(R1,R2). fizzbuzzならびを表示する(_fizzbuzzならび) :- atomic_list_concat(_fizzbuzzならび,' ',_表示文字列), writef('%t\n',[_表示文字列]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- length(L0,N), fizzbuzz([_],[_|L0],[_,_,_],[_,_,_,_,_]). fizzbuzz(Lm,Lm,_,_). fizzbuzz(L0,Lm,L1,L2) :- fizzbuzz(L0,L1,L2,L3,L4,_正解), writef('%t ',[_正解]), fizzbuzz([_|L0],Lm,L3,L4). fizzbuzz(_,[_],[_],[_,_,_],[_,_,_,_,_],'FizzBuzz'). fizzbuzz(_,[_],[_|L2],[_,_,_],L2,'Fizz'). fizzbuzz(_,[_|L1],[_],L1,[_,_,_,_,_],'Buzz'). fizzbuzz(L,[_|L1],[_|L2],L1,L2,N) :- length(L,N). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- findall(M,between(1,N,M),L), fizzbuzz([_],[_],L). fizzbuzz(_,_,[]) :- !. fizzbuzz([_,_,_],[_,_,_,_,_],[_|R]) :- fizzbuzz([],[],['FizzBuzz'|R]). fizzbuzz([_,_,_],L2,[_|R]) :- fizzbuzz([],L2,['Fizz'|R]). fizzbuzz(L1,[_,_,_,_,_],[_|R]) :- fizzbuzz(L1,[],['Buzz'|R]). fizzbuzz(L1,L2,[A|R]) :- writef('%t ',[A]), fizzbuzz([_|L1],[_|L2],R). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- findall(M,between(1,N,M),L), fizzbuzz([_,_,_],[_,_,_,_,_],L). fizzbuzz(_,_,[]) :- !. fizzbuzz([],[],[_|R]) :- fizzbuzz([_,_,_],[_,_,_,_,_],['FizzBuzz'|R]). fizzbuzz([],L2,[_|R]) :- fizzbuzz([_,_,_],L2,['Fizz'|R]). fizzbuzz(L1,[],[_|R]) :- fizzbuzz(L1,[_,_,_,_,_],['Buzz'|R]). fizzbuzz([_|L1],[_|L2],[A|R]) :- writef('%t ',[A]), fizzbuzz(L1,L2,R). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- findall(M,between(1,N,M),L), forall(fizzbuzz(['','','Fizz'],['','','','','Buzz'],L),true). fizzbuzz([A|R1],[B|R2],[N|R3]) :- fizzbuzz(A,B,N,C), writef('%t ',[C]). fizzbuzz([A|R1],[B|R2],[_|R3]) :- append(R1,[A],L1), append(R2,[B],L2), fizzbuzz(L1,L2,R3). fizzbuzz('','',N,N) :- !. fizzbuzz(A,B,_,C) :- atom_concat(A,B,C). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- findall(M,between(1,N,M),L), fizzbuzz(['','','Fizz'],['','','','','Buzz'],L). fizzbuzz(_,_,[]). fizzbuzz([A|R1],[B|R2],[N|R3]) :- fizzbuzz(A,B,N,C), writef('%t ',[C]), append(R1,[A],L1), append(R2,[B],L2), fizzbuzz(L1,L2,R3). fizzbuzz('','',N,N) :- !. fizzbuzz(A,B,_,C) :- atom_concat(A,B,C). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- findall(M,between(1,N,M),L), forall(fizzbuzz(['','','Fizz'],['','','','','Buzz'],L),true). fizzbuzz([A|R1],[B|R2],[N|R3]) :- fizzbuzz(A,B,N,C), writef('%t%t%t',[A,B,C]). fizzbuzz([A|R1],[B|R2],[_|R3]) :- append(R1,[A],L1), append(R2,[B],L2), fizzbuzz(L1,L2,R3). fizzbuzz('','',N,N). fizzbuzz(A,B,_,' '). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- findall(M,between(1,N,M),L), forall(fizzbuzz(['','','Fizz'],['','','','','Buzz'],L),true). fizzbuzz([A|R1],[B|R2],[N|R3]) :- fizzbuzz(A,B,N,C), writef('%t%t%t ',[A,B,C]). fizzbuzz([A|R1],[B|R2],[_|R3]) :- append(R1,[A],L1), append(R2,[B],L2), fizzbuzz(L1,L2,R3). fizzbuzz('','',N,N) :- !. fizzbuzz(A,B,_,''). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- fizzbuzz([],N,['','','Fizz'],['','','','','Buzz']),!. fizzbuzz(Ln,N,_,_) :- length(Ln,N). fizzbuzz(Ln,N,L1,L2) :- fizzbuzz_1([_|Ln],L1,L2,S), writef('%t ',[S]), fizzbuzz_2(L1,L2,L1_2,L2_2), fizzbuzz([_|Ln],N,L1_2,L2_2). fizzbuzz_1([_|Ln],[''|_],[''|_],N) :- length([_|Ln],N). fizzbuzz_1(_,[A|_],[B|_],S) :- atomic_list_concat([A,B],S). fizzbuzz_2([A|R1],[B|R2],L1_2,L2_2) :- append(R1,[A],L1_2), append(R2,[B],L2_2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- fizzbuzz([_],['','','',fizz],['','','','',buzz],Lnx), length(Lnx,N). fizzbuzz(Ln,[A|R1],[B|R2],Ln) :- 表示(Ln,A,B). fizzbuzz(Ln,[A|R1],[B|R2],Lnx) :- 回転([A|R1],[B|R2],L1,L2), fizzbuzz([_|Ln],L1_2,L2_2,Lnx). 回転([A|R1],[B|R2],L1,L2) :- append(R1,[A],L1), append(R2,[B],L2). 表示(Ln,A,B) :- 表示項(Ln,A,B,X), writef('%t '[X]). 表示項(Ln,'','',N) :- length(Ln,N),!. 表示項(_,A,B,C) :- atom_concat([A,B],C). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- fizzbuzz([],N,['','','Fizz'],['','','','','Buzz']). fizzbuzz(L,N,_,_) :- length(L,N),!. fizzbuzz(Ln,N,[_31,_32,_33],[_51,_52,_53,_54,_55]) :- fizzbuzz_1(_31,_51,Ln,A), writef('%t%t%t ',[_31,_51,A]), fizzbuzz([_|Ln],N,[_32,_33,_31],[_52,_53,_54,_55,_51]). fizzbuzz_1('','',Ln,M) :- length([_|Ln],M),!. fizzbuzz_1(_,_,_,''). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- fizzbuzz([_],[_,_],[_,_,_,_],Ln,X), writef('%t',[X]), length(Ln,N),!. fizzbuzz(L1,L2,L3,Ln,X) :- fizzbuzz_1(L1,L2,L3,L2_1,L3_1,Y), fizzbuzz_2(L1,L2_1,L3_1,Y,Ln,X). fizzbuzz_2(L1,L2,L3,X,L1,X). fizzbuzz_2(L1,L2,L3,_,Ln,X) :- fizzbuzz([_|L1],L2,L3,Ln,X). fizzbuzz_1(R1,[],[],[_,_],[_,_,_,_],'FizzBuzz '). fizzbuzz_1(R1,[],[_|R3],[_,_],R3,'Fizz '). fizzbuzz_1(R1,[_|R2],[],R2,[_,_,_,_],'Buzz '). fizzbuzz_1(R1,[_|R2],[_|R3],R2,R3,N) :- length(R1,N). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(Nth,X) :- fizzbuzz([_],[_,_],[_,_,_,_],Nth,X). fizzbuzz(L1,L2,L3,Nth,X) :- length(L1,Nth_1), fizzbuzz_1(Nth_1,L2,L3,L2_1,L3_1,Y), fizzbuzz_2(L1,L2_1,L3_1,Nth_1,Nth,Y,X). fizzbuzz_2(L1,L2,L3,Nth,Nth,X,X). fizzbuzz_2(L1,L2,L3,_,Nth,_,X) :- fizzbuzz([_|L1],L2,L3,Nth,X). fizzbuzz_1(_,[],[],[_,_],[_,_,_,_],'FizzBuzz'). fizzbuzz_1(_,[],[_|R3],[_,_],R3,'Fizz'). fizzbuzz_1(_,[_|R2],[],R2,[_,_,_,_],'Buzz'). fizzbuzz_1(N,[_|R2],[_|R3],R2,R3,N). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(M) :- fizzbuzz(M,[_],[_,_,_],[_,_,_,_,_]). fizzbuzz(M,[_|L],_,_) :- length(L,M),!. fizzbuzz(M,L,L1,L2) :- fizzbuzz(L,L1,L2,L_1,L1_1,L2_1,S), writef('%t ',[S]), fizzbuzz(M,L_1,L1_1,L2_1). fizzbuzz(L,L,L,[_|L],[_,_,_|L],[_,_,_,_,_|L],fizzbuzz) :- !. fizzbuzz(L,L,L2,[_|L],[_,_,_|L],L2,fizz) :- !. fizzbuzz(L,L1,L,[_|L],L1,[_,_,_,_,_|L],buzz). fizzbuzz(L,L1,L2,[_|L],L1,L2,N) :- length(L,N). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(M) :- s(S,M), fizzbuzz(S,s(0),s(s(s(0))),s(s(s(s(s(0)))))). fizzbuzz(S,s(S),_,_) :- !. fizzbuzz(MS,S,S1,S2) :- fizzbuzz(S,S1,S2,S_1,S1_1,S2_1,A), writef('%t ',[A]), fizzbuzz(MS,S_1,S1_1,S2_1). fizzbuzz(S,S,S,s(S),s(s(s(S))),s(s(s(s(s(S))))),fizzbuzz) :- !. fizzbuzz(S,S,S2,s(S),s(s(s(S))),S2,fizz) :- !. fizzbuzz(S,S1,S,s(S),S1,s(s(s(s(s(S))))),buzz). fizzbuzz(S,S1,S2,s(S),S1,S2,N) :- s(S,N). s(0,0) :- !. s(s(S),N) :- var(N), s(S,N_1), succ(N_1,N). s(s(S),N) :- integer(N), succ(N_1,N), s(S,N_1). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% finzzbuzz(N) :- fizzbuzz([],N,['FizzBuzz',_,_,'Fizz',_,'Buzz','Fizz',_,_,'Fizz','Buzz',_,'Fizz',_,_],[]). fizzbuzz(Ln,N,_,_) :- length(Ln,N). fizzbuzz(Ln,N,Ln2,[_,_,_,_,_,_,_,_,_,_,_,_,_,_,_]) :- fizzbuzz(Ln,N,Ln2,[]). fizzbuzz(Ln,N,Ln2,L) :- append(_,[A|L],Ln2), fizzbuzz_2(Ln,A,B), writef('%t ',[B]), fizzbuzz([_|Ln],N,Ln2,[_|L]). fizzbuzz_2(Ln,A,A) :- atom(A). fizzbuzz_2(Ln,A,N) :- length([_|Ln],N). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- findall(M,between(1,N,M),L), fizzbuzz(L,[_,_,'Fizz',_,'Buzz','Fizz',_,_,'Fizz','Buzz',_,'Fizz',_,_,'FizzBuzz']). fizzbuzz([],_) :- !. fizzbuzz(L,[]) :- fizzbuzz(L,[_,_,'Fizz',_,'Buzz','Fizz',_,_,'Fizz','Buzz',_,'Fizz',_,_,'FizzBuzz']). fizzbuzz([A|R1],[B|R2]) :- var(B), writef('%t ',[A]), fizzbuzz(R1,R2). fizzbuzz([A|R1],[B|R2]) :- atomi(B), writef('%t ',[B]), fizzbuzz(R1,R2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 'FizzBuzz'(N) :- findall(M,between(1,N,M),L1), 'FizzBuzz置換パターン'(L1,L2), atomic_list_concat(L2,' ',S), writef('%t\n',[S]). 'FizzBuzz置換パターン'([_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15|R1],[_1,_2,'Fizz',_4,'Buzz','Fizz',_7,_8,'Fizz','Buzz',_11,'Fizz',_13,_14,'FizzBuzz'|R2]) :- 'FizzBuzz置換パターン'(R1,R2). 'FizzBuzz置換パターン'(L,R) :- length(L,Len), length(R,Len), append(L,_,[_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15]), append(R,_,[_1,_2,'Fizz',_4,'Buzz','Fizz',_7,_8,'Fizz','Buzz',_11,'Fizz',_13,_14,'FizzBuzz']). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- 置換パターンならびを生成(_置換パターンならび), nth1(_nth1,_置換パターンならび,A), fizzbuzz_2(_nth1,A), _nth1 = N. 置換パターンならびを生成(_置換パターンならび) :- U is (N // 15) + 1, findall([_,_,'Fizz',_,'Buzz',_,_,_,'Fizz','Buzz',_,'Fizz',_,_,'FizzBuzz'],between(1,U,_),LL), flatten(LL,_置換パターンならび). fizzbuzz_2(_nth1,A) :- var(A), writef('%t ',[_nth1]). fizzbuzz_2(_,A) :- atom(A), writef('%t ',[A]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- M is N // 15 + 1, findall([_,_,'Fizz',_,'Buzz','Fizz',_,_,'Fizz','Buzz',_,'Fizz',_,_,'FizzBuzz'],between(1,M,_),LL), flatten(LL,L), forall(( append(L0,[A|R],L), length([_|L0],N_1), ( N_1 > Max,!,fail; fizzbuzz_2(A,N_1,B))), writef('%t ',[B])). fizzbuzz_2(A,N,N) :- var(A),!. fizzbuzz_2(A,N,A). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- 'fizzbuzzパターンの形成'(N,L), 'fizz/buzz/fizzbuzz/順序数のどれかを表示する'(N,L,_順序数). 'fizzbuzzパターンの形成'(N,L) :- N_1 is (N - 1) // 15 + 1, findall([_,_,'Fizz',_,'Buzz','Fizz',_,_,'Fizz','Buzz',_,'Fizz',_,_,'FizzBuzz'],between(1,N_1,_),LL), flatten(LL,L). 'fizz/buzz/fizzbuzz/順序数のどれかを表示する'(N,L,_順序数) :- nth1(_nth1,L,A), 表示項の選択(_nth1,A,_表示項), writef('%t ',[_表示項]), _nth1 = N,!. 表示項の選択(_nth1,_nth1,_nth1) :- !. 表示項の選択(_nth1,A,A). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- 'fizzbuzzパターンの形成'(N,L1), 変数だけ要素位置番号を埋める(N,L1,L2), forall(member(A,L2),writef('%t ')). 'fizzbuzzパターンの形成'(N,L) :- N_1 is (N - 1) // 15 + 1, findall([_,_,'Fizz',_,'Buzz','Fizz',_,_,'Fizz','Buzz',_,'Fizz',_,_,'FizzBuzz'],between(1,N_1,_),LL), flatten(LL,L). 変数だけ要素位置番号を埋める(N,L1,L2) :- findall(U,( nth1(_nth1,L1,U), _nth1 =< N, (U=_nth1;atom(U))), L2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- 'fizzbuzzパターンの形成'(N,L1), 変数だけ要素位置番号を埋める(N,L1,L2), forall(member(A,L2),writef('%t ')). 'fizzbuzzパターンの形成'(N,L) :- N_1 is (N - 1) // 15 + 1, findall([_,_,'Fizz',_,'Buzz','Fizz',_,_,'Fizz','Buzz',_,'Fizz',_,_,'FizzBuzz'],between(1,N_1,_),LL), flatten(LL,L). 変数だけ要素位置番号を埋める(M,N,L) :- M > N,!. 変数だけ要素位置番号を埋める(M,N,[M|R]) :- M_2 is M + 1, 変数だけ要素位置番号を埋める(M_2,N,R). 変数だけ要素位置番号を埋める(M,N,[_|R]) :- M_2 is M + 1, 変数だけ要素位置番号を埋める(M_2,N,R). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- 'fizzbuzzパターンの形成'(N,L1), 変数だけ要素位置番号を表示する(N,L1). 'fizzbuzzパターンの形成'(N,L) :- N_1 is (N - 1) // 15 + 1, findall([_,_,'Fizz',_,'Buzz','Fizz',_,_,'Fizz','Buzz',_,'Fizz',_,_,'FizzBuzz'],between(1,N_1,_),LL), flatten(LL,L). 変数だけ要素位置番号を表示する(N,L1) :- forall((nth1(_nth1,L1,U),_nth1 =< N,(U=_nth1;atom(U))),writef('%t ',[U])). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- fizzbuzz(0,N),!. fizzbuzz(N,M) :- append(L0,[A|R],[1,2,[3,fizz],4,[5,buzz],[6,fizz],7,8,[9,fizz],[10,buzz],11,[12,fizz],13,14,[15,fizzbuzz]]), 表示値(N,A,N3,_表示値), fizzbuzz_2(N,M,R,N3,_表示値). fizzbuzz_2(N,M,R,N3,_表示値) :- N3 > M. fizzbuzz_2(N,M,R,N3,_表示値) :- writef('%t ',[_表示値]), R = [], N4 is N + 15, fizzbuzz(N4,M). 表示値(N1,[N2,A],N3,A) :- N3 is N1 + N2,!. 表示値(N1,N2,N3,N3) :- N3 is N1 + N2. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- N_1 is (N - 1) // 15 + 1, findall([_,_,'Fizz',_,'Buzz','Fizz',_,_,'Fizz','Buzz',_,'Fizz',_,_,'FizzBuzz'],between(1,N_1,_),LL), flatten(LL,L1), forall((nth1(_nth1,L1,U),_nth1 =< N,(var(U),U=_nth1;atom(U))),writef('%t ',[U])). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- 'fizzbuzzパターンの形成'(N,L_f,L_b), 'fizz/buzz/fizzbuzz/順序数のどれかを表示する'(N,L_f,L_b,_順序数). 'fizzbuzzパターンの形成'(N,L_f,L_b) :- N_f is (N - 1) // 3 + 1, findall(['','','Fizz'],between(1,N_f,_),LL_f), flatten(LL_f,L_f). N_b is (N - 1) // 5 + 1, findall(['','','','','Buzz'],between(1,N_b,_),LL_b), flatten(LL_b,L_b). 'fizz/buzz/fizzbuzz/順序数のどれかを表示する'(N,L,_順序数) :- nth1(_nth1,L_f,F), nth1(_nth1,L_b,B), 表示項の選択(_nth1,F,B,_表示項), writef('%t ',[_表示項]), _nth1 = N,!. 表示項の選択(_nth1,'','',_nth1) :- !. 表示項の選択(_,A,B,_表示項) :- atomic_list_concat([A,B],_表示項). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # # FizzBuzz問題の要領で、1から100までの整数を、かいぎょう区切りで出力せよ、ただし、 # 3の倍数なら「Fizz」を、7の倍数なら「Buzz」を、13の倍数なら「hoge」を、 # 数値の代わりに出力することとする # 'FizzBuzzhoge' :- 'FizzBuzzhoge'([],['','','Fizz'],['','','','','','','Buzz'],['','','','','','','','','','','','','hoge']). 'FizzBuzzhoge'(Ln,_,_,_) :- length(Ln,100),!. 'FizzBuzzhoge'(Ln,L1,L2,L3) :- 'FizzBuzzhoge'([_|Ln],L1,L2,L3,_表示情報), writef('%t\n',[_表示情報]), 三つのリストの左シフト(L1,L2,L3,L1_2,L2_2,L3_2), 'FizzBuzzhoge'([_|Ln],L1_2,L2_2,L3_2). 'FizzBuzzhoge'(Ln,[''|_],[''|_],[''|_],_数値) :- length(Ln,_数値),!. 'FizzBuzzhoge'(Ln,[A|_],[B|_],[C|_],_FizzBuzzhoge文字列) :- atomic_list_concat([A,B,C],_FizzBuzzhoge文字列). 三つのリストの左シフト([A|R1],[B|R2],[C|R3],L1,L2,L3) :- append(R1,[A],L1), append(R2,[B],L2), append(R3,[C],L3). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(_まで) :- fizzbuzz([],_まで,あとふたつ,あとよっつ). fizzbuzz(L1,_まで,_,_) :- length(L1,_まで),!. fizzbuzz(L1,_まで,_Fizzまであといくつ_1,_Buzzまであといくつ_1) :- fizzbuzz_1([_|L1],_Fizzまであといくつ_1,_Buzzまであといくつ_1,_Fizzまであといくつ_2,_Buzzまであといくつ_2,Y), writef('%t ',[Y]), fizzbuzz([_|L1],_まで,_Fizzまであといくつ_2,_Buzzまであといくつ_2). fizzbuzz_1(_,ないよ,ないよ,あとふたつ,あとよっつ,'FizzBuzz'). fizzbuzz_1(_,ないよ,_Buzzまであといくつ_1,あとふたつ,_Buzzまであといくつ_2,'Fizz') :- ひとつ減らすよ(_Buzzまであといくつ_1,_Buzzまであといくつ_2). fizzbuzz_1(_,_Fizzまであといくつ_1,ないよ,_Fizzまであといくつ_2,あとよっつ,'Buzz') :- ひとつ減らすよ(_Fizzまであといくつ_1,_Fizzまであといくつ_2). fizzbuzz_1(L1,_Fizzまであといくつ_1,_Buzzまであといくつ_1,_Fizzまであといくつ_2,_Buzzまであといくつ_2,N) :- ひとつ減らすよ(_Fizzまであといくつ_1,_Fizzまであといくつ_2), ひとつ減らすよ(_Buzzまであといくつ_1,_Buzzまであといくつ_2), length(L1,N). ひとつ減らすよ(あとよっつ,あとみっつ). ひとつ減らすよ(あとみっつ,あとふたつ). ひとつ減らすよ(あとふたつ,あとひとつ). ひとつ減らすよ(あとひとつ,ないよ). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 佑(_丈) :- 校([],_丈,碩,漁). 校(_里,_丈,_,_) :- length(_里,_丈),!. 校(_里,_丈,_部,_寓) :- 乾([_|_里],_部,_寓,_料,_勘,_公), writef('%t ',[_公]), 校([_|_里],_丈,_料,_勘). 乾(_,建,建,碩,漁,'FizzBuzz'). 乾(_,建,_寓,碩,_勘,'Fizz') :- 装(_寓,_勘). 乾(_,_発,建,_塔,漁,'Buzz') :- 装(_発,_塔). 乾(_里,_発,_寓,_塔,_勘,_論) :- 装(_発,_塔), 装(_寓,_勘), length(_里,_論). 装(漁,宜). 装(宜,碩). 装(碩,週). 装(週,建). % % 述語名、変数からシンボル性を除去した述語定義。 % 一つ上のFizzBuzz定義の述語名と変数名を無作為に全角漢字を % 引いてきて置き換えた。プログラミングにはこういう一面が常に % 多少はある。 % %%%%%%% デスマコロシアム(5) fizzbuzzをFIZZBUZZと表記する(1) %%%%%%%%%%% fizzbuzz(M) :- fizzbuzz(0,M,[_,_],[_,_,_,_],L), atomic_list_concat(L,A), write(A). fizzbuzz(M,M,_,_,[]). fizzbuzz(N,M,L1,L2,[A|R3]) :- succ(N,N_2), dt(N_2,L1,L2,R1,R2,A), fizzbuzz(N_2,M,R1,R2,R3). dt(_,[],[],[_,_],[_,_,_,_],'FIZZBUZZ') :- !. dt(_,[],[_|R],[_,_],R,fizz) :- !. dt(_,[_|R],[],R,[_,_,_,_],buzz) :- !. dt(N,[_|R1],[_|R2],R1,R2,N). %%%%%%% デスマコロシアム(5) fizzbuzzをFIZZBUZZと表記する(2) %%%%%%%%%%% fizzbuzz(N) :- N_1 is (N - 1) // 15 + 1, findall([_,_,'fizz',_,'buzz','fizz',_,_,'fizz','buzz',_,'fizz',_,_,'FIZZBUZZ'],between(1,N_1,_),LL), flatten(LL,L1), forall((nth1(_nth1,L1,U),_nth1 =< N,(_nth1=U;atom(U))),writef('%t',[U])). %%%%%%% デスマコロシアム(5) fizzbuzzをFIZZBUZZと表記する(3) %%%%%%%%%%% fizzbuzz(N) :- N_1 is (N - 1) // 15 + 1, findall([_,_,'fizz',_,'buzz','fizz',_,_,'fizz','buzz',_,'fizz',_,_,'FIZZBUZZ'],between(1,N_1,_),LL), flatten(LL,L), 表示(N,L). 表示(N,L) :- nth1(_nth1,L,U), 表示選択(_nth1,U), writef('%t',[U]), _nth1=N. 表示選択(_nth1,_nth1). 表示選択(_,U) :- atom(U). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % 最小文字数を競ってみよう(現在 147字) % fizzbuzz(N):-between(1,N,M),put(32),g(M,S),write(S),M=N. g(M,'Fizz'):-m(M,3). g(M,'Buzz'):-m(M,5). g(M,M):- \+m(M,3),\+m(M,5). m(M,N):-0=:=M mod N. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % 述語名fizzbuzzをfにして良いなら 140字 (twitterの1twit限度文字数) % f(N):-between(1,N,M),put(32),g(M,S),write(S),M=N. g(M,'Fizz'):-m(M,3). g(M,'Buzz'):-m(M,5). g(M,M):- \+m(M,3),\+m(M,5). m(M,N):-0=:=M mod N. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % IF/Prolog (for/3,if/3 を使って) % % 述語名fizzbuzzをfにして良いなら 82字 % f(M):-for(1,N,M),nl,if((1>N mod 3,A=fizz;1>N mod 5,A=buzz),write(A),write(N)),MN mod 3,A=fizz;1>N mod 5,A=buzz),write(A))->write(N)),M