string umwandeln

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.
problembär

/me hat geschrieben:Das kann man so machen, allerdings entspricht das nicht der Aufgabenstellung.
Hab' auch das 'a' überlesen :(. Dann also

Code: Alles auswählen

a = "ABCDGT-Z"
b = "ACGT"

c = ""
for i in a:
    if i in b:
        c += i
    else:
        c += "a"
print c
Blackjack hat geschrieben:@problembär: Damit hältst Du bis jetzt wohl den ersten Platz für die schlechteste Laufzeit. In quadratischer Laufzeit eine Zeichenkette aufbauen und die lineare Suche in einer Zeichenkette…
Mit dem Einwand hab' ich gerechnet :). So würd' ich's machen, wenn's einfach und gut lesbar sein soll. Wenn's schnell sein soll, würd ich's so machen:

Code: Alles auswählen

#include <stdio.h>
#include <string.h>

/* transform.c: Compile with:

   gcc -Wall -Wextra -ansi -pedantic -O3 transform.c -o transform
*/

int main(void)
{
    int i, u, x;
    char a[] = "AGSKYSASJKASIOJASJK----ACTG";
    char b[] = "ACGT";

    int alen = strlen(a);
    int blen = strlen(b);

    puts(a);

    for (i = 0; i < alen; i++) {
        x = 0;
        for (u = 0; u < blen; u++) {
            if(b[u] == a[i]) {
                x = 1;
                break;
            }
        }
        if (!x) {
            a[i] = 'a';
        }
    }
    puts(a);
    return 0;
}
Gruß
Zuletzt geändert von problembär am Montag 11. Januar 2010, 21:22, insgesamt 2-mal geändert.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

problembär hat geschrieben:
Blackjack hat geschrieben:@problembär: Damit hältst Du bis jetzt wohl den ersten Platz für die schlechteste Laufzeit. In quadratischer Laufzeit eine Zeichenkette aufbauen und die lineare Suche in einer Zeichenkette…
Mit dem Einwand hab' ich gerechnet :). So würd' ich's machen, wenn's einfach und gut lesbar sein soll.
Was ist denn an BlackJacks Vorschlag so unlesbar?

Code: Alles auswählen

In [14]: from string import maketrans

In [15]: text = "ABCDEFGT-"

In [16]: table = maketrans("BDEF", "aaaa")

In [17]: text.translate(table)
Out[17]: 'AaCaaaGT-'
(ok, das "maketrans" müßte man natürlich noch erweitern...)
problembär hat geschrieben: Wenn's schnell sein soll, würd ich's so machen:
<C-Code>
Wobei Du auch dann noch quadratische Laufzeit hast... :roll:
problembär

Hyperion hat geschrieben:Was ist denn an BlackJacks Vorschlag so unlesbar?
Nichts, der ist auch völlig ok.

Gruß
BlackJack

@problembär: Na also wenn dann schon so (ungetestet, NASM-Syntax):

Code: Alles auswählen

global _transform

section .data
table:	db 0, 0, 0, 0 	; ... 256 0/1-values wether the corresponding character
			; code should be replaced by an 'a' or not.

section .text
_transform:
	xor	eax, eax
	pop	ebx
loop0:
	mov	al, [ebx]
	cmp	al, 0
	je	return
	
	cmp	byte [eax+table], 0
	jne	skip
	mov	byte [ebx], 'a'
skip:
	inc	ebx
	jmp	loop0
return:
	ret
Adresse der Zeichenkette wird auf dem Stack erwartet. :-)
problembär

Cool, läuft bei mir (nasm, SuSE 10.0) :D.
Obwohl ich (wie immer bei Assembler) nur Bahnhof verstehe ...

Zu Deinem Python-Vorschlag fand ich übrigens noch interessant, daß viele auch bei so einfacher Datenverarbeitung in Python recht bald mit Modulen arbeiten. Spricht ja nichts dagegen, überrascht mich nur etwas :D.

Gruß
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Erstmal mit vernünftigem Highlight: http://paste.pocoo.org/show/164511/

Warum machst du denn ein ``je return`` wenn return nur ``ret`` enthält?

Ah, ich habs verstanden :) `je` ist jump equal, oder? Fühle mich gerade ein wenig an unsere Assemblerzeit in der Schule erinnert.
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

problembär hat geschrieben:Zu Deinem Python-Vorschlag fand ich übrigens noch interessant, daß viele auch bei so einfacher Datenverarbeitung in Python recht bald mit Modulen arbeiten. Spricht ja nichts dagegen, überrascht mich nur etwas :D.
Natürlich - warum auch Sachen selbst amchen wenn man einfach Module nutzen kann deren Verwendung nahezu keine Kosten hat.

Die Assembler-Lösung finde ich fein. ``je`` ist natürlich Jump Equal, ``jne`` ist das Gegenteil. Der Transform-Teil verwundert mich ein wenig, aber ich schätze mal dass so die Parameter entgegengenommen werden, also liegt der String in ``ebx`` und wird auf den Stack kopiert. Schade dass bei uns in der Uni nur uninteressante Aufgaben in Assembler gegeben wurden.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

@Leonidas: Ja naja, es steht ja "ungetestet" dran. Über die Parameterübergabe wunderst Du Dich zurecht, denn ganz oben auf dem Stapel steht natürlich die Rücksprungadresse. Argh. Ausserdem muss der Aufgerufene Code beim `gcc` das `ebx`-Register am Ende wieder in den ursprünglichen Zustand versetzen. Mit dem `ecx`-Register kann man dagegen machen was man will. Also hier das Ganze noch einmal in funktionierend: http://paste.pocoo.org/show/164572/

Getestet mit:

Code: Alles auswählen

#include <stdio.h> 
#include <string.h> 

extern void transform(char *s);

int main(void) 
{ 
    char a[] = "AGSKYSASJKASIOJASJK----ACTG"; 
    
    puts(a); 
    transform(a);
    puts(a); 

    return 0; 
}
Antworten