16 / 28
Feb 2010

Co jest grane? Robię zadanie BFNTEST. W przykładowe kody wklejam różne komentarze, np kod wejściowy wygląda tak:

#define R(p) rand()%('9'-(p)+1)+(p) // makropolecenie
#define P(p) putc((p),stdout)
#define PP(p) P(R(p)) // makropolecenia zagnieżdżone
#include <iostream>
#include <cstdlib>
#include <cstdio>
using namespace std;
/* funkcja generująca ciąg cyfr */
void gen(int x) 
{
	if (x) PP('1'); else PP('0');
	for(;x;x--) PP('0');
}
int main/*123456789*/()
{
	int a, d, n;/* */
	c/*ggg*/in >> a;/*hhhh*/ srand(a); /* inicjalizacja generatora
        liczb pseudolosowych /* */
	cin >> d; cin >> n; cout << n << endl;
	for/*/*uuuu // */(;n;n--)/*/* */ /*/* */
	{
		gen(rand()%d);  P(' ');
		gen(rand()%d);  P('\n');
	}
	return 0;
}

U mnie wszystko działa ok, ale ja wyśle to ANI JEDEN test nie przechodzi. Czy jest możliwość abym dostał jakieś dane testowe najbardziej popieprzone abym mógł sprawdzić u siebie, bo ja już nie wiem co mam dalej robić?

Może kilka podam...

printf("Tekst 1 /* Tekst 2 */ Tekst 3\n");

Powinno wypisać całość. Nie powinno natomiast wypisać tego:

/*/ Hello world! /*/

Warto też zwrócić uwagę:

Coś
/* Linia 1
Linia 2
Linia 3
Linia 4
*/
Drugie coś

Nie powinno wyrzucać pomiędzy "Coś" a "Drugie coś" czterech-pięciu wolnych linii.

I jeszcze pewnie wiele innych pułapek...

4 months later

No i jeszcze jest pytanie, czy mogą być przypadki, gdy komentarze są zagnieżdżone... mianowicie:

/* to jest komentarz, a w nim /* inny komentarz, który zawiera /* wewnętrzny komentarz */ co daje lacznie */ 2 komentarze w 1 ... a niech bedzie jeszcze jeden /* taki maly */ .. i tyle ;] */

@fanatyk99: Fakt, nie kompiluje się xD głupi przykład wink

2 months later

Mój program poprawnie 'odpowiada' na powyższe, a na spoju tylko dwa pierwsze testy zalicza.
Więcej jakichś pułapek? Czegoś, gdzie programy mogą się sypać? Dawał błędne wyniki?

No to testy ode mnie (może trafię w Twój błąd):

printf("");
printf("//   ");
printf(" /* */ ");
printf("\n");
printf(" // \n /* \n */ ");
cout<<" Bla // Bla Bla\n";
cout<<" Bla /* Bla // */ // Bla"<<endl;
/ ala/ //alka
/* / ala/ // */
/ala*/
/ala*/* ala *./  */
// komentarz
// komentarz2 \
dalszy komentarzyk
perl/*/*/*///*//*//*//**//*//*//*//
/*/* /* ///*//*//*//**//*//*//*//*/
komentarz // czy nie komentarz
*//.*/.**./

Output:

printf("");
printf("//   ");
printf(" /* */ ");
printf("\n");
printf(" // \n /* \n */ ");
cout<<" Bla // Bla Bla\n";
cout<<" Bla /* Bla // */ // Bla"<<endl;
/ ala/ 
/ala*/
/ala*
perl*
komentarz 
*

Nie jestem jednak pewien, co do liczby wypisywanych enterów, więc może ktoś z 12/12 (albo ponad 5/12) odpowie, ile powinno być enterów i kiedy. smile

1 month later

Ma ktoś jeszcze pomysł na inne testy?
Mój program uwzględnia:
-zwykłe komentarze /* */ i //
-komentarze ze wskaźnikami /**/*
-printfa
-couta
-putsa
-getsa
-takiego typu komentarze:

// komentarz \
dalszy komentarz

-komentarze z enterami; np. dla

/*
*/

wypisuje mi jedną pustą linię.

Nawet najdziwniejsze pomysły mile widziane, bo moje już się wyczerpały.

Nie przechodzi mi testów: 3, 4 i 9 (mam 9/12pkt).

Wypisze to samo (chyba tak powinno być).
[tu był link] <- link do mojego programu na ideone

A czy Twój AC zakłada define'y?

Trochę zagmatwałeś ten program zobacz jeszcze takie test
In:

#include <stdio.h>
/*fddddddd*/
int main(void)
{
  int a=0;//ddddd
  printf("/*csc*/");
  printf("\\ \" %d",/*fdf*/a);
  putchar('\'');
  putchar('\"');
  return 0;
}

Out:

#include <stdio.h>
int main(void)
{
  int a=0;
  printf("/*csc*/");
  printf("\\ \" %d",a);
  putchar('\'');
  putchar('\"');
  return 0;
}

Myślę, że źle podchodzisz do znaków ( ' i " ). Jeśli chcesz to mogę dać ci mój AC do testów.
pozdr.

Też mam dobre wyniki dla Twojego testu.
To poproszę tego ACcepta do testów (na PW jakbyś mógł). smile
//Edit: Dzięki. Jak dostanę maxa, to napiszę, co miałem źle. smile

1 month later

Ja mam trochę inny problem, na pewno nie mam WA, ale nie wiem dlaczego dostaje TLE...
Oto kod:

-- kod usunięty --

Tak, jakby mi się jakoś program gdzieś zapętlał, ale ja nie wiem, gdzie. Może jak ktoś inny spojrzy świeżym wzrokiem, to znajdzie błąd ;]

