1votos

Ajedrez aleatorio de Fischer en Haskell

por josejuan hace 2 años

Creo que falta la regla de que los alfiles no comparten color de casilla.

Generar posición inicial de una partida de ajedrez aleatorio de Fischer

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import Data.List (sort, permutations) 
 
data Piece = King | Queen | Rook | Knight | Bishop | Pawn deriving (Eq, Enum, Ord) 
 
chess960 :: [[Piece]] 
chess960 = do 
  k  ← [2…7]                                                     -- el rey no puede estar ni al principio ni al final 
  r1 ← [1…k-1]                                                   -- una torre a su izq 
  r2 ← [k+1…8]                                                   -- la otra a su der 
  b1 ← [i | i ← [1,3…8], ¬(i ∈ [k, r1, r2])]                     -- un alfil en negras 
  b2 ← [i | i ← [2,4…8], ¬(i ∈ [k, r1, r2])]                     -- otro alfil en blancas 
  q  ← [i | i ← [1…8], ¬(i ∈ [k, r1, r2, b1, b2])]               -- la reina donde pille 
  let [k1, k2] = [i | i ← [1…8], ¬(i ∈ [k, r1, r2, b1, b2, q])]  -- los caballos en donde queda 
  η $ snd ↥ sort (zip [k   , r1  , r2  , b1    , b2    , q    , k1    , k2    ] 
                      [King, Rook, Rook, Bishop, Bishop, Queen, Knight, Knight]) 
 
 
-- si se quieren mostrar de forma chulipandi 
instance Show Piece where 
  show King   = "♔" 
  show Queen  = "♕" 
  show Rook   = "♖" 
  show Bishop = "♗" 
  show Knight = "♘" 
  show Pawn   = "♙" 
 
{- 
 
-- por ejemplo 
 
> mapM_ print $ map (chess960!!) [1,37..960] 
[♖,♔,♖,♗,♗,♘,♕,♘] 
[♖,♔,♗,♗,♖,♘,♕,♘] 
[♖,♔,♗,♗,♘,♕,♖,♘] 
[♖,♗,♔,♖,♗,♘,♕,♘] 
[♖,♘,♔,♕,♗,♖,♘,♗] 
[♖,♘,♔,♗,♕,♘,♗,♖] 
[♘,♖,♔,♕,♖,♗,♗,♘] 
[♘,♖,♔,♕,♗,♗,♖,♘] 
[♖,♘,♕,♔,♖,♗,♗,♘] 
[♖,♘,♕,♔,♗,♗,♖,♘] 
[♘,♖,♕,♔,♖,♗,♗,♘] 
[♗,♖,♘,♔,♕,♗,♘,♖] 
[♘,♗,♖,♔,♗,♖,♕,♘] 
[♘,♗,♖,♔,♗,♕,♘,♖] 
[♖,♘,♗,♕,♔,♗,♖,♘] 
[♘,♖,♕,♗,♔,♖,♗,♘] 
[♘,♖,♕,♗,♔,♘,♗,♖] 
[♗,♗,♖,♘,♔,♕,♘,♖] 
[♗,♗,♘,♖,♔,♕,♖,♘] 
[♖,♗,♗,♘,♕,♔,♖,♘] 
[♗,♖,♘,♗,♕,♔,♖,♘] 
[♗,♘,♖,♕,♘,♔,♖,♗] 
[♘,♗,♗,♖,♕,♔,♖,♘] 
[♘,♕,♗,♗,♖,♔,♖,♘] 
[♖,♘,♕,♗,♗,♘,♔,♖] 
[♘,♕,♖,♗,♗,♘,♔,♖] 
[♘,♕,♗,♗,♖,♘,♔,♖] 
 
-} 
3 comentarios
0votos

Escrito por AverageUser hace 2 años

Muy buena solucion ¿Imprime todas las opcioones posibles?

y si, me falto la de los alfiles, me di cuenta despues
0votos

Escrito por josejuan hace 2 años

Si, imprime todas, he posteado otra con una pequeña modificación para poder filtrar el tipo de salida que se quiere.

Comenta la solución

Tienes que identificarte para poder publicar tu comentario.