Das Open-Control-Projekt - Die Alternative zur C-Control-I


Das Forum zur C-Control-1
Welche C-Control-Varianten existieren?
Übersicht - Suchen - Neueste 50 Beiträge - Neuer Beitrag - Login - Registrieren
INFO - FAQ - CC2-Forum - CCPro-Forum 

 Demoprogramm: Symbolrätsel erstellen/generieren Kategorie: Open-Micro/Open-Mini/Open-Midi/Open-Macro/Open-Maxi (von Dietmar, Homepage - 20.05.2022 15:50)
Dietmar nutzt:  Open-Micro, Open-Mini, Open-Midi, Open-Macro, Open-Maxi, Open-Mini Station


' ===========================================================================
' Demoprogramm: SymbolrÀtsel erstellen/generieren
' In OCBASIC 1.12a_e1 fĂŒr Open-Maxi von Dietmar Harlos am 30. April 2022
' ===========================================================================

' In diesem Programm wird unter anderem demonstriert, wie Felder und Arrays
' auf der Open-Maxi realisiert werden können.

' Ein SymbolrĂ€tsel ist eine Anordnung von Symbolen und Rechenzeichen. FĂŒr
' Symbole mĂŒssen einstellige Zahlen gesucht werden, so daß sechs ineinander
' verschachtelte Gleichungen erfĂŒllt sind:

' ACE + DAC = JFD
'  -     +     -
' AAA - HFC =  GI
'  =     =     =
'  AH + III = JBJ

' Gleiche Symbole bedeuten auch gleiche Zahlen, verschiedene Symbole
' verschiedene Zahlen.

' SymbolrÀtsel sind in Deutschland bekannt und beliebt. Es gibt eine Reihe
' von Zeitschriften wie STERN, GONG oder HÖRZU, die regelmĂ€ĂŸig ein RĂ€tsel
' dieser Art abdrucken.

' Mit dem folgenden Programm kann man die RÀtsel lösen. Es verwendet einen
' "Brute Force"-Algorithmus, bei dem alle Permutationen geprĂŒft werden:

' https://www.meister-fiete.de/raetsel/kzrl.zip

' --- Definitionen ----------------------------------------------------------

INCLUDE "omax.def"               'Definitionen fĂŒr die Open-Maxi

DEFINE feld &h2aa                'Array an 1. Adresse hinter dem USER-RAM

DIM bitarray BYTE                'ein Bitarray
DIM debug    BIT[1] OF bitarray  'ist HIGH, wenn Debugging aktiv
DIM ziffer   BIT[2] OF bitarray  'ist HIGH, wenn Ziffer bereits ausgegeben

DIM a,b,c BYTE                   'temporĂ€re Variablen

' vol+vom=vor                    'Berechnungsvorschrift
'  +   +   +
' vml+vmm=vmr
'  =   =   =
' vul+vum=vur

DIM vol WORD                     'oberste Zeile
DIM vom WORD
DIM vor WORD

DIM vml WORD                     'mittlere Zeile
DIM vmm WORD
DIM vmr WORD

DIM vul WORD                     'untere Zeile
DIM vum WORD
DIM vur WORD

DIM w WORD                       'temporĂ€re Variable

' --- Hauptprogramm ---------------------------------------------------------

'PrintSpc=ON    'Bei PRINT dezimale Zahlen mit fĂŒhrendem Leerzeichen ausgeben
End2Host=ON    'Bei Programmende (siehe END) gleich in den Host-Modus wechseln

' Titel:

PRINT
PRINT "Symbolraetsel"
PRINT "============="
PRINT

' Initialisierungen:

debug=ON 'OFF 'ON   'Lösung anzeigen

RANDOMIZE 64        'Zufallsgenerator initialisieren (z.B. RANDOMIZE TIMER)

' Das Hauptprogramm:

' Obere Zeile

vol=(((RAND SHR 1)+16384) MOD 9000)+1           '1..9000
REPEAT
  vom=(((RAND SHR 1)+16384) MOD (9800-vol))+1   '1..9800-vol
  vor=vol+vom
UNTIL vor>2 AND vor<=9800

' Mittlere Zeile

REPEAT
  vml=(((RAND SHR 1)+16384) MOD 9900)+1         '1..9900
  REPEAT
    vmm=(((RAND SHR 1)+16384) MOD (9990-vml))+1 '1..9990-vml
    vmr=vml+vmm
  UNTIL vmr>2 AND vmr<=9990
  vur=vor+vmr
UNTIL vur>0 AND vur<10000

' Untere Zeile

vul=vol+vml
vum=vom+vmm

IF debug THEN anzeigeloesung:?

initfeld

anzeige

?:?"Programmende."
END            'ZurĂŒck in den Hostmodus. Neustart mit RETURN-Taste.

' --- Subroutinen und Funktionen --------------------------------------------

' Anzeige der Lösung

PROCEDURE anzeigeloesung
  spaces(vol):?vol"+";:spaces(vom):?vom"=";:spaces(vor):?vor
  ?"  +    +    +"
  spaces(vml):?vml"+";:spaces(vmm):?vmm"=";:spaces(vmr):?vmr
  ?"  =    =    ="
  spaces(vul):?vul"+";:spaces(vum):?vum"=";:spaces(vur):?vur
  RETURN
END PROCEDURE

' Leerzeichen vor der Zahl je nach GrĂ¶ĂŸe

PROCEDURE spaces(w)
  IF w<10   THEN PUT " "
  IF w<100  THEN PUT " "
  IF w<1000 THEN PUT " "
  RETURN
END PROCEDURE

' Feld mit den Symbolen initialisieren

PROCEDURE initfeld
  FOR a=0 TO 9
    REPEAT
      b=((RAND SHR 1)+16384)/3277  '0..9
    UNTIL PEEK(feld+b)=0
    POKE feld+b,ASC("A")+a
  NEXT a
  RETURN
END PROCEDURE

' Anzeige des RĂ€tsels

PROCEDURE anzeige
  digits(vol):PUT "+":digits(vom):PUT "=":digits(vor):?
  ?"  +    +    +"
  digits(vml):PUT "+":digits(vmm):PUT "=":digits(vmr):?
  ?"  =    =    ="
  digits(vul):PUT "+":digits(vum):PUT "=":digits(vur):?
  RETURN
END PROCEDURE

' Die einzelnen Ziffern der Zahl als Symbole ausgeben

PROCEDURE digits(w)
  spaces w
  ziffer=OFF
  IF w/1000          THEN PUT PEEK(feld+w/1000) : ziffer=ON : w=w MOD 1000
  IF w/100 OR ziffer THEN PUT PEEK(feld+w/100)  : ziffer=ON : w=w MOD 100
  IF w/10 OR ziffer  THEN PUT PEEK(feld+w/10)   : ziffer=ON : w=w MOD 10
  PUT PEEK(feld+w)
  RETURN
END PROCEDURE

' --- Programmende ---------------------------------------------------------


Passender Link: Infosite zu den OM-Mikrocontrollern

Meine Homepage: http://ccintern.dharlos.de

 Antwort schreiben

Bisherige Antworten:

Re: Demoprogramm: Symbolrätsel erstellen/generieren (von Christian - 26.05.2022 9:47)