Pokazywanie postów oznaczonych etykietą python 2. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą python 2. Pokaż wszystkie posty

środa, 21 marca 2018

00035 - 617 - StringMerge - www.pl.spoj.com

Treść zadania:

Napisz funkcję:

char* string_merge(char *, char *);


która sklei ze sobą dwa łańcuchy biorąc na przemian po jednym znaku z każdego łańcucha i umieści w nowej dynamicznie alokowanej tablicy znaków, do której zwróci wskaźnik. Należy wziąć po tyle znaków ile jest w krótszym łańcuchu.

Input
W pierwszej linii liczba testów t, w kolejnych liniach po dwa łańcuchy znaków odzielone spacją.

Output
W każdej linii jeden łańcuch, wynik działania funkcji string_merge.

Example

Input:
4
a bb
abs sfd
ewr w
wqeqweqweq eqweqwe

Output:
ab
asbfsd
ew
weqqewqewqewqe


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

#define T_SIZE 1001

using namespace std;

char* string_merge(char *a, char *b)
{
    int i, c;
    i=0;
    c=0;
    char *s = new char [10000];
    while(a[i] != '\0' && b[i] !=  '\0')
    {
        s[c]=a[i];
        ++c;
        s[c]=b[i];
        ++c;
        ++i;
    }
    s[c]='\0';
    return s;
};

int main()
{
    int t, n;
    char S1[T_SIZE], S2[T_SIZE], *S;
    cin >> t; /* wczytaj liczbę testów */
    cin.getline(S1,T_SIZE);
    while(t)
    {
        cin.getline(S1,T_SIZE,' ');
        cin.getline(S2,T_SIZE);
        S=string_merge(S1,S2);
        cout << S << endl;
        delete[] S;
        t--;
    }
    return 0;
}



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

poniedziałek, 19 marca 2018

00034 - 1300 - Szyfr Cezara - www.pl.spoj.com

Treść zadania:

Szyfr Cezara jest to szyfr za pomocą, którego Juliusz Cezar szyfrował swoje listy do Cycerona. Jako ciekawostkę można podać, że szyfr ten był podobno używany jeszcze w 1915 roku w armii rosyjskiej, gdyż tylko tak prosty szyfr wydawał się zrozumiały dla sztabowców.

Każdą literę tekstu jawnego zamieniamy na literę przesuniętą o 3 miejsca w prawo. I tak literę A szyfrujemy jako literę D, literę B jako E itd. W przypadku litery Z wybieramy literę C. W celu odszyfrowania tekstu powtarzamy operację tym razem przesuwając litery o 3 pozycje w lewo.

Input
Na wejściu pojawi się tekst zawierający jedynie wielkie litery alfabetu łacińskiego, spacje oraz znaki nowej linii, a jego długość nie przekracza 200 znaków.

Output
Na wyjściu otrzymujemy zaszyfrowany tekst używając Szyfru Cezara.

Example

Input:
ABC DEF
TERA EST ROTUNDA

Output:
DEF GHI
WHUD HVW URWXQGD


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

int main()
{
    char c;
    for(;scanf("%c",&c)==1;)
    {
        if(c<='Z' && c>='A')
        {
            if(c>'W')
            {
                printf("%c",c-23);
            }
            else
            {
                printf("%c",c+3);
            }
        }
        else
        {
            printf("%c",c);
        }
    }
    return 0;
}



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

using namespace std;

int main()
{
    char c;
    for(;scanf("%c",&c)==1;)
    {
        if(c<='Z' && c>='A')
        {
            if(c>'W')
            {
                printf("%c",c-23);
            }
            else
            {
                printf("%c",c+3);
            }
        }
        else
        {
            printf("%c",c);
        }
    }
    return 0;
}



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

środa, 14 marca 2018

00033 - 1910 - Odwracanie wyrazów - www.pl.spoj.com

Treść zadania:

Napisz program, który zapisuje wspak podane na wejściu wyrazy.

Wejście
Na wejście programu podana zostanie pewna nieokreślona ilość wyrazów, tj. ciągów znaków zbudowanych z małych liter. Poszczególne wyrazy zostaną rozdzielone znakiem nowej linii. Przyjmujemy, że długość wyrazów nie przekracza 1000 znaków.

