@kbr: Die vielen GOTOs (und GOSUBs) sind ja eine direkte Folge der Einschränkungen von: kein ELSE, BREAK, WHILE, UNTIL, und keine benannten Funktionen.  Es gab ja auch BASIC-Erweiterungen die so etwas zur Verfügung gestellt haben.  Simons BASIC zum Beispiel hatte so einiges davon.  Leider sind die Programme dadurch eher langsamer geworden.
So sieht das dann in QBasic aus wenn man noch eigene Datentypen und benannte Unterprogramme und Funktionen dazu nimmt:
[codebox=qbasic file=Unbenannt.txt]CONST AscA=ASC("a")
TYPE RoomType
  name AS STRING
  sectorID AS INTEGER
  checksum AS STRING*5
END TYPE
TYPE HistogramType
  count(25) AS INTEGER
  letter(25) AS INTEGER
END TYPE
SUB ParseRoom(room AS RoomType, s AS STRING)
  i=INSTR(s, ANY "0123456789")
  room.name=MID$(s,1,i-2)
  room.sectorID=VAL(MID$(s,i))
  room.checksum=MID$(s,LEN(s)-5,5)
END SUB
SUB InitHistogram(histogram AS HistogramType)
  FOR i=0 TO 25
    histogram.count(i)=0
    histogram.letter(i)=i
  NEXT
END SUB
SUB CountLetters(histogram AS HistogramType, s AS STRING)
  FOR i=1 TO LEN(s)
    c$=MID$(s,i,1)
    IF c$<>"-" THEN
      c=ASC(c$)-AscA
      histogram.count(c)=histogram.count(c)+1
    END IF
  NEXT
END SUB
SUB SortHistogram(histogram AS HistogramType)
  DO
    swapHappend=0
    FOR i=0 TO 24
      x=histogram.count(histogram.letter(i))
      y=histogram.count(histogram.letter(i+1))
      IF x<y OR (x=y AND histogram.letter(i)>histogram.letter(i+1)) THEN
        t=histogram.letter(i)
        histogram.letter(i)=histogram.letter(i+1)
        histogram.letter(i+1)=t
        swapHappend=1
      END IF
    NEXT
  LOOP WHILE swapHappend
END SUB
FUNCTION IsValid(room AS RoomType)
  DIM histogram AS HistogramType
  InitHistogram histogram
  CountLetters histogram,room.name
  SortHistogram histogram
  checksum$=""
  FOR i=0 TO 4
    checksum$=checksum$+CHR$(histogram.letter(i)+AscA)
  NEXT
  IsValid=checksum$=room.checksum
END FUNCTION
FUNCTION DecodeName$(room AS RoomType)
  name$=""
  FOR i=1 TO LEN(room.name)
    c$=MID$(room.name,i,1)
    IF c$="-" THEN
      c$=" "
    ELSE
      c$=CHR$((ASC(c$)-AscA+room.sectorID) MOD 26+AscA)
    END IF
    name$=name$+c$
  NEXT
  DecodeName$=name$
END FUNCTION
DIM room AS RoomType, northPoleRoom AS RoomType
sum=0
northPoleRoom.sectorID=-1
inFile=FreeFile
OPEN "input.txt" FOR INPUT AS #inFile
WHILE NOT EOF(inFile)
  LINE INPUT #inFile,line$
  ParseRoom room,line$
  IF IsValid(room) THEN
    sum=sum+room.sectorID
    IF INSTR(DecodeName(room),"north") THEN northPoleRoom=room
  END IF
WEND
CLOSE #inFile
PRINT sum,"North Pole stuff is in sector:";northPoleRoom.sectorID[/code]
Das könnte man dann schon fast als lesbar bezeichnen. 

  Da hat sich ein Microsoft so ein bisschen in Richtung Pascal bewegt.  Was dann auch meine nächste Programmiersprache auf dem PC war.