All pastes #50281 Raw Edit

Untitled

public text v1 · immutable
#50281 ·published 2006-04-20 22:04 UTC
rendered paste body
ROOMMATES IN A HAT
[riah]
;who are the roommates?
exten => s,1,set(__ROWS=6)              ;the number of players
exten => s,n,set(__TRIES=1)
exten => s,n,set(__ROOMMATE1=Brad)
exten => s,n,set(__ROOMMATE2=Brian)
exten => s,n,set(__ROOMMATE3=James)
exten => s,n,set(__ROOMMATE4=Jeff)
exten => s,n,set(__ROOMMATE5=Marc)
exten => s,n,set(__ROOMMATE6=Aubrey)
exten => s,n,set(__PRIZES=2)		;how many winners we can have
exten => s,n,set(__TRUNC=0)		;in the event of a tie, can i trim of the front of the sorted list?
exten => s,n,set(__CROP=0)		;.... " .... can i trim of the back?
exten => s,n,set(__COUNT=0)		;dont need to do this
exten => s,n,set(__TOTALSCORE=0)	;or this
exten => s,n,set(__EXITLOOP=0)		;this is probably ok


;;;;;;;;;;;;;;;;;;;;;;;;;;GET THE WEIGHT OF EACH PLAYER OR SET THEM ALL TO THE SAME;;;;;;;;;;;;;;;;;;;;;;
exten => s,n,set(__COUNT=$[${TRUNC} + 1])               ;set roommate counter
exten => s,n,while($[${COUNT} <= ${ROWS}]) 		;while we havent assigned a weight...
	exten => s,n(reask),background(beep)		;prompt with a tone...
	exten => s,n,waitexten(5)			;and givem five seconds to enter an extension 0-9
	exten => s,n(incr),set(__COUNT=$[${COUNT}+1])   ;then increment the counter
exten => s,n,endwhile
exten => s,n(dontask),noop() 	;(break:  dontask if we are on the last player)  set the number of players 


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CALIBRATE SCORES;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
exten => s,n(repeat),set(__COUNT=$[${TRUNC} + 1])	;Start a counter
				;**CALIBRATE ARRAY TO 100 AND INCREMENT**;
exten => s,n,while($[${COUNT} <= ${ROWS}])		;while we havent counted all the players
	exten => s,n,set(__MATEWEIGHT${COUNT}=${MATH(${MATEWEIGHT${COUNT}}*100,int)})
	exten => s,n,set(__MATEWEIGHT${COUNT}=${MATH(${MATEWEIGHT${COUNT}}/${TOTALSCORE},int)})
	exten => s,n,set(__COUNT=$[${COUNT} + 1])   	;**CALIBRATE ARRAY TO 100 & INCREMENT**;
exten => s,n,endwhile


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;DRAW RANDOMLY & USE # OF TRIES TO PICK A WINNER;;;;;;;;;;;;;;;;;;;;;;;;
exten => s,n,set(__COUNT=$[${TRUNC} + 1])						;RESET COUNT
	;**WHILE WE HAVENT CHECKED EVERYONE WELL START TO DRAW**;
exten => s,n,while($[${COUNT} <= ${ROWS}])

	exten => s,n(iloop),while($[${EXITLOOP} != 1])			;start a boolean loop
		exten => s,n,random(${MATEWEIGHT${COUNT}}:s,finalscore)	;draw based on score till you win
		exten => s,n,set(__TRIES=$[${TRIES} + 1])		;if failed draw again	
		exten => s,n,goto(iloop)				;and end loop
		exten => s,n(finalscore),set(__MATEWEIGHT${COUNT}=${TRIES})	;score based on tries
		exten => s,n,set(__EXITLOOP=1)					;exit the loop
	exten => s,n,endwhile						
	exten => s,n,set(EXITLOOP=0)					;reset boolean var
	exten => s,n,set(__COUNT=$[${COUNT}+1])				;increment parent count
	exten => s,n,set(__TRIES=1)					;reset tries
exten => s,n,endwhile							;check next roomate


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;BUBBLE SORT THE ARRAY, "WINNERS" FIRST;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
exten => s,n,set(__COUNT=$[${TRUNC} + 1])					;a counter
exten => s,n,set(__SUBCOUNT=1)							;a subcounter
exten => s,n,while($[${COUNT} < ${ROWS}])					;checked every spot
	exten => s,n,while($[${SUBCOUNT} < $[${ROWS} - $[${COUNT} - 1]]])	;as few times as possible
				     ;**HANDY DANDY SORT MACRO**;
		exten => s,n,macroif($[${MATEWEIGHT${SUBCOUNT}} > ${MATEWEIGHT$[${SUBCOUNT} + 1]}]?sort|${MATEWEIGHT${SUBCOUNT}},${MATEWEIGHT$[${SUBCOUNT} + 1]},${ROOMMATE${SUBCOUNT}},${ROOMMATE$[${SUBCOUNT} + 1]},${SUBCOUNT},1)
		exten => s,n(incr2),set(__SUBCOUNT=$[${SUBCOUNT} + 1])         	;increment subroutine
	exten => s,n,endwhile
	exten => s,n,set(__COUNT=$[${COUNT} + 1])				;increment parent loop
	exten => s,n,set(__SUBCOUNT=1)						;reset subroutine counter
