Palindrom
-
Es wäre schon sinnvoll eine Funktion zu schreiben der ein String übergeben wird und die dann einen (pseudo)boolschen Wert zurückgibt.
int is_palindrom(char *);
-
ihr müsst nur bis zur mitte gehen, also nicht alles vorwärts und rückwärts vergleichen:
int is_palindrom (char *str) { int len = strlen(str); int s; for (s=0; s<len/2; s++) if (str[s] != str[len-s-1]) return 0; return 1; }
-
Mein Vorschlag für "", "u", "Uu", "Uhu" und "Lagerregal":
int ist_palindrom(char *s) { char *e = s+strlen(s)-1; while(s < e) if (tolower(*s++) != tolower(*e--)) return 0; return 1; }
-
am besten noch noch spaces entfernen sonst klappt folgendes nicht:
Ein Neger mit Gazelle zagt im regen nie
-
servus... schrieb:
am besten noch noch spaces entfernen sonst klappt folgendes nicht:
Ein Neger mit Gazelle zagt im regen nieso ungefähr
int is_palindrome (char *s) { char *e = s+strlen(s)-1; while (s < e) { while (*s == ' ') s++; while (*e == ' ') e--; if ((*s++ ^ *e--) & 0xdf) return 0; } return 1; }
-
@ten: ähm, eher isspace( ) (tabs und so
)
Greetz, Swordfish
-
int is_palindrom(char *s) { int vergleichflag; char *e = s+strlen(s)-1; vergleichflag = 0; do { while(isspace(*s)) s++; while(isspace(*e) && e > s) e--; if (s >= e) return vergleichflag; vergleichflag = 1; /* mindestens ein Vergleich */ } while(tolower(*s++) == tolower(*e--)); return 0; }
-
wozu dieses vergleichsflag?
ich wette das bekommste mit eibem geschickt platzierten 'goto' wech...
-
Du wirst doch kein goto an die Wand malen wollen...
a) Kein Flag mehr
b) Für "", "u" und "uu" ReturnWert 0#include <conio.h> #include <ctype.h> #include <stdio.h> #include <stdlib.h> #include <string.h> char *list[] = { "", " ", " ", "u", "u ", " u", "uu", "u u", " uu ", " u\tu", " u u ", /* Palindrom */ "Uhu", "Uhu ", " Uhu ", "U h u", "U hu", "Anna", " anna", " a nn A", " a n\tn a", "\ta n n a ", "Lagerregal", "Ein Neger mit Gazelle zagt im Regen nie", /* kein Palindrom */ " a n n e ", " a h n e \t ", 0 }; int is_palindrome(char *s) { char *e = s+strlen(s); do { while(isspace(*s)) s++; while(s < e-1 && isspace(*(e-1))) e--; if (s >= e-1) /* fertig, mit e zurück zum Stringende */ { if (s == e-1) /* Uhu, ungerade Buchstabenanzahl */ { while(*e) if (!isspace(*e++)) /* 'u' */ return 1; } else /* s > e-1, Anna, gerade Buchstabenanzahl */ while(*e) if (!isspace(*e++)) /* 'n' */ while(*e) if (!isspace(*e++)) /* 'a' */ return 1; return 0; } } while(tolower(*s++) == tolower(*--e)); return 0; } int main() { int i; for (i = 0; list[i]; i++) { if (i) printf("\n"); printf("\"%s\" %u", list[i], is_palindrome(list[i])); } getch(); return 0; }
Ausgabe
"" 0 " " 0 " " 0 "u" 0 "u " 0 " u" 0 "uu" 0 "u u" 0 " uu " 0 " u u" 0 " u u " 0 "Uhu" 1 "Uhu " 1 " Uhu " 1 "U h u" 1 "U hu" 1 "Anna" 1 " anna" 1 " a nn A" 1 " a n n a" 1 " a n n a " 1 "Lagerregal" 1 "Ein Neger mit Gazelle zagt im Regen nie" 1 " a n n e " 0 " a h n e " 0
-
In [49]: def is_palindrom(s): ....: if s.replace(' ', '') == s[::-1].replace(' ', ''): return True ....: return False ....: In [50]: is_palindrom('ein neger mit gazelle zagt im regen nie') Out[50]: True In [51]: is_palindrom('python') Out[51]: False
-
def is_palindrom(s): s = s.replace(" ", "") return s == s[::-1]
is_palindrom = (lambda s: (lambda t: (t == t[::-1]))(s.replace(" ", "")))
welches bevorzuge ich wohl?
-
c.rackwitz schrieb:
welches bevorzuge ich wohl?
skriptsprachen bevorzugst du...
-
keksekekse schrieb:
b) Für "", "u" und "uu" ReturnWert 0
Randfrage: Warum sollte man sowas nicht als Palindrom auffassen? Wenn man rein nach der Definition geht, sind das Palindrome.
-
"u", "uu" und "Üü" sind jetzt drin. TODO: "Eine güldne, gute Tugend: Lüge nie!"
int tolower_ger(int ch) { switch(ch) { case 'Ä': return 'ä'; case 'Ö': return 'ö'; case 'Ü': return 'ü'; case 'ß': return 'ß'; /* TODO */ } return tolower(ch); } int is_palindrom(char *s) { char *e = s+strlen(s); if (*s == 0) /* ist 'non' ein Palindrom? */ return 0; /* eine Frage für filosofische Fische */ do { while(isspace(*s)) s++; while(s < e-1 && isspace(*(e-1))) e--; if (s >= e-1) /* fertig, ist Palindrom */ return 1; } while(tolower_ger(*s++) == tolower_ger(*--e)); return 0; /* kein Palindrom */ }
Ferner existieren noch Datums-Palindrome, z.B. der 20.02.2002.
an diesem Tag war mein 34. Geburtstag. Heute habe ich 2 CD's von ABBA gekauft und bekam 22.02 € zurück. Wobei 22.02 am heutigen Valentinstag auch noch eine besondere Bedeutung hat.
-
keksekekse schrieb:
an diesem Tag war mein 34. Geburtstag. Heute habe ich 2 CD's von ABBA gekauft und bekam 22.02 € zurück.
ich glaub' du hast 2.43 € zurückgekriegt
-
Nö, auf dem Zettel steht 22.02 € Rückgeld. Und wenn ich mit einem 30€-Schein gezahlt hätte, dann hätte ich 2.02 € zurückbekommen...
EDIT Zum Nachrechnen: 16.99 und 10.99 = 27.98 €
-
also wer sich cd's von abba kauft, muss schon palindrom-fan sein, anders kann man das nicht erklären