Porto nach Pedro Barbosa (1977)

Output

Konzept

Pedro Barbosa veröffentlichte „Porto" 1977 in seinem Buch „A Literatura Cibernética 1: Autopoemas Gerados por Computador". Barbosa, der bei Abraham A. Moles in Straßburg studiert hatte, war einer der Pioniere computergestützter Literatur in Portugal.

Das Gedicht kombiniert vier Substantive — granita (Granit), saudade (Sehnsucht), pedra (Stein), historia (Geschichte) — mit vier portugiesischen Präpositionen. Das vollständige Programm erzeugt alle 24 Permutationen der Substantive, jeweils mit allen 256 Präpositionskombinationen: 6.144 Zeilen, die ein algorithmisches Porträt der Stadt Porto bilden.

Code

Python
JavaScript
from itertools import permutations, product

def generate_permutations(prepositions, main_words):
    for main_perm in permutations(main_words):
        for prep_comb in product(prepositions, repeat=4):
            line = []
            for i in range(len(main_words)):
                line.append(prep_comb[i])
                line.append(main_perm[i])
            print(' '.join(line))

prepositions = ['o', 'da', 'no', 'na']
main_words = ['granita', 'saudade', 'pedra', 'historia']

generate_permutations(prepositions, main_words)
const PREPOSITIONS = ['o', 'da', 'no', 'na'];
const MAIN_WORDS   = ['granita', 'saudade', 'pedra', 'historia'];

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

// Generate a random subset of permutation lines.
// Full set: 24 permutations × 256 preposition combos = 6144 lines.
// For display, we sample a subset.
function generate(count = 24) {
  const lines = [];
  for (let i = 0; i < count; i++) {
    // Shuffle nouns (Fisher-Yates)
    const words = [...MAIN_WORDS];
    for (let j = words.length - 1; j > 0; j--) {
      const k = Math.floor(Math.random() * (j + 1));
      [words[j], words[k]] = [words[k], words[j]];
    }
    // Random preposition for each noun
    const parts = [];
    for (let j = 0; j < words.length; j++) {
      parts.push(pick(PREPOSITIONS));
      parts.push(words[j]);
    }
    lines.push(parts.join(' '));
  }
  return lines;
}