ベルク・カッツェ |
枠/着順の表を作りアルファベットを追記していくと、Aは3枠5着になりました。 |
4月21日(木) 0:06:08
51449 |
むらかみ |
3位の〓〓〓〓〓〓〓〓が私のような気がします。
その後に送りなおした名前はうまく反映されています。 |
4月21日(木) 0:07:45
51450 |
しとお |
私も表を描きました。少しずつ表が埋まっていくのが気持ちよくて楽しかったですね |
4月21日(木) 0:13:41
51451 |
Mr.ダンディ |
ベルク・カッツェさんの #51449と同様にしました。 |
4月21日(木) 0:14:17
51452 |
紫の薔薇の人 |
5×5の表を作って解きました。
各行各列には、A〜Eが一つしか入らないので、徐々に解けていきます。 1着 4枠 C 2着 2枠 B 3着 1枠 E 4着 5枠 D 5着 3枠 A になりました。 だから、答えは「3,5」 |
4月21日(木) 0:20:21
51453 |
「数学」小旅行 |
不可能な順列を消していくと絞れました。 |
4月21日(木) 1:23:29
51454 |
Sunachu |
5x5x5の立方体で考えたら簡単でした。 |
4月21日(木) 9:30:36
51456 |
中DA |
僕も5×5の表を使って解きました。
Aの着順が最初に求まりました。 |
4月21日(木) 20:43:11
51457 |
SECOND |
!こんな問題をプログラムで解くには、どうすればよいか?? 難題で、、仕方ない、
!順列 P(5,5)=120 の2乗、14400通り、全てのケースを検査した。1通りだけで他には無い。 !人の哲学的解法を、代行させるには、どうすればよいだろう・・ !ok= 0 1 !ok= 0 2 !ok= 0 3 ! ( ! ) !ok= 0 6220 !ok= 1 6221 ! - - E - - ! - B - - - ! - - - - A ! C - - - - ! - - - D - !ok= 0 6222 ! ( ! ) !ok= 0 14399 !ok= 0 14400 DIM m(120,5), z(5), h$(5,5) DATA 1,2,3,4,5 MAT READ z CALL perm20(1) !z(5)=1,2,3,4,5 の順列 P(5,5) の展開を m(120,5)に作成 ! FOR y=1 TO 120 FOR x=1 TO 120 MAT h$="-"& NUL$ !h$(枠,着順) を 空マーク"-"で埋める FOR i=1 TO 5 LET h$(m(y,i),m(x,i))=CHR$(i+64) !P(5,5)^2=14400通りの (枠,着順)ケースを h$(5,5) に順次作成 NEXT i CALL check !観客ア〜観客キの条件、検査 LET n=n+1 PRINT "!ok=";ok;n IF ok=1 THEN MAT PRINT USING "! # # # # #" :h$ pause END IF NEXT x NEXT y !------------------------------------------- ! 配列 h$(1~5枠,1~5着順) の中味 ABCDE の検査 !------------------------------------------- SUB check LET ok=0 !-------------------- !観客ア Cは4枠かー。 !-------------------- FOR i=1 TO 5 IF h$(4,i)="C" THEN EXIT FOR NEXT i IF 5< i THEN EXIT SUB !-------------------- !観客イ Eは、5枠の馬よりは先着したよ。 !-------------------- FOR i=1 TO 5 IF h$(5,i)<>"-" THEN EXIT FOR NEXT i FOR j=1 TO i-1 FOR w=1 TO 4 IF h$(w,j)="E" THEN EXIT FOR NEXT w IF w<=4 THEN EXIT FOR NEXT j IF i<=j THEN EXIT SUB !-------------------- !観客ウ 1枠の馬、3着以下だね。 !-------------------- IF h$(1,1)<>"-" OR h$(1,2)<>"-" THEN EXIT SUB !-------------------- !観客エ Bは2着かー、惜しいなぁ。 !-------------------- FOR i=1 TO 5 IF h$(i,2)="B" THEN EXIT FOR NEXT i IF 5< i THEN EXIT SUB !-------------------- !観客オ 3枠の馬、5着だったよ...。 !-------------------- IF h$(3,5)="-" THEN EXIT SUB !-------------------- !観客カ 2枠の馬は、1着にはなれなかったか。 !-------------------- IF h$(2,1)<>"-" THEN EXIT SUB !-------------------- !観客キ Dは、1着の馬より外側の枠(注:枠の番号が大きいということ)だったなー。 !-------------------- FOR i=1 TO 5 IF h$(i,1)<>"-" THEN EXIT FOR NEXT i FOR i=i+1 TO 5 FOR j=2 TO 5 IF h$(i,j)="D" THEN EXIT FOR NEXT j IF j<=5 THEN EXIT FOR NEXT i IF 5< i THEN EXIT SUB !-------------------- LET ok=1 END SUB !----------------------------------------------------- ! z(5)=1,2,3,4,5 の 順列 P(5,5)を、m(120,5) に格納する !----------------------------------------------------- SUB perm20(k) !start CALL perm20(1) local i IF k<=5 THEN FOR i=k TO 5 swap z(k),z(i) CALL perm20(k+1) swap z(k),z(i) NEXT i ELSE LET p=p+1 FOR i=1 TO 5 LET m(p,i)=z(i) NEXT i END IF END SUB END |
4月22日(金) 11:17:43
51458 |
よんひ |
python(手習い中)で制約プログラミングで解いてみました。
Google Colab上で、以下のコードを実行すると UMA Chaku Waku A 5 3 B 2 2 C 1 4 D 4 5 E 3 1 という結果が得られました。 ------------------------ !pip install ortools from ortools.sat.python import cp_model class SolutionPrinter(cp_model.CpSolverSolutionCallback): def __init__(self, u2c, u2w): cp_model.CpSolverSolutionCallback.__init__(self) self.__u2c = u2c self.__u2w = u2w self.__solution_count = 0 def solution_count(self): return self.__solution_count def on_solution_callback(self): print('Solution %i,' % self.__solution_count) self.__solution_count += 1 uma=['A','B','C','D','E'] print('UMA Chaku Waku') for i in range(len(uma)): print(f'{uma[i]} {self.Value(u2c[i])+1} {self.Value(u2w[i])+1}') print() m = cp_model.CpModel() u2w=[m.NewIntVar(0,5-1,'u2w%i'% i) for i in range(5)]#馬→枠 w2c=[m.NewIntVar(0,5-1,'w2c%i'% i) for i in range(5)]#枠→着 u2c=[m.NewIntVar(0,5-1,'u2c%i'% i) for i in range(5)]#馬→着 m.AddAllDifferent(u2w) m.AddAllDifferent(w2c) m.AddAllDifferent(u2c) for i in range(5): m.AddElement(u2w[i],w2c,u2c[i])#馬→枠→着と馬→着が一致 #Cは4枠かー。 m.Add(u2w[2]==3) #Eは、5枠の馬よりは先着したよ。 m.Add(u2c[4]<w2c[4]) #1枠の馬、3着以下だね。 m.Add(w2c[0]>=2) #Bは2着かー、惜しいなぁ。 m.Add(u2c[1]==1) #3枠の馬、5着だったよ...。 m.Add(w2c[2]==4) #2枠の馬は、1着にはなれなかったか。 m.Add(w2c[1]!=0) #Dは、1着の馬より外側の枠(注:枠の番号が大きいということ)だったなー。 c2w=[m.NewIntVar(0,5-1,'c2w%i'% i) for i in range(5)]#着→枠 m.AddInverse(w2c,c2w) m.Add(u2w[3]>c2w[0]) # Solve the model. solver = cp_model.CpSolver() solution_printer = SolutionPrinter(u2c,u2w) solver.parameters.enumerate_all_solutions = True solver.Solve(m, solution_printer) |
4月22日(金) 17:04:42
51459 |
よんひ |
この掲示板は行頭のスペースがトリムされてしまうんですね。pythonはスペースに文法上の意味があるので正しく入れないとエラーになります。
空行を除いた4,9,11,27行目に1つ 5-8,10,12-16,18行目に2つ 17行目に3つの 行頭のスペース(またはタブ)が付きます。 |
4月22日(金) 18:09:37
51460 |