looping - path problem
[1/6] from: rcm:formix:au at: 25-Apr-2006 15:03
Hello Rebol-Org,
I am having a problem trying to "shrink" some code. These are the initial
values -
random/seed now
digits: [1 2 3 4 5 6 7 8 9 0]
target: copy []
;;; then target becomes a fairly random 4-digit number
target: to-string random/secure digits
remove/part target 6
I want to compare the target with the user's answer, but I can't make a
for or repeat loop
work
because I get invalid path errors. Even though it returns approptiate
results, what follows
is
obviously inefficient so I would be very glad to know the way to make it
leaner.
Regards, Rosemary
get-answer: does [
ans: to-string num/text
answer: copy []
bulls: shots: 0
if find target ans/1 [
either ans/1 == target/1
[bulls: bulls + 1] [shots: shots + 1]]
if find target ans/2 [
either ans/2 == target/2
[bulls: bulls + 1][shots: shots + 1]]
if find target ans/3 [
either ans/3 == target/3
[bulls: bulls + 1][shots: shots + 1]]
if find target ans/4 [
either ans/4 == target/4
[bulls: bulls + 1][shots: shots + 1]]
tries: tries + 1
either ( tries <= 9 )
[answer: rejoin ["0" tries ": " ans " " bulls " " shots]]
[answer: rejoin [tries ": " ans " " bulls " " shots]]
]
--
Formix Australia - www.formix.com.au
613 9354 9585
PO Box 261 Nth Carlton Vic 3054
[2/6] from: tomc:cs:uoregon at: 24-Apr-2006 22:16
hi Rosemary,
have you used the :word notation for the variable in your path
(think of it as getting the value out of the word
instead of putting it in)
repeat i 4[
either equal? ans/:i target/:i
[bulls: bulls + 1]
[shots: shots + 1]
]
Rosemary de Dear wrote:
> Hello Rebol-Org,
> I am having a problem trying to "shrink" some code. These are the initial
<<quoted lines omitted: 39>>
> 613 9354 9585
> PO Box 261 Nth Carlton Vic 3054
--
... nice weather eh tomc-cs.uoregon.edu
[3/6] from: pwawood::gmail at: 25-Apr-2006 14:05
You could use foreach to iterate through one series to find the number
of bulls-eyes (but you have to handle the iteration of the other series
yourself) and then use intersect of the two series to determine the
number of shots:
foreach attempt ans [
if attempt = first target [bulls: bulls + 1]
ans: next ans
]
shots: shots + length? intersect head ans target
Regards
Peter
On Tuesday, Apr 25, 2006, at 13:03 Asia/Kuala_Lumpur, Rosemary de Dear
wrote:
[4/6] from: tomc::cs::uoregon::edu at: 24-Apr-2006 23:06
Hi Peter,
I had looked at the much cleaner 'intersect as well but rejected it
because it treats it's arguments as 'sets' in the mathematical sense...
that is, order does not mater. which I do not think ia appropiate in
this case
Peter Wood wrote:
> You could use foreach to iterate through one series to find the number
> of bulls-eyes (but you have to handle the iteration of the other series
<<quoted lines omitted: 78>>
>>lists at rebol.com with unsubscribe as the subject.
>>
--
... nice weather eh tomc-cs.uoregon.edu
[5/6] from: pwawood:gmai:l at: 25-Apr-2006 14:39
Hi Tom
That's why I used foreach to get the position dependent bulls-eyes and
intersect to get the position independent shots. (I hope I understood
the scoring system properly). It would have helped if there wasn't an
error in my code. Here is the revised version:
foreach attempt ans [
if attempt = first target [bulls: bulls + 1]
target: next target
]
shots: shots + length? intersect ans target: head target
Actually, I suspect there may be a better solution using parse.
Regards
Peter
On Tuesday, Apr 25, 2006, at 14:06 Asia/Kuala_Lumpur, Tom Conlin wrote:
[6/6] from: rcm::formix::com::au at: 25-Apr-2006 19:40
Dear Tom and Peter,
Thank you both very much for your suggestions and code fragments. I had
tried something like
either ans/:i == target/:i
but must have got it wrong, and had thought of parsing as my next option.
I still might, but for now ... success!!! So here is "Bull and Shots" a
little game we played at school when things got dull.
Thank you again, Rosemary
rebol [Title: "Bulls and Shots" File: %bulls-and-shots.r]
random/seed now
digits: [1 2 3 4 5 6 7 8 9 0]
target: copy []
main: layout [
origin 30x30
backdrop water effect [gradient 0x1]
box "Bulls and Shots" 360x30 font-size 20 water white edge [size: 1x1
color: pewter]
at 50x100 guide
btn 100x25 tan "New Game" #"n" [new-game]
num: field 100x25 font-size 16 center middle
btn 100x25 tan "Guess" #"g" [get-answer show-answer]
btn 100x25 tan "Quit" #"q" [quit]
at 30x230 guide
text as-is white bold {
H O W T O P L A Y
* Hit New Game or "n"
* Enter four digits 0 - 9
* Hit Guess or "g"
* Maximum tries = 12
* There are no repeat digits
* B U L L - right digit, right place
* S H O T - right digit, wrong place}
at 220x75 guide
h4 "Try: Guess Bulls Shots" 165x20 snow water
pad 0x-8
results: area 165x240 font-size 17 wrap
pad 80x10
box "Peek" 80x25 font-size 16 water white edge [size: 1x1 color: tan]
feel [over: func [face act pos] [
face/text: either act [copy target]["Peek"] show face ]]
]
new-game: does [
clear results/text
results/line-list: none
show results
tries: 0
target: copy []
target: to-string random/secure digits
remove/part target 6
focus num
]
get-answer: does [
ans: to-string num/text
answer: copy []
bulls: shots: 0
repeat i 4 [
if find target ans/:i [
either ans/:i == target/:i
[bulls: bulls + 1]
[shots: shots + 1]
]]
tries: tries + 1
either ( tries <= 9 )
[answer: rejoin ["0" tries ": " ans " " bulls " " shots]]
[answer: rejoin [tries ": " ans " " bulls " " shots]]
]
show-answer: does [
append results/text answer
append results/text newline
show results
if bulls = 4 [alert form ["Bravo - you guessed it !"]]
if tries = 12 [alert form ["Game over - no guesses left."]]
clear num/text
focus num
]
center-face main
view main
do-events
--
Formix Australia - www.formix.com.au
613 9354 9585
PO Box 261 Nth Carlton Vic 3054
Notes
- Quoted lines have been omitted from some messages.
View the message alone to see the lines that have been omitted