środa, 28 lutego 2018

00029 - 1830 - Nierówność trójkąta - www.pl.spoj.com

Treść zadania:

Napisz program, który sprawdza, czy istnieje trójkąt o bokach o podanej długości.

Wejście
Na wejście programu podana zostanie pewna nieokreślona liczba zestawów danych. Każdy z zestawów składa się z 3 liczb rozdzielonych spacjami. Poszczególne zestawy zostaną rozdzielone znakiem nowej linii.

Wyjście
Na wyjściu ma się pojawić ciąg binarny, którego i-ty wyraz jest równy 1, jeżeli istnieje trójkąt o długościach boków podanych w i-tym wczytanym z wejścia zestawie. Poszczególne elementy tego ciągu należy rozdzielić znakiem nowej linii.

Przykład

Wejście:
1.2 1.2 1.2
1.5 2.5 3.5
-1.5 6.0 4.5
2 4 8

Wyjście:
1
1
0
0


Kod źródłowy w C:
#include <stdio.h>
#include <stdlib.h>

int main()
{
    double a, b, c;
    for(;scanf("%lf%lf%lf",&a,&b,&c)!=EOF;)
    {
        if((a+b)>c && (a+c)>b && (b+c)>a && a>0 && b>0 && c>0)
        {
            printf("1\n");
        }
        else
        {
            printf("0\n");
        }
    }
    return 0;
}


Kod źródłowy w C++:
#include <iostream>

using namespace std;

int main()
{
    double a, b, c;
    for(;cin>>a>>b>>c;)
    {
        if((a+b)>c && (a+c)>b && (b+c)>a && a>0 && b>0 && c>0)
        {
            cout<<1<<endl;
        }
        else
        {
            cout<<0<<endl;
        }
    }
    return 0;
}



Źródło: http://pl.spoj.com/problems/KC003/

poniedziałek, 26 lutego 2018

00028 - 998 - Kalkulator 2 - www.pl.spoj.com

Treść zadania:

Napisz program, który działa jak prosty kalkulator z pamięcią obsługujący pięć operacji: dodawanie, odejmowanie, mnożenie, dzielenie i obliczanie reszty z dzielenia liczb całkowitych. Przyjmujemy, że nasz kalkulator ma w pamięci 10 rejestrów o numerach 0 - 9 oraz że wszystkie rejestry zawierają na początku zera.

Wejście
Na wejście programu podana zostanie pewna nieokreślona liczba zestawów danych. Zestawy składają się z jednoznakowego symbolu operacji do wykonania (+, -, *, /, % i z) oraz następujących po nim dwóch liczb całkowitych.

Wyjście
Na wyjściu programu ma się pojawić ciąg liczb będących rezultatem wykonania pojawiających się na wejściu poleceń. Poszczególne liczby należy rozdzielić znakami nowej linii. To, co należy wykonać, zależy od symbolu operacji. Symbole +, -, *, / i % nakazują wykonanie odpowiednio dodawania, odejmowania, mnożenia, dzielenia i obliczenia reszty z dzielenia liczb, które są przechowywane w rejestrach o podanych numerach. Symbol z nakazuje zapis wartości podanej jako drugi argument w rejestrze o numerze podanym jako pierwszy argument. (Po wykonaniu tej operacji nie trzeba nic wyświetlać). Uwaga! Można założyć, że dane wejściowe nie zawierają polecenia dzielenia przez 0.

Przykład

Wejście:
z 3 6
z 1 89
z 2 60
z 0 11
+ 0 1
- 1 2
* 2 3
/ 3 0
% 3 1

Wyjście:
100
29
360
0
6


Kod źródłowy w C++:
#include <iostream>

using namespace std;

int main()
{
    unsigned short int r[9];
    int q, w;
    char o;
    for(;cin>>o>>q>>w;)
    {
        --q;
        switch(o)
        {
            case 'z':
                r[q]=w;
            break;

            case '+':
                cout<<r[q]+r[w-1]<<endl;
            break;

            case '-':
                cout<<r[q]-r[w-1]<<endl;
            break;

            case '*':
                cout<<r[q]*r[w-1]<<endl;
            break;

            case '/':
                cout<<r[q]/r[w-1]<<endl;
            break;

            case '%':
                cout<<r[q]%r[w-1]<<endl;
            break;
        }

    }
    return 0;
}



Źródło: http://pl.spoj.com/problems/CALC2/

środa, 21 lutego 2018

00027 - 708 - Problem Collatza - www.pl.spoj.com

Treść zadania:

Dany jest ciąg xn określony rekurencyjnie:
x0=s,
xn+1=3*xn+1, jeśli xn jest nieparzyste i
xn+1=xn/2, jeśli xn jest parzyste

Napisz program, który oblicza pierwsze takie n, dla którego xn=1.

Wejście
W pierwszej linii liczba testów t. W każdym z t kolejnych wierszy
jedna liczba całkowita s, 1 <= s <= 10000.

Wyjście
W każdej linii jedna liczba - obliczona wartość n.

Przykład

Wejście:
5
1
2
8
3
567

Wyjście:
0
1
3
7
61