Wyjście
Na wyjściu mają się pojawić te same wyrazy, które pojawiły się na wejściu, ale zapisane wspak. Poszczególne wyrazy należy rozdzielić znakiem nowej linii.

Przykład

Wejście:
alfa
beta
gamma

Wyjście:
afla
ateb
ammag


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

using namespace std;

int main()
{
    int i;
    char input[1000];
    for(;cin>>input;)
    {
        for(i=0;input[i]!='\0';++i)
        {

        }
        --i;
        for(i;i!=-1;--i)
        {
            cout<<input[i];
        }
        cout<<endl;
    }
    return 0;
}



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

poniedziałek, 12 marca 2018

00032 - 4138 - Harry and big doughnuts - www.pl.spoj.com

Treść zadania:

Młody Harry został poproszony o kupienie karmy dla kotów przez swoją sąsiadkę - starą, dziwną panią, która była właścicielką wielu kotów. Ale koty też były dziwne i jadały tylko pączki. Toteż sąsiadka chciała aby Harry przyniósł jej dokładnie po jednym pączku dla każdego kota - a posiadała ich c. Harry miał ze sobą plecak, ale że był tylko małym chłopcem, potrafił udźwignąć jedynie k kilogramów. Harry wiedział, że każdy pączek waży w kilogramów (duże koty, duże pączki). Pomóż Harremu zdecydować czy powinien iść do supermarketu i kupić żarcie, czy się po prostu poddać i pomarzyć o odrobinie magii...

Wejście
W pierwszej linii jedna dodatnia liczba całkowita t (t <= 100) oznaczająca ilość testów (Harry został poproszony o kupno pączków kilka razy). Następnie t linii, każda zawierająca 3 liczby: c, k oraz w (1 <= c, k, w <= 100)

t [liczba testów]
c k w [liczba kotów, udźwig Harrego oraz waga pączka]
c k w [następny test]
...

Wyjście
t linii zawierających słowo "yes" jeśli Harry jest w stanie wykonać zadanie lub "no" jeśli pączki złamałyby Harremu kręgosłup.

Przykład

Wejście:
3
5 15 3
1 5 4
13 25 2

Wyjście:
yes
yes
no


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

int main()
{
    int t, c, k, w, i;
    scanf("%d",&t);
    for(i=0;i<t;++i)
    {
        scanf("%d%d%d",&c,&k,&w);
        if((w*c)<=k)
        {
            printf("yes\n");
        }
        else
        {
            printf("no\n");
        }
    }
    return 0;
}



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

using namespace std;

int main()
{
    int t, c, k, w;
    cin>>t;
    for(int i=0;i<t;++i)
    {
        cin>>c>>k>>w;
        if((w*c)<=k)
        {
            cout<<"yes"<<endl;
        }
        else
        {
            cout<<"no"<<endl;
        }
    }
    return 0;
}



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

środa, 7 marca 2018

00031 - 1042 - Test 3 - www.pl.spoj.com

Treść zadania:

Przepisz dane z wejścia na wyjście. Dane wejściowe są dwucyfrowymi liczbami naturalnymi. Zakończ działanie programu, gdy na wejściu pojawi się, trzecia liczba 42 poprzedzona jakąkolwiek inną liczbą, różną od 42.

Wejście
W każdej linii jedna liczba dwucyfrowa.

Wyjście
W każdej linii jedna liczba dwucyfrowa. Odczytane wartości 42 również powinny się pojawić.

Przykład

Wejście:
42
42
12
13
42
11
42
43
42
42
99
01

Wyjście:
42
42
12
13
42
11
42
43
42


Kod źródłowy w C:
#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    int a, b, c=0;
    scanf("%d",&b);
    printf("%d\n",b);
    for(;;)
    {
        scanf("%d",&a);
        if(a==42 && b != 42)
        {
            ++c;
        }
        printf("%d\n",a);
        b=a;
        if(c==3)
        {
            break;
        }
    }
    return 0;
}



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

using namespace std;

