Word search: Difference between revisions

Content added Content deleted
(Added 11l)
Line 45: Line 45:
mph (8,8)(6,8)</pre>
mph (8,8)(6,8)</pre>
<br><br>
<br><br>

=={{header|11l}}==
{{trans|Python}}

<lang 11l>-V
dirs = [[1, 0], [ 0, 1], [ 1, 1],
[1, -1], [-1, 0],
[0, -1], [-1, -1], [-1, 1]]
n_rows = 10
n_cols = 10
grid_size = n_rows * n_cols
min_words = 25

T Grid
num_attempts = 0
[[String]] cells = [[‘’] * :n_cols] * :n_rows
[String] solutions

F read_words(filename)
[String] words
L(line) File(filename).read_lines()
V s = line.lowercase()
I re:‘^[a-z]{3,10}’.match(s)
words.append(s)
R words

F place_message(Grid &grid; =msg)
msg = msg.uppercase().replace(re:‘[^A-Z]’, ‘’)
V message_len = msg.len
I message_len C 0 <.< :grid_size
V gap_size = :grid_size I/ message_len

L(i) 0 .< message_len
V pos = i * gap_size + random:(0 .. gap_size)
grid.cells[pos I/ :n_cols][pos % :n_cols] = msg[i]

R message_len
R 0

F try_location(Grid &grid; word, direction, pos)
V r = pos I/ :n_cols
V c = pos % :n_cols
V length = word.len

I (:dirs[direction][0] == 1 & (length + c) > :n_cols) |
(:dirs[direction][0] == -1 & (length - 1) > c) |
(:dirs[direction][1] == 1 & (length + r) > :n_rows) |
(:dirs[direction][1] == -1 & (length - 1) > r)
R 0

V rr = r
V cc = c
V i = 0
V overlaps = 0

L i < length
I grid.cells[rr][cc] != ‘’ & grid.cells[rr][cc] != word[i]
R 0
cc += :dirs[direction][0]
rr += :dirs[direction][1]
i++

rr = r
cc = c
i = 0

L i < length
I grid.cells[rr][cc] == word[i]
overlaps++
E
grid.cells[rr][cc] = word[i]

I i < length - 1
cc += :dirs[direction][0]
rr += :dirs[direction][1]
i++

V letters_placed = length - overlaps
I letters_placed > 0
grid.solutions.append(‘#<10 (#.,#.)(#.,#.)’.format(word, c, r, cc, rr))

R letters_placed

F try_place_word(Grid &grid; word)
V rand_dir = random:(0 .. :dirs.len)
V rand_pos = random:(0 .. :grid_size)

L(=direction) 0 .< :dirs.len
direction = (direction + rand_dir) % :dirs.len

L(=pos) 0 .< :grid_size
pos = (pos + rand_pos) % :grid_size
V letters_placed = try_location(&grid, word, direction, pos)
I letters_placed > 0
R letters_placed
R 0

F create_word_search(&words)
V grid = Grid()
V num_attempts = 0

L num_attempts < 100
num_attempts++
random:shuffle(&words)
grid = Grid()
V message_len = place_message(&grid, ‘Rosetta Code’)
V target = :grid_size - message_len
V cells_filled = 0
L(word) words
cells_filled += try_place_word(&grid, word)
I cells_filled == target
I grid.solutions.len >= :min_words
grid.num_attempts = num_attempts
R grid
E
L.break
R grid

F print_result(grid)
I grid.num_attempts == 0
print(‘No grid to display’)
R

V size = grid.solutions.len

print(‘Attempts: #.’.format(grid.num_attempts))
print(‘Number of words: #.’.format(size))

print("\n 0 1 2 3 4 5 6 7 8 9\n")
L(r) 0 .< :n_rows
print(‘#. ’.format(r), end' ‘’)
L(c) 0 .< :n_cols
print(‘ #. ’.format(grid.cells[r][c]), end' ‘’)
print()
print()

L(i) (0 .< size - 1).step(2)
print(‘#. #.’.format(grid.solutions[i], grid.solutions[i + 1]))

I size % 2 == 1
print(grid.solutions[size - 1])

print_result(create_word_search(&read_words(‘unixdict.txt’)))</lang>

{{out}}
<pre>
Attempts: 2
Number of words: 26

0 1 2 3 4 5 6 7 8 9

0 a s i a t i c R w t
1 O n o i l l i t o c
2 a a r o n a S r k e
3 d a l y h E i n r v
4 t T n t u T i o d e
5 d e l a y t c n w n
6 d r A n s a C o a t
7 t c o O b c d g o f
8 s w e l l n i r D u
9 s h a l e E w a c l

deny (0,6)(3,3) tan (3,4)(3,6)
cotillion (9,1)(1,1) aaron (0,2)(4,2)
albacore (2,9)(9,2) eventful (9,2)(9,9)
stink (4,6)(8,2) endow (4,9)(8,5)
asiatic (0,0)(6,0) daly (0,3)(3,3)
swell (0,8)(4,8) delay (0,5)(4,5)
shale (0,9)(4,9) argon (7,9)(7,5)
tori (9,0)(6,3) oct (2,7)(0,7)
yuh (4,5)(4,3) sci (4,6)(6,8)
tor (9,6)(7,8) wac (6,9)(8,9)
lord (3,8)(0,5) rat (2,2)(0,4)
ode (7,4)(9,4) fan (9,7)(7,5)
ala (5,2)(3,0) wok (8,0)(8,2)
</pre>


=={{header|C sharp}}==
=={{header|C sharp}}==