Kod źródłowy w C:
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int t, s, c;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&s);
        c=0;
        for(;;)
        {
            if(s==1)
            {
                break;
            }
            ++c;
            if(s%2==0)
            {
                s=s/2;
            }
            else
            {
                s=(3*s)+1;
            }
        }
        printf("%d\n",c);
    }
    return 0;
}



Kod źródło w C++:
#include <iostream>

using namespace std;

int main()
{
    int t, s, c;
    cin>>t;
    while(t--)
    {
        cin>>s;
        c=0;
        for(;;)
        {
            if(s==1)
            {
                break;
            }
            ++c;
            if(s%2==0)
            {
                s=s/2;
            }
            else
            {
                s=(3*s)+1;
            }
        }
        cout<<c<<endl;
    }
    return 0;
}


Źródło: http://pl.spoj.com/problems/PTCLTZ/

poniedziałek, 19 lutego 2018

00026 - 1262 - ROL (k) - www.pl.spoj.com

Treść zadania:

Przesuń elementy tablicy cyklicznie w lewo o zadaną liczbę miejsc.

Input
Najpierw dwie liczby n i k takie, że 1 < k < n < 10000, a następnie w kolejnym wierszu n liczb.

Output
W jednym wierszu n liczb w zmienionym porządku (przesuniętych cyklicznie o k miejsc).

Example

Input:
5 3
1 2 3 4 5

Output:
4 5 1 2 3


Kod źródłowy w C:
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int n, k, i;
    int tab[10000];
    scanf("%d%d",&n,&k);
    for(i=0; i<n; ++i)
    {
        scanf("%d",&tab[i]);
    }
    for(i=k; i<n; ++i)
    {
        printf("%d ",tab[i]);
    }
    for(i=0; i<k; ++i)
    {
        printf("%d ",tab[i]);
    }
    return 0;
}


Kod źródłowy w C++:
#include <iostream>

using namespace std;

int main()
{
    int n, k, i;
    int tab[10000];
    cin>>n>>k;
    for(i=0; i<n; ++i)
    {
        cin>>tab[i];
    }
    for(i=k; i<n; ++i)
    {
        cout<<tab[i]<<" ";
    }
    for(i=0; i<k; ++i)
    {
        cout<<tab[i]<<" ";
    }
    return 0;
}



Źródło: http://pl.spoj.com/problems/PP0602D/

czwartek, 15 lutego 2018

Program Kwiaciarnia - programowanie obiektowe

Treść zadania:

Napisać program, w którym zostaną zdefiniowane trzy klasy zgodnie z poniższym opisem:

Klasy:
• "Kwiat", zawiera dane prywatne: identyfikator rośliny, nazwa, typ ( cięte pojedyncze, doniczkowe, wiązanki, do zasadzenia);
• "Kwiaciarnia", zawiera dane prywatne: identyfikator kwiaciarni, adres (np. nazwa ulicy);
• "Stan", zawiera dane prywatne: identyfikator kwiaciarni; identyfikator rośliny, liczba sztuk;

Każda klasa powinna posiadać publiczne metody umożliwiające operowanie na jej prywatnych danych, w tym publiczne konstruktory nadające wartości danym.

Program powinien.
1. Zapisywać do plików dane z obiektów powyższych klas oraz odczytywać dane z plików do obiektów odpowiednich klas;
2. Wyświetlać:
    a) listę dostępnych typów dla rośliny (kwiatu) o wskazanej nazwie;
    b) liczbę sztuk doniczkowych róż znajdujących się w kwiaciarni o danym adresie;
    c) listę kwiaciarni (adresy) posiadających w sprzedaży przynajmniej jedną wiązankę z rośliną o podanej nazwie.


Kod źródłowy w C++:
#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <string.h>

using namespace std;

void menu();
void dodaj_kwiat();
void dodaj_stan();
void odczytywanie_danych();
void zadanie_2_a();
void zadanie_2_b();
void zadanie_2_c();

class kwiat
{
    private:
        string nazwa_rosliny,typ_rosliny;
        int id_rosliny;

    public:
        kwiat()
        {
            nazwa_rosliny="";
            typ_rosliny="";
            id_rosliny=(-1);
        }

        kwiat(int id_rosliny,string typ_rosliny,string nazwa_rosliny)
        {
            this->id_rosliny=id_rosliny;
            this->typ_rosliny=typ_rosliny;
            this->nazwa_rosliny=nazwa_rosliny;
        }

        int daj_id_rosliny()
        {
            return id_rosliny;
        }

        string daj_typ_rosliny()
        {
            return typ_rosliny;
        }

        string daj_nazwe_rosliny()
        {
            return nazwa_rosliny;
        }
};

class kwiaciarnia
{
    private:
        string adres_kwiaciarni;
        int id_kwiaciarni;

    public:
        kwiaciarnia()
        {
            id_kwiaciarni=1;
            adres_kwiaciarni="Warszawska 4";
        }

        kwiaciarnia(int id_kwiaciarni,string adres_kwiaciarni)
        {
            this->id_kwiaciarni=id_kwiaciarni;
            this->adres_kwiaciarni=adres_kwiaciarni;
        }

        int daj_id_kwiaciarni()
        {
            return id_kwiaciarni;
        }

        string daj_adres_kwiaciarni()
        {
            return adres_kwiaciarni;
        }
};

class stan
{
    private:
        int id_kwiaciarni;
        int id_rosliny;
        int liczba_sztuk;