int main()
{
    int a, b, c=0;
    cin>>b;
    cout<<b<<endl;
    for(;;)
    {
        cin>>a;
        if(a==42 && b != 42)
        {
            ++c;
        }
        cout<<a<<endl;
        b=a;
        if(c==3)
        {
            break;
        }
    }
    return 0;
}



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

poniedziałek, 5 marca 2018

00030 - 1042 - Transponowanie macierzy - www.pl.spoj.com

Treść zadania:

Transponuj podaną macierz.

Wejście
W pierwszym wierszu znajdują się dwie liczby m n (1<=m,n<=200) oznaczające odpowiednio liczbę wierszy oraz liczbę kolumn. Następnie następuje m wierszy, w każdym n liczb.

Wyjście
Na wyjściu powinna znaleźć się macierz transponowana do zadanej

Przykład

Wejście:
4 3
1 2 5
4 3 3
3 4 9
8 7 7

Wyjście:
1 4 3 8
2 3 4 7
5 3 9 7


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

int main()
{
    int m, n, i, j;
    int tab [200][200];

    scanf("%d%d",&m,&n);

    for(i=0;i<m;++i)
    {
        for(j=0;j<n;++j)
        {
            scanf("%d",&tab[i][j]);
        }
    }
    for(i=0;i<n;++i)
    {
        for(j=0;j<m;++j)
        {
            printf("%d ",tab[j][i]);
        }
        printf("\n");
    }
    return 0;
}



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

using namespace std;

int main()
{
    int m, n, i, j;
    int tab [200][200];

 cin>>m>>n;
 
    for(i=0;i<m;++i)
    {
        for(j=0;j<n;++j)
        {
            cin>>tab[i][j];
        }
    }
    for(i=0;i<n;++i)
    {
        for(j=0;j<m;++j)
        {
            cout<<tab[j][i]<<" ";
        }
        cout<<endl;
    }
    return 0;
}



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

ś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/

ś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/

środa, 7 lutego 2018

00023 - 977 - Tablica - www.pl.spoj.com

Treść zadania:

Napisz program, który wczytuje z wejścia ciąg liczb i wypisuje go w odwróconej kolejności.

Wejście
Na wejście programu podana zostanie pewna nieokreślona, ale niewielka ilość liczb całkowitych rozdzielonych spacjami.

Wyjście
Na wyjściu ma się pojawić ciąg liczbowy, którego i-ta pozycja jest równa (n+1-i)-tej liczbie wczytanej z wejścia, gdzie n to ilość wczytanych liczb. Poszczególne liczby należy rozdzielić spacjami.

Przykład

Wejście:
1 2 3

Wyjście:
3 2 1


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

using namespace std;

int main()
{
    int n;
    int input[10000];
    int output[10000];

    for(n=0;cin>>input[n];++n)
    {

    }
    --n;
    for(n;n>=0;--n)
    {
        cout<<input[n];
        if(n!=0)
        {
            cout<<" ";
        }
    }
    cout<<endl;
    return 0;
}


Kod źródłowy w Python 2:
a = raw_input('')
output = ''
a_l = a.split(' ')
a_l.reverse()
for n in range(0, len(a_l), +1):
    if n == len(a_l)-1:
        output += a_l[n]
    else:
        output += a_l[n]+" "
print output
exit(0)


Kod źródłowy w Python 3:
a = input('')
output = ''
a_l = a.split(' ')
a_l.reverse()
for n in range(0, len(a_l), +1):
    if n == len(a_l)-1:
        output += a_l[n]
    else:
        output += a_l[n]+" "
print (output)
exit(0)



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

poniedziałek, 5 lutego 2018

00022 - 969 - Równanie kwadratowe - www.pl.spoj.com

Treść zadania:

Napisz program, który wyznacza liczbę pierwiastków rzeczywistych równania kwadratowego.

Wejście
Na wejście programu podana zostanie pewna nieokreślona, ale niewielka ilość zestawów danych. Każdy zestaw składać się będzie z 3 liczb rzeczywistych (współczynników A, B i C równania Ax^2 + Bx + C = 0) rozdzielonych spacjami. Poszczególne zestawy zostaną rozdzielone znakiem nowej linii. Można przyjąć, że A jest różne od zera.

