User:Thebigh/mysandbox

From Rosetta Code
Revision as of 20:37, 15 November 2021 by Thebigh (talk | contribs) (more)

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|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>

Output:

Seconds Steps behind Steps ahead

600        2102            998
601        2105            1000
602        2110            1000
603        2116            999
604        2121            999
605        2126            999
606        2131            999
607        2137            998
608        2142            998
609        2145            1000
 29037 / 10000
 29237 / 2000

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

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>

Output:

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.