    public:
        stan()
        {
            id_kwiaciarni=1;
            id_rosliny=1;
            liczba_sztuk=2;
        }

        stan(int id_kwiaciarni,int id_rosliny,int liczba_sztuk)
        {
            this->id_kwiaciarni=id_kwiaciarni;
            this->id_rosliny=id_rosliny;
            this->liczba_sztuk=liczba_sztuk;
        }

        int daj_id_rosliny()
        {
            return id_rosliny;
        }

        int daj_id_kwiaciarni()
        {
            return id_kwiaciarni;
        }

        int daj_liczbe_sztuk()
        {
            return liczba_sztuk;
        }
};

// Kwiacairnia
kwiaciarnia tk[100];
int liczba_kwiaciarnia=0;
int liczba_kwiaciarnia1=0;
string adres_k;
int id_k;
int id_kwiaciarni;
string adres_kwiaciarni;
// Kwiat
kwiat tr[100];
int liczba_kwiat=0;
int liczba_kwiat1=0;
string nazwa_r;
string typ_r;
int id_r;
// Stan
int ilosc;
stan ts[100];
int liczba_stan=0;
int liczba_stan1=0;


void dodaj_kwiaciarnie()
{
    cout<<endl<<"Podaj id kwiaciarni: ";
    cin>>id_kwiaciarni;
    cout<<endl<<"Podaj adres kwiaciarni ";
    cin>>adres_kwiaciarni;
    system("cls");
    cout<<"Dane wprowadzono poprawnie."<<endl<<"Wprowadzone dane to: "<<id_kwiaciarni<<" "<<adres_kwiaciarni<<"."<<endl;

    kwiaciarnia tmp(id_kwiaciarni,adres_kwiaciarni);
 tk[liczba_kwiaciarnia]=tmp;
 liczba_kwiaciarnia++;

 ofstream dopliku2("kwiaciarnia.txt",ios_base::app);
 for(int i=liczba_kwiaciarnia1;i<liczba_kwiaciarnia;i++)
 {
  dopliku2<<tk[i].daj_id_kwiaciarni()<<" "<<tk[i].daj_adres_kwiaciarni()<<endl;
 }
 dopliku2.close();

    system("pause");
    system("cls");
    menu();
}

void dodaj_kwiat()
{
 liczba_kwiat1=liczba_kwiat;
 cout<<endl<<"podaj id rosliny: ";
 cin>>id_r;
 cout<<endl<<"podaj typ rosliny ";
 cin>>typ_r;
 cout<<endl<<"podaj nazwe rosliny ";
 cin>>nazwa_r;
 kwiat tmp(id_r,typ_r,nazwa_r);
 tr[liczba_kwiat]=tmp;
 liczba_kwiat++;

 ofstream dopliku("kwiat.txt",ios_base::app);
 for(int i=liczba_kwiat1;i<liczba_kwiat;i++)
 {
  dopliku<<tr[i].daj_id_rosliny()<<" "<<tr[i].daj_typ_rosliny()<<" "<<tr[i].daj_nazwe_rosliny()<<endl;
 }
 dopliku.close();

    system("pause");
    system("cls");
    menu();
}

void dodaj_stan()
{
 cout<<endl<<"podaj id kwiaciarni: ";
 cin>>id_k;
 cout<<endl<<"podaj id rosliny ";
 cin>>id_r;
 cout<<endl<<"podaj ilosc ";
 cin>>ilosc;
 stan tmp(id_k,id_r,ilosc);
 ts[liczba_stan]=tmp;
 liczba_stan++;

 ofstream dopliku3("stan.txt",ios_base::app);
 for(int i=liczba_stan1;i<liczba_stan;i++)
 {
  dopliku3<<ts[i].daj_id_kwiaciarni()<<" "<<ts[i].daj_id_rosliny()<<" "<<ts[i].daj_liczbe_sztuk()<<endl;
 }
 dopliku3.close();

 system("pause");
    system("cls");
    menu();
}

wyswietl_kwiaciarnie()
{
 for(int i=0;i<liczba_kwiaciarnia;i++)
 {
        cout<<"\nid kwiaciarni: "<<tk[i].daj_id_kwiaciarni()<<" ";
        cout<<"adres kwiaciarni: "<<tk[i].daj_adres_kwiaciarni();
 }
 cout<<endl;
 system("pause");
 system("cls");
 menu();
}

wyswietl_kwiat()
{
 for(int i=0;i<liczba_kwiat;i++)
 {
        cout<<endl<<"id rosliny: "<<tr[i].daj_id_rosliny()<<" ";
        cout<<"typ: "<<tr[i].daj_typ_rosliny()<<" ";
        cout<<"nazwa: "<<tr[i].daj_nazwe_rosliny();
 }
 cout<<endl;
 system("pause");
 system("cls");
 menu();
}

wyswietl_stan()
{
 for(int i=0;i<liczba_stan;i++)
 {
  cout<<endl<<"Id kwiaciarni: "<<ts[i].daj_id_kwiaciarni()<<" ";
  cout<<"Id rosliny: "<<ts[i].daj_id_rosliny()<<" ";
  cout<<"Ilosc: "<<ts[i].daj_liczbe_sztuk();
 }
 cout<<endl;
 system("pause");
 system("cls");
 menu();
}

