Problema de strings: Palindromos.

Iniciado por j retirado, 27 Junio 2009, 21:31 PM

0 Miembros y 1 Visitante están viendo este tema.

j retirado

Para ver qué es un palindromo, véase Palindromo. Posteen más soluciones.


/* Algoritmo que te dice si una palabra es palindromo */

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

#define ES_PALIN printf("\n\nEs palindromo\n\n");
#define NO_PALIN printf("\n\nNo es palindromo\n\n");
#define FALSE 0
#define TRUE !FALSE
typedef int Bool;

void es_palindromo(char *a)
{
       Bool b = TRUE;
       int ultPos = strlen(a)-1;
       int i;

       for(i=0; i<strlen(a); i++, ultPos--)
       {
               if(a[i] != a[ultPos])
               {
                       b = FALSE;
                       break;
               }
       }

       if(b) ES_PALIN
       else NO_PALIN;
}

int main()
{
       char *a = (char *) calloc (20, sizeof(char));
       printf("Palabra: "); scanf("%s", a);

       es_palindromo(a);

       free(a); a=NULL;

       system("pause");
       return 0;
}


Saludos.

j retirado

#1
Un enunciado más complicado del problema:

Citar
Una hilera de letras, o palabra, se llama palindromo cuando tiene más de
una letra y leída de izquierda a derecha y de derecha a izquierda son
iguales, por ejemplo, ababa.

Una hilera se llama i-palindromo cuando quitando el primer carácter de la
izquierda se convierte en palindromo, por ejemplo casa.

Una hilera se llama d-palindromo cuando quitando el primer carácter de la
derecha se convierte en palindromo, por ejemplo amad.

Llamaremos palabras distinguidas a aquellas que son palindromo, ipalindromo
o d-palindromo.

El problema consiste en recibir una palabra y determinar los cortes, si los
hubiera, que la descomponen en dos palabras distinguidas, e indicar para
cada una de ellas de que tipo o tipos es.

Ejemplo 1:
Si la entrada contiene:
azarosos

La salida podría contener:
azar d-palindromo
osos i-palindromo d-palindromo
etc.

Ejemplo 2:
Si la entrada contiene:
amarrar

La salida podría contener:
ama palindromo
rrar i-palindromo
amar d-palindromo
rar palindromo
etc.

Yo hice un par de funciones que descompenen un string en substring (por asi decirlo) y que pueden ayudar un poco en la solución. Pruebenlas y comenten.


void descomponer(char *a)
{
       int unsigned tam_actual = strlen(a);
       int unsigned i, j;
       for(i=0; i<(strlen(a)-1); i++)
       {
               for(j=0; j<tam_actual; j++)
                       printf("%c", a[j]);
               printf("\n");
               tam_actual--;
       }
}

void descomponer2(char *a)
{
int unsigned tam_actual = 2;
int unsigned i, j;

for(i=0; i<(strlen(a)-1); i++)
{
for(j=0; j<tam_actual; j++)
printf("%c", a[j]);
printf("\n");
tam_actual++;
}
}

void descomponer3(char *a)
{
int unsigned tam_actual = 2;
int unsigned i, j, x=0;

while(x<(strlen(a)-1))
{
for(i=0; i<(strlen(a)-1); i++)
{
for(j=x; j<tam_actual; j++)
printf("%c", a[j]);
printf("\n");
tam_actual++;
}
tam_actual=2;
x++;
}
}

El siguiente simplemente redirige la salida en un fichero:
void descomponer4(char *a)
{
FILE *file = fopen("descomponer.txt","w");
int unsigned tam_actual = 2;
int unsigned i, j, x=0;

while(x<(strlen(a)-1))
{
for(i=0; i<(strlen(a)-1); i++)
{
for(j=x; j<tam_actual; j++)
fputc(a[j], file);
fputs("\n", file);
tam_actual++;
}
tam_actual=2;
x++;
}

fclose(file);
}


