Jump to content

Flipping bits game: Difference between revisions

m
→‎{{header|REXX}}: simplified the program, added identifiers of the user inputs.
m (→‎{{header|Perl 6}}: fixed scramble routine)
m (→‎{{header|REXX}}: simplified the program, added identifiers of the user inputs.)
Line 2,674:
:::*   the size of the array (grid)   [default is 3,   maximum is 26]
:::*   the number of bits (for the target) to be set to   '''on'''   [default is size of the grid]
:::*   the characters which are used for the   '''on'''   and   '''off'''   (bits)   [defaults are   '''1'''   and   '''0''']
<br>Programming note: &nbsp; none of the command line parameters are checked for errors (so as to make the program simpler).
<lang rexx>/*REXX program presents a "flipping bit" puzzle. The user can solve via it via C.L. */
parse arg N u on. off . /*get optional arguments from the C.L. */
if N=='' | N=="," then N =3 /*Size given? Then use default of 3.*/
if u=='' | u=="," then u =N /*the number of bits initialized to ON.*/
if on =='' then on =1 /*the character used for "on". */
if off=='' then off=0 /* " " " " "off". */
col@= 'a b c d e f g h i j k l m n o p q r s t u v w x y z' /*for the column id.*/
cols=space(col@, 0); upper cols /*letters to be used for the columns. */
@.=off0; !.=off0 /*set both arrays to "off" characters.*/
tries=0 /*number of player's attempts (so far).*/
do while show(0) < u /* [↓] turn "on" U number of bits.*/
r=random(1, N); c=random(1, N) /*get a random row and column. */
@.r.c=on1 ; !.r.c=on 1 /*set (both) row and column to ON. */
end /*while*/ /* [↑] keep going 'til U bits set.*/
oz=z /*keep the original array string. */
Line 2,697 ⟶ 2,694:
end /*random···*/ /* [↑] just perform 1 or 2 times. */
 
if z==oz then call flip 'R', random(1, N) /*ensure it's not target we're flipping*/
 
do until z==oz /*prompt until they get it right. */
call prompt /*get a row or column number from C.L. */
call flip left(?, 1), substr(?, 2) /*flip a user selected row or column. */
call show 0 /*get image (Z) of the updated array. */
end /*until···*/
Line 2,710 ⟶ 2,707:
/*──────────────────────────────────────────────────────────────────────────────────────*/
halt: say 'program was halted!'; exit /*the REXX program was halted by user. */
isInt: return datatype(arg(1), 'W') /*returns 1 if arg is an integer.*/
isLet: return datatype(arg(1), 'M') /*returns 1 if arg is a letter. */
terr: if ok then say '***error!***: illegal' arg(1); ok=0; return
/*──────────────────────────────────────────────────────────────────────────────────────*/
flip: parse arg x,# /*X is R or C; #: is which one.*/
do c=1 for N while x=='R'; if @.#.c==on then \@.#.c=off; else @.#.end /*c=on; end*/
do r=1 for N while x=='C'; if @.r.#==on then \@.r.#=off; else @.end /*r.#=on; end*/
return /* [↑] the bits can be ON or OFF. */
/*──────────────────────────────────────────────────────────────────────────────────────*/
Line 2,725 ⟶ 2,722:
 
do forever; ok=1; say; say !; pull ? _ . 1 all /*prompt & get ans*/
if abbrev('QUIT', ?, 1) then do; say 'quitting···'; exit 0; end
if ?=='' then do; call show 1," ◄───target",.; ok=0
call show 1," ◄───your array"
Line 2,734 ⟶ 2,731:
if isLet(?) & (a<1 | a>N) then call terr 'column: ' ?
if isLet(?) & length(?)>1 then call terr 'column: ' ?
if isLet(?) then ?='C'pos(?, cols)
if isInt(?) & (?<1 | ?>N) then call terr 'row: ' ?
if isInt(?) then ?=?/1 /*normalize number*/
Line 2,744 ⟶ 2,741:
return ? /*return response.*/
/*──────────────────────────────────────────────────────────────────────────────────────*/
show: $=0; _=; z _=; parse arg tell,tx,o /*$: #≡num of ON bits.*/
if tell then do; say /*are we telling? */
say ' ' subword(col@,1,N) " column letter"
say 'row ╔'copies('═',N+N+1) /*prepend col hdrs*/
end /* [↑] grid hdrs.*/
if off= z='' then off=0 /* " " " " "off". /* [↓] build grid.*/
 
do r=1 for N /*show grid rows.*/
do c=1 for N; if o==. then do; z=z || !.r.c; _=_ !.r.c; $=$+!.r.c; /*build grid cols.*/end
if o==. then else do; z=z || !@.r.c; _=_ !@.r.c; $=$+(!@.r.c==on); end
else do; z=z || @.r.c; _=_ @.r.c; $=$+(@.r.c==on); end
end /*c*/ /*··· and sum ONs.*/
if tx\=='' then tar.r=_ tx /*build da target?*/
if tell then say right(r, 2) ' ║'_ tx; _= /*show the grid? */
end /*r*/ /*show a grid row.*/
 
if tell then say /*show blank line.*/
return $ /*$: #num of ONon bits. */</lang>
'''output''' &nbsp; when using the default input of: &nbsp; <tt> 3 </tt>
 
Line 2,766 ⟶ 2,762:
 
Also note that the 2<sup>nd</sup> answer was a blank (or nothing), which caused the program to re-show the target array.
<pre style="height:75ex101ex">
a b c column letter
row ╔═══════
Line 2,782 ⟶ 2,778:
 
─────────Please enter a row number or column letter, or Quit:
2 ◄■■■■■■■■■■■■■ user input
2
─────────bit array after play: 1
 
Line 2,793 ⟶ 2,789:
 
─────────Please enter a row number or column letter, or Quit:
◄■■■■■■■■■■■■■ user input (a null)
 
 
a b c column letter
Line 2,810 ⟶ 2,806:
 
─────────Please enter a row number or column letter, or Quit:
b ◄■■■■■■■■■■■■■ user input
b
─────────bit array after play: 2
 
Line 2,821 ⟶ 2,817:
 
─────────Please enter a row number or column letter, or Quit:
a ◄■■■■■■■■■■■■■ user input
a
 
a b c column letter
Line 2,831 ⟶ 2,827:
─────────Congrats! You did it in 3 tries.
</pre>
'''output''' &nbsp; when the following was used for input: &nbsp; <tt> 4 &nbsp; , &nbsp; + &nbsp; - </tt>
<pre>
a b c d column letter
row ╔═════════
1 ║ +1 +1 -0 -0 ◄───target
2 ║ -0 +1 -0 +1 ◄───target
3 ║ -0 -0 -0 -0 ◄───target
4 ║ -0 -0 -0 -0 ◄───target
 
 
a b c d column letter
row ╔═════════
1 ║ -0 +1 -0 +1 ◄───your array
2 ║ -0 -0 +1 +1 ◄───your array
3 ║ +1 -0 -0 +1 ◄───your array
4 ║ +1 -0 -0 +1 ◄───your array
 
 
─────────Please enter a row number or column letter, or Quit:
q ◄■■■■■■■■■■■■■ user input
q
</pre>
 
Cookies help us deliver our services. By using our services, you agree to our use of cookies.