void zadanie_2_a()
{
 string typy[100];
 string nazwa_rosliny;

 cout<<"Tresc zadania:"<<endl;
 cout<<"Wyswietl liste dostepnych typow dla rosliny (kwiatu) o wskazanej nazwie."<<endl<<endl;
 cout<<"Podaj nazwe rosliny: "<<endl;
 cin>>nazwa_rosliny;

 for(int i=0; i<100; ++i)
 {
        if(nazwa_rosliny==tr[i].daj_nazwe_rosliny())
        {
            typy[i]=tr[i].daj_typ_rosliny();
        }
        else
        {
            typy[i]="0";
        }
 }

 cout<<"Lista typow rosliny dla "<<nazwa_rosliny<<":"<<endl;

 for (int i=0; i<100; ++i)
 {
  if(typy[i]!="0")
  {
            cout<<typy[i]<<endl;
  }
 }

 system("pause");
 system("cls");
 menu();
}

void zadanie_2_b()
{
 float wartosc=0;
 int ididr=0;
 int ididkw=0;
 string nazwa;

 cout<<"Tresc zadania:"<<endl;
 cout<<"Wyswietl liczbe sztuk doniczkowych roz znajdujacych sie w kwiaciarni o danym adresie."<<endl<<endl;
 cout<<"Podaj adres kwiaciarni aby  pokazac ilosc roz doniczkowych :";
 cin>>nazwa;

 for(int i=0;i<liczba_kwiaciarnia;i++)
 {
  if(tk[i].daj_adres_kwiaciarni()==nazwa)
  {
   ididkw=tk[i].daj_id_kwiaciarni();
  }
 }

  for(int i=0;i<liczba_kwiat;i++)
 {
     if((tr[i].daj_typ_rosliny()=="doniczkowa")&&(tr[i].daj_nazwe_rosliny()=="roza"))
  {
       ididr=tr[i].daj_id_rosliny();
      for(int j=0;j<liczba_stan;j++)
      {
       if((ts[j].daj_id_kwiaciarni()==ididkw)&&(ts[j].daj_id_rosliny()==ididr))
          {
     wartosc=wartosc+ts[j].daj_liczbe_sztuk();
    }
         }
  }
 }
 cout<<"W kwiaciarni o adresie: "<<nazwa<<" znajduje sie: "<<wartosc<<" sztuk roz doniczkowych"<<endl;
 system("pause");
 system("cls");
 menu();
}

void zadanie_2_c()
{
 cout<<"Tresc zadania:"<<endl;
 cout<<"Wyswietl liste kwiaciarni (adresy) posiadajacych w sprzedazy przynajmniej jedna wiazanke z roslin o podanej nazwie."<<endl;
 cout<<endl<<endl;
 int ididr=0;
 int ididkw=0;
 string nazwa_rosliny;
 cout<<"Podaj nazwe rosliny:"<<endl;
 cin>>nazwa_rosliny;

 for(int i=0;i<liczba_kwiat;i++)
 {
  if((tr[i].daj_typ_rosliny()=="wiazanka")&&(tr[i].daj_nazwe_rosliny()==nazwa_rosliny))
  {
   ididr=tr[i].daj_id_rosliny();
   for(int j=0;j<liczba_stan;j++)
   {
    if((ts[j].daj_id_rosliny()==ididr)&&(ts[j].daj_liczbe_sztuk()>=1))
    {
     ididkw=ts[j].daj_id_kwiaciarni();
     for(int k=0;k<liczba_kwiaciarnia;k++)
     {
      if(tk[k].daj_id_kwiaciarni()==ididkw)
      {
       cout<<tk[k].daj_adres_kwiaciarni()<<" "<<endl;
      }
     }
    }
   }
  }
 }
 cout<<endl;
 system("pause");
 system("cls");
 menu();
}

void odczytywanie_danych()
{
    int s;
    cout << "\n +----------------------------+"<< endl;
    cout << " |     Program Kwiaciarnia    |"<< endl;
    cout << " |     Odczytywanie danych    |"<< endl;
    cout << " |                            |"<< endl;
    cout << " |  1 - Wyswietl kwiacairnie  |"<< endl;
    cout << " |  2 - Wyswietl kwiaty       |"<< endl;
    cout << " |  3 - Wyswietl stan         |"<< endl;
    cout << " |  4 - Zadanie 2 a)          |"<< endl;
    cout << " |  5 - Zadanie 2 b)          |"<< endl;
    cout << " |  6 - Zadanie 2 c)          |"<< endl;
    cout << " |  7 - Cofnij                |"<< endl;
    cout << " +----------------------------+"<< endl;

    cin >> s;
    system("cls");
    switch(s)
    {
        case 1:
            wyswietl_kwiaciarnie();
            break;

        case 2:
            wyswietl_kwiat();
            break;

        case 3:
            wyswietl_stan();
            break;

        case 4:
            zadanie_2_a();
            break;

        case 5:
            zadanie_2_b();
            break;

        case 6:
            zadanie_2_c();
            break;

        case 7:
            menu();
            break;
    }
}

