Checker

Stato
Discussione chiusa ad ulteriori risposte.

solo

Utente Silver
29 Maggio 2008
40
1
0
63
Risoluzione in: C++ C# Java o VB
Problem statement:
Codice:
Problem Statement
    
PROBLEM STATEMENT
For every problem given on TopCoder, there are restrictions on the input that
TopCoder checks.  For the most simple inputs, this could be as easy as ensuring
that a single int is between 1 and 50, inclusive.  On more complicated
problems, this CheckData() method (as it is called) becomes more difficult.

Implement a class Checker with a method CheckData() that will take a String[]
as an argument.  You must ensure that the String[] is a valid input for the
following "problem description":

****** BEGIN PSUEDO-PROBLEM DESCRIPTION ******
You are given a String[] lovers representing a love triangle.  Each element in
this String[] will be formatted as follows:
"NAME1 LOVES NAME2"
(quotes added for clarity only).

Checker will ensure the following:
*lovers will contain between 2 and 20 elements, inclusive.
*Each element of lovers will contain less than or equal to 40 characters and
will be formatted as
 "NAME1 LOVES NAME2" (quotes added for clarity again)
with the capital word LOVES and only one space between words, and no leading
or trailing spaces.
*NAME1 and NAME2 will be names of non-zero length.
*NAME1 and NAME2 will not be identical (everyone loves themselves anyway).
*NAME1 and NAME2 will contain only capital letters [A-Z] and/or hyphens '-'.
*For each NAME2 there will be a corresponding NAME1 in lovers.  That is,
everyone loves someone else in the problem.

Notes:
*One person may love multiple people (repeated NAME1 in different elements) and
one person may be loved by multiple people (repeated NAME2 in different
elements).
*It is possible for two elements to be identical.
 (ex {"A LOVES B","A LOVES B","B LOVES A"} is valid).
****** END PSUEDO-PROBLEM STATEMENT ******

DEFINITION
Class name: Checker
Method name: CheckData
Parameters: String[]
Returns: boolean
The method signature is:
boolean CheckData(String[] lovers)
Be sure your method is public.

For technical reasons, TopCoder will ensure the following:
*lovers contains 0 to 50 elements.
*each element of lovers contains 0 to 50 characters, inclusive.
*each element of lovers contains characters ([a-z][A-Z][0-9]), spaces, or any
of the characters (quotes added for clarity) "<>./?;:{}[]=+-_|".

EXAMPLES
{"D-G LOVES M",
 "M LOVES D-G",
 "T LOVES G",
 "G LOVES D-G"}
This input matches the above criteria, so CheckData returns true.

{"D LOVES M",
 "D LOVES C",
 "G LOVES M",
 "M LOVES T",
 "T LOVES D"}
Since C is loved but never appears as NAME1, this returns false.

{"D LOVES M",
 "C LOVES C",
 "G LOVES M",
 "M LOVES T",
 "T LOVES D"}
Now we see that C desperately tries loving himself, but that is not allowed so
the method returns false.

{"N LOVES C",
 "C LOVES D",
 "D LOVES M",
 "M LOVES g",
 "g LOVES N"}
g has lowercase letters in his name and therefore the method returns false.

{"A LOVES B",
 "A LOVES C",
 "C LOVES A",
 "B  LOVES A"}
Element 3 has a badly formatted string (two spaces where only one is allowed),
so the result is false.

{"ME LOVES YOU"}
Since 2-20 elements (inclusive) are necessary, this returns false.

{"ME LOVES YOU",
 "ME LOVES YOU"}
This has the correct number of elements, and the repeat is legal.  However,
since YOU never exists as NAME1, the result is still false.

{"ME LOVES YOU",
 "ME LOVES YOU",
 "YOU LOVES ME"}
The above situation remedied.  This returns true.

{"I LOVE YOU",
 "YOU LOVE I"}
Both Strings are incorrectly formatted (LOVE instead of LOVES), so the method
returns false.
Definition
    
Class:
Checker
Method:
CheckData
Parameters:
String[]
Returns:
boolean
Method signature:
boolean CheckData(String[] param0)
(be sure your method is public)

Soluzione:
[ot]
Codice:
import java.util.*;

public class Checker {

    private String regex;
    
    /** Creates a new instance of Checker */
    public Checker() {
        regex = "/[A-Z0-9-]{1,}+[ ]{1,1}+LOVES+[ ]{1,1}+[A-Z0-9-]{1,}/";
    }
    
    private String GetName1(String couple){
        /*restituisce NAME1*/
        String temp="";
        int i = couple.indexOf(' ');
        temp = couple.substring(0,i-1);
        return temp;
    }
    
    private String GetName2(String couple){
        /*restituisce NAME2*/
        String temp="";
        int i = couple.lastIndexOf(' ');
        temp = couple.substring(i+1);
        return temp;
    }
    
