Number reversal game: Difference between revisions

From Rosetta Code
Content added Content deleted
(→‎{{header|PureBasic}}: Added PureBasic)
(→‎{{header|PureBasic}}: Better randomization)
Line 116: Line 116:
Dim MyList(9)
Dim MyList(9)


;- Initiate the list
For i=1 To 9 ;- Initiate the list
For i=1 To 9
MyList(i)=i
MyList(i)=i
Next
Next

;- Mix it up
For i=9 To 1 Step -1
For i=0 To 50 ;- Mix it up
Define j=Random(8)+1
Swap MyList(Random(8)+1),MyList(Random(8)+1)
If j<>i
Swap MyList(i),MyList(j)
EndIf
Next
Next


;Start playing
If OpenConsole() ;Start playing
If OpenConsole()
Define ok=#False, score, indata
Define ok=#False, score, indata
Repeat
Repeat


;- Show current list
score+1
score+1
Print(RSet(str(score), 3)+": ")
Print(RSet(str(score), 3)+": ") ;- Show current list
For i=1 To 9
For i=1 To 9
Print(str(MyList(i))+" ")
Print(str(MyList(i))+" ")
Next
Next
;- Get input & swap
Repeat ;- Get input & swap
Repeat
Print(#CRLF$+"How many numbers should be flipped? ")
Print(#CRLF$+"How many numbers should be flipped? ")
indata=Val(Input())
indata=Val(Input())
Line 149: Line 142:
Next
Next
;- Check if ok?
ok=#True ;- Check if ok?
ok=#True
For i=1 To 9
For i=1 To 9
If MyList(i)<>i
If MyList(i)<>i

Revision as of 21:26, 3 April 2010

Task
Number reversal game
You are encouraged to solve this task according to the task description, using any language you may know.

Given a jumbled list of the numbers 1 to 9, show the list then ask the player how many digits from the left to reverse. Reverse those digits, then ask again, until all the digits end up in ascending order.

The score is the count of the reversals needed to attain the ascending order.

Note: Assume the players input does not need extra validation.

BASIC

Works with: QBasic

<lang qbasic>PRINT "number reversal game" PRINT " Given a jumbled list of the numbers 1 to 9" PRINT " Show the list." PRINT " Ask the player how many digits from the left to reverse." PRINT " Reverse those digits then ask again." PRINT " until all the digits end up in ascending order."

RANDOMIZE TIMER

DIM nums(1 TO 9) AS INTEGER DIM L0 AS INTEGER, n AS INTEGER, flip AS INTEGER, tries AS INTEGER, again AS INTEGER

'initial values and Knuth shuffle FOR L0 = 1 TO 9

   nums(L0) = L0

NEXT FOR L0 = 9 TO 1 STEP -1

   n = INT(RND * (L0)) + 1
   IF n <> L0 THEN SWAP nums(n), nums(L0)

NEXT

tries = 1 DO

   IF tries < 10 THEN PRINT " ";
   PRINT tries; ":";
   FOR L0 = 1 TO 9
       PRINT nums(L0);
   NEXT
   INPUT "How many numbers should be flipped"; flip
   IF flip < 0 THEN flip = 0
   IF flip > 9 THEN flip = 9
   FOR L0 = 1 TO (flip \ 2)
       SWAP nums(L0), nums(flip - L0 + 1)
   NEXT
   again = 0
   'check for order
   FOR L0 = 1 TO 8
       IF nums(L0) > nums(L0 + 1) THEN
           tries = tries + 1
           again = -1
           EXIT FOR
       END IF
   NEXT

LOOP WHILE again

PRINT "You took "; tries; " attempts to put the digits in order"</lang>

Sample output:

number reversal game
    Given a jumbled list of the numbers 1 to 9
    Show the list.
    Ask the player how many digits from the left to reverse.
    Reverse those digits then ask again.
    until all the digits end up in ascending order.
 1 : 2  6  9  1  3  7  5  8  4 How many numbers should be flipped? 3
 2 : 9  6  2  1  3  7  5  8  4 How many numbers should be flipped? 9
 3 : 4  8  5  7  3  1  2  6  9 How many numbers should be flipped? 2
 4 : 8  4  5  7  3  1  2  6  9 How many numbers should be flipped? 8
 5 : 6  2  1  3  7  5  4  8  9 How many numbers should be flipped? 5
 6 : 7  3  1  2  6  5  4  8  9 How many numbers should be flipped? 7
 7 : 4  5  6  2  1  3  7  8  9 How many numbers should be flipped? 3
 8 : 6  5  4  2  1  3  7  8  9 How many numbers should be flipped? 6
 9 : 3  1  2  4  5  6  7  8  9 How many numbers should be flipped? 3
 10 : 2  1  3  4  5  6  7  8  9 How many numbers should be flipped? 2
You took  10  attempts to put the digits in order

Factor

<lang factor>USING: formatting io kernel math math.parser math.ranges namespaces random sequences strings ; IN: rosetta.number-reversal

make-jumbled-array ( -- sorted jumbled )
   CHAR: 1 CHAR: 9 [a,b] [ 1string ] map dup clone randomize
   [ 2dup = ] [ randomize ] while ;

SYMBOL: trials

prompt ( jumbled -- n )
   trials get "#%2d: " printf
   ", " join write
   "   Flip how many? " write flush
   readln string>number ;
game-loop ( sorted jumbled -- )
   2dup = [
       2drop trials get
       "\nYou took %d attempts to put the digits in order!\n" printf
       flush
   ] [
       trials [ 1 + ] change
       dup dup prompt head-slice reverse! drop
       game-loop
   ] if ;
play ( -- )
   0 trials set
   make-jumbled-array game-loop ;</lang>

PureBasic

<lang PureBasic>Define i Dim MyList(9)

For i=1 To 9  ;- Initiate the list

 MyList(i)=i

Next

For i=0 To 50  ;- Mix it up

 Swap MyList(Random(8)+1),MyList(Random(8)+1)

Next

If OpenConsole() ;Start playing

 Define ok=#False, score, indata
 Repeat
   score+1
   Print(RSet(str(score), 3)+": ")      ;- Show current list
   For i=1 To 9
     Print(str(MyList(i))+" ")
   Next
   
   Repeat                               ;- Get input & swap
     Print(#CRLF$+"How many numbers should be flipped? ")
     indata=Val(Input())
   Until indata>=1 And indata<=9
   For i=1 To (indata/2)
     Swap MyList(i),MyList(indata-i+1)
   Next
   
   ok=#True                             ;- Check if ok?
   For i=1 To 9
     If MyList(i)<>i
       ok=#False
     EndIf
   Next
 Until ok
 PrintN(#CRLF$+"You did it in "+str(score)+" moves")
 Print("Press ENTER to exit"): Input()
 CloseConsole()

EndIf</lang>

Python

<lang python> number reversal game

   Given a jumbled list of the numbers 1 to 9
   Show the list.
   Ask the player how many digits from the left to reverse.
   Reverse those digits then ask again.
   until all the digits end up in ascending order.

import random

print(__doc__) data, trials = list('123456789'), 0 while data == sorted(data):

   random.shuffle(data)

while data != sorted(data):

   trials += 1
   flip = int(input('#%2i: LIST: %r Flip how many?: ' % (trials, ' '.join(data))))
   data[:flip] = reversed(data[:flip])

print('\nYou took %2i attempts to put the digits in order!' % trials)</lang>

Sample output:

number reversal game
    Given a jumbled list of the numbers 1 to 9
    Show the list.
    Ask the player how many digits from the left to reverse.
    Reverse those digits then ask again.
    until all the digits end up in ascending order.


# 1: LIST: '1 3 9 2 7 5 4 8 6' Flip how many?: 9
# 2: LIST: '6 8 4 5 7 2 9 3 1' Flip how many?: 6
# 3: LIST: '2 7 5 4 8 6 9 3 1' Flip how many?: 8
# 4: LIST: '3 9 6 8 4 5 7 2 1' Flip how many?: 7
# 5: LIST: '7 5 4 8 6 9 3 2 1' Flip how many?: 3
# 6: LIST: '4 5 7 8 6 9 3 2 1' Flip how many?: 6
# 7: LIST: '9 6 8 7 5 4 3 2 1' Flip how many?: 2
# 8: LIST: '6 9 8 7 5 4 3 2 1' Flip how many?: 4
# 9: LIST: '7 8 9 6 5 4 3 2 1' Flip how many?: 3
#10: LIST: '9 8 7 6 5 4 3 2 1' Flip how many?: 9

You took 10 attempts to put the digits in order!