void wprowadzanie_danych()
{
    int s;
    cout << "\n +----------------------------+"<< endl;
    cout << " |     Program Kwiaciarnia    |"<< endl;
    cout << " |     Wprowadzanie danych    |"<< endl;
    cout << " |                            |"<< endl;
    cout << " |  1 - Dodaj kwiaciarnie     |"<< endl;
    cout << " |  2 - Dodaj kwiat           |"<< endl;
    cout << " |  3 - Dodaj stan            |"<< endl;
    cout << " |  4 - Cofnij                |"<< endl;
    cout << " +----------------------------+"<< endl;
    cin >> s;
    system("cls");
    switch(s)
    {
        case 1:
            dodaj_kwiaciarnie();
            break;

        case 2:
            dodaj_kwiat();
            break;

        case 3:
            dodaj_stan();

        case 4:
            menu();
            break;
    }
}

void menu()
{
    int s;
    cout << endl;
    cout << " +----------------------------+"<< endl;
    cout << " |     Program Kwiaciarnia    |"<< endl;
    cout << " |                            |"<< endl;
    cout << " |  1 - Wprowadzanie danych   |"<< endl;
    cout << " |  2 - Odczytywanie danych   |"<< endl;
    cout << " |  3 - Koniec                |"<< endl;
    cout << " +----------------------------+"<< endl;
    cin >> s;
    system("cls");
    switch(s)
    {
        case 1:
            wprowadzanie_danych();
            break;

        case 2:
            odczytywanie_danych();
            break;

        case 3:
            system("exit");
            break;
    }
}

int main()
{
 ifstream zpliku("kwiat.txt");

 for(;;)
 {
  if(!(zpliku>>id_r))
  break;
  zpliku>>typ_r>>nazwa_r;
  kwiat tmp(id_r,typ_r,nazwa_r);
  tr[liczba_kwiat]=tmp;
  liczba_kwiat++;
 }

 ifstream zpliku2("kwiaciarnia.txt");
 for(;;)
    {
  if(!(zpliku2>>id_k))
  break;
  zpliku2>>adres_k;
  kwiaciarnia tmp(id_k,adres_k);
  tk[liczba_kwiaciarnia]=tmp;
  liczba_kwiaciarnia++;
 }

 ifstream zpliku3("stan.txt");
 for(;;)
 {
  if(!(zpliku3>>id_k))
  break;
  zpliku3>>id_r>>ilosc;
  stan tmp(id_k,id_r,ilosc);
  ts[liczba_stan]=tmp;
  liczba_stan++;
 }

 menu();
}



Zawartość pliku kwiaciarnia.txt:
1 Warszawska_5
2 Al_Tysiaclecia_43
3 Dzialkowa_27
4 Klemensiewicza_54
5 Osiedlowa_102
6 Wrzosowa_91
7 Wolska_33
8 Lesna_1
9 Bajkowa_56
10 Hallera_8
11 Sarenki_84
12 Mar_Jozefa_Pildsuckiego_27
13 Zielona_3
14 Gorzysta_20
15 Husarska_37
16 Domaniewska_76
17 Adama_Mickiewicza_10
18 Sosnowa_40
19 Podlesna_39
20 Sportowa_83



Zawartość pliku kwiat.txt:
1 wiazanka roza
2 doniczkowa storczyk
3 bukiet tulipan
4 doniczkowa fiolki
5 doniczkowa hiacynt
6 bukiet niezapominajka
7 doniczkowa roza
8 bukiet chryzantema
9 doniczkowa kaktus
10 wiazanka chryzantema
11 bukiet mlecz
12 doniczkowa krokus
13 wiazanka lilia
14 wiazanka krokus
15 doniczkowa pelargonia
16 wiazanka tulipan
17 bukiet lilia
18 wiazanka kalia
19 doniczkowa zonkil
20 bukiet roza
21 do_zasadzenia krokus
22 ciete_pojedyncze roza
23 do_zasadzenia kaktus
24 do_zasadzenia tulipan
25 do_zasadzenia fiolki
26 do_zasadzenia storczyk
27 ciete_pojedyncze mlecz
28 do_zasadzenia chryzantema
29 do_zasadzenia roza
30 ciete_pojedyncze storczyk




Zawartość pliku stan.txt:
1 1 33
1 1 33
1 15 2
1 14 63
2 17 32
2 11 43
2 6 23
2 1 43
2 13 21
2 8 23
5 2 53
3 6 23
2 8 34
5 12 63
1 20 12
6 20 43
5 3 63
2 1 63
5 3 53
15 16 44
18 13 74
20 12 63
12 6 23
3 8 23
4 9 43
7 6 34
1 20 5
10 4 32
13 6 32
17 10 23
1 7 43
15 1 11
17 1 10
1 1 2
6 1 7

środa, 14 lutego 2018

00025 - 1228 - Równanie liniowe - www.pl.spoj.com

Treść zadania:

Równanie liniowe jest postaci ax+b=c, gdzie a, b, c są liczbami rzeczywistymi. Niewiadomą jest x, która również jest liczbą rzeczywistą. Równanie to może mieć jedno rozwiązanie, brak rozwiązań lub nieskończenie wiele rozwiązań.

Input
W pojedyńczej linii podane są trzy liczby rzeczywiste zaokrąglone do drugiego miejsca po przecinku.