exten => s,n,endwhile

exten => s,n,set(__COUNT=${PRIZES})		;Set the counter to the last winning spot
;**DO WE ALREADY HAVE WINNERS?  ELSE TRIM IF SOMEONE ISNT TIED FOR A SPOT OR SOMEONE IS DEFINATELY OUT**;
exten => s,n,gotoif($[$[${MATEWEIGHT${COUNT}} != ${MATEWEIGHT$[${COUNT} + 1]}] | $[${PRIZES} >= ${ROWS}]]?winners,1:trunc,1)


;;;;;;;;;;;:;;;LEAVE THE COUNTER AND COUNT BACKWARDS TO SPIT OUT THE WINNERS WHEN WE WIN;;;;;;;;;;;;;;;;;;
exten => winners,1,while($[${COUNT} > 0])		  	;Count backwards

exten => winners,n,noop(${ROOMMATE${COUNT}} is a winner)	;Spit out winner.  Festival instead?
exten => winners,n,set(__COUNT=$[${COUNT} -1])			;Check the next winning spot
exten => winners,n,endwhile
exten => winners,n,hangup					;beautiful friend, the end


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GET WEIGHT AND CHECK TOTAL;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
exten => _X,1,set(__MATEWEIGHT${COUNT}=${EXTEN})   ;give each roommate a relative weight using the counter
exten => _X,n,set(__TOTALSCORE=$[${TOTALSCORE} + ${MATEWEIGHT${COUNT}}])	;increment totalscore
exten => _X,n,gotoif($[${MATEWEIGHT${COUNT}} = 0]?zerocrop)			;to count 0's (no chance)
exten => _X,n,goto(s,incr)							;else go to next roommate

  ;*IF WE GET A ZERO STICK IT AT THE BACK OF THE LIST AND INCREMENT CROP VAR SO WE DONT TEST 0% CHANCE*; 
  ;*USE HANDY MACRO TO REARRANGE LIST STICKING PLAYERS WITH NO CHANCE AT THE BACK CROP THEM OFF ARRAY*;
exten => _X,n(zerocrop),macro(sort|${MATEWEIGHT${COUNT}},${MATEWEIGHT${ROWS}},${ROOMMATE${COUNT}},${ROOMMATE${ROWS}},${COUNT},0)
exten => _X,n,set(__CROP=$[${CROP} + 1])
exten => _X,n,set(__ROWS=$[${ROWS} - 1])			;then keep track of places to crop	
exten => _X,n,noop(${ROOMMATE1} ${ROOMMATE2} ${ROOMMATE3} ${ROOMMATE4} ${ROOMMATE5} ${ROOMMATE6})
exten => _X,n,wait(3)
exten => _X,n,gotoif($[${COUNT} > ${ROWS}]?s,dontask) ;the last guy is already in the right spot
exten => _X,n,goto(s,reask)					;fill this spot with a # other than zero


exten => trunc,1,while($[${COUNT} > 1])					;Count for definate winners
exten => trunc,n,gotoif($[${MATEWEIGHT${COUNT}} != ${MATEWEIGHT$[${COUNT} - 1]}]?posttrunc)  ;check = next
exten => trunc,n,set(__COUNT=$[${COUNT} - 1])				;else keep looking for definites
exten => trunc,n,endwhile
exten => trunc,n(posttrunc),set(__TRUNC=$[${PRIZES} - ${COUNT}])	;dont test actual winners again
exten => trunc,n,set(__COUNT=${PRIZES}+1)				;start from spot we haven't checked
exten => trunc,n,while($[${COUNT} <= ${ROWS}])				;count up
exten => trunc,n,gotoif($[${MATEWEIGHT${COUNT}} != ${MATEWEIGHT$[${COUNT} + 1]}]?postcrop) ;!=? we can crop
exten => trunc,n,set(__COUNT=$[${COUNT} + 1])				;if no count up and check again
exten => trunc,n,endwhile
exten => trunc,n(postcrop),set(__ROWS=$[${ROWS} - ${COUNT}])		;if so less players for next round
exten => trunc,n,goto(s,repeat)						;do it again


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;HANDY DANDY SORT MACRO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
[macro-sort]
exten => s,1,set(__TEMP=${ARG2})				;move
exten => s,n,set(__MATEWEIGHT$[${ARG5} + ${ARG6}]=${ARG1})	;the
exten => s,n,set(__MATEWEIGHT${ARG5}=${TEMP})			;scores
exten => s,n,set(__TEMP=${ARG4})				;move
exten => s,n,set(__ROOMMATE$[${ARG5} + ${ARG6}]=${ARG3})	;the
exten => s,n,set(__ROOMMATE${ARG5}=${TEMP})			;names
;(ARG6 will allow us to count backwards);