    private boolean checkString(String couple){
        /*Controlla che siano presenti solo caratteri validi ([A-Z] - ) e che contenga la parola LOVES*/
        return couple.matches(regex);
    }
    
    private boolean checkPresence(String[] lovers){
        /*Controlla che ogni NAME1 sia presente anche come NAME2 */
        boolean result = false;
        for (int i=0;(i<lovers.length)&&(!result);i++){
            String name1 = GetName1(lovers[i]);
            for (int j=0;(j<lovers.length)&&(!result);j++){
                String name2 = GetName2(lovers[i]);
                if (name1 == name2) result = true;
            }
            if (!result) return false;
            result = false;
        }
        return true;
    }
    
    private boolean checkLength(String[] lovers){
        /*Controlla che il vettore sia delle giuste dimensioni*/
        return (lovers.length<=50);
    }
    
    private boolean checkDifference(String couple){
        /*Controlla che NAME1 != NAME2 */
        return (GetName1(couple)!=GetName2(couple));
    }
    
    private boolean checkSingleLength(String couple){
        /*Controlla che la lunghezza della stringa NAME1 LOVES NAME2 sia corretta*/
        return (couple.length()<=40);
    }
    
    private boolean checkArray(String[] lovers){
        for (int i=0;i<lovers.length;i++)
            if ((!checkSingleLength(lovers[i]))||(!checkDifference(lovers[i]))||(!checkString(lovers[i])))
                return false;
        return true;
    }
    
    public boolean CheckData(String[] param0){
        boolean res = true;
        res = checkLength(param0) && checkPresence(param0) && checkArray(param0);
        return res;
    }
    
}
[/ot]
 
certo che potresti spendere due parole di tue ad introdurre l'esercizio e il relativo codice...
cosi da evitare un copia incolla spudorato e senza tuo commento...
 
Predator ha detto:
certo che potresti spendere due parole di tue ad introdurre l'esercizio e il relativo codice...
cosi da evitare un copia incolla spudorato e senza tuo commento...

sarebbe il minimo visto che sono non sono un asso in inglese :asd: :lol:
 
bé con l'altro esercizio l'avevo fatto e il 3d ha avuto una sola risposta da parte di una persona che si è dimostrata interessata davvero ^^

P.S. L'inglese è un requisito indispensabile per un informatico ;)
 
solo ha detto:
bé con l'altro esercizio l'avevo fatto e il 3d ha avuto una sola risposta da parte di una persona che si è dimostrata interessata davvero ^^

P.S. L'inglese è un requisito indispensabile per un informatico ;)
[ot]io sono in italia e parlo italiano[/ot]
comunque c'è qua... google traduttore
 
[ot]@kr1pn0$: nessuno qui sta dicendo che bisogna parlare in inglese, è corretto il fatto che uno dia la giusta importanza alle sue origini, ma è anche un dato di fatto oramai che l'inglese è di vitale importanza, soprattutto per un informatico. Il 99% della documentazione valida su qualsiasi argomento informatico è in inglese e tu non puoi cambiare questo. Se poi ti accontenti delle cretinate che trovi in italiano...[/ot]
 
quoto solo...
però certo: magari è un po' difficilotto comprendere i testi in inglese...però ricorda:
Codice:
#include <iostream>
using namespace std;

int main()
{
   int imparato, prova_e_riprova;
   for (prova_e_riprova=0; prova_e_riprova != imparato; prova_e_riprova++)
}
xD
 
solo ha detto:
[ot]@kr1pn0$: nessuno qui sta dicendo che bisogna parlare in inglese, è corretto il fatto che uno dia la giusta importanza alle sue origini, ma è anche un dato di fatto oramai che l'inglese è di vitale importanza, soprattutto per un informatico. Il 99% della documentazione valida su qualsiasi argomento informatico è in inglese e tu non puoi cambiare questo. Se poi ti accontenti delle cretinate che trovi in italiano...[/ot]
yes....
but it's a guide pratical of C by blacklight......
:asd:
 
kr1pn0$ ha detto:
solo ha detto:
[ot]@kr1pn0$: nessuno qui sta dicendo che bisogna parlare in inglese, è corretto il fatto che uno dia la giusta importanza alle sue origini, ma è anche un dato di fatto oramai che l'inglese è di vitale importanza, soprattutto per un informatico. Il 99% della documentazione valida su qualsiasi argomento informatico è in inglese e tu non puoi cambiare questo. Se poi ti accontenti delle cretinate che trovi in italiano...[/ot]
yes....
but it's a guide pratical of C by blacklight......
:asd:

cosa?
EDIT: ah forse ho capito, dici che esiste una guida in italiano al C di blacklight? Quelle sono basi di programmazione, se cerchi guide specifiche per argomenti avanzati non ne trovi in italiano, e comunque il K&R è in inglese.
 