Output
Rozwiązaniem problemu jest liczba rzeczywista zaokrąglona do drugiego miejsca po przecinku w przypadku, gdy równanie liniowe ax+b=c posiada rozwiązanie. W przypadku braku rozwiązania powinien zostać wydrukowany napis BR, a w przypadku nieskończenie wielu rozwiązań napis NWR


Example 1

Input:
0.52 1.60 -5.44

Output:
-13.54


Example 2

Input:
0.00 2.00 3.00

Output:
BR


Example 3

Input:
0.00 2.00 2.00

Output:
NWR

Kod źródłowy w C:
#include <stdio.h>
#include <stdlib.h>

int main()
{
    double a, b, c;
    for(;scanf("%lf%lf%lf",&a,&b,&c)!=EOF;)
    {
        if(a==0 && (c-b)==0)
        {
            printf("NWR");
            continue;
        }
        if(a==0 && (c-b)>0)
        {
            printf("BR");
            continue;
        }
        if((c-b)==0)
        {
            printf("NWR");
            continue;

        }
        else
        {
            printf("%.2lf\n",(c-b)/a);
            continue;
        }
    }
    return 0;
}


Kod źródłowy w C++:
#include <iostream>
#include <iomanip>

using namespace std;

int main()
{
    double a, b, c;
    for(;cin>>a>>b>>c;)
    {
        if(a==0 && (c-b)==0)
        {
            cout<<"NWR"<<endl;
            continue;
        }
        if(a==0 && (c-b)>0)
        {
            cout<<"BR"<<endl;
            continue;
        }
        if((c-b)==0)
        {
            cout<<"NWR"<<endl;
            continue;

        }
        else
        {
            cout<<fixed;
            cout<<setprecision(2)<<(c-b)/a<<endl;
            continue;
        }
    }
    return 0;
}



Źródło: http://pl.spoj.com/problems/JROWLIN/

poniedziałek, 12 lutego 2018

00024 - 506 - Flamaster - www.pl.spoj.com

Treść zadania:

Kasia niedawno poznała wszystkie literki w szkole. Z wielką pasją potrafiła całe dnie spędzać na pisaniu długich słów swoim ulubionym flamastrem. Pisała i pisała "tasiemce" tak długo, aż flamaster wypisał się. Kasia posmutniała. Z trudem, ale udało jej się uprosić swoją mamę, aby kupiła jej nowy pisak. Musiała jednak obiecać, że tym razem będzie bardziej oszczędna przy jego używaniu żeby wystarczył na dłużej. Kasia zaczęła zastanawiać się w jaki sposób będzie mogła zrealizować obietnicę daną mamie.

Postanowiła, że aby zaoszczędzić wkład flamastra będzie wypisywała skróconą wersję wymyślanych wyrazów. Jeśli miała zamiar napisać więcej niż dwie takie same literki obok siebie w wyrazie, to teraz napisze literkę a następnie liczbę, określającą ilość wystąpień tej literki.

Zadanie
Twoim zadaniem jest dla zadanego wyrazu, który wymyśliła Kasia, podanie skróconej wersji tego wyrazu.

Wejście
W pierwszej linijce wejścia znajduje się liczba naturalna C, 1 ≤ C ≤ 50, oznaczająca ilość zestawów danych. W kolejnych C wierszach wejścia znajdują się zestawy danych. Każdy zestaw składa się z niepustego wyrazu złożonego z samych dużych liter alfabetu amerykańskiego. Długość wyrazu nie przekracza 200 znaków.

Wyjście
Dla każdego zestawu danych, dla zadanego wyrazu, na wyjściu powinna znaleźć się jego skrócona wersja.

Przykład

Dla danych wejściowych:
4
OPSS
ABCDEF
ABBCCCDDDDEEEEEFGGHIIJKKKL
AAAAAAAAAABBBBBBBBBBBBBBBB

prawidłowym rozwiązaniem jest:
OPSS
ABCDEF
ABBC3D4E5FGGHIIJK3L
A10B16


Kod źródłowy w C++:
#include <iostream>

using namespace std;

int main()
{
    int c, q, i;
    char p;
    char input[200];
    cin>>c;
    ++c;
    while(--c)
    {
        cin>>input;
        for(i=0;input[i]!='\0';++i)
        {
            if(input[i]==input[i+1] && input[i+1]==input[i+2])
            {
                p=input[i];
                q=2;
                while(input[i+q]==p)
                {
                    ++q;
                }
                cout<<input[i]<<q;
                i+=q;
                --i;

            }
            else
            {
                cout<<input[i];
            }
        }
        cout<<endl;
    }
    return 0;
}


Kod źródłowy Python 2:
c = int(raw_input(''))
for i in range(0, c, +1):
    strr = raw_input('')
    output = ""
    char = []
    quantity = 0
    char = list(strr)
    if len(char) == 1:
        print str(char[0])
        continue
    for j in range(1, len(char), +1):
        if char[j - 1] == char[j]:
            quantity += 1
            continue
        elif char[j - 1] != char[j] and quantity < 1:
            output += str(char[j - 1])
            quantity = 0
            continue
        elif char[j - 1] != char[j] and quantity == 1:
            output+= str(char[j-1]) + str(char[j-1])
            quantity = 0
            continue
        elif char[j - 1] != char[j] and quantity > 1:
            output += str(char[j - 1]) + str(quantity + 1)
            quantity = 0
            continue
    if j+1 == int(len(char)) and quantity == 0:
        output += str(char[j])
        print output
        continue
    if j+1 == int(len(char)) and quantity == 1:
        output += str(char[j]) + str(char[j])
        print output
        continue
    if j+1 == int(len(char)) and quantity > 1:
        output += str(char[j]) + str(quantity + 1)
        print output
        continue
