Stochastische Texte nach Theo Lutz (1959)

Output

Konzept

Theo Lutz, Student von Max Bense an der TH Stuttgart, programmierte 1959 auf einer Zuse Z22 einen der ersten literarischen Textgeneratoren. Das Programm erzeugt zufällige Sätze aus einem Vokabular, das Franz Kafkas Roman „Das Schloss" entnommen ist: 16 Substantive und 16 Adjektive werden durch Operatoren und Konjunktionen zu Aussagesätzen kombiniert.

Die Reimplementierung ergänzt ein Flexionslexikon für die korrekte deutsche Genus-Kongruenz (ein/eine, jeder/jede/jedes).

Code

Python
JavaScript
from random import choice

subjekte = ['GRAF', 'FREMDER', 'BLICK', 'KIRCHE', 'SCHLOSS',
            'BILD', 'AUGE', 'DORF', 'TURM', 'BAUER',
            'WEG', 'GAST', 'TAG', 'HAUS', 'TISCH', 'KNECHT']

prädikate = ['OFFEN', 'STUMM', 'STARK', 'GUT', 'ENG',
             'NAH', 'NEU', 'STILL', 'WEIT', 'TIEF',
             'SPÄT', 'DUNKEL', 'FREI', 'GROß', 'ALT', 'WÜTEND']

konjunktionen = [' UND ', ' ODER ', ' SO GILT ',
                 '. ', '. ', '. ', '. ', '. ']

operatoren = ['EIN', 'JEDER', 'KEIN', 'NICHT JEDER']

LEXIKON = {
    'EIN': {
        'KIRCHE': 'EINE KIRCHE',
    },
    'JEDER': {
        'KIRCHE': 'JEDE KIRCHE',
        'SCHLOSS': 'JEDES SCHLOSS',
        'BILD': 'JEDES BILD',
        'AUGE': 'JEDES AUGE',
        'DORF': 'JEDES DORF',
        'HAUS': 'JEDES HAUS',
    },
    'NICHT JEDER': {
        'KIRCHE': 'NICHT JEDE KIRCHE',
        'SCHLOSS': 'NICHT JEDES SCHLOSS',
        'BILD': 'NICHT JEDES BILD',
        'AUGE': 'NICHT JEDES AUGE',
        'DORF': 'NICHT JEDES DORF',
        'HAUS': 'NICHT JEDES HAUS',
    }
}

def rumpfsatz():
    operator = choice(operatoren)
    subjekt = choice(subjekte)
    auswahl = f"{operator} {subjekt}"
    auswahl = LEXIKON.get(operator, {}).get(subjekt, auswahl)
    return f"{auswahl} IST"

for i in range(71):
    print(f"\n{rumpfsatz()} {choice(prädikate)}"
          f"{choice(konjunktionen)}"
          f"{rumpfsatz()} {choice(prädikate)}.\n")
const SUBJEKTE = [
  'GRAF', 'FREMDER', 'BLICK', 'KIRCHE', 'SCHLOSS',
  'BILD', 'AUGE', 'DORF', 'TURM', 'BAUER',
  'WEG', 'GAST', 'TAG', 'HAUS', 'TISCH', 'KNECHT'
];

const PRÄDIKATE = [
  'OFFEN', 'STUMM', 'STARK', 'GUT', 'ENG',
  'NAH', 'NEU', 'STILL', 'WEIT', 'TIEF',
  'SPÄT', 'DUNKEL', 'FREI', 'GROß', 'ALT', 'WÜTEND'
];

const KONJUNKTIONEN = [
  ' UND ', ' ODER ', ' SO GILT ',
  '. ', '. ', '. ', '. ', '. '
];

const OPERATOREN = ['EIN', 'JEDER', 'KEIN', 'NICHT JEDER'];

const LEXIKON = {
  'EIN':          { 'KIRCHE': 'EINE KIRCHE' },
  'JEDER':        { 'KIRCHE': 'JEDE KIRCHE',
                    'SCHLOSS': 'JEDES SCHLOSS',
                    'BILD': 'JEDES BILD',
                    'AUGE': 'JEDES AUGE',
                    'DORF': 'JEDES DORF',
                    'HAUS': 'JEDES HAUS' },
  'NICHT JEDER':  { 'KIRCHE': 'NICHT JEDE KIRCHE',
                    'SCHLOSS': 'NICHT JEDES SCHLOSS',
                    'BILD': 'NICHT JEDES BILD',
                    'AUGE': 'NICHT JEDES AUGE',
                    'DORF': 'NICHT JEDES DORF',
                    'HAUS': 'NICHT JEDES HAUS' }
};

function pick(arr) {
  return arr[Math.floor(Math.random() * arr.length)];
}

function rumpfsatz() {
  const op = pick(OPERATOREN);
  const subj = pick(SUBJEKTE);
  const inflected = LEXIKON[op]?.[subj] || `${op} ${subj}`;
  return `${inflected} IST`;
}

function generate(n = 16) {
  const lines = [];
  for (let i = 0; i < n; i++) {
    const konj = pick(KONJUNKTIONEN);
    const line = `${rumpfsatz()} ${pick(PRÄDIKATE)}`
               + `${konj}`
               + `${rumpfsatz()} ${pick(PRÄDIKATE)}.`;
    lines.push(line);
  }
  return lines;
}