Perchè ti invoglia a cimentarti in linguaggi che non sono "tuoi" ^^
E non dire che non sai farlo così... Una volta che conosci un linguaggio di programmazione, li conosci praticamente tutti ;)

E comunque se proprio non ti vanno a genio fallo nel linguaggio che preferisci l'importante è che sia OO, io non ti sculaccerò :p
 
solo ha detto:
Perchè ti invoglia a cimentarti in linguaggi che non sono "tuoi" ^^
E non dire che non sai farlo così... Una volta che conosci un linguaggio di programmazione, li conosci praticamente tutti ;)

E comunque se proprio non ti vanno a genio fallo nel linguaggio che preferisci l'importante è che sia OO, io non ti sculaccerò :p

A meno che tu non conosca il python, che di fatto fa tutto lui.
 
Si, ma odio gli oggetti xD
Comunque quando ho un momento ci ridò un occhio e vedo l'esercizio, se non è troppo OO lo faccio xD
 
Ma dai? Ti pare che non ho letto il testo dell'esercizio? -.- Il troppo OO era semplicemente per dire che con gli oggetti più di tanto non so fare...
Comunque non ho capito l'esercizio, devo implementare il metodo CheckData(String) nella classe Checker, ma questo metodo cosa deve fare? Ho solo capito che deve ritornare un valore booleano.
 
in pratica deve avere un metodo pubblico checkData che prende un array di stringhe come parametro. Deve controllare che tutte queste stringhe e che l'array risponda a certi requisiti. Se non risponde a questi requisiti allora il metodo restituirà false. I parametri sono i seguenti:
- lunghezza array <= 50
- lunghezza di ogni stringa <=40
- ogni stringa formattata nel seguente modo NAME1 LOVES NAME2 (NAME1 e NAME2 stringhe di lunghezza >0 contenenti solo caratteri e -)
- la stringa è composta da soli caratteri maiuscoli e i nomi possono contenere solo lettere o "-"
- Ogni NAME1 deve essere presente (in un'altra stringa) come NAME2 (ovvero ogni persona deve essere corrisposta)
- NAME1 non può amare se stesso (ovvero NAME1 != NAME2)

Credo sia tutto ;)
 
Opo, la regex se non hai voglia puoi copiarla dal codice di solo, così per la struttura della classe, per il resto sono poco più che controlli sulle stringhe, ce la puoi fare^^

Se trovi problemi posta comunque, anche se di python so poco posso darti una mano con la parte logica e OOP (se ti faccio esempi in c++ non ti offendi, vero? xD a parte scherzi la sintassi del c++ in ambito OO è molto autoesplicativa ;) )
 
Nono, il problema non è sulla composizione della regex quanto sul fatto che non so come dichiararne una in Python xD
E poi il mio problema è negli ultimi 2 punti, quando ho più tempo libero cerco di ovviare a questi, grazie comunque della disponibilità ^^
 
tutto questo casino per un problema così semplice? lol
cmq effettivamente non è semplice capire che cavolo vuole che si faccia..... bisogna leggerlo con attenzione
 
- Ogni NAME1 deve essere presente (in un'altra stringa) come NAME2 (ovvero ogni persona deve essere corrisposta)
Dovrebbe essere il contrario altrimenti questo non sarebbe giusto
Codice:
{"D-G LOVES M",
"M LOVES D-G",
"T LOVES G",
"G LOVES D-G"}

This input matches the above criteria, so CheckData returns true.
Perchè T non è presente come NAME2 però il metodo restituisce true (almeno stando a quello che dice :asd: )

Comunque il codice l'ho fatto in C# Eccolo
output (penso sia giusto l'ho fatto di fretta e l'ho provato solo con gli esempi che hai postano all'inizio).
Codice:
D-G LOVES M
M LOVES D-G
T LOVES G
G LOVES D-G
Return:True


D LOVES M
D LOVES C
G LOVES M
M LOVES T
T LOVES D
Return:False


D LOVES M
C LOVES C
G LOVES M
M LOVES T
T LOVES D
Return:False


N LOVES C
C LOVES D
D LOVES M
M LOVES g
g LOVES N
Return:False


A LOVES B
A LOVES C
C LOVES A
B  LOVES A
Return:False


ME LOVES YOU
Return:False


I LOVE YOU
YOU LOVE I
Return:False


ME LOVES YOU
ME LOVES YOU
Return:False


ME LOVES YOU
ME LOVES YOU
YOU LOVES ME
Return:True
p.s. Non è obbligatorio usare le espressioni regolari (ad esempio io non l'ho fatto, non mi andava).
 
Stato
Discussione chiusa ad ulteriori risposte.