exit(0)


Kod źródłowy w Python 3:
c = int(input(''))
for i in range(0, c, +1):
    strr = input('')
    output = ""
    char = []
    quantity = 0
    char = list(strr)
    if len(char) == 1:
        print (str(char[0]))
        continue
    for j in range(1, len(char), +1):
        if char[j - 1] == char[j]:
            quantity += 1
            continue
        elif char[j - 1] != char[j] and quantity < 1:
            output += str(char[j - 1])
            quantity = 0
            continue
        elif char[j - 1] != char[j] and quantity == 1:
            output+= str(char[j-1]) + str(char[j-1])
            quantity = 0
            continue
        elif char[j - 1] != char[j] and quantity > 1:
            output += str(char[j - 1]) + str(quantity + 1)
            quantity = 0
            continue
    if j+1 == int(len(char)) and quantity == 0:
        output += str(char[j])
        print (output)
        continue
    if j+1 == int(len(char)) and quantity == 1:
        output += str(char[j]) + str(char[j])
        print (output)
        continue
    if j+1 == int(len(char)) and quantity > 1:
        output += str(char[j]) + str(quantity + 1)
        print (output)
        continue
exit(0)



Źródło: http://pl.spoj.com/problems/FLAMASTE/

sobota, 10 lutego 2018

Podstawowe funkcje języka Standard ML

W tym artykule pokażę kilka podstawowych funkcjonalności języka Standard Meta Language (SML).

Każdy program kończymy średnikiem: ;

Operacje arytmetyczne:
Dodawanie:
Input: 5 + 2;
Output: 7

Odejmowanie:
Input: 5 - 2;
Output: 3

Mnożenie:
Input: 5 * 2;
Output: 10

Dzielenie:
Input: 5 div 2;
Output: 2

Modulo (reszta z dzielenia)
Input: 5 mod 2;
Output: 1

Listy i operacje na listach:

Możemy sprawdzić czy lista jest pusta:
null(x) --sprawdzenie czy lista x jest listą pustą

hd(x) - zwraca głowę listy x (pierwszy element z listy x)

Input: hd([1,2,3,4,5]);
Output: 1

tl(x) - zwraca ogon listy (wszystkie poza pierwszym elementy z listy x)
Input: tl([1,2,3,4,5]);
Output: [2,3,4,5]

Przyjmowanie list jako argumenty funkcji:
f([1,2,3,4,5]); - funkcja przyjmuje jedną listę zawierającą pięć elementów: 1, 2, 3, 4, 5
f([[1],[2],[3],[4],[5]]); - funkcja przyjmuje pięć jedno-elementowych list które mają wartości: 1, 2, 3, 4, 5 jednak każdy z tych elementów jest oddzielną listą.

Paradygmat funkcyjny - jak zacząć?

Pisanie programów funkcyjnych w językach czysto funkcyjnych nie jest dobrym pomysłem jeżeli dopiero zaczynasz z programowaniem.

Do zaczęcia nauki paradygmatu funkcyjnego potrzebujesz:
• Wiedzieć i rozumieć jak działa rekurencja.
• Warunkiem (bardzo) mocno zalecanym jest poznanie paradygmatu obiektowego oraz (zalecanym) strukturalnego.
• Umieć pisać funkcję oraz programy składające się z kilku funkcji aby umieć posługiwać się funkcjami.

Kilka artykułów o programowaniu funkcyjnym:
https://4programmers.net/Inżynieria_oprogramowania/Wstęp_do_programowania_funkcyjnego#paradygmat-programowania-funkcyjnego
http://wazniak.mimuw.edu.pl/index.php?title=Programowanie_funkcyjne/Wstęp
https://pl.wikibooks.org/wiki/Programowanie/Programowanie_funkcyjne
http://www.python.rk.edu.pl/w/p/funkcje-i-programowanie-funkcyjne/

Paradygmat funkcyjny - co to jest?

Paradygmat funkcyjny obok kilku inny (obiektowego, strukturalnego, aspektowego, w logice) to jeden z bardziej popularnych paradygmatów programowania. W porównaniu do programowania obiektowego i strukturalnego w paradygmacie funkcyjnym nie ma pojęcia czasu jeżeli chodzi o stan pamięci w programie.

W podejściu obiektowym i strukturalnym program operuje na zmiennych jako miejscach w pamięci i zmienia je w czasie. W paradygmacie funkcyjnym bardzo unika się podejścia tego typu a program jest wynikiem funkcji z przyjętymi argumentami.

Teoretycznie każdy problem da się rozwiązać w paradygmacie funkcyjnym.

Jeżeli każdy program można zapisać funkcyjnie to dlaczego znacząca większość programów jest pisana obiektowo?
     Główny powód to fakt że część programów dużo łatwiej zapisać obiektowo a część dużo łatwiej funkcyjnie. Jednak tych które łatwiej zapisać obiektowo jest znacząco więcej niż tych które można zapisać funkcyjnie.

