Perl Monk, Perl Meditation PerlMonks

### Re: "Another thrice-damned version of Mastermind"

by jgallagher (Pilgrim)
 on May 04, 2003 at 07:00 UTC Need Help??

Very cool. My only question is why, in the for(@q){...}, do you have to set \$a = \$_? I tried to do it with just \$_, and sure enough, it didn't work, but I have no idea why that is.

Spoilers below!
```#!/usr/bin/perl -w

sub q {
\$; = 1;                        # \$; stores how many tries you've h
for (0..3) {
\$;[\$_] = int(rand(9))      # @; stores the correct four number
+s; set it up here
}
}

sub _ {
print @_
}

&q;

for (;;) {
\$: = \$~ = 0;        # set \$: (right number in the right spot) and
+\$~ (right number) to 0
_ "\$/\$; ";          # prints a newline then the number of tries yo
\$_ = <>;            # read a line into \$_

if (/^\d{4}\$/) {    # if the line is exactly 4 digits...
@q = split //;  # @q holds the 4 digits

--\$#q;          # set \$#q = 3, ignoring the newline at \$q[4]
\$@ = -1;        # set \$@ to -1

# This loops through the input digits and checks for correctne
+ss

for (@q) {                         # set \$_ to each of the 4 i
+nput digits
\$a = \$_;                       # set \$a to the current dig
+it (why not leave it \$_?)
(\$a == \$;[++\$@]) && ++\$:       # increment \$: if you have
+a right number in the right spot
|| (grep /\$a/, @;) && ++\$~ # else increment \$~ if you
+have a right number in the wrong spot
}

_ "\$~W\$:B ";  # print out the total of right/wrong (\$~W) and r
+ight/right (\$:B)
++\$;;         # increment number of tries

\$: == 4       # if we have four right numbers all in the right
+ spots
| \$; > 10 # or we have already had 10 tries
&& _ (@;) # print out the correct answer
&& &q     # and start the game over
}
}

Replies are listed 'Best First'.
Re^2: "Another thrice-damned version of Mastermind"
by Aristotle (Chancellor) on May 04, 2003 at 07:29 UTC
Taking a quick cursory look, I'd assume due to grep /\$a/, @;

Makeshifts last the longest.

Re: Re: "Another thrice-damned version of Mastermind"
by tinypig (Beadle) on May 04, 2003 at 11:18 UTC
Nice work. I was reviewing it and I honestly don't remember why I did that (it's been a while since I originally wrote it). The only thing I can think is that I might have been concerned about overwriting the digit. I did have a quit (q) command in there when it was longer, though that is just a shot in the dark. With your suggestion implemented, it does seem to work fine:
```sub q{\$;=1;for(0..3){\$;[\$_]=int(rand(9))}}sub _{print@_}&q;for(;;){\$:=
+\$~=0
;_"\$/\$; ";\$_=<>;if(/^\d{4}\$/){@q=split//;--\$#q;\$@=-1;for(@q){(\$_==\$;[+
++\$@]
)&&++\$:||(grep/\$_/,@;)&&++\$~}_"\$~W\$:B ";++\$;;\$:==4|\$;>10&&_(@;)&&&q}}
Actually, it doesn't. As per Aristotle's suggestion above, the (grep/\$_/,@;) would return true every time, thus always telling you you had four correct numbers.
Doh.
by tinypig (Beadle) on May 04, 2003 at 17:25 UTC
Sorry, you guys are right. Strange, I thought I ran that this morning and it worked.

Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://255442]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others drinking their drinks and smoking their pipes about the Monastery: (5)
As of 2024-08-05 21:57 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?

No recent polls found

Notices?
 • erzuuli ‥ 🛈The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.