Number reversal game: Difference between revisions
mNo edit summary |
(added ocaml) |
||
Line 150: | Line 150: | ||
11: 3 2 1 4 5 6 7 8 9 How many numbers to flip?: 3 |
11: 3 2 1 4 5 6 7 8 9 How many numbers to flip?: 3 |
||
You took 11 attempts to put the numbers in order.</lang> |
You took 11 attempts to put the numbers in order.</lang> |
||
=={{header|OCaml}}== |
|||
<lang ocaml>let swap ar i j = |
|||
let tmp = ar.(i) in |
|||
ar.(i) <- ar.(j); |
|||
ar.(j) <- tmp |
|||
let shuffle ar = |
|||
for i = pred(Array.length ar) downto 1 do |
|||
let j = Random.int (i + 1) in |
|||
swap ar i j |
|||
done |
|||
let reversal ar n = |
|||
for i = 0 to pred(n/2) do |
|||
let j = (pred n) - i in |
|||
swap ar i j |
|||
done |
|||
let sorted ar = |
|||
try |
|||
let prev = ref ar.(0) in |
|||
for i = 1 to pred(Array.length ar) do |
|||
if ar.(i) < !prev then raise Exit; |
|||
prev := ar.(i) |
|||
done; |
|||
(true) |
|||
with Exit -> |
|||
(false) |
|||
let () = |
|||
print_endline "\ |
|||
Number Reversal Game |
|||
Sort the numbers in ascending order by repeatedly |
|||
flipping sets of numbers from the left."; |
|||
Random.self_init(); |
|||
let nums = Array.init 9 (fun i -> succ i) in |
|||
shuffle nums; |
|||
let n = ref 1 in |
|||
while not(sorted nums) do |
|||
Printf.printf "#%2d: " !n; |
|||
Array.iter (Printf.printf " %d") nums; |
|||
print_newline(); |
|||
let r = read_int() in |
|||
reversal nums r; |
|||
incr n; |
|||
done; |
|||
print_endline "Congratulations!"; |
|||
Printf.printf "You took %d attempts to put the digits in order.\n" !n; |
|||
;;</lang> |
|||
=={{header|PureBasic}}== |
=={{header|PureBasic}}== |
Revision as of 05:56, 5 April 2010
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.
C.f: Sorting algorithms/Pancake sort, Pancake sorting.
BASIC
<lang qbasic>PRINT "Given a jumbled list of the numbers 1 to 9," PRINT "you must select how many digits from the left to reverse." PRINT "Your goal is to get the digits in order with 1 on the left and 9 on the right."
RANDOMIZE TIMER
DIM nums(1 TO 9) AS INTEGER DIM L0 AS INTEGER, n AS INTEGER, flp 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
again = -1 DO
IF tries < 10 THEN PRINT " "; PRINT tries; ":"; FOR L0 = 1 TO 9 PRINT nums(L0); NEXT
IF NOT again THEN EXIT DO
INPUT " -- How many numbers should be flipped"; flp IF flp < 0 THEN flp = 0 IF flp > 9 THEN flp = 0
FOR L0 = 1 TO (flp \ 2) SWAP nums(L0), nums(flp - L0 + 1) NEXT
again = 0 'check for order FOR L0 = 1 TO 8 IF nums(L0) > nums(L0 + 1) THEN again = -1 EXIT FOR END IF NEXT
IF flp > 0 THEN tries = tries + 1
LOOP
PRINT : PRINT "You took"; tries; " tries to put the digits in order."</lang>
Sample output:
Given a jumbled list of the numbers 1 to 9, you must select how many digits from the left to reverse. Your goal is to get the digits in order with 1 on the left and 9 on the right. 0 : 1 4 5 3 2 7 6 8 9 -- How many numbers should be flipped? 7 1 : 6 7 2 3 5 4 1 8 9 -- How many numbers should be flipped? 2 2 : 7 6 2 3 5 4 1 8 9 -- How many numbers should be flipped? 7 3 : 1 4 5 3 2 6 7 8 9 -- How many numbers should be flipped? 3 4 : 5 4 1 3 2 6 7 8 9 -- How many numbers should be flipped? 5 5 : 2 3 1 4 5 6 7 8 9 -- How many numbers should be flipped? 2 6 : 3 2 1 4 5 6 7 8 9 -- How many numbers should be flipped? 3 7 : 1 2 3 4 5 6 7 8 9 You took 7 tries 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>
J
Solution: <lang j>require 'misc' NB. for the verb prompt
INTRO=: noun define Number Reversal Game Flip groups of numbers from the left of the list until the numbers are sorted in ascending order. )
reversegame=: verb define
nums=. >: 9?9 NB. 1-9 in random order score=. 0 smoutput INTRO NB. Display instructions while. (-.@-: /:~) nums do. score=. >: score NB. increment score nnum=. 0&".@prompt (;":&.>score;': ';nums), ' How many numbers to flip?: ' if. 0 = #nnum do. return. end. NB. exit on ENTER nums=. nnum |.@{.`(i.@[)`]} :: ] nums NB. reverse first nnum numbers end. 'You took ',(": score), ' attempts to put the numbers in order.'
)</lang> Example Usage: <lang j> reversegame Number Reversal Game Sort the numbers in ascending order by repeatedly flipping sets of numbers from the left.
1: 4 7 5 6 9 1 2 8 3 How many numbers to flip?: 5 2: 9 6 5 7 4 1 2 8 3 How many numbers to flip?: 9 3: 3 8 2 1 4 7 5 6 9 How many numbers to flip?: 2 4: 8 3 2 1 4 7 5 6 9 How many numbers to flip?: 8 5: 6 5 7 4 1 2 3 8 9 How many numbers to flip?: 3 6: 7 5 6 4 1 2 3 8 9 How many numbers to flip?: 7 7: 3 2 1 4 6 5 7 8 9 How many numbers to flip?: 5 8: 6 4 1 2 3 5 7 8 9 How many numbers to flip?: 6 9: 5 3 2 1 4 6 7 8 9 How many numbers to flip?: 5 10: 4 1 2 3 5 6 7 8 9 How many numbers to flip?: 4 11: 3 2 1 4 5 6 7 8 9 How many numbers to flip?: 3 You took 11 attempts to put the numbers in order.</lang>
OCaml
<lang ocaml>let swap ar i j =
let tmp = ar.(i) in ar.(i) <- ar.(j); ar.(j) <- tmp
let shuffle ar =
for i = pred(Array.length ar) downto 1 do let j = Random.int (i + 1) in swap ar i j done
let reversal ar n =
for i = 0 to pred(n/2) do let j = (pred n) - i in swap ar i j done
let sorted ar =
try let prev = ref ar.(0) in for i = 1 to pred(Array.length ar) do if ar.(i) < !prev then raise Exit; prev := ar.(i) done; (true) with Exit -> (false)
let () =
print_endline "\ Number Reversal Game Sort the numbers in ascending order by repeatedly flipping sets of numbers from the left."; Random.self_init(); let nums = Array.init 9 (fun i -> succ i) in shuffle nums; let n = ref 1 in while not(sorted nums) do Printf.printf "#%2d: " !n; Array.iter (Printf.printf " %d") nums; print_newline(); let r = read_int() in reversal nums r; incr n; done; print_endline "Congratulations!"; Printf.printf "You took %d attempts to put the digits in order.\n" !n;
- </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!
Tcl
<lang tcl>package require Tcl 8.5
- Simple shuffler, not very efficient but good enough for here
proc shuffle list {
set result {} while {[llength $list]} {
set i [expr {int([llength $list] * rand())}] lappend result [lindex $list $i] set list [lreplace $list $i $i]
} return $result
}
- Returns the list with the prefix of it reversed
proc flipfirst {list n} {
concat [lreverse [lrange $list 0 $n-1]] [lrange $list $n end]
}
- Core game engine; list to play with is optional argument
proc nrgame Template:Target "1 2 3 4 5 6 7 8 9" {
set nums $target while {$nums eq $target} {set nums [shuffle $nums]} set goes 0 while {$nums ne $target} {
incr goes puts -nonewline "#${goes}: List is '[join $nums {, }]', how many to reverse? " flush stdout gets stdin n if {$n eq "q"} {return quit} # Input validation would go here set nums [flipfirst $nums $n]
} return $goes
}
- Print some instructions and wait for the user to win
puts "Welcome to the Number Reversal Game!" puts "------------------------------------" puts "I'll show you a list of numbers, you need to reverse prefixes of them" puts "to get the whole list in ascending order. A 'q' will quit early.\n" puts "" set outcome [nrgame] if {$outcome ne "quit"} {
puts "\nYou took $outcome attempts to put the digits in order."
}</lang> Sample output:
Welcome to the Number Reversal Game! ------------------------------------ I'll show you a list of numbers, you need to reverse prefixes of them to get the whole list in ascending order. A 'q' will quit early. #1: List is '8, 6, 2, 5, 7, 9, 3, 1, 4', how many to reverse? 6 #2: List is '9, 7, 5, 2, 6, 8, 3, 1, 4', how many to reverse? 9 #3: List is '4, 1, 3, 8, 6, 2, 5, 7, 9', how many to reverse? 4 #4: List is '8, 3, 1, 4, 6, 2, 5, 7, 9', how many to reverse? 8 #5: List is '7, 5, 2, 6, 4, 1, 3, 8, 9', how many to reverse? 7 #6: List is '3, 1, 4, 6, 2, 5, 7, 8, 9', how many to reverse? 4 #7: List is '6, 4, 1, 3, 2, 5, 7, 8, 9', how many to reverse? 6 #8: List is '5, 2, 3, 1, 4, 6, 7, 8, 9', how many to reverse? 5 #9: List is '4, 1, 3, 2, 5, 6, 7, 8, 9', how many to reverse? 4 #10: List is '2, 3, 1, 4, 5, 6, 7, 8, 9', how many to reverse? 2 #11: List is '3, 2, 1, 4, 5, 6, 7, 8, 9', how many to reverse? 3 You took 11 attempts to put the digits in order.