Jakie są główne trudności pisania programów funkcyjnych?
     Wielokrotnie zagnieżdżona rekurencja można powodować łatwe wejście w samo-zapętlenie się programu, dodatkowo funkcja będąca dowołaniem do funkcja która jest funkcją będącą efektem wywołania kilku kolejnych funkcji sprawia że kod w ten sposób zapisany jest mało czytelny i przy większych zespołach trudniej przekazać informacje o sposobie działania kodu. Kod pisany funkcyjnie jest często dużo trudniejszy w zrozumieniu niż kod napisany obiektowo przez co przy większych projektach wydłuża się czas na zrozumienie istniejącego kodu.

Więcej o paradygmacie funkcyjnym: https://pl.wikipedia.org/wiki/Programowanie_funkcyjne

Standard Metal Language - jak zacząć?

Do pisania programów w Standard Meta Langauge (SML) potrzebujesz:
• komputera z systemem Windows / Unix / MacOS
• edytora tekstu
• kompilatora języka
• przeglądarki internetowej

Kompilator jest oprogramowaniem darmowym na licencji open-source.

Wersja z której osobiście korzystałem to Standard ML of New Jersey.
Strona domowa języka: https://www.smlnj.org
Strona z gotowymi paczkami: https://www.smlnj.org/dist/working/110.82/index.html

Wystarczy pobrać plik .msi oraz go zainstalować.
Wersja z której korzystałem: http://smlnj.cs.uchicago.edu/dist/working/110.82/smlnj-110.82.msi

Do edytowania programów używałem NotePad++ a pliki zapisywałem z rozszerzeniem .sml
https://notepad-plus-plus.org

Przydatne linki:
• Instalacja na windows: https://www.smlnj.org/dist/working/110.82/WININSTALL
• Instalacja na innych systemach: https://www.smlnj.org/dist/working/110.82/WININSTALL
• Lista książek do języka Standard ML: https://www.smlnj.org/doc/literature.html#books
• Lista kilku tutoriali: https://www.smlnj.org/doc/literature.html#tutorials
• Najczęściej zadawane pytania: https://www.smlnj.org/doc/FAQ/index.html
• Dokumentacja języka Standard ML: https://www.smlnj.org/doc/index.html

Po instalacji i uruchomieniu otrzymujemy konsolę do której możemy wklejać nasze programy:

Sortowanie - Standard ML

Treść zadania:

Napisz dwie funkcje:
Pierwsza przyjmie za argument listę i posortuje jej elementy od najmniejszego do największego.
Druga przyjmie za argument listę i posortuje jej elementy od największego do najmniejszego.

Przykład:
sorting_low_first([10,3,7,2,9,4,5,1,8,6]) = [1,2,3,4,5,6,7,8,9,10]
sorting_hight_first([10,3,7,2,9,4,5,1,8,6]) = [10,9,8,7,6,5,4,3,2,1]

Kod źródłowy:
fun insert_low_first(a,x) = if null(x) then a::[] else if a<hd(x) then a::x else hd(x)::insert_low_first(a,tl(x))
fun sorting_low_first(x:int list) = if null(x) then [] else insert_low_first(hd(x),sorting_low_first(tl(x)));

fun insert_hight_first(a,x) = if null(x) then a::[] else if a>hd(x) then a::x else hd(x)::insert_hight_first(a,tl(x))
fun sorting_hight_first(x:int list) = if null(x) then [] else insert_hight_first(hd(x),sorting_hight_first(tl(x)));


Dane testowe:
sorting_low_first([10,3,7,2,9,4,5,1,8,6]);
sorting_hight_first([10,3,7,2,9,4,5,1,8,6]);


czwartek, 8 lutego 2018

Suma liczb z listy - Standard ML

Treść zadania:

Napisz funkcję która przyjmie jako argument listę i wypiszę sumę jej elementów.

Przykład:
f([1,2,3,4,5]) = 15
f([5,5,5,5,5]) = 25
f([1,1,1,1,1]) = 5
f([2,2,2,2,2]) = 10
f([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]) = 120

Kod źródłowy:
fun f(x) = if null(x) then 0 else hd(x)+f(tl(x));


Dane testowe:
f([1,2,3,4,5]);
f([5,5,5,5,5]);
f([1,1,1,1,1]);
f([2,2,2,2,2]);
f([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]);


Parzyste nieparzyste - Standard ML

Treść zadania:

Zadeklarować funkcję f: int list → int list określoną następująco:

f(x) = lista otrzymana z listy x poprzez następujące przestawienie:
najpierw liczby parzyste występujące w x,
potrem liczby nieparzyste występujące w x

Na przykład:
f([4,7,2,1,2,3,7,5,2]) = [4,2,2,2,7,1,3,7,5]

Kod źródłowy:
fun append(x, y) = if null(x) then y else hd(x) :: append(tl(x), y)
fun even(x) = if null(x) then x else if hd(x) mod 2 = 0 then append([hd(x)],even(tl(x))) else even(tl(x))
fun odd(x) = if null(x) then x else if hd(x) mod 2 = 1 then append([hd(x)],odd(tl(x))) else odd(tl(x))
fun f(x) = append(even(x),odd(x));


Dane testowe:
f([4,7,2,1,2,3,7,5,2]);