1votos

Problema de las ocho reinas en Haskell

por josejuan hace 1 año

No, la solución de Dexter es más corta que la tuya, pero mi solución es más corta que la de Dexter ;)

La idea central es colocar ocho reinas en un tablero de ajedrez, sin que se estas se amenacen entre si.

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
62
63
reinas z = [p | p <- permutations (shiftL 1 <$> [0..z-1]), w p, w $ reverse p] 
           where w = (z==) . popCount . sum . zipWith (flip shiftL) [0..] 
 
 
 
 
printReinas z n = mapM_ (\x->mapM_ (putStrLn . intersperse ' ' . printf ("%0" ++ show z ++ "b")) x >> putStrLn "") $ take n $ reinas z 
{- 
 
> printReinas 4 2 
0 0 1 0 
1 0 0 0 
0 0 0 1 
0 1 0 0 
 
0 1 0 0 
0 0 0 1 
1 0 0 0 
0 0 1 0 
 
> printReinas 8 3 
0 0 1 0 0 0 0 0 
0 0 0 0 1 0 0 0 
0 1 0 0 0 0 0 0 
0 0 0 0 0 0 0 1 
0 0 0 0 0 1 0 0 
0 0 0 1 0 0 0 0 
0 0 0 0 0 0 1 0 
1 0 0 0 0 0 0 0 
 
0 0 1 0 0 0 0 0 
0 0 0 0 0 1 0 0 
0 0 0 1 0 0 0 0 
0 1 0 0 0 0 0 0 
0 0 0 0 0 0 0 1 
0 0 0 0 1 0 0 0 
0 0 0 0 0 0 1 0 
1 0 0 0 0 0 0 0 
 
0 0 0 0 1 0 0 0 
0 1 0 0 0 0 0 0 
0 0 0 1 0 0 0 0 
0 0 0 0 0 0 1 0 
0 0 1 0 0 0 0 0 
0 0 0 0 0 0 0 1 
0 0 0 0 0 1 0 0 
1 0 0 0 0 0 0 0 
 
> printReinas 12 1 
0 0 0 0 1 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 1 0 0 0 0 
0 1 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 1 0 0 0 0 0 
0 0 1 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 1 0 
0 0 0 0 0 0 0 0 1 0 0 0 
0 0 0 1 0 0 0 0 0 0 0 0 
0 0 0 0 0 1 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 1 0 0 
0 0 0 0 0 0 0 0 0 0 0 1 
1 0 0 0 0 0 0 0 0 0 0 0 
 
-} 
4 comentarios
0votos

Escrito por AverageUser hace 1 año

No se si decir que la de Dexter es más corta realmente, pero esta si. Pero bueno, para Prolog es bastante corta, tomando en cuenta que la escribí ordenada, creo yo.
0votos

Escrito por AverageUser hace 1 año

Además no publicaste los Imports, estaría en duda si contar eso como parte del código o no la verdad.
0votos

Escrito por josejuan hace 1 año

Si los tengo en mi prelude seguro que no cuentan y si en la tuya cambias los nombres (ej. Queens por Qs) seguro que será más corta. Es sólo un juego, no le des muchas vueltas ;D
0votos

Escrito por AverageUser hace 1 año

Respecto a los nombre, es por eso que dije que estaba ordenada, eso y que pongo espacios después de cada coma. Y en mi "defensa", diré que es un juego entretenido.

Comenta la solución

Tienes que identificarte para poder publicar tu comentario.