Visualizza il feed RSS

Titolo provvisorio...

C64 - I numeri dei salmi, revisited in COMAL

Valuta questo inserimento
di pubblicato il 02-07-2020 alle 15:50 (107 Visite)
Riprendiamo il problemino numerico già pubblicato qui per proporre una ulteriore soluzione, stavolta sviluppata in linguaggio COMAL 80 per quello che pare essere uno dei trend più divertenti e seguiti nell'ambito del retroprogramming.

Raccomando come sempre l'articolo completo in PDF e i sorgenti di tutti gli esempi COMAL in formato .d64.

codice:
//*******************************
// save hymns
//*******************************

DIM b'digits(10)
DIM hymn2$ OF 3
DIM hymn3$ OF 3
DIM t$ OF 6

TIME 0
PAGE
PRINT "***************************"
PRINT "*** I numeri degli inni ***"
PRINT "** Soluzione alternativa **"
PRINT "** con array booleano.   **"
PRINT "***************************"
PRINT 

// Loop esterno: centinaia
FOR di2:=1 TO 3 DO
  b'digits(1+di2):=TRUE
  
  // Loop intermedio: decine
  FOR di1:=0 TO 9 DO
    IF b'digits(1+di1)=TRUE THEN GOTO next'di1
    b'digits(1+di1):=TRUE
    
    // Loop interno: unita'
    FOR di0:=0 TO 9 DO
      IF b'digits(1+di0)=TRUE THEN GOTO next'di0
      b'digits(1+di0):=TRUE
      hymn1:=100*di2+10*di1+di0
      
      IF hymn1>329 THEN
        PRINT 
        PRINT "***************************"
        PRINT "Run time: ";
        PRINT TIME/60,"s"
        PRINT "***************************"
        END "Fine lavoro"
      ENDIF 
      
      hymn2$:=STR$(hymn1+hymn1)
      hymn3$:=STR$(3*hymn1)
      t$:=hymn2$+hymn3$
      
      j:=1
      WHILE j<7 DO
        i:=1+VAL(t$(j))
        IF b'digits(i)=TRUE THEN GOTO undo
        b'digits(i):=TRUE
        j:+1
      ENDWHILE 
      
      // Stampa la terna trovata
      PRINT hymn1,", ",hymn2$,", ",hymn3$
      
undo:
      IF j>1 THEN
        FOR k:=1 TO j-1 DO
          b'digits(1+VAL(t$(k))):=FALSE
        ENDFOR k
      ENDIF 
      
      b'digits(1+di0):=FALSE
next'di0:
    ENDFOR di0
    
    b'digits(1+di1):=FALSE
next'di1:
  ENDFOR di1
  
  b'digits(1+di2):=FALSE
ENDFOR di2