Jump to content
Matei

C [ Propozitie palindroma ] - Easy Challenge

Recommended Posts

S? se determine dac? o propozitie este palindrom?.

O propozitie este palindrom? daca citit? de la prima liter? pan? la ultima are aceeasi succesiune ca citit? de la ultima liter? pân? la prima.

Nu conteaza daca sunt litere mari sau mici :)

Atentie : Spatiul sau alte semne de punctuatie, nu trebuie luate in considerare. :) Exemplu :

Ele ,,,, ... fac cafELe - Aici, programul nostru ar trebui sa afiseze Palindrom :)

Raspunsurile pe privat ! Dupa, postez si eu solutia mea :)

Spor ! :P

Solvers :

- cmiN (python)

- Patrunjel ©

- bcman (python)

- noValue ©

Edited by Matei
Link to post
Share on other sites

@Silviu gresesti pe la vreo conditie pe acolo ceva tu. in orice caz nu faci bine ceva ... nu mai stiu asa mult pascal , ca n-am mai scris de 4 ani ceva cod . dar cum ti-am raspuns si pe privat ... : incearca sa bagi ca input "abc" sa vezi ca-ti zice ca e palindrom :P

Link to post
Share on other sites

@demisec te cam complici ... gandeste-te ca faci toata treaba asta intr-un timp 3*N (prelucrare, inversare, comparare) pe cand poate fi facut in N/2 plus ca ai tinut cont doar de cateva semne de punctuatie nu de toate :))

Ce ar fi daca ai lua doua variabile x si y. Cu x pleci din stanga de tot cu y pleci din dreapta de tot (in sir) si cu fiecare din cele 2 te apropii de mijloc si la prima neregularitate returnezi false, in felul asta parcurgi jumatate de vector. Acum te intrebi cum prelucrezi semnele, spatiile, etc. ... simplu, sari peste ele. Avansezi si cu x (spre dreapta) si cu y (spre stanga) pana dai de un caracter pentru care functia isalpha sau isalnum, daca vrei si cifre, returneaza true, in momentul ala ai ajuns si cu x si cu y la primele 2 litere nevizitate ale extremitatilor. Apoi compari x pe y trecandu-le pe amandoua prin tolower sau cu o functie in care daca chr >= 'a' atunci chr = chr - 'a' + 'A'.

Algoritmul e simplu si compact in py si mergea la fel de simplu si in C, dupa ce incep sa se puna sursele pun si eu codul.

Link to post
Share on other sites

Intr-un polindrom nu ai nevoie decat sa parcurgi [lungimea sir de caractere (filtrat, daca necesar) / 2]. Cum impartirea int/int = datorita castului implicit e un int(fara ceea ce ar trebui sa fie dupa virgula) vei parcurge round((float)nrEle/2)-nrEle%2. Ceea ce face ca intr-o bucla for, ai nevoie doar de lungimea string si acel contor (i). iar comparatia e foarte usor de facut c != c[len-i-1].

Eu cand am scris codul am uitat sa pun un break exact dupa booleanul meu din urma rezultatului c != c[len-i-1]. Dar oricum stiu ca merge.

Link to post
Share on other sites

Off: hah, ai trecut c++ in loc de c...

On: compiler ele astea sunt mare bataie de cap, si aici ma refer la cele pentru C, unele detecteaza C si compileaza prin ASM de c++, altele ruleaza scriptul in C corect dar executabilul scos nu merge nici macar sa vezi consola. Sa nu mai vorbim de altele in care atata timp cat e scris codu corect(sintacxa) Iti va compila, chiar daca e in limbat c+-

Link to post
Share on other sites
Stiu ca vrei sa iei 10 la tema da' dupa ce ca ti-ai gasit fraierii care sa ti-o faca mai esti si nesimtit.

ma faci sa rad ! :) crezi ca temele mele asa arata ? :P eram sigur ca o sa apara unul ca tine... am zis sa fie standard c library pentru ca le compilez pe linux :)

