![]() |
teilweise permutation
hy!
ich suche einen algorithmus mit dem nur bestimmte buchstaben eines strings vertauscht werden. z.b. ABCDEFG ABCDFEG ABCEDFG ABCEFDG etc. es soll also jeweils der erste und letzte buchstabe stehen bleiben. die stringlänge kann variieren (also z.b.auch nur ABCDE). weiß nicht recht wie ich das machen soll. ich hab an eine permutation gedacht. hoffe ihr könnt mir helfen! :dp: thx im voraus! :dp: MfG ajaxson |
Re: teilweise permutation
bilde die Permutationen über die Mitte und füge den ersten und letzten wert dazu
|
Re: teilweise permutation
tut mir leid das versteh ich jetzt nicht ganz.
wie meinst du das "über die mitte"? (muss dazu sagen das ich noch anfänger im umgang mit delphi bin) |
Re: teilweise permutation
permutiere den String über alle Zeichen in der Mitte (vom zweiten bis zum vorletzten) und füge den ersten und letzten zum Ergebnis hinzu:
Bsp: BCD -> ABCDE BDC -> ADBCE CBD -> ACBDE CDB -> ACDBE DBC -> ADBCE DCB -> ADCBE |
Re: teilweise permutation
so in etwa ...
Delphi-Quellcode:
while solangeduwillst do
ergebnis = copy(sourcestring,1,1) + permutation(copy(sourcestring,2,length(sourcestring)-2) + copy(sourcestring,length(sourcestring)-1,1); |
Re: teilweise permutation
ok thx..da werd ich mal versuchen das umzusetzten. :thumb:
|
Re: teilweise permutation
Falls du das mit der "englischen Universität" und der angeblichen Lesbarkeit von permutierten Wörtern, bei denen nur der 1. und letzte Buchstabe stimmen, umsetzen willst, muss ich dich leider enttäuschen: Das is n Hoax. ==> es funktioniert nur in Ausnahmefällen. Ich habs zuerst auch geglaubt und irgendwann mal gelesen, dass das n Hoax sein soll. Google bestätigte das dann...
mfg Christian |
Re: teilweise permutation
ne das ist für eine andere aufgabe gedacht ;)
|
Re: teilweise permutation
Zitat:
Das Thema war ja mal ne Weile in den Medien (etwas übertrieben gesagt) und man konnte solche Artikel auch in der Zeitung lesen und das war eigentlich kein Problem. Ich denke nicht, dass das spezielle Wörter waren... |
Re: teilweise permutation
Zitat:
![]() Zitat:
[1] im konkreten Fall war es ![]() mfg Christian P.S.: Pssst! Ich glaub wir werden etwas OT... |
Re: teilweise permutation
um jetzt mal wieder zu mir zurück zu kommen :lol:
procedure permutation(eingabe:string); var ergebnis:string; begin while x=length(eingabe) -2 do begin ergebnis := copy(eingabe,1,1) + permutation(copy(eingabe,2,length(eingabe)-2)) + copy(eingabe,length(eingabe)-1,1);<----die zeile wird als fehler markiert x:=x+1; end; end; er gibt mir folgende fehlermeldung:[Pascal Fehler] Unit1.pas(79): E2010 Inkompatible Typen: 'string' und 'procedure, untyped pointer or untyped parameter' |
Re: teilweise permutation
"permutation" ist als procedure deklariert und hat keinen Rückgabewert. Daher der Fehler.
|
Re: teilweise permutation
:wall: ok thx^^
|
Re: teilweise permutation
Code:
irgendwie funktioniert das nicht...das programm bricht nach ner zeit ab(overflow) und gibt nur ad aus(bei eingabe abcde).
function permutation(eingabe:string):string;
var ergebnis:string; begin while x<>length(eingabe) -2 do begin x:=x+1; ergebnis := copy(eingabe,1,1) + permutation(copy(eingabe,2,length(eingabe)-2)) + copy(eingabe,length(eingabe)-1,1); form1.Memo1.Lines.Add(ergebnis); end; end; hat jemand schon einmal jemand einen ähnlichen algorithmus geschrieben? Beispiele wären hilfreich. :( :( :( |
Re: teilweise permutation
Wenn du jetzt noch "ergebnis" einfach mal nach Englisch übersetzt, und aus der Variablendeklaration heraus nimmst, bist du schon mal ein großes Stück weiter. Ob ein ordentliches Abbruchkriterium erreicht wird kann ich dank Müdigkeit gerade nicht sehen, ich finde es aber schon seltsam eine while-Schleife in einer Rekursion dort einzusetzen, in der die Rekursion statt findet. Darüber hinaus scheint "x" irgendwo deklariert zu sein, und ist somit wohl auch noch für alle rekursiven Aufrufe das selbe. Macht auf mich grad einen recht planlosen Eindruck, will aber nicht ausschließen dass auch ich morgen nach ein paar Stunden Schlaf erkenne was du da machst ;)
Edit: Also... irgendwie... WAS zum Geier soll da passieren!? Du rufst eine Funktion auf, die die inneren Zeichen eines Strings herauskopiert, und damit rufst du die Funktion nochmal auf. Das tust du sogar noch so oft, wie der String lang ist minus 2. Die rekursiv aufgerufenen Funktionen tun das selbe, nur mit den verkürzten Strings, und gibst diese dann zurück, und schreibst das in ein Memo. Ganz nebenbei zählst du eine Variable irgendwie hoch, die nachher irgendwas wildes enthalten dürfte, aber niemals zum Terminieren der Rekursion führen wird. Das ist von vorne bis hinten Unsinn. Ich empfehle mindestens die Wikipedia-Einträge zur Rekursion und Permutation zu lesen (und verinnerlichen), und zudem ein paar Pascal-Grundlagen ("result" anyone?). Weil wenn wir so weiter machen, wirds ein Geschustere, und am Ende wird irgendwer entnervt einfach eine fertige Funktion posten die du kopieren kannst, aber mehr wissen wirste dann auch nicht. |
Re: teilweise permutation
Hier mal ein Vorschlag...
Delphi-Quellcode:
Gruss
procedure permutation(mitte:string; Liste:TStrings);
procedure permut(links, mitte, rechts:string); var i:integer; temp:string; begin if mitte = '' then Liste.Append(links + rechts) else for i:=1 to length(mitte) do begin temp:=mitte; delete(temp, i, 1); permut(links + mitte[i], temp, rechts); end; end; var links, rechts:string; begin Liste.Clear; links:=copy(mitte, 1, 1); delete(mitte, 1, 1); rechts:=copy(mitte, length(mitte), 1); delete(mitte, length(mitte), 1); permut(links, mitte, rechts); end; procedure TForm.ButtonClick(Sender: TObject); begin permutation('ABCDEFG', Memo.Lines); end; Thorsten |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:27 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz