Strings trennen, Bereiche einfügen...

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
ete
User
Beiträge: 218
Registriert: Montag 19. Februar 2007, 13:19
Kontaktdaten:

Hallo!

ich komm mal wieder nicht weiter und suche einen Lösungsansatz. Folgendes Problem:

Ich habe einen String:
a = 500 * 'a'

Diesen möchte ich alle 50 Zeichen trennen und darunter an bestimmten Positionen einen Pfeil einfügen. Das mache ich, indem ich einen Dummy String erstelle und an den Bereichen meine Pfeile einfügen, der Rest bleibt als '-'.

Jetzt habe ich aber das Problem, dass sich die Bereiche überlappen können. Dann würde ich gerne eine neue Zeile einfügen, um darunter den Bereich zu kennzeichnen. Das ganze soll am Ende so aussehen:

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-------->>>>>>>>----------------------------
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
--------------------------------------------------
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-->>>>>>>>----------------------------------
---------->>>>>>>>>>----------------------

Wie würdet ihr das machen? Ich hab an sowas gedacht:
- Die Bereiche vor dem splitten gegeneinader überprüfen
- Wenn sie überlappen herausfinden wie oft
- Dann entsprechend viele Dummy Strings erstellen
- eine Liste der Bereiche pro Dummy string erstellen
:?:

Ich hoffe das war verständlich...

Liebe Grüsse
Stefanie
http://www.snowflake-sl.info/index.html
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Das Splitten in Teilstrings der Länge 50 hat erstmal nichts mit deinem Problem zu tun, dass es ggf. mehrere Zeilen mit Pfeilen geben muss. Du kannst das Problem immer auf nur einen String, unter dem du Pfeile anzeigen willst, runterbrechen.

Dieses Problem würde ich so angehen, dass ich Range-Objekte der Reihe nach betrachte und schaue, dass ich möglichst viele ohne Überlappung (und direkte Berührung) in eine Zeile packe.

Das alles hat wenig mit Strings zu tun, sondern ich würde mit `Range`-Objekte arbeiten, die Anfang und Ende eines Bereichs definieren. Ohne Gewähr:

Code: Alles auswählen

class Range:
  def __init__(self, begin, end):
    assert begin <= end
    self.begin, self.end = begin, end

  def intersects(self, range):
    return not (self.begin > range.end and self.end < range.begin)

class RangeList:
  def __init__(self, *ranges):
    self.ranges = ranges

  def intersects(self, range):
    return any(r.intersects(range) for r in self.ranges)

  def add(self, range):
    for i, r in enumerate(self.ranges):
      if range.begin < r.begin:
        self.ranges.insert(i, range)
        return
    self.ranges.append(range)

class Ranges:
  def __init__(self):
    self.rangelists = []

  def add_range(self, range):
    for ranges in self.rangelists:
      if not ranges.intersects(range):
        ranges.add(range)
        return
    self.rangelists.append(RangeList(range))
Die __str__-Methode, um jetzt aus Ranges, RangeList und Range Strings zu machen, überlasse ich dem Leser. Sie ist IMHO trivial, da man nur noch gemäß der begin und end-Attribute viele "-" und ">" erzeugen muss.

Stefan
ete
User
Beiträge: 218
Registriert: Montag 19. Februar 2007, 13:19
Kontaktdaten:

Danke, ich versuch mal durchzusteigen :roll:

str Methode ist klar...
http://www.snowflake-sl.info/index.html
Antworten