User:Thebigh/mysandbox: Difference between revisions
Content added Content deleted
(MOAR) |
(clear) |
||
Line 1: | Line 1: | ||
An evil wizard has trapped you in the stairwell of his castle. Your only hope of escape is to run up all 100 steps to reach the top, and you can run one step per second. Unfortunately the wizard uses magic to lengthen the staircase by five steps per second. The new steps are inserted randomly between existing steps, so if you're lucky some of them might be beneath you and not ahead of you. |
|||
Can you escape, or are you doomed to run up an ever-lengthening staircase forever? |
|||
Write a program to simulate your escape attempt. How are you doing after ten minutes? For every second between 600 and 609 seconds inclusive print the number of steps behind you and the number still ahead of you. |
|||
If you escaped, run 10,000 tests and print the average time taken and the average final length of the staircase. |
|||
==header|C== |
|||
<lang c> |
|||
#include <stdio.h> |
|||
#include <stdlib.h> |
|||
#include <time.h> |
|||
int main(void) { |
|||
int trial, secs_tot=0, steps_tot=0; //keep track of time and steps over all the trials |
|||
int sbeh, slen, wiz, secs; //all the variables related to an individual trial |
|||
time_t t; |
|||
srand((unsigned) time(&t)); //random number seed |
|||
printf( "Seconds steps behind steps ahead\n" ); |
|||
for( trial=1;trial<=10000;trial++ ) { //10000 attempts for the runner |
|||
sbeh = 0; slen = 100; secs = 0; // initialise this trial |
|||
while(sbeh<slen) { //as long as the runner is still on the stairs |
|||
sbeh+=1; //runner climbs a step |
|||
for(wiz=1;wiz<=5;wiz++) { //evil wizard conjures five new steps |
|||
if(rand()%slen < sbeh) |
|||
sbeh+=1; //maybe a new step is behind us |
|||
slen+=1; //either way, the staircase is longer |
|||
} |
|||
secs+=1; //one second has passed |
|||
if(trial==1&&599<secs&&secs<610) |
|||
printf("%d %d %d\n", secs, sbeh, slen-sbeh ); |
|||
} |
|||
secs_tot+=secs; |
|||
steps_tot+=slen; |
|||
} |
|||
printf( "Average secs taken: %f\n", secs_tot/10000.0 ); |
|||
printf( "Average final length of staircase: %f\n", steps_tot/10000.0 ); |
|||
return 0; |
|||
}</lang> |
|||
{{out}}<pre> |
|||
Seconds steps behind steps ahead |
|||
600 2147 953 |
|||
601 2151 954 |
|||
602 2156 954 |
|||
603 2160 955 |
|||
604 2166 954 |
|||
605 2169 956 |
|||
606 2174 956 |
|||
607 2180 955 |
|||
608 2184 956 |
|||
609 2188 957 |
|||
Average secs taken: 2921.493200 |
|||
Average final length of staircase: 14707.466000 |
|||
</pre> |
|||
==header|Fermat== |
|||
<lang fermat> |
|||
time_tot:=0; {we'll keep track of the total time and steps across all the trials} |
|||
steps_tot:=0; |
|||
!!('Seconds ','Steps behind ','Steps ahead'); |
|||
for trial = 1 to 10 do |
|||
s_behind:=0; {initialise staircase and runner for this trial} |
|||
stair_len:=100; |
|||
time:=0; |
|||
while s_behind < stair_len do |
|||
s_behind:=s_behind + 1; |
|||
for wiz = 1 to 5 do |
|||
stair_len:=stair_len + 1; {evil wizard creates a step} {(mwaahahaha)} |
|||
if (Rand|stair_len) < s_behind then |
|||
s_behind:=s_behind + 1; |
|||
fi |
|||
od; |
|||
time:=time+1; {another second has passed} |
|||
if trial = 1 and 599<time and time<610 then |
|||
!!(time, ' ', s_behind, ' ',stair_len-s_behind) |
|||
fi; |
|||
od; |
|||
time_tot:=time_tot+time; |
|||
steps_tot:=steps_tot+stair_len; |
|||
od; |
|||
!!(time_tot/10000); |
|||
!!(steps_tot/10000);</lang> |
|||
{{out}}<pre> |
|||
Seconds Steps behind Steps ahead |
|||
600 2125 975 |
|||
601 2129 976 |
|||
602 2132 978 |
|||
603 2136 979 |
|||
604 2142 978 |
|||
605 2146 979 |
|||
606 2151 979 |
|||
607 2156 979 |
|||
608 2162 978 |
|||
609 2166 979 |
|||
3697083 / 1250 |
|||
3722083 / 250 |
|||
</pre> |
|||
==header|FreeBASIC== |
|||
<lang freebasic> |
|||
randomize timer |
|||
dim as uinteger steps_behind = 0, stairs_length = 100, seconds, j |
|||
dim as uinteger seconds_tot, steps_tot |
|||
print "Seconds", "steps behind", "steps ahead" |
|||
for trial as uinteger = 1 to 10000 'We'll have the runner try this 10000 times |
|||
steps_behind = 0 'runner starts at the bottom |
|||
seconds = 0 'reset time taken |
|||
stairs_length = 100 'Staircase has 100 steps |
|||
while steps_behind < stairs_length 'if the runner hasn't reached the top |
|||
steps_behind += 1 'go up one step |
|||
for j = 1 to 5 'The evil wizard conjures another five steps |
|||
if int(rnd*stairs_length) < steps_behind then steps_behind += 1 |
|||
'there's a chance that a new step will be behind you |
|||
stairs_length += 1 'but either way the staircase is one step longer |
|||
next j |
|||
seconds += 1 'that all took one second |
|||
if trial = 1 and seconds >599 and seconds < 610 then print seconds, steps_behind, stairs_length - steps_behind |
|||
'for the first attempt, see how the runner is doing after ten minutes |
|||
wend |
|||
seconds_tot += seconds 'if the runner escaped, track the time taken and the length of the stairs |
|||
steps_tot += stairs_length |
|||
next trial |
|||
print "Average time taken: ";seconds_tot/10000; " seconds." |
|||
print "Average final staircase length: ";steps_tot/10000; " steps." |
|||
'if you noticed that last number is about 100*exp(5), that's no coincidence</lang> |
|||
{{out}}<pre> |
|||
Seconds steps behind steps ahead |
|||
600 2032 1068 |
|||
601 2038 1067 |
|||
602 2042 1068 |
|||
603 2045 1070 |
|||
604 2048 1072 |
|||
605 2053 1072 |
|||
606 2055 1075 |
|||
607 2060 1075 |
|||
608 2064 1076 |
|||
609 2068 1077 |
|||
Average time taken: 2921.9457 seconds. |
|||
Average final staircase length: 14709.7285 steps. |
|||
</pre> |
|||
==header|GW-BASIC== |
|||
<lang gwbasic> |
|||
10 RANDOMIZE TIMER |
|||
20 TIMET = 0 : STEPST = 0 |
|||
30 FOR TRIAL = 1 TO 10000 |
|||
40 TIME = 0 |
|||
50 SBEH = 0 |
|||
60 SLEN = 100 |
|||
70 SBEH = SBEH + 1 |
|||
80 IF SBEH >= SLEN THEN GOTO 160 |
|||
90 FOR WIZ = 1 TO 5 |
|||
100 IF INT(RND*SLEN)<SBEH THEN SBEH = SBEH + 1 |
|||
110 SLEN = SLEN + 1 |
|||
120 NEXT WIZ |
|||
130 TIME = TIME + 1 |
|||
140 IF TRIAL = 1 AND 599<TIME AND TIME <610 THEN PRINT TIME, SBEH, SLEN-SBEH |
|||
150 GOTO 70 |
|||
160 TIMET = TIMET+TIME+1 |
|||
170 STEPST = STEPST + SLEN |
|||
180 NEXT TRIAL |
|||
190 PRINT TIMET/10000 |
|||
200 PRINT STEPST/10000</lang> |
|||
{{out}}<pre> |
|||
600 2274 826 |
|||
601 2279 826 |
|||
602 2284 826 |
|||
603 2289 826 |
|||
604 2294 826 |
|||
605 2299 826 |
|||
606 2305 825 |
|||
607 2309 826 |
|||
608 2313 827 |
|||
609 2319 826 |
|||
2960.879 |
|||
14899.39 |
|||
</pre> |