1 / 27
Oct 2004

In the problem PAWNS, can we assume that black starts from the bottom line and is moving upwards ? This seems quite evident from the rules and the examples, but it is not clearly stated, so I prefer to ask.

In the problem PSPHERE, you say that the state of equilibrium is the "state of minimum energy" and this energy "is inversly proportional to the distance between the closest pair of charges on the sphere". From the rest of the rules (and from the scores of course smiley ), I suppose you meant that the energy is proportional to the minimal distance, and not inversely proportional.

  • created

    Oct '04
  • last reply

    Dec '14
  • 26

    replies

  • 3.0k

    views

  • 19

    users

Yes, you can assume that this is the case. I think such an assumption is pretty natural, since the problem text suggests that the example should be used as an accurate illustration.

Well... we want to reach a state of minimum energy, where the distances are as large as possible. So I believe the description seems ok?

Oops, my fault blush I shouldn't spend so much time on those problems open_mouth

4 years later

program c C#

using System;
namespace KC005
{
    class Program
    {
        public bool NameAndSubname(string sb)
        {
            if (!(char.IsLetter(sb[0])) || !(char.IsUpper(sb[0])))
            {
                return false;
            }
            else
            {
                char[] tab = sb.ToCharArray();
                tab[tab.Length - 1] = '\0';
                foreach (char c in tab)
                {
                    if (!(char.IsLetter(c)) && !(char.IsLower(c)) && (c != '\0')) return false;
                }
            }
            return true;
        }
        public bool Date(string sb)
    {
        string[] tab = sb.Split('-');
        int rok = int.Parse(tab[0]);
        int miesiac = int.Parse(tab[1]);
        int dzien = int.Parse(tab[2]);
        if (rok >= 1900 && rok <= 2000)
        {
            if (miesiac >= 1 && miesiac <= 12)
            {
                switch (miesiac)
                {
                    case 1:
                    case 3:
                    case 5:
                    case 7:
                    case 8:
                    case 10:
                    case 12:
                        if (dzien >= 1 && dzien <= 31) return true;
                        break;
                    case 2:
                        if (dzien >= 1 && ((dzien <= 28 && rok % 4 != 0) || (dzien <= 29 && rok % 4 == 0))) return true;
                        break;
                    case 4:
                    case 6:
                    case 9:
                    case 11:
                        if (dzien >= 1 && dzien <= 30) return true;
                        break;
                    default: break;
                }
            }
        }
        return false;
    }


    static void Main(string[] args)
    {
        Program p = new Program();
        string formularz;
        while ((formularz = Console.ReadLine()) != null)
        {
            string[] tab = formularz.Split(new Char[] { ' ' });
            if (!(p.NameAndSubname(tab[1])))
            {
                Console.WriteLine("0"); // jesli tak to koniec
                continue;
            }
            if (!(p.NameAndSubname(tab[3])))
            {
                Console.WriteLine("1");
                continue;
            }
            if (!(p.Date(tab[6])))
            {
                Console.WriteLine("2");
                continue;
            }
            Console.WriteLine("3");
        }
    }
}
}

ktos mi moze powiedziec dlaczego to nie dziala ? Na moich testach jest wszystko cacy

28 days later

Witam,

czy moglby mi ktos bardziej opisac, jak ma wygladac zestaw wejscowy?
Czy uzytkownik podaje pauzy pomiedzy rokiem, miesiacem i dniem? Wogole czy uzytkownik podaje imie tak: "Imie: Roman" czy "Roman"? Czy te "imie:" maja sie wogole wyswietlac czy co? I jeszcze do daty, w zadaniu pisze: "Każdy z zestawów składa się z 3 rozdzielonych średnikiem napisów[...]", a nizej mamy: "...w poprawnej dacie pole RRRR jest liczbą całkowitą z zakresu 1900-2000, pole MM jest liczbą całkowitą z zakresu 1-12, a pole DD liczbą całkowitą z zakresu 1-31...". Czyli wkoncu int czy napis? Czy uzytkownik podaje spacje pomiedzy danymi w dacie?

Pozdrawiam

