User:Thebigh/mysandbox: Difference between revisions

From Rosetta Code
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>

Revision as of 22:30, 15 November 2021