6 months later
19 days later

Nie napisałem, żebyś usuwał spacje, ale żebyś właśnie nie usuwał żadnych dodatkowych. No ale może źle się wyraziłem.
Mój program dla powyższego testu wypisuje pustą linię, bo komentarze widocznie jakoś ją zostawiają. Nie dostaję jednak maxa, tylko 9/12, ale kiedyś też nie wypisywałem nic i miałem sporo mniej punktów. Tak więc spróbuj dostosować się do tego testu, a byś może zostaniesz zaskoczony. wink

Wielkie THX.
Teraz mam 9 testów zaliczonych (tak jak Ty smiley). W końcu udało mi się dojść do tego dlaczego mi albo nie wypisywało nic albo to co nie trzeba smiley Kombinowałem z boolami a tu prawie w ogóle nie były potrzebne smiley
Akceptuje wszystkie oprócz dwóch ostatnich... Masz może na nie jakiś pomysł?

No to sporo masz roboty, nie obijasz się smiley a w HSPL nie bierzesz udziału? Powalcz tak na wszystkie fronty stuck_out_tongue
To ja na przyszłość (bo nie jest to coś bardzo pilnego) też byłbym wdzięczny za jakieś jeszcze testy, póki co mam tam 7/12, ale może z dodatkowymi wskazówkami dałoby radę na max, bo tak ładnie wygląda statystyka z zaliczonymi zadaniami danego typu na maksimum punktów smile

Też biorę, ale nie oszukujmy się, dobrze będzie jak w OI przejdę do 2giego etapu. wink
HSPL jest w sumie o tyle łatwiejszy, że można zobaczyć, ile testów przechodzi program i ma się nieskończoną ilość zgłoszeń, ale tam z kolei biorą udział programiści z całego świata, więc też marne szanse na wygraną. No ale chodzi, żeby się dokształcić i sobie poćwiczyć. wink
A Ty bierzesz udział w OI i HSPLu? Czy matura za bardzo Cię pochłania. smile

5 years later

Mam mały kłopot. Niby dla każdej z prób kod działa poprawnie, ale sędzia mi go odrzuca. Nie przechodzi ani jeden test

Kod:

#include <iostream>



















using namespace std;

void getln(string &line, string &prev)
{
    prev = line;
    getline(cin, line);
}

string line, pline;
int textS=0;
bool bool1 = false;

main()
{
    while(textS<50000)
    {
        point1: 
        string content;
        getln(line, pline);
        int len = line.length();
        if(pline == line)
        {
            textS+=2;
            continue;
        }
        
        
        for(int i = 0; i<len; i++)
        {
            if(bool1 == true) goto point2;
            if(line[i]==34)
            {

#define INC_I if(i!=line.length()-1)i++;                

                cout<<line[i];
                INC_I
                textS++;
                while(!(line[i]==34 && line[i-1]!=92))
                {
                    cout<<line[i];
                    i++;
                    textS++;
                    if(i==line.length()-1)break;
                    
                }
                cout<<line[i];
            }
            
            
            else if(line[i]==39)
            {
                cout<<line[i];
                INC_I
                textS++;
                while(!(line[i]==39 && line[i-1]!=92))
                {
                    cout<<line[i];
                    i++;
                    textS++;
                    if(i==line.length()-1)break;
                    
                }
                cout<<line[i];
                
                
            }
            else
            {
                
                if(line[i]==47 && line[i+1]==42)
                {
                    if(i>len-2)
                    {
                    getln(line, pline);
                    int len = line.length();
                    i=0;
                    }
                    else i+=2;
                    textS+=2;
                    point2: 
                    if(!(line[i]==42 && line[i+1]==47))
                    {
                    while(!(line[i]==42 && line[i+1]==47))
                    {
                        i++; textS++;
                        if(i==len)
                        {
                        bool1 = true;
                        goto point1;                
                        }
                        
                    }}
                    i++;
                    textS++;
                    bool1 = false;
                    continue;
                }
                
                
                else if(line[i]==47 && line[i+1]==47)
                {
                    while(line[len-1]==92)
                    {
                    getln(line, pline);
                    len = line.length();
                    }
                    break;
                    
                }
                
                cout<<line[i];
                
                
                
            }    
            content.push_back(line[i]);    
            
        }
        if(!content.empty())cout<<endl;
        
        
    }
    
    
    
}

Przyklad:
Input:

printf("");
printf("//   ");
printf(" /* */ ");
printf("\n");
printf(" // \n /* \n */ ");
cout<<" Bla // Bla Bla\n";
cout<<" Bla /* Bla // */ // Bla"<<endl;
/ ala/ //alka
/* / ala/ // */
/ala*/
/ala*/* ala *./  */
// komentarz
// komentarz2 \
dalszy komentarzyk
perl/*/*/*///*//*//*//**//*//*//*//
/*/* /* ///*//*//*//**//*//*//*//*/
komentarz // czy nie komentarz
*//.*/.**./
/*hjfdsjhf
sdfjh
dsgfj
8?
/
8
**
//
*/

Output:

printf("");
printf("//   ");
printf(" /* */ ");
printf("\n");
printf(" // \n /* \n */ ");
cout<<" Bla // Bla Bla\n";
cout<<" Bla /* Bla // */ // Bla"<<endl;
/ ala/ 
/ala*/
/ala*
perl*
komentarz 
*
5 months later

Suggested Topics

Want to read more? Browse other topics in Online Judge System or view latest topics.