Link to post
Share on other sites

A trecut destul timp de la începerea challenge-ului, deci voi publica rezolvarea mea ?i îi a?tept ?i pe ceilal?i s? î?i publice rezolv?rile (în special pe cmiN). Rezolvarea mea e destul de proast?, neoptimizat? etc. dar totu?i m? bucur c? a func?ionat. Poate o s? mai reu?esc s? o optimizez inspirându-m? de la voi. Python:

a = raw_input("Introduceti propozitia: ")
initial = []
for char in a:
if ord(char) >= 65 and ord(char) <= 90:
char = chr(ord(char)+32)
initial.append(char)
elif ord(char) >= 97 and ord(char) <= 122:
initial.append(char)
inv = initial[::-1]
if initial == inv:
print 'Propozitia este palindroma\n'
else:
print 'Propozitia nu este palindroma\n'
raw_input()

Edited by bcman
Link to post
Share on other sites

#include "stdafx.h"
#include <iostream>
#include <string>
#include <cctype>
using namespace std;
int main ()
{
string s1,s2;
string::iterator it;
getline(cin,s1);
for (it=s1.begin();it<s1.end();it++)
{
if (*it>='A' && *it<='Z')
*it+=32;
if (isalpha(*it))
s2+=*it;
}
s1.clear();
string::reverse_iterator rit;
for (rit=s2.rbegin();rit<s2.rend();rit++)
s1+=*rit;
if (s1.compare(s2)==0)
cout<<"Palindrom";
else
cout<<"Nu este palindrom";
system("pause");
return 0;
}

Cod C++. Acest cod poate fi simplificat prin utilizarea functiilor implicite (de exemplu: reverse() din <algorithm>). :-)

______________________________________________

#include "stdafx.h"
#include <iostream>
#include <string>
#include <cctype>
using namespace std;
int main ()
{
string s1,s2;
string::iterator it;
getline(cin,s1);
for (it=s1.begin();it<s1.end();it++)
{
if (*it>='A' && *it<='Z')
*it+=32;
if (isalpha(*it))
s2+=*it;
}
s1.clear();
string::reverse_iterator rit;
for (it=s2.begin(),rit=s2.rbegin();it<s2.end(),rit<s2.rend();it++,rit++)
if (*it!=*rit)
{
cout<<"Nu este palindrom";
system("pause");
return 0;
}
cout<<"Palindrom";
system("pause");
return 0;
}

C++

Problema rezolvata fara inversarea string-ului.

______________________________________________

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
char x[1001],y[1001];
int main ()
{
int i,j,n;
gets(x);
n=strlen(x);
j=0;
for (i=0;i<n;i++)
{
if (isalpha(x[i]) && x[i]<='Z' && x[i]>='A')
x[i]+=32;
if (isalpha(x[i]))
{
y[j]=x[i];
j++;
}
x[i]='\0';
}
n=strlen(y);
for (i=0,j=n-1;i<n,j>=0;i++,j--)
if (y[i]!=y[j])
{
printf("Nu este palindrom");
system("pause");
return 0;
}
printf("Palindrom");
system("pause");
return 0;
}

Rezolvare C.

Edited by Rfd
Link to post
Share on other sites

Codul meu :

#include <stdio.h>

#include <string.h>

int main () {

char cuv[100], *p,str2[]="";

int lungime=0;

int ok=1;

int i;

gets (cuv);

p = strtok (cuv," ,.-");

while (p!=NULL) {

strcat (str2, p );

p=strtok (NULL, " ,.-");

}

lungime=strlen(str2);

for (i=0;i<lungime/2;i++)

if (str2!=str2[lungime-i-1]&&str2!=(str2[lungime-i-1]-32)&&str2!=(str2[lungime-i-1]+32))

ok=0;

if (ok)

printf ("Palindrom \n");

else

printf ("Nu este palindrom \n");

return 0;

}

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...