オフラインリアルタイムどう書く過去問(第26回)


問題はこちら->http://nabetani.sakura.ne.jp/hena/ord26tribo/
以前に解いていた問題です。
上からX段目までの三角形の数がXの二乗ですので、計算で解きました。
n個めの三角形の位置を求めるのに、計算しやすいようにn-1の平方根を求め、後で補正しました。
(補正しなくても偶奇が変わるだけですが)
初期の各色の数は三角形の数と同じで、三角形の辺の重なる部分(右隣、下)の色を2ずつ減らしていきます。

pos(N,[X,Y]):-X0 is floor(sqrt(N-97)),Y is N-96-X0*X0,X is X0+1. %uekara X, hidarikara Y banme

del([],G,R,B,G,R,B).
del([[X,Y]|T],G,R,B,GR,RR,BR):-1 =:= Y mod 2,!,                     %yokoni kisuu banme,
       Y1 is Y+1,(member([X,Y1],T)->R1 is R-2;R1=R),                %migidonari ni sankaku
       X1 is X+1,(member([X1,Y1],T)->B1 is B - 2;B1=B),             %sita ni sankaku
       del(T,G,R1,B1,GR,RR,BR).
del([[X,Y]|T],G,R,B,GR,RR,BR):-                                      %yoko ni guusuu banme
       Y1 is Y+1,(member([X,Y1],T)->G1 is G-2;G1=G),                 % mgidonari ni sankaku
       del(T,G1,R,B,GR,RR,BR).

start:-str(S),split_string(S,"\s,\n","\s",L),pre(L),!.

pre([]):-!.
pre([_,B,C,D,E|T]):-
       string_codes(B,L),maplist(pos,L,R),length(R,N),
       del(R,N,N,N,GR,RR,BR),maplist(number_chars,RE,[C,D,E]), %kaku iro nokazu = sankakukeino kazu
       (RE==[RR,GR,BR]->Str=" pass";Str=" fail"),write(Str),write(" "),writeln([RR,GR,BR]),pre(T).

str("0       bdelmnouy       5,7,9
1       a       1,1,1
2       q       1,1,1
3       t       1,1,1
4       i       1,1,1
5       fg      2,0,2
6       gh      0,2,2
7       gm      2,2,0
8       fgh     1,1,3
9       fghm    2,2,2
10      fhm     3,3,3
11      bdfhjprx        8,8,0
12      abcdfghm        4,4,0
13      jklmqrst        0,4,4
14      klmntuvw        4,0,4
15      abcdefghijklmnopqrstuvwxy       5,5,5
16      abcdefghijklmnoqrtvwxy  6,8,4
17      abdefhijklnoprstvwxy    10,8,4
18      acegikmoqsuwy   13,13,5
19      bdfhjlnprtvxy   13,11,1
20      abdegijlnpqsuwy         15,15,15
21      aefghiqrstuvwxy         3,3,15
22      cfhkmoqrstuvwxy         7,7,15
23      cfhkmortvx      10,10,10
24      no      0,2,2
25      pwy     3,3,3
26      iqwy    4,4,4
27      lopuv   3,3,5
28      abdjtw  6,6,6
29      fgpstux         5,3,5
30      dijlnotv        6,8,2
31      bdefkmpwx       5,9,3
32      bfghjlmuwx      4,8,6
33      befghlopqrw     5,7,9
34      bfgjklmnqsux    8,6,8
35      fijklnpqstvwy   9,9,9
36      abcdfgilmnrsuv  8,6,6
37      abcdegijklnpruw         11,11,9
38      efgijkmnopqrtvwx        6,8,4
39      abcdefghilopqrtwy       9,9,7
40      abfghklmopqrsuvwxy      8,6,12
41      abcdeghklmoprstuwxy     9,7,7
42      abcdehijklmnopqrtwxy    8,8,6
43      acdefghimnopqrstuvwxy   7,3,9
44      abcfghijklmnopqrtuvwxy  6,6,6
45      abcdefghijklmnoqrstuwxy         5,7,7
46      abcdeghijklmnopqrstuvwxy        6,6,6").