Saludos.

EDIT: Aprendí a usar la función GeSHi. Gracias Leo Gutierrez.

h0oke

Muy lindos los ejercicios. Felicitaciones

Ragnarok

Código (cpp) [Seleccionar]
int esPalindromo(char *s){
  for (int i=0, j=strlen(s)-1; s[i] == s [j] && i < j; i++, j--);
  return i >= j;
}
No olvidéis leer las normas generales, además de las específicas de cada tablón.sgae, ladrones

leogtz

#include <stdio.h>
#include <string.h>
void cadena_inversa(char cadena[], char cadena2[]);
int main(void)
{
    char cadena[200];
    printf("Cadena : ");
    scanf("%199s", cadena);
    char cadena2[200];
    cadena_inversa(cadena, cadena2);
    if(!strcmp(cadena, cadena2))
    printf("Es palindrome");
    else
    printf("No es palindrome");
    return 0;
}
void cadena_inversa(char cadena[], char cadena2[])
{
/* Se copia la cadena inversa en "cadena2" */
    signed int contador = 0;
    for(signed int i = strlen(cadena)-1; i >= 0; i--)
    cadena2[contador++] = cadena[i];
    cadena2[contador] = 0;
    }
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

leogtz

En Perl:
Código (perl) [Seleccionar]
#!/usr/bin/perl
use strict;
use warnings;
print "Escriba palabra : ";
chomp(my $word = <STDIN>);
if($word eq reverse($word))
{
print "Palindromo";
} else {
print "No palindromo";
}
exit;


En Batch:
Código (dos) [Seleccionar]
@echo off
if exist "file.txt" (del /f /q "file.txt")
setlocal enabledelayedexpansion
:code
set /p "cadena=Cadena : "
if not defined cadena (goto:code)
set "cadena=%cadena: =%"
set "cadena_=%cadena%"
set /a "longitud-=1"
:bucle
set "cadena=%cadena:~1%"
set /a "longitud+=1"
if defined cadena goto:bucle
for /l %%_ in (%longitud%=-1=0) do <nul set /p "=!cadena_:~%%_,1!" >> "file.txt"
for /f "tokens=*" %%_ in (file.txt) do (
if /i "%cadena_%"=="%%_" (echo.Palindrome) else (echo.No palindrome)
)
pause>nul 2>&1
exit /b 0
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

j retirado

Algo más para el segundo enunciado. i-palindromo, d-palindromo:


#define FALSE 0
#define TRUE !FALSE
typedef int Bool;

Bool palindromo(char *a);
void es_ipalindromo(char *a);
void es_dpalindromo(char *a);

Bool palindromo(char *a)
{
Bool b = TRUE;
int unsigned i, j;

for(i=0, j=strlen(a)-1; i<strlen(a); i++, j--)
{
if(a[i] != a[j]) b = FALSE;
break;
        }
return b;
}

void es_ipalindromo(char *a)
{
int unsigned i;
char *b = (char *) calloc (strlen(a)+1, sizeof(char));
for(i=1; i<strlen(a); i++)
b[i] = a[i];

if(palindromo(b))
printf("%s \tES i-palindromo\n", a);
else
printf("%s \tNO i-palindromo\n", a);

free(b); b=NULL;
}

void es_dpalindromo(char *a)
{
int unsigned i;
char *b = (char *) calloc (strlen(a)+1, sizeof(char));
for(i=0; i<strlen(a)-1; i++)
b[i] = a[i];

if(palindromo(b))
printf("%s \tES d-palindromo\n", a);
else
printf("%s \tNO d-palindromo\n", a);

free(b); b=NULL;
}


Saludos.

Ragnarok

En python:

Código (python) [Seleccionar]
palindromo = lambda s: s[:len(s)//2] == s[:(len(s)-1)//2:-1]
No olvidéis leer las normas generales, además de las específicas de cada tablón.sgae, ladrones