Задача Сервера

Правила проведения олимпиады, условия задач и комментарии к ним, результаты олимпиады и апелляции.

Задача Сервера

Сообщение Vladislav_133 24 мар 2016, 11:11

Задача Сервера
Вложения
Servera.pdf
(263.07 Кб) Скачиваний: 366
Аватара пользователя
Vladislav_133
Elite
 
Сообщения: 1386
Зарегистрирован: 13 дек 2008, 18:08
Полное имя: П.В.Ю.

Re: Задача Сервера

Сообщение hardcore_test 24 мар 2016, 13:12

Может ли быть такой ввод
Фамилия w@w (3 пробела), r@w
hardcore_test
 
Сообщения: 102
Зарегистрирован: 06 мар 2015, 16:10
Полное имя: Владислав Андреевич Быков

Re: Задача Сервера

Сообщение Vladislav_133 24 мар 2016, 13:19

запятая обязательно, а пробелы могут быть, а могут и не быть
Аватара пользователя
Vladislav_133
Elite
 
Сообщения: 1386
Зарегистрирован: 13 дек 2008, 18:08
Полное имя: П.В.Ю.

Re: Задача Сервера

Сообщение hardcore_test 24 мар 2016, 13:53

Не информативные строки это те где нет почты?
hardcore_test
 
Сообщения: 102
Зарегистрирован: 06 мар 2015, 16:10
Полное имя: Владислав Андреевич Быков

Re: Задача Сервера

Сообщение Vladislav_133 24 мар 2016, 14:07

Точно.
Аватара пользователя
Vladislav_133
Elite
 
Сообщения: 1386
Зарегистрирован: 13 дек 2008, 18:08
Полное имя: П.В.Ю.

Re: Задача Сервера

Сообщение Vladislav_133 28 мар 2016, 09:17

Конечно, у некоторых может возникнуть вопрос почему у этой задачи 3 балла, а у 3-й пошел - 4. Из чего я исходил. В данной задаче нужно много возиться со строками, а большинство пишут программы на высокоуровневых языках, типа c#, Python и т.п., где много всяких возможностей обработки текстовой информации. С этой точки зрения задача должна быть легче задачи, где в основном числа. Вот такие простые соображения. Впрочем как ни выбираем каждый год, все кажется, что выбор баллов не точен.
Последний раз редактировалось Vladislav_133 28 мар 2016, 10:57, всего редактировалось 1 раз.
Аватара пользователя
Vladislav_133
Elite
 
Сообщения: 1386
Зарегистрирован: 13 дек 2008, 18:08
Полное имя: П.В.Ю.

Re: Задача Сервера

Сообщение hardcore_test 28 мар 2016, 09:58

Эта задача была сложнее потому что не так много времени в институте уделяется обработкам строк, а математическая задача это более частая проблема
hardcore_test
 
Сообщения: 102
Зарегистрирован: 06 мар 2015, 16:10
Полное имя: Владислав Андреевич Быков

Re: Задача Сервера

Сообщение [DD] 01 апр 2016, 10:38

Подсветки синтаксиса для Rust нет так, что использовал подсветку для PHP.
Подсветка синтаксиса: (main.rs) [ Загрузить ] [ Скрыть ]
Подсветка синтаксиса языка php
  1. use std::fs::File;
  2. use std::io::{Read, Write};
  3. use std::collections::HashMap;
  4. //функция для получения адреса сервера и только его
  5. fn get_server(data:&str)->Option<String>{
  6.     let x = data.trim();
  7.     match x.find('@') {//если в значении имеется @
  8.         Some(p) => Some(x[p+1..x.len()].to_string()),//то берем только то что после нее
  9.         None => None
  10.     }
  11. }
  12.  
  13. fn main() {
  14.     let mut servers : HashMap<String, Vec<String>> = HashMap::new();//переменная для результата
  15.     let mut data : String = String::new();
  16.     {//читаем из файла. Данных не сильно много так что можно сразу и все(в отдельном блоке из-за особенностей Rust)
  17.         let mut input = match File::open("input.txt") {
  18.             Ok(f) => f,
  19.             Err(e) => panic!("{}", e)
  20.         };
  21.         input.read_to_string(&mut data).unwrap();
  22.     }
  23.     for line in data.split("\n").filter_map(|x| {let x = x.trim(); return if x.len() == 0 {None} else {Some(x)} }){//бьем на строки и берем только не пустые строки
  24.         let (name, srvs) = match line.find(' ') {
  25.             Some(p) => (line[0..p].to_string(), line[p..line.len()].to_string()),//получаем имя строку с адресами
  26.             None => continue
  27.         };
  28.        
  29.         for item in srvs.split(",").filter_map(get_server){//получаем отдельные адреса и сохраняем их
  30.             if !servers.contains_key(&item) {
  31.                 servers.insert(item.clone(), Vec::new());
  32.             }
  33.             let mut vec = servers.get_mut(&item).unwrap();
  34.             if !vec.contains(&name){
  35.                 vec.push(name.clone());
  36.             }
  37.         }
  38.     }
  39.    
  40.     //ну а тут просто сохранение в файл.
  41.    
  42.     let mut output = match File::create("output.txt") {
  43.         Ok(f) => f,
  44.         Err(e) => panic!("{}", e)
  45.     };
  46.     for (server, names) in servers {
  47.         let s = format!("{} {}\n", server, names.join(","));
  48.         output.write_all(&s.into_bytes()).unwrap();
  49.     }
  50. }
