Palindrom



  • 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 😉


Anmelden zum Antworten