Flipping bits game: Difference between revisions
Content deleted Content added
m →{{header|Haskell}}: (Slightly reordered imports, for legibility) |
No edit summary |
||
Line 1,777: | Line 1,777: | ||
Completed in 3 moves.</pre> |
Completed in 3 moves.</pre> |
||
=={{header|Lua}}== |
|||
<lang lua> |
|||
target, board, moves, W, H = {}, {}, 0, 3, 3 |
|||
function getIndex( i, j ) return i + j * W - W end |
|||
function flip( d, r ) |
|||
function invert( a ) if a == 1 then return 0 end return 1 end |
|||
local idx |
|||
if d == 1 then |
|||
for i = 1, W do |
|||
idx = getIndex( i, r ) |
|||
board[idx] = invert( board[idx] ) |
|||
end |
|||
else |
|||
for i = 1, H do |
|||
idx = getIndex( r, i ) |
|||
board[idx] = invert( board[idx] ) |
|||
end |
|||
end |
|||
moves = moves + 1 |
|||
end |
|||
function createTarget() |
|||
target, board = {}, {} |
|||
local idx |
|||
for j = 1, H do |
|||
for i = 1, W do |
|||
idx = getIndex( i, j ) |
|||
if math.random() < .5 then target[idx] = 0 |
|||
else target[idx] = 1 |
|||
end |
|||
board[idx] = target[idx] |
|||
end |
|||
end |
|||
for i = 1, 103 do |
|||
if math.random() < .5 then flip( 1, math.random( H ) ) |
|||
else flip( 2, math.random( W ) ) |
|||
end |
|||
end |
|||
moves = 0 |
|||
end |
|||
function getUserInput() |
|||
io.write( "Input row and/or column: " ); local r = io.read() |
|||
local a |
|||
for i = 1, #r do |
|||
a = string.byte( r:sub( i, i ):lower() ) |
|||
if a >= 48 and a <= 57 then flip( 2, a - 48 ) end |
|||
if a >= 97 and a <= string.byte( 'z' ) then flip( 1, a - 96 ) end |
|||
end |
|||
end |
|||
function solved() |
|||
local idx |
|||
for j = 1, H do |
|||
for i = 1, W do |
|||
idx = getIndex( i, j ) |
|||
if target[idx] ~= board[idx] then return false end |
|||
end |
|||
end |
|||
return true |
|||
end |
|||
function display() |
|||
local idx |
|||
io.write( "\nTARGET\n " ) |
|||
for i = 1, W do io.write( string.format( "%d ", i ) ) end; print() |
|||
for j = 1, H do |
|||
io.write( string.format( "%s ", string.char( 96 + j ) ) ) |
|||
for i = 1, W do |
|||
idx = getIndex( i, j ) |
|||
io.write( string.format( "%d ", target[idx] ) ) |
|||
end; io.write( "\n" ) |
|||
end |
|||
io.write( "\nBOARD\n " ) |
|||
for i = 1, W do io.write( string.format( "%d ", i ) ) end; print() |
|||
for j = 1, H do |
|||
io.write( string.format( "%s ", string.char( 96 + j ) ) ) |
|||
for i = 1, W do |
|||
idx = getIndex( i, j ) |
|||
io.write( string.format( "%d ", board[idx] ) ) |
|||
end; io.write( "\n" ) |
|||
end |
|||
io.write( string.format( "Moves: %d\n", moves ) ) |
|||
end |
|||
function play() |
|||
while true do |
|||
createTarget() |
|||
repeat |
|||
display() |
|||
getUserInput() |
|||
until solved() |
|||
display() |
|||
io.write( "Very well!\nPlay again(Y/N)? " ); |
|||
if io.read():lower() ~= "y" then return end |
|||
end |
|||
end |
|||
--[[entry point]]-- |
|||
math.randomseed( os.time() ) |
|||
play() |
|||
</lang> |
|||
{{out}} |
|||
<pre> |
|||
TARGET |
|||
1 2 3 |
|||
a 0 0 0 |
|||
b 0 0 0 |
|||
c 1 0 0 |
|||
BOARD |
|||
1 2 3 |
|||
a 1 1 0 |
|||
b 0 0 1 |
|||
c 0 1 0 |
|||
Moves: 0 |
|||
Input row and/or column: 3ac |
|||
TARGET |
|||
1 2 3 |
|||
a 0 0 0 |
|||
b 0 0 0 |
|||
c 1 0 0 |
|||
BOARD |
|||
1 2 3 |
|||
a 0 0 0 |
|||
b 0 0 0 |
|||
c 1 0 0 |
|||
Moves: 3 |
|||
Very well! |
|||
Play again(Y/N)? |
|||
</pre> |
|||
=={{header|Maple}}== |
=={{header|Maple}}== |