мы рождены чтоб сказку сделать кодом
[DD]
Elite
 
Сообщения: 163
Зарегистрирован: 18 мар 2009, 22:18
Откуда: from HELL
Полное имя: Зыков Д.А.

Re: Задача Сервера

Сообщение Vladislav_133 10 апр 2016, 18:01

Дошли и до серверов. Много кода? Да. Текстовая обработка вся вручную. :)

Подсветка синтаксиса: [ Загрузить ] [ Скрыть ]
Подсветка синтаксиса языка cpp
//list of servers
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <memory.h>

int cmps(char *, char *);
void getn(char *, char *);
int vnm(char *, char *);

//global arrays
char s[200], ms[300][200];
//
struct rpo{
    char ns[50];
    char ms[5000];
};

int main(){
    struct rpo rp[300];
    int n,i,j,h,m,l,v;
    char * k;
    n=0;
    while(fgets(s,200,stdin)){
        if(strstr(s,"@")){
            strcpy(ms[n],s);
            n++;
        }
    }
//
    m=0;
    for(i=0; i<n; i++){ //go through the array of rows
        j=0;k=ms[i];
        while((k=strstr(k+j,"@"))){ //find out names of servers
            h=0;
            while(1){
                if(*(k+h+1)==' '||*(k+h+1)==','||*(k+h+1)=='\n')break;
                s[h]=*(k+h+1);h++;             
            }
            if(h>0){//name of server found
                s[h]='\0';
                for(v=0; v<m; v++){
                    if(!cmps(rp[v].ns,s))break;
                }
                if(v==m){//add server with user
                    //server
                    strcpy(rp[m].ns,s);
                    //user
                    getn(ms[i],s);
                    strcpy(rp[m].ms,s);
                    m++;
                }else{//such server exists, add user
                    getn(ms[i],s);
                    if(!vnm(rp[v].ms,s)) {
                        strcat(rp[v].ms,",");              
                        strcat(rp[v].ms,s);                
                    };
                }      
            }
            j++;
        }
    }
//*********************************************************************
    for(v=0; v<m; v++) printf("%s %s \n",rp[v].ns, rp[v].ms);
//*********************************************************************            
    return 0;
}
//function of comparison
int cmps(char * s1, char * s2){
    int l = strlen(s2);
    char * ss = (char *)malloc(l+1);
    strncpy(ss,s1,l); ss[l]='\0';
    if((s1[l]==' '||s1[l]=='\0')&&(!strcmp(s2,ss))){
        free(ss);
        return 0;
    }        
    free(ss);
    return 1;
}
//get name
void getn(char * s, char * ns){
    int i1=0,i2=0,p=0;
    while(1){
        if(p==1&&(s[i1]==' '||s[i1]=='\n'))break;
        if(s[i1]==' '){
            i1++; continue;
        }
        p=1; ns[i2]=s[i1]; i1++; i2++;
    }    
    ns[i2]='\0';
}
//check the user name
int vnm(char * s, char * ns){
    int i1=0,i2,p=0;
    char ss[100];
    while(1){
        i2=0;  
        while(1){
            if(s[i1]!=' '&&s[i1]!=','&&s[i1]!='\n'&&s[i1]!='\0'){
                ss[i2]=s[i1]; i1++; i2++; continue;    
            }
            ss[i2]='\0';break;
        }
        if(strcmp(ns,ss)==0){
            p=1; break;
        };
        if(s[i1]!=',')break;
        i1++;
    }
    return p;
}
 
Аватара пользователя
Vladislav_133
Elite
 
Сообщения: 1386
Зарегистрирован: 13 дек 2008, 18:08
Полное имя: П.В.Ю.


Вернуться в Олимпиада по программированию

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

cron