StringOfChar - Zeichenkette mit x*Zeichen

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
TKRoth
Beiträge: 32
Registriert: 24.02.2012 15:34
Wohnort: Hamburg
Kontaktdaten:

StringOfChar - Zeichenkette mit x*Zeichen

Beitrag von TKRoth »

Mal was Kleines von mir:

Code: Alles auswählen

Procedure.s StringOfChar(Count.i,Char.s)
  ProcedureReturn ReplaceString(Space(Count)," ",Char)
EndProcedure

Debug "10 Sterne: "+StringOfChar(10,"*")
Computer werden benötigt um Probleme zu lösen die man ohne Computer nicht hätte.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: StringOfChar - Zeichenkette mit x*Zeichen

Beitrag von STARGÅTE »

Dafür wäre es aber besser LSet oder RSet zu verwenden um das Suchen/Ersetzen zu ersparen:

Code: Alles auswählen

Debug "10 Sterne: "+LSet("", 10, "*")
oder bei dir dnan halt:

Code: Alles auswählen

Procedure.s StringOfChar(Count.i,Char.s)
  ProcedureReturn LSet("", Count, Char)
EndProcedure

Debug "10 Sterne: "+StringOfChar(10,"*")
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Derren
Beiträge: 558
Registriert: 23.07.2011 02:08

Re: StringOfChar - Zeichenkette mit x*Zeichen

Beitrag von Derren »

In wie fern ist das schneller oder besser als eine Fox/Next Schleife?
Du musst ja zu dem Schluss gekommen sein, dass For/Next deinen Ansprüchen nicht genügt, oder wie kommt man sonst auf so eine Idee?
Signatur und so
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: StringOfChar - Zeichenkette mit x*Zeichen

Beitrag von STARGÅTE »

Derren hat geschrieben:In wie fern ist das schneller oder besser als eine Fox/Next Schleife?
Wenn du mit For/Next sowas meinst wie:

Code: Alles auswählen

For N = 1 to 10
  String + "x"
Next
Dann ist diese Variante sehr langsam, weil 10 mal eine neue Zeichenkette erstellt werden muss.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: StringOfChar - Zeichenkette mit x*Zeichen

Beitrag von ts-soft »

STARGÅTE hat schon Recht, LSet ist günstiger als Deine Procedure.
Erstens erfolgt ein Call zum Aufruf der Procedure und dann werden 2 PB-Funktionen aufgerufen.

Der Geschwindigkeitsunterschied wird sich in den meisten Anwendungen zwar nicht unbedingt wiederspiegeln,
aber es ist einfach nicht nötig.

Du hast also das Rad neu erfunden, aber das neue Rad ist nicht wirklich besser :wink:
Aber das passiert einem immer wieder in seinem Programmiererleben :)

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: StringOfChar - Zeichenkette mit x*Zeichen

Beitrag von DarkDragon »

ts-soft hat geschrieben:STARGÅTE hat schon Recht, LSet ist günstiger als Deine Procedure.
Erstens erfolgt ein Call zum Aufruf der Procedure und dann werden 2 PB-Funktionen aufgerufen.
Das ist aber nicht der Knackpunkt. Der Knackpunkt ist die Tatsache, dass die zwei Funktionen, die TKRoths Prozedur aufruft (Space und ReplaceString) 2 mal durch die volle Länge iterieren (einmal um den String mit dem Leerzeichen zu füllen und einmal um alle Leerzeichen durch andere Zeichen zu ersetzen), wohingegen STARGATEs Aufruf nur einmal durch den gesamten String muss um die Zeichen auf den Zielwert zu bringen.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Antworten