Napisałem do tego zadania kilka różnych programów, każdy innym sposobem i ciągle mam WA.
Zakładałem nawet polskie znaki w imieniu i nazwisku, ale też nie przeszło.
Nic nie wydaje mi się nawet podejrzane w moim kodzie, wszystkie testy idą dobrze, ale SPOJ nie zalicza.
Może ktoś z osób, które zrobiły to zadanie będzie wiedział w czym tkwi haczyk.
Oto kod (wydaje mi się naprawdę prosty oprócz funkcji: isupper i islower, które sprawdzają czy dany znak jest duży albo mały):

Accepted

Jedyne, co mi się nasuwa na myśl, to to, że zbyt dokładnie rozpisałem datę, a w testach jest np. 29-02-2003, chociaż ten rok nie jest przestępny). Ale testy pewnie są dobrze (jak się kilkanaście razy dostaje WA, to już się wszystko podejrzewa).
Mogłem też coś w końcowych warunkach spaprać.
Gdyby co, to już zmieniałem wielkość tablic z 50 na 20 i 21, dodawałem '\n' na końcu scanefa oraz zmieniałem: for(i=1;i

Każda wskazówka mile widziana.

Przykładowo dla testu:

Twój program daje odpowiedź: 2
Powinno Być: 0.

Wielkie dzięki. smiley
Mój błąd polegał na tym, że założyłem, że w dacie są same cyfry. Zamienienie daty na string wyeliminowało błąd. smile

No cóż dla mojego programu ktory dostal ACC data 31 luty jest jak najbardziej poprawna smileysmiley

10 days later

Witam, oto moj kod:

#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;
class Formularz { // klasa
	private:
		char imie [18];
		char nazwisko[30];
		char data[21];
		int wynik;
		//met prywatne
		void s_imie();
		void s_nazwisko();
		void s_data();
	public:
	Formularz(char*,char*,char*);
	~Formularz();
	void werdykt();
	//przyjazn
	friend ostream & operator<<(ostream & os,const Formularz & obiekt);
}; // koniec klasy
//----------------------------------------------------------------------
Formularz::Formularz(char* imi, char* nazw, char* dat){ // definicje
	strcpy(imie,imi);
	strcpy(nazwisko,nazw);
	strcpy(data,dat);
	wynik=3;
}
Formularz::~Formularz()
{
}
//////////////////////////////////IMIE//////////////////////////////////
void Formularz::s_imie(){ // metoda sprawdza imie
	if(!(imie[0]>='A' && imie[0]<='Z'))
	wynik=0;
	else{
for(int i=1; imie[i]!='\0'; i++){
	if(imie[i]==';'){
		if(imie[i+1]!='\0'){
			wynik=0;
			break;
		}//if
	}//if
	else if(!(imie[i]>='a' && imie[i]<='z'))
	{
		wynik=0;
		break;
	}//else
	//cout << imie[i] << endl; //test
}//for
}//else
}//metoda
///////////////////////////////////NAZWISKO/////////////////////////////
void Formularz::s_nazwisko(){ // metoda sprawdza poprawnosc nazwiska
	if(!(nazwisko[0]>='A' && nazwisko[0]<='Z'))
	wynik=1;
	else{
		for(int i=1;nazwisko[i]!='\0'; i++){
		if(nazwisko[i]==';'){
		if(nazwisko[i+1]!='\0'){
			wynik=0;
			break;
		}//if
	}//if
	else if(!(nazwisko[i]>='a' && imie[i]<='z'))
			{
				wynik=1;
				break;
			}
		}//for
	}//else
}//koniec metody
////////////////////////////////DATA////////////////////////////////////
void Formularz::s_data(){
	char rok[4];
	strncpy(rok, data,4);
	double d_rok=atof(rok);
	//cout << d_rok << endl; //test
	if(d_rok<1900 || d_rok>2000)
	wynik=2;
	char dni[2];
	dni[0]=data[5];
	dni[1]=data[6];
	d_rok = atof(dni);
	//cout << d_rok<<endl; // test
	if(d_rok<1 || d_rok>12)
	wynik=2;
	dni[0]=data[8];
	dni[1]=data[9];
	d_rok=atof(dni);
	if(d_rok<1 || d_rok>31)
	wynik=2;
}//koniec metody	
void Formularz::werdykt(){
	s_imie();
	if(wynik==3)
	s_nazwisko();
	if(wynik==3)
	s_data();
}
//----------------------------------------------------------------------
//----------------------------------------------------------------------
//przyjazn
ostream & operator<<(ostream &os, const Formularz& obiekt){
	os << obiekt.wynik << endl;
	return os;
}
//----------------------------------------------------------------------
//----------------------------------------------------------------------
int main(){
	char imie[17];
	char nazwisko[30];
	char data[21];
	while(cin>>imie){
	cin>>imie>>nazwisko>>nazwisko>>data>>data>>data;
		Formularz obiekt(imie, nazwisko, data);
		obiekt.werdykt();
		cout << obiekt;
	}
	return 0;
}

nie wiem, wszystkie testy przechodzi bezblednie. Przepraszam za obszernosc kodu, ale staram sie stosowac nowo co poznane "myki".
Pozdrawiam

w C++ tez powinna byc to skoro w C# jest.
Mianowicie do sprawdzania imienia i nazwiska mozna posluzyc sie wyrazeniami regularnymi wink

9 days later
  1. w napisie mogą również wystąpić cyfry, tak samo jak i znaki przestankowe i inne.
  2. wystarczy spojrzeć na dane wejściowe. przy każdym zadaniu podany jest zestaw przykładowy
  3. a jak jest napisane w formularzu: podaj datę urodzenia w formacie DD-MM-RRRR to wiesz jak wypełnić?
  4. à propos daty urodzenia to 1988 to rok Twojego urodzenia czy tak dla picu numerek?
1 month later

Pomimo tego, że zadanie jest teoretycznie bardzo proste to jednak sporo się z nim namęczyłem. Wszystkim korzystającym z funkcji atoi polecam sprawdzenie wyników działania programu dla poniższych testów:

Imie: Jan; Nazwisko: Kowalski; Data ur.: 1900-+1-+1
Imie: Jan; Nazwisko: Kowalski; Data ur.: 1900-1--1-

W obydwu przypadkach prawidłowy wynik to oczywiście 2.

1 month later

Dlaczego mój kod w Javie nie zwraca wartości 0(dostaje NZEC) ??

import java.util.Scanner;
import java.util.StringTokenizer;
public class Main { 
    public static void main(String[] args) { 
    	Scanner sc = new Scanner(System.in);
    	String form = "";
    	String imie = "";
    	String nazwisko = "";
    	String rok = "";
    	String miech = "";
    	String dzien = "";
    	while(sc.hasNext()) {
    		form = sc.nextLine();
    		StringTokenizer st = new StringTokenizer(form, " ;-");
    		st.nextToken();
    		imie = st.nextToken();
    		st.nextToken();
    		nazwisko = st.nextToken();
    		st.nextToken(); st.nextToken();
    		rok = st.nextToken();
    		miech = st.nextToken();
    		dzien = st.nextToken();
    		Character c = new Character(imie.charAt(0));
    		Character d = new Character(nazwisko.charAt(0));
    		if(Character.isLowerCase(c) || imie.length() >= 10 || !containsLetterOnly(imie)) System.out.println(0);
    		else if(Character.isLowerCase(d) || nazwisko.length() >= 20 || !containsLetterOnly(nazwisko)) System.out.println(1);
    		else if((Integer.parseInt(rok) < 1900 || Integer.parseInt(rok) > 2000)
    			|| (Integer.parseInt(miech) < 1 || Integer.parseInt(miech) > 12)
    			|| (Integer.parseInt(dzien) < 1 || Integer.parseInt(dzien) > 31)) System.out.println(2);
    		else System.out.println(3);
    	}
    	System.exit(0);
    } 
    private static boolean containsLetterOnly(String s) {
    	for(int i = 0; i < s.length(); i++) {
    		Character c = new Character(s.charAt(i));
    		if(!Character.isLetter(c)) return false;
    	}
    	return true;	
    }
}
2 months later

W adzie działa wszystko ok oddałem parę programów. problem polega na tym, że są to podchwytliwe testy i niestety trzeba ruszyć głową

3 months later
2 months later

Hej! Z tego co widziałem temat formularz był już przerabiany. Ja też próbowałem i jakoś mi nie idzie. Dla imienia i nazwiska jest ok tak myślę ale wykłada się wszystko przy datach np. dla daty 0019 lub miesiąc 17 przyjmuje że jest poprawna Jak to poprawić? Proszę o jakąś podpowiedź. Poniżej treść zadania i moje wypociny.

Napisz program, który sprawdza, czy dany formularz osobowy został prawidłowo wypełniony. Formularze, których poprawność należy sprawdzić, mają postać:
Imie: II; Nazwisko: NN; Data ur.: RRRR-MM-DD
gdzie II jest napisem złożonym z co najwyżej 10 znaków, NN jest napisem złożonym z co najwyżej 20 znaków, RRRR jest 4-znakowym napisem, a MM i DD są 2-znakowymi napisami.
Wejście
Na wejście programu podana zostanie pewna liczba zestawów danych (co najwyżej 10.000). Każdy z zestawów składa się z 3 rozdzielonych średnikiem napisów, o postaci opisanej powyżej (można przyjąć, że pola II, NN, RRRR, MM i DD składają się wyłącznie z czarnych znaków różnych od średnika). Poszczególne zestawy zostaną rozdzielone znakiem nowej linii.
Wyjście
Na wyjściu ma się pojawić, dla każdego wczytanego z wejścia formularza, liczba wyliczona zgodnie z poniższą regułą:
0, jeżeli formularz nie zawiera poprawnego imienia; poprawne imiona zaczynają się od wielkiej litery, po której następują małe litery;
1, jeżeli formularz zawiera poprawne imię, a nie zawiera poprawnego nazwiska; poprawne nazwiska zaczynają się od wielkiej litery, po której następują małe litery;
2, jeżeli formularz zawiera poprawne imię i nazwisko, a nie zawiera poprawnej daty; w poprawnej dacie pole RRRR jest liczbą całkowitą z zakresu 1900-2000, pole MM jest liczbą całkowitą z zakresu 1-12, a pole DD liczbą całkowitą z zakresu 1-31;
3, w pozostałych przypadkach.
Poszczególne liczby należy rozdzielić znakiem nowej linii.
Przykład
Wejście:
    Imie: Roman; Nazwisko: Kowalski6; Data ur.: 1900-01-30
Imie: Andrzej; Nazwisko: Kowal; Data ur.: 1899-10-10
Imie: roman; Nazwisko: No-wak; Data ur.: 1099-11-12
Imie: Alicja; Nazwisko: Nowak; Data ur.: 1990-01-01
Wyjście:
    1
2
0
3

kod

#include <stdio.h>
#include<string.h>
int main ()
{
 int x;
    for(x=0; x<=10001; x++) 
    { 
        char imie[20], nazwisko[30], data[40]; 
        int c = 0; 
        int i = scanf("Imie:%*1[ ]%*1[A-Z]%*9[a-z];%1[ ]", imie); 
        if (i == 1) 
                {              
                     int n=scanf("Nazwisko:%*1[ ]%*1[A-Z]%*19[a-z];%1[ ]", nazwisko); 
                     if (n==1)
                                {              
                                int d = scanf("Data ur.:%*1[ ]%*4[1900-2000]%*1[-]%*2[00-12]%*1[-]%*2[0-31]%1[\n]", data);  
                                if (d==1) puts("3");
                                else 
                                     {
                                      puts("2"); 
                                      while (c != EOF && c != '\n') 
                                      c = getchar(); 
                                     }
                                }      
                     else 
                         {
                          puts("1"); 
                          while (c != EOF && c != '\n') 
                          c = getchar(); 
                         }
                         }           
        else 
           { 
            puts("0"); 
            while (c != EOF && c != '\n') 
                c = getchar(); 
           } 
    } 
return 0;
}

ok rozumiem,że warunek zakładający 10000 elementów jest nie prawidłwy, ale jak połączyć twoją powyżaszą sugestię pętli ze scanf jesli dalej w programie mam coś takiego

int i = scanf("Imie:%*1[ ]%*1[A-Z]%*9[a-z];%1[ ]", imie);

czy nie wysypie się jak przedtem zamieszczę pętle proponowaną przez Ciebie i jeszcze jedno pytanko Czy gdyby program chodził za długo ze względu na długość pętli to nie wyświetliłby przekroczonego limitu czasu tak pytam Nie obrażaj się jestem poprostu cienki. No i zastanawiałem się czy nie wstawić wewnątrz jakiegoś warunku wyjśćia z pętli coś przy użyciu EOF ale też niewiem jak to dokładnie ubrać w poprawna składnię.

6 months later
4 months later