Jump to content
Matei

C [ Propozitie palindroma ] - Easy Challenge

Recommended Posts

Posted (edited)

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
Posted

L-am facut si eu in pascal, sper sa intelegi, daca nu stii pascal atunci doar ruleaza-l si ai sa vezi ca functioneaza.

Nu stiu c si am vazut ca, cmiN la facut in python deci nu ar trebui sa fie probleme.

Posted

@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

Posted

@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.

Posted

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.

Posted

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+-

Posted
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 :)

Posted
#include <string.h>

...

char s[50];

..

..

if(s==strrev(s))

cout<<"Palindrom ";

else

cout<<"Nope."

Presupun ca stii si tu sa citesti un sir de caractere / cuvant de la tastatura.

C code - 14 lines - codepad

Nu stiu de unde ai scos strrev-u ala ( cre ca din php )

Si chiar daca mergea.. nu poti sa compari asa 2 stringuri in C :)

Posted (edited)

#include<iostream>
#include <string.h>
using namespace std;
char s2[20];
int main()
{
char s[] = "aba";
strrev(s);
strcpy(s2,s);
strrev(s);
if(strcmp(s,s2)==0)
cout<<"palindrom ";
else
cout<<"nu-i ";

return 0;
}

c++

@ pr00f : merge si asta ;\ corectai.

Edited by black_death_c4t
Posted (edited)

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
Posted (edited)

#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
Posted

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;

}

Posted (edited)
Problema era legata de siruri de caractere cu aceasta proprietate, nu numere palindrom. :-P

Greseala mea, chiar nu citisem primul post pana sa vad replay-ul tau ...

Edited by Addic73d

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...