POLSKI SPOJ

Problem hidden
This problem was hidden by Editorial Board member probably because it has incorrect language version or invalid test data, or description of the problem is not clear.

Zadanie w systemie SPOJ (trudne)

567. Precz z komentarzami!

Kod zadania: BFNTEST

Pani z Informatyki, która od wielu lat uczyła już Jasia, z trudem mogła ręcznie przebrnąć przez oceniane kody źródłowe doszukując się w nich rzeczywistych czy wyimaginowanych podobieństw. Poprosiła więc swojego najzdolniejszego ucznia, Jasia, o pomoc w tym arcytrudnym zadaniu. Jaś po przeanalizowaniu problemu, doszedł do wniosku, że pierwszym zadaniem jest usunięcie z programów źródłowych licznych i nieistotnych z punktu widzenia oceny podobieństw kodów, komentarzy, którymi upstrzone były (nierzadko do przesady) kody źródłowe młodszych kolegów.
Komentarze w programach źródłowych napisanych w językach C/C++ wystepują w dwóch postaciach:

/* to jest komentarz
   to wciąż jest komentarz */
lub 
          // to jest komentarz (aż do końca linii).

Zadaniem Jasia jest napisać program, który z podanego na wejściu poprawnego kodu źródłowego (o rozmiarze nie większym niż 50kB) napisanego w języku C/C++ usunie wszystkie komentarze, a pozostały nienaruszony teskt programu wydrukuje na wyjście.

Przykład 1

Wejście:

#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()
{
	int a, d, n;
	cin >> a; srand(a); /* inicjalizacja generatora
        liczb pseudolosowych /* */
	cin >> d; cin >> n; cout << n << endl;
	for(;n;n--)
	{
		gen(rand()%d);  P(' ');
		gen(rand()%d);  P('\n');
	}
	return 0;
}

Wyjście:

#define R(p) rand()%('9'-(p)+1)+(p)
#define P(p) putc((p),stdout)
#define PP(p) P(R(p))

#include <iostream>
#include <cstdlib>

#include <cstdio>

using namespace std;


void gen(int x)
{
        if (x) PP('1'); else PP('0');
        for(;x;x--) PP('0');
}

int main()
{
        int a, d, n;
        cin >> a; srand(a);
        cin >> d; cin >> n; cout << n << endl;
        for(;n;n--)
        {
                gen(rand()%d);  P(' ');
                gen(rand()%d);  P('\n');
        }
        return 0;
}

Przykład 2

Wejście:

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

typedef struct _road{
    int cost;//,Id;
    int from,to;
    struct _road *next;
}road;

int readInt(void);
inline int roadcmp(const void *a,const void *b){
    return ((road*)a)->cost-((road*)b)->cost;
};

inline void swap(road *a,road *b){
/* zamienia die zmienne point miejscami */
    road tmp=*a;
    *a=*b;
    *b=tmp;
};
/* Heapify, BuildHeap, HeapSort - funkcje sortujace tablice punktow uzywajac
   porzadku definiowanego przez funkcje compare
   wywolac nalezy poprzez HeapSort */
void Heapify(road *A,int n, int i);
void BuildHeap(road *A,int n);
void HeapSort(road *A,int n);

int city[10000]; //czy jest juz w drzewie
int main(){} /* to juz jest koniec....*/

Wyjście:

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

typedef struct _road{
    int cost;
    int from,to;
    struct _road *next;
}road;

int readInt(void);
inline int roadcmp(const void *a,const void *b){
    return ((road*)a)->cost-((road*)b)->cost;
};

inline void swap(road *a,road *b){

    road tmp=*a;
    *a=*b;
    *b=tmp;
};

void Heapify(road *A,int n, int i);
void BuildHeap(road *A,int n);
void HeapSort(road *A,int n);

int city[10000];
int main(){}

Dodane przez:Michał Małafiejski
Data dodania:2005-05-08
Limit czasu wykonania programu:1s
Limit długości kodu źródłowego50000B
Języki programowania:All except: PERL 6
Pochodzenie:-

ukryj komentarze
2012-05-07 14:13:54 Maciej Boniecki
Spacje mają znaczenie i należy je zostawiać. Sporo testów do tego zadania możesz znaleźć na forum.
2012-05-06 19:52:24 Jan Bartnik
Głupie pytanie - czy spacje mają znaczeni przy ocenie poprawnego rozwiązania? Bo patrząc na przykłady to mamy przykładowo wejście:
int main(){} /* to juz jest koniec....*/
A na wyjściu w przykładzie spacji przed komentarzem już nie ma. I tak wszędzie w przykładach. Moje rozwiązanie zostawia spację zamiast ją usuwać ale dostaję 5 punktów - czyżby przez to?
Przy okazji - jak zgaduję należy przewidzieć np. taką sytuację jak:
printf("tekst i /*to nie jest komentarz*/ ?");
2010-11-08 00:29:10 Xxxx Xxxx
http://pl.php.net/token_get_all
MUHAHUHIHE :P

Ostatnio edytowany: 2010-11-10 16:35:37
2010-09-12 09:35:57 Piotr Kąkol
Nie, poprawności. Ale oczywiście, jeśli będziesz miał za wolny program (w co w sumie wątpię) możesz dostać TLE dla jakiegoś testu i mieć mniej punktów.
2010-09-11 13:13:26 Krzysztof Butkiewicz
Pod jakim kątem program jest oceniany? Szybkość działania?
2010-07-04 20:13:21 Piotr Kąkol
Bo trudno jest zdobyć maxa. Wiem coś o tym. ;-P
2010-07-04 18:41:33 Tomek
czemu to jest w kategorii "trudne"?
2010-02-25 16:36:49 Michał Guzek
Sprawdzaliście czy może w C-stringach jest znak komentarza - a jeśli tak to go ignorujecie (bo w C-stringach można takie znaki umieszczać) ?
2009-06-24 14:51:14 Dawid Kalinowski
Może w testach są komentarze zagnieżdżone?
2009-05-08 19:30:43 Jaroslaw Berek
cos jest nie tak dlaczego pokazuje wyniki wszystkie bledne skoro jaki kod bym nie wzial to dobrze usuwa komentarze?
SPOJ System © 2012 Sphere Research Labs | Projekty informatyczne i aplikacje na zamówienie. All Rights Reserved.