Wyjście
Na wyjściu ma się pojawić ciąg liczbowy, którego i-ta pozycja jest równa liczbie pierwiastków rzeczywistych i-tego wczytanego z wejścia równania. Poszczególne liczby należy rozdzielić znakami nowej linii.

Przykład

Wejście:
0.3 0.3 0.4
0.5 1 0.5
-0.5 -0.5 0

Wyjście:
0
1
2


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

int main()
{
    double a, b, c, d;
    int output;
    for(;scanf("%lf%lf%lf",&a,&b,&c)!=EOF;)
    {
        output=0;
        d=(b*b)-(4*a*c);
        if (d==0)
        {
            ++output;
        }
        if (d>0)
        {
            output+=2;
        }
        printf("%d\n",output);
    }
    return 0;
}


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

using namespace std;

int main()
{
    double a, b, c, d;
    int output;
    for(;cin>>a>>b>>c;)
    {
        output=0;
        d=(b*b)-(4*a*c);
        if (d==0)
        {
            ++output;
        }
        if (d>0)
        {
            output+=2;
        }
        cout<<output<<endl;
    }
    return 0;
}


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

środa, 31 stycznia 2018

00021 - 804 - Gra Euklidesa - www.pl.spoj.com

Treść zadania:

Gra Euklidesa przebiega według następujących zasad:

•W grze bierze udział dwóch graczy (A i B). Początkowo każdy z nich dysponuje pewną niezerową liczbą identycznych żetonów - odpowiednio a i b.
•Jeżeli jeden z graczy ma mniej żetonów niż drugi, może wykonać ruch. Wykonując ruch, gracz zabiera partnerowi tyle żetonów, ile sam posiada. Żetony te są wyłączone z dalszej gry (tj. gracz wykonujący ruch ich nie przejmuje).
•Gra kończy się w sytuacji, gdy żaden z graczy nie może wykonać ruchu (w szczególności gra może skończyć się bezpośrednio po "rozdaniu" żetonów, bez jakichkolwiek ruchów).

Znając początkowe zasoby graczy (tj. wartości a i b), wyznacz łączną liczbę żetonów pozostałych w grze w chwili jej zakończenia.

Wejście
t [1 <= t <= 10; liczba partii]
a1 b1 [1 <= a1, b1 <= 1 000 000 000; początkowe liczby żetonów u graczy (partia #1) ]
a2 b2 [ jw. (partia #2) ]
...
at bt

Wyjście
r1 [ łączna liczba żetonów u obu graczy po zakończeniu partii #1 ]
r2 [ jw., dla partii #2 ]
...
rt

Przykład

Wejście:
3
1 1
2 4
9 6

Wyjście:
2
4
6

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

int main()
{
    int a, b, t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&a,&b);
        if(a==b)
        {
            printf("%d\n",a+b);
        }
        else
        {
            while(a!=b)
            {
                if(b%a==0)
                {
                    printf("%d\n",2*a);
                    break;
                }
                if(a%b==0)
                {
                    printf("%d\n",2*b);
                    break;
                }
                if(a<b)
                {
                    b=b%a;
                }
                else
                {
                    a=a%b;
                }
            }
        }
    }
    return 0;
}


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

using namespace std;

int main()
{
    int a, b, t;
    cin>>t;
    while(t--)
    {
        cin>>a>>b;
        if(a==b)
        {
            cout<<a+b<<endl;
        }
        else
        {
            while(a!=b)
            {
                if(b%a==0)
                {
                    cout<<2*a<<endl;
                    break;
                }
                if(a%b==0)
                {
                    cout<<2*b<<endl;
                    break;
                }
                if(a<b)
                {
                    b=b%a;
                }
                else
                {
                    a=a%b;
                }
            }
        }
    }
    return 0;
}


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

poniedziałek, 29 stycznia 2018

00020 - 1261 - PESEL - www.pl.spoj.com

Teść zadania:

Jan Kowalski musi wpisać do systemu szpitalnego dane osobowe pacjenta, oprócz imienia i nazwiska musi również wpisać PESEL pacjenta. Jakież było jego zdziwienie, gdy spostrzegł, że pewnych pacjentów system nie przyjmował z powodu wadliwego PESELu.

Twoim zadaniem jest sprawdzenie, czy podana liczba 11-cyfrowa jest poprawnym PESELem.

Aby sprawdzić czy dany PESEL jest prawidłowy należy wykonać następujące działania:

Pierwszą cyfrę mnożymy przez 1,
drugą cyfrę mnożymy przez 3,
trzecią cyfrę mnożymy przez 7,
czwarta cyfrę mnożymy przez 9,
piątą cyfrę mnożymy przez 1,
szóstą cyfrę mnożymy przez 3,
siódmą cyfrę mnożymy przez 7,
ósmą cyfrę mnożymy przez 9,
dziewiątą cyfrę mnożymy przez 1,
dziesiątą cyfrę mnożymy przez 3,
jedenastą cyfrę mnożymy przez 1.

Tak uzyskane 11 iloczynów dodajemy do siebie. Jeśli ostatnia cyfra tej sumy jest zerem to podany PESEL jest prawidłowy. Przykład dla numeru PESEL 44051401458

4*1 + 4*3 + 0*7 + 5*9 + 1*1 + 4*3 + 0*7 + 1*9 + 4*1 + 5*3 + 8*1 = 4 + 12 + 0 + 45 + 1 + 12 + 0 + 9 + 4 + 15 + 8 = 110

Źródło: www.wikipedia.pl

Jeśli suma jest większa od zera, wtedy sprawdzamy jej poprawność. W przeciwnym przypadku nr PESEL jest błędny. Ponieważ ostatnia cyfra liczby 110 jest zerem więc podany PESEL jest prawidłowy.

Na wejściu podana jest w pojedyńczej linii ilość t<=100 numerów PESEL do sprawdzenia. W kolejnych t liniach są 11-cyfrowe liczby.

Output
W pojedyńczej linii powinna zostać wyświetlona litera D, jeśli numer PESEL jest poprawny lub N, gdy nie.

Przykład:
Input:
2
44051401458
12345678901

Output:
D
N




Więcej o numerze PESEL: https://pl.wikipedia.org/wiki/PESEL

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

using namespace std;

int main()
{
    int t, s;
    char pesel[12];
    cin>>t;
    while(t--)
    {
        cin>> pesel;
        s = 0;
        s+=(pesel[0] - '0')*1;
        s+=(pesel[1] - '0')*3;
        s+=(pesel[2] - '0')*7;
        s+=(pesel[3] - '0')*9;
        s=s+(pesel[4] - '0')*1;
        s=s+(pesel[5] - '0')*3;
        s=s+(pesel[6] - '0')*7;
        s=s+(pesel[7] - '0')*9;
        s=s+(pesel[8] - '0')*1;
        s=s+(pesel[9] - '0')*3;
        s=s+(pesel[10] - '0')*1;

        if (s>0 && s%10 == 0)
        {
            cout << "D" << endl;
        }
        else
        {
            cout << "N" << endl;
        }
    }
    return 0;
}


Kod źródłowy w Python 3:
a = input()
t = 0
while (int(t)<int(a)):

    i = input()
    j = 0
    j+= (int(i)%10*1)
    i = int(i)/10
    j+= (int(i)%10*3)
    i = int(i)/10
    j+= (int(i)%10*1)
    i = int(i)/10
    j+= (int(i)%10*9)
    i = int(i)/10
    j+= (int(i)%10*7)
    i = int(i)/10
    j+= (int(i)%10*3)
    i = int(i)/10
    j+= (int(i)%10*1)
    i = int(i)/10
    j+= (int(i)%10*9)
    i = int(i)/10
    j+= (int(i)%10*7)
    i = int(i)/10
    j+= (int(i)%10*3)
    i = int(i)/10
    j+= (int(i)%10*1)
    i = int(i)/10
 
    if (int(j)==0):
        print ("N")
    elif (int(j)%10==0):
        print ("D")
    else:
        print ("N")
    t+=1


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

środa, 6 grudnia 2017

00019 - 499 - Czy umiesz potęgować - www.pl.spoj.com

Treść zadania:
Dla danych dwóch liczb naturalnych a i b, wyznaczyć ostatnią cyfrę liczby ab.

Zadanie
Napisz program, który:

•wczyta ze standardowego wejścia: podstawę a oraz wykładnik b,
•wyznaczy ostatnią cyfrę liczby ab,
•wypisze wynik na standardowe wyjście.

Wejście
W pierwszej linii wejścia znajduje się jedna liczba całkowia D (1≤D≤10), oznaczjąca liczbę przypadków do rozważenia. Opis każdego przypadku podany jest w jednym wierszu, zawierającym dwie liczby naturalne a i b oddzielone pojedynczym odstępem (spacją), takie, że (1 ≤ a,b ≤ 1 000 000 000).

Wyjście
Dla każdego przypadku z wejścia Twój program powinien wypisać (w osobnej linii dla każdego przypadku z wejścia) cyfrę jedności liczby ab zapisanej dziesiętnie.

Przykład
Dla danych wejściowych:

2
2 3
3 3

poprawną odpowiedzią jest:

8
7


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

using namespace std;

int main()
{
    int d;
    cin>>d;
    int a[d],b[d];
    for(int i=0; i<d; ++i)
    {
        cin>>a[i]>>b[i];
    }
    for(int i=0 ; i<d ; ++i)
    {
        int c = a[i]%10;
        switch(c)
        {
            case 9:
                if(b[i]%2)
                {
                    cout<<"9"<<endl;
                }
                else
                {
                    cout<<"1"<<endl;
                }
                break;
            case 8:
                if(!(b[i]%4))
                {
                    cout<<"6"<<endl;
                }
                else if(!(b[i]%2))
                {
                    cout<<"4"<<endl;
                }
                else if(b[i]>8)
                {
                    for(int k=3 ; k<=1000000000 ; k+=4)
                    {
                        if(!(b[i]%k))
                        {
                            cout<<"2"<<endl;
                            break ;
                        }
                    }
                }
                else
                {
                    cout<<"8"<<endl;
                }
                break;
            case 7 :
                if(!(b[i]%4))
                {
                    cout<<"1"<<endl;
                }
                else if(!(b[i]%2))
                {
                    cout<<"9"<<endl;
                }
                else if(b[i]>7)
                {
                    for(int k=3 ; k<=1000000000 ; k+=4)
                    {
                        if(!(b[i]%k))
                        {
                            cout<<"3"<<endl;
                            break ;
                        }
                    }
                }
                else
                {
                    cout<<"7"<<endl;
                }
                break;
            case 6 :
                cout<<"6"<<endl;
                break;
            case 5 :
                cout <<"5"<<endl;
                break;
            case 4 :
                if(!(b[i]%2))
                {
                    cout<<"6"<<endl;
                }
                else
                {
                    cout<<"4"<<endl;
                }
                break;
            case 3 :
                if(!(b[i]%4))
                {
                    cout<<"1"<<endl;
                }
                else if(!(b[i]%2))
                {
                    cout<<"9"<<endl;
                }
                else if(b[i]>3)
                {
                    for(int k=3 ; k<=1000000000 ; k+=4)
                    {
                        if(!(b[i]%k))
                        {
                            cout<<"7"<<endl;
                            break;
                        }
                    }
                }
                else
                {
                    cout<<"3"<<endl;
                }
                break;
            case 2:
                if(!(b[i]%4))
                {
                    cout<<"6"<<endl;
                }
                else if(!(b[i]%2))
                {
                    cout<<"4"<<endl;
                }
                else if(b[i]>2)
                {
                    for(int k=3 ; k<=1000000000; k+=4)
                    {
                        if(!(b[i]%k))
                        {
                            cout<<"8"<<endl;
                            break ;
                        }
                    }
                }
                else
                {
                    cout<<"2"<<endl;
                }
                break;
            case 1:
                cout<<"1"<<endl;
                break ;
            case 0:
                cout<<"0"<<endl;
                break ;
            default :
                cout<<a[i]%10<<endl;
                break;
        }
    }
    return 0 ;
}


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