Compare commits

..

No commits in common. "main" and "v3" have entirely different histories.
main ... v3

104 changed files with 18 additions and 1087 deletions

View File

@ -7,4 +7,4 @@ validate_code:
stage: test stage: test
script: script:
- chmod +x ./test/main.sh - chmod +x ./test/main.sh
- ./test/main.sh --all --gitlab - ./test/main.sh

View File

@ -1,84 +0,0 @@
Úkolem je vytvořit program, který bude zpracovávat jednoduché matematické vzorce.
Na vstupu dostanete dvě desetinná čísla oddělená znakem operace a zakončená znakem rovná se. Vaším úkolem je vypočítat hodnotu podle zadaného operátoru:
- pro + určit součet,
- pro - určit rozdíl,
- pro * určit součin,
- pro / určit celočíselný podíl (např. 3.5 / 1.5 = 2, kolikrát se do dělence vejde celý dělitel).
Jiné operace program nebude umět a vypíše pro ně chybové hlášení. Formát vstupu a výstupu je vidět níže na ukázce práce programu.
Pokud je vstup neplatný, program to musí detekovat a zobrazit chybové hlášení. Chybové hlášení zobrazujte na standardní výstup (ne na chybový výstup). Za chybu považujte:
- zadané číslo není validní desetinné číslo,
- dělitel je 0 pro operaci /,
- čísla nejsou oddělena validním operátorem (+, -, * nebo /),
- za posledním číslem se nenachází znak =.
**Ukázka práce programu:**
```
Zadejte vzorec:
3.5 + 1.5 =
5
```
---
```
Zadejte vzorec:
3.5 / 1.5 =
2
```
---
```
Zadejte vzorec:
1000000 * 1.5e+8 =
1.5e+14
```
---
```
Zadejte vzorec:
7 / -1 =
-7
```
---
```
Zadejte vzorec:
abc / 1 =
Nespravny vstup.
```
---
```
Zadejte vzorec:
4 & 10 =
Nespravny vstup.
```
Poznámky:
- Ukázkové běhy zachycují očekávané výpisy Vašeho programu (tučné písmo) a vstupy zadané uživatelem (základní písmo). Zvýraznění tučným písmem je použité pouze zde na stránce zadání, aby byl výpis lépe čitelný. Váš program má za úkol zobrazit text bez zvýrazňování (bez HTML markupu).
- Znak odřádkování (\n) je i za poslední řádkou výstupu (i za případným chybovým hlášením).
- Pro reprezentaci hodnot použijte desetinná čísla typu double. Nepoužívejte typ float, jeho přesnost nemusí být dostatečná.
- Při programování si dejte pozor na přesnou podobu výpisů. Výstup Vašeho programu kontroluje stroj, který požaduje přesnou shodu výstupů Vašeho programu s výstupy referenčními. Za chybu je považováno, pokud se výpis liší. I chybějící nebo přebývající mezera/odřádkování je považováno za chybu. Abyste tyto problémy rychle vyloučili, použijte přiložený archiv se sadou vstupních a očekávaných výstupních dat. Podívejte se na videotutoriál (Courses -> Video tutoriály), jak testovací data použít a jak testování zautomatizovat.
- Výsledná hodnota je porovnávána jako desetinné číslo s tolerancí 1 promile.
- Váš program bude spouštěn v omezeném testovacím prostředí. Je omezen dobou běhu (limit je vidět v logu referenčního řešení) a dále je omezena i velikost dostupné paměti (ale tato úloha by ani s jedním omezením neměla mít problém).
- Slovní popis struktury platných vstupních dat není zcela exaktní. Proto připojujeme i formální popis vstupního jazyka v EBNF:
```
input ::= { whiteSpace } decimal { whiteSpace } op { whiteSpace } decimal { whiteSpace } '='
whiteSpace ::= ' ' | '\t' | '\n' | '\r'
decimal ::= [ '+' | '-' ] integer [ '.' integer [ ( 'e' | 'E' ) [ '+' | '-' ] integer ] ] |
[ '+' | '-' ] '.' integer [ ( 'e' | 'E' ) [ '+' | '-' ] integer ]
integer ::= digit { digit }
digit ::= '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9'
op ::= '+' | '-' | '*' | '/'
```

View File

@ -1,53 +0,0 @@
#include <limits.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
int main() {
printf("Zadejte vzorec:\n");
double num1, num2;
char op;
char equal_sign;
if (scanf("%lf %c %lf %c", &num1, &op, &num2, &equal_sign) != 4 || equal_sign != '=') {
printf("Nespravny vstup.\n");
return EXIT_FAILURE;
}
if (op != '+' && op != '-' && op != '*' && op != '/') {
printf("Nespravny vstup.\n");
return EXIT_FAILURE;
}
if (op == '/' && num2 == 0) {
printf("Nespravny vstup.\n");
return EXIT_FAILURE;
}
double result = 0;
switch (op) {
case '+':
result = num1 + num2;
break;
case '-':
result = num1 - num2;
break;
case '*':
result = num1 * num2;
break;
case '/':
result = num1 / num2;
if (result < 0) {
result = ceil(num1 / num2);
} else {
result = floor(num1 / num2);
}
break;
}
if (fabs(result - (int)result) < 1e-9) {
printf("%ld\n", (long)result);
} else {
printf("%.12g\n", result);
}
}

View File

@ -1 +0,0 @@
3.5 + 1.5 =

View File

@ -1,2 +0,0 @@
Zadejte vzorec:
5

View File

@ -1,2 +0,0 @@
Zadejte vzorec:
5

View File

@ -1 +0,0 @@
3.5 / 1.5 =

View File

@ -1,2 +0,0 @@
Zadejte vzorec:
2

View File

@ -1,2 +0,0 @@
Zadejte vzorec:
2

View File

@ -1 +0,0 @@
1000000 * 1.5e+8 =

View File

@ -1,2 +0,0 @@
Zadejte vzorec:
1.5e+14

View File

@ -1,2 +0,0 @@
Zadejte vzorec:
1.5e+14

View File

@ -1 +0,0 @@
7 / -1 =

View File

@ -1,2 +0,0 @@
Zadejte vzorec:
-7

View File

@ -1,2 +0,0 @@
Zadejte vzorec:
-7

View File

@ -1 +0,0 @@
abc / 1 =

View File

@ -1,2 +0,0 @@
Zadejte vzorec:
Nespravny vstup.

View File

@ -1,2 +0,0 @@
Zadejte vzorec:
Nespravny vstup.

View File

@ -1 +0,0 @@
4 & 10 =

View File

@ -1,2 +0,0 @@
Zadejte vzorec:
Nespravny vstup.

View File

@ -1,2 +0,0 @@
Zadejte vzorec:
Nespravny vstup.

View File

@ -1 +0,0 @@
0.848905 * 0.783596 =

View File

@ -1,2 +0,0 @@
Zadejte vzorec:
0.66519856238

View File

@ -1 +0,0 @@
-3.5 / 1.5 =

View File

@ -1,2 +0,0 @@
Zadejte vzorec:
-2

View File

@ -1 +0,0 @@
0.984813 / 0.360992 =

View File

@ -1,2 +0,0 @@
Zadejte vzorec:
2

View File

@ -1 +0,0 @@
2 * 3

View File

@ -1,2 +0,0 @@
Zadejte vzorec:
Nespravny vstup.

View File

@ -1,98 +0,0 @@
Úkolem je napsat program, který rozhodne vzájemnou polohu 2 kružnic.
Vstupem programu je zadání dvou kružnic. Každá kružnice je zadaná svým středem (x a y souřadnice) a poloměrem. Čísla jsou zadaná v pořadí x y r, jedná se o desetinná čísla.
Výstupem programu je rozhodnutí o vzájemné poloze kružnic. Celkem může nastat 6 variant vzájemné polohy:
- kružnice splývají,
- jedna kružnice leží zcela uvnitř druhé,
- jedna kružnice se zevnitř dotýká druhé,
- kružnice se protínají,
- kružnice se dotýkají zvenku,
- kružnice leží zcela mimo sebe.
Program rozhodne o poloze a vypíše ji. Dále, pokud je to relevantní, program vypíše plochu překryvu kružnic. Formát výstupu pro všech 6 variant je uveden v ukázkovém běhu níže. Pozor, za výstupem je odřádkování (\n).
Program musí být schopen detekovat nesprávný vstup. Pokud je na vstupu nesmyslné zadání, program to zjistí, vypíše chybové hlášení a ukončí se. Formát chybového hlášení je uveden v ukázce níže. Pozor, za případným chybovým hlášením je odřádkování (\n). Chybové hlášení zasílejte na standardní výstup (printf), nezasílejte jej na chybový výstup. Za chybu je považováno:
- nečíselná hodnota nějaké souřadnice,
- nečíselná hodnota poloměru,
- poloměr nulový nebo záporný.
**Ukázka práce programu:**
```
Zadejte parametry kruznice #1:
0 0 5
Zadejte parametry kruznice #2:
0 10 5
Vnejsi dotyk, zadny prekryv.
```
---
```
Zadejte parametry kruznice #1:
0 0 3
Zadejte parametry kruznice #2:
1.5 1.5 0.8
Kruznice #2 lezi uvnitr kruznice #1, prekryv: 2.010619
```
---
```
Zadejte parametry kruznice #1:
0 0 4
Zadejte parametry kruznice #2:
2 0 2
Vnitrni dotyk, kruznice #2 lezi uvnitr kruznice #1, prekryv: 12.566371
```
---
```
Zadejte parametry kruznice #1:
0 0 5
Zadejte parametry kruznice #2:
100 100 10
Kruznice lezi vne sebe, zadny prekryv.
```
---
```
Zadejte parametry kruznice #1:
0 0 4.5
Zadejte parametry kruznice #2:
10 10 15
Kruznice se protinaji, prekryv: 37.475800
```
---
```
Zadejte parametry kruznice #1:
-10.25 -20.5 4
Zadejte parametry kruznice #2:
-10.25 -20.5 4
Kruznice splyvaji, prekryv: 50.265482
```
---
```
Zadejte parametry kruznice #1:
0 0 -2
Nespravny vstup.
```
---
```
Zadejte parametry kruznice #1:
0 12 5
Zadejte parametry kruznice #2:
3 7 abc
Nespravny vstup.
```

View File

@ -1,137 +0,0 @@
#include <float.h>
#include <math.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#ifdef __PROGTEST__
#define debug(...) ((void)0)
#else
#define debug(fmt, ...) \
fprintf(stdout, "[%s:%d %s()] " fmt "\n", __FILE__, __LINE__, __func__, \
##__VA_ARGS__)
#endif
double clamp(double d) {
if (d > 1.0) {
return 1.0;
} else if (d < -1.0) {
return -1.0;
} else {
return d;
}
}
// https://www.geeksforgeeks.org/dsa/area-of-intersection-of-two-circles/
double intersection_area(double a_r, double b_r, double distance) {
double a_square = a_r * a_r;
double b_square = b_r * b_r;
double distance_square = distance * distance;
double alpha_acos =
(distance_square + a_square - b_square) / (2 * a_r * distance);
double beta_acos =
(distance_square + b_square - a_square) / (2 * b_r * distance);
double alpha = acos(clamp(alpha_acos)) * 2;
double beta = acos(clamp(beta_acos)) * 2;
double a1 = 0.5 * beta * b_square - 0.5 * b_square * sin(beta);
double a2 = 0.5 * alpha * a_square - 0.5 * a_square * sin(alpha);
double area = a1 + a2;
debug("Area = %lf", area);
return area;
}
double circle_area(double radius) { return M_PI * radius * radius; }
int main() {
double a_center_x = 0, a_center_y = 0, a_radius = 0, b_center_x = 0,
b_center_y = 0, b_radius = 0;
printf("Zadejte parametry kruznice #1:\n");
int inputs_read = scanf("%lf %lf %lf", &a_center_x, &a_center_y, &a_radius);
if (inputs_read != 3 || a_radius <= 0) {
printf("Nespravny vstup.\n");
return EXIT_FAILURE;
}
printf("Zadejte parametry kruznice #2:\n");
inputs_read = scanf("%lf %lf %lf", &b_center_x, &b_center_y, &b_radius);
if (inputs_read != 3 || b_radius <= 0) {
printf("Nespravny vstup.\n");
return EXIT_FAILURE;
}
double center_distance =
sqrt((b_center_x - a_center_x) * (b_center_x - a_center_x) +
(b_center_y - a_center_y) * (b_center_y - a_center_y));
debug("Distance of centers = %0.60lf", center_distance);
debug("Radii difference = %0.60lf", a_radius - b_radius);
debug("Radii difference = %0.60lf", b_radius - a_radius);
debug("Center + #1 = %0.60lf", a_center_x + a_radius);
debug("Center + #2 = %0.60lf", b_center_x + b_radius);
double radii_sum = a_radius + b_radius;
double radii_difference = fabs(a_radius - b_radius);
double epsilon = 100 * DBL_EPSILON * fmax(a_radius, b_radius);
// Both origin points and radii are identical
bool are_identical = a_center_x == b_center_x && a_center_y == b_center_y && a_radius == b_radius;
// d = r1 + r2
// d - r1 - r1 < epsilon
bool are_touching_from_outside = fabs(center_distance - radii_sum) < epsilon;
// d = |r1 - r2|
// d - |r1 - r2| < epsilon
bool are_touching_from_inside = fabs(center_distance - radii_difference) < epsilon;
// d < |r1 - r2|
bool is_fully_inside = center_distance < radii_difference;
// d < r1 + r2
bool are_overlapping = center_distance < radii_sum;
if (are_identical) {
printf("Kruznice splyvaji, prekryv: %lf\n", circle_area(a_radius));
}
else if (are_touching_from_inside) {
if (a_radius > b_radius) {
printf(
"Vnitrni dotyk, kruznice #2 lezi uvnitr kruznice #1, prekryv: %lf\n",
circle_area(b_radius));
} else {
printf(
"Vnitrni dotyk, kruznice #1 lezi uvnitr kruznice #2, prekryv: %lf\n",
circle_area(a_radius));
}
}
else if (are_touching_from_outside) {
printf("Vnejsi dotyk, zadny prekryv.\n");
}
else if (is_fully_inside) {
if (a_radius > b_radius) {
printf("Kruznice #2 lezi uvnitr kruznice #1, prekryv: %lf\n",
circle_area(b_radius));
} else {
printf("Kruznice #1 lezi uvnitr kruznice #2, prekryv: %lf\n",
circle_area(a_radius));
}
}
else if (are_overlapping) {
printf("Kruznice se protinaji, prekryv: %lf\n",
intersection_area(a_radius, b_radius, center_distance));
}
else {
printf("Kruznice lezi vne sebe, zadny prekryv.\n");
}
return EXIT_SUCCESS;
}

View File

@ -1,2 +0,0 @@
0 0 5
0 10 5

View File

@ -1,3 +0,0 @@
Zadejte parametry kruznice #1:
Zadejte parametry kruznice #2:
Vnejsi dotyk, zadny prekryv.

View File

@ -1,3 +0,0 @@
Zadejte parametry kruznice #1:
Zadejte parametry kruznice #2:
Vnejsi dotyk, zadny prekryv.

View File

@ -1,2 +0,0 @@
0 0 3
1.5 1.5 0.8

View File

@ -1,3 +0,0 @@
Zadejte parametry kruznice #1:
Zadejte parametry kruznice #2:
Kruznice #2 lezi uvnitr kruznice #1, prekryv: 2.010619

View File

@ -1,3 +0,0 @@
Zadejte parametry kruznice #1:
Zadejte parametry kruznice #2:
Kruznice #2 lezi uvnitr kruznice #1, prekryv: 2.010619

View File

@ -1,2 +0,0 @@
0 0 4
2 0 2

View File

@ -1,3 +0,0 @@
Zadejte parametry kruznice #1:
Zadejte parametry kruznice #2:
Vnitrni dotyk, kruznice #2 lezi uvnitr kruznice #1, prekryv: 12.566371

View File

@ -1,3 +0,0 @@
Zadejte parametry kruznice #1:
Zadejte parametry kruznice #2:
Vnitrni dotyk, kruznice #2 lezi uvnitr kruznice #1, prekryv: 12.566371

View File

@ -1,2 +0,0 @@
0 0 5
100 100 10

View File

@ -1,3 +0,0 @@
Zadejte parametry kruznice #1:
Zadejte parametry kruznice #2:
Kruznice lezi vne sebe, zadny prekryv.

View File

@ -1,3 +0,0 @@
Zadejte parametry kruznice #1:
Zadejte parametry kruznice #2:
Kruznice lezi vne sebe, zadny prekryv.

View File

@ -1,2 +0,0 @@
0 0 4.5
10 10 15

View File

@ -1,3 +0,0 @@
Zadejte parametry kruznice #1:
Zadejte parametry kruznice #2:
Kruznice se protinaji, prekryv: 37.475800

View File

@ -1,3 +0,0 @@
Zadejte parametry kruznice #1:
Zadejte parametry kruznice #2:
Kruznice se protinaji, prekryv: 37.475800

View File

@ -1,2 +0,0 @@
-10.25 -20.5 4
-10.25 -20.5 4

View File

@ -1,3 +0,0 @@
Zadejte parametry kruznice #1:
Zadejte parametry kruznice #2:
Kruznice splyvaji, prekryv: 50.265482

View File

@ -1,3 +0,0 @@
Zadejte parametry kruznice #1:
Zadejte parametry kruznice #2:
Kruznice splyvaji, prekryv: 50.265482

View File

@ -1 +0,0 @@
0 0 -2

View File

@ -1,2 +0,0 @@
Zadejte parametry kruznice #1:
Nespravny vstup.

View File

@ -1,2 +0,0 @@
Zadejte parametry kruznice #1:
Nespravny vstup.

View File

@ -1,2 +0,0 @@
0 12 5
3 7 abc

View File

@ -1,3 +0,0 @@
Zadejte parametry kruznice #1:
Zadejte parametry kruznice #2:
Nespravny vstup.

View File

@ -1,3 +0,0 @@
Zadejte parametry kruznice #1:
Zadejte parametry kruznice #2:
Nespravny vstup.

View File

@ -1,2 +0,0 @@
9.7e-39 -1.85e-38 4.16e-38
4.03e-38 2.3e-39 4.6e-39

View File

@ -1,3 +0,0 @@
Zadejte parametry kruznice #1:
Zadejte parametry kruznice #2:
Vnitrni dotyk, kruznice #2 lezi uvnitr kruznice #1, prekryv: 0.000000

View File

@ -1,2 +0,0 @@
4.03e-38 2.3e-39 4.6e-39
9.7e-39 -1.85e-38 4.16e-38

View File

@ -1,3 +0,0 @@
Zadejte parametry kruznice #1:
Zadejte parametry kruznice #2:
Vnitrni dotyk, kruznice #1 lezi uvnitr kruznice #2, prekryv: 0.000000

View File

@ -1,2 +0,0 @@
-2.21e-38 -1.11e-38 1.4862e-36
1.2253e-36 5.721e-37 1.092e-37

View File

@ -1,3 +0,0 @@
Zadejte parametry kruznice #1:
Zadejte parametry kruznice #2:
Vnitrni dotyk, kruznice #2 lezi uvnitr kruznice #1, prekryv: 0.000000

View File

@ -1,261 +0,0 @@
Úkolem je vytvořit program, který bude počítat a zobrazovat počty traťových dílců potřebných pro stavbu trati zadané délky.
Předpokládáme, že výrobce dodává traťové dílce dvou velikostí. Úkolem je určit počty potřebných traťových dílců jednotlivých velikostí, které jsou potřebné pro výstavbu trati zadané délky. Při stavbě trati musíme používat dílce vždy celé (nelze je krátit).
Vstupem programu je zadání délek vyráběných traťových dílců. Jedná se o dvě navzájem různá celá čísla. Po tomto vstupu následuje zadání délky trati ke stavbě. Pro zadanou délku trati program vypočte potřebné množství traťových dílců. Zadání délky je navíc dvojího druhu:
- \- délka pro toto zadání program zobrazí kolika různými způsoby lze traťové dílce kombinovat,
- \+ délka pro toto zadání program vypíše nalezené kombinace a zobrazí jejich počet.
Výstupem programu je počet možných způsobů, kterými lze zkombinovat traťové dílce pro zadanou vzdálenost. Podle vstupu (znaku + či - v zadání) se dále zobrazí či nezobrazí i výpis jednotlivých možných kombinací. Přesný formát výstupu je v ukázce níže. Pokud zadanou délku nelze z vyráběných dílců sestavit, program pro zadaný vstup vypíše informaci podle ukázky. Pozor, za výpisem je odřádkování (\n).
Pokud je vstup neplatný, program to musí detekovat, zobrazit chybové hlášení a ukončit se. Chybové hlášení zobrazujte na standardní výstup (ne na chybový výstup). Za chybu považujte:
- délky vyráběných traťových dílců jsou nečíselné, záporné, nulové nebo jsou obě délky shodné,
- při zadávání délky nebyl použit ani znak + ani - pro zapnutí/vypnutí úplného výpisu všech kombinací,
- zadání délky trati je nečíselné nebo záporné.
Program v základní verzi pracuje s malými čísly, tedy k vyřešení stačí naivní algoritmus kontrolující přípustné možnosti. Pokud má být zobrazován kompletní výpis všech možných kombinací, nelze algoritmus příliš vylepšovat. Úloha nabízí bonusový test. V tomto testu se testuje, zda řešení dokáže rychle počítat počty možných kombinací (pracuje pouze v režimu -, tedy bez výpisu všech nalezených kombinací). Pokud bonusový test zvládnete, dostane řešení více než nominálních 100% bodů. Pokud v programu použijete pouze naivní algoritmus, bonusovým testem neprojdete a získáte nejvýše nominální hodnocení 100% bodů.
Při programování si dejte pozor na přesnou podobu výpisů. Výstup Vašeho programu kontroluje stroj, který požaduje přesnou shodu výstupů Vašeho programu s výstupy referenčními. Za chybu je považováno, pokud se výpis liší. I chybějící nebo přebývající mezera/odřádkování je považováno za chybu. Abyste tyto problémy rychle vyloučili, použijte přiložený archiv se sadou vstupních a očekávaných výstupních dat.
Váš program bude spouštěn v omezeném testovacím prostředí. Je omezen dobou běhu (limit je vidět v logu referenčního řešení) a dále je omezena i velikost dostupné paměti (ale tato úloha by ani s jedním omezením neměla mít v povinných testech problém). Zvládnutí bonusového testu již vyžaduje lepší algoritmus.
**Ukázka práce programu:**
```
Delky koleji:
10 13
Vzdalenost:
+ 100
= 10 * 10 + 13 * 0
Celkem variant: 1
```
---
```
Delky koleji:
10 13
Vzdalenost:
+ 749
= 10 * 32 + 13 * 33
= 10 * 19 + 13 * 43
= 10 * 6 + 13 * 53
= 10 * 71 + 13 * 3
= 10 * 58 + 13 * 13
= 10 * 45 + 13 * 23
Celkem variant: 6
```
---
```
Delky koleji:
10 13
Vzdalenost:
+ 71
Reseni neexistuje.
```
---
```
Delky koleji:
10 13
Vzdalenost:
+ 0
= 10 * 0 + 13 * 0
Celkem variant: 1
```
---
```
Delky koleji:
54 16
Vzdalenost:
+ 121
Reseni neexistuje.
```
---
```
Delky koleji:
54 16
Vzdalenost:
+ 2400
= 54 * 16 + 16 * 96
= 54 * 8 + 16 * 123
= 54 * 0 + 16 * 150
= 54 * 40 + 16 * 15
= 54 * 32 + 16 * 42
= 54 * 24 + 16 * 69
Celkem variant: 6
```
---
```
Delky koleji:
173 459
Vzdalenost:
- 5219
Reseni neexistuje.
```
---
```
Delky koleji:
173 459
Vzdalenost:
- 234875
Celkem variant: 3
```
---
```
Delky koleji:
22 33
Vzdalenost:
* 12
Nespravny vstup.
```
---
```
Delky koleji:
10 abc
Nespravny vstup.
```
**Poznámky:**
- Ukázkové běhy zachycují očekávané výpisy Vašeho programu (tučné písmo) a vstupy zadané uživatelem (základní písmo). Zvýraznění tučným písmem je použité pouze zde na stránce zadání, aby byl výpis lépe čitelný. Váš program má za úkol pouze zobrazit text bez zvýrazňování (bez HTML markupu).
- Znak odřádkování (\n) je i za poslední řádkou výstupu (i za případným chybovým hlášením).
- Výpis nalezených kombinací (pokud je požadován) nemá určené pořadí. Testovací prostředí si v případě potřeby pořadí před porovnáním prohodí. Tedy například pro dílce délky 13 17 a požadovanou délku tratě 7111 jsou za správné považované následující výpisy:
```
= 13 * 190 + 17 * 273
= 13 * 428 + 17 * 91
= 13 * 105 + 17 * 338
= 13 * 343 + 17 * 156
= 13 * 20 + 17 * 403
= 13 * 258 + 17 * 221
= 13 * 496 + 17 * 39
= 13 * 173 + 17 * 286
= 13 * 411 + 17 * 104
= 13 * 88 + 17 * 351
= 13 * 326 + 17 * 169
= 13 * 3 + 17 * 416
= 13 * 241 + 17 * 234
= 13 * 479 + 17 * 52
= 13 * 156 + 17 * 299
= 13 * 394 + 17 * 117
= 13 * 71 + 17 * 364
= 13 * 309 + 17 * 182
= 13 * 547 + 17 * 0
= 13 * 224 + 17 * 247
= 13 * 462 + 17 * 65
= 13 * 139 + 17 * 312
= 13 * 377 + 17 * 130
= 13 * 54 + 17 * 377
= 13 * 292 + 17 * 195
= 13 * 530 + 17 * 13
= 13 * 207 + 17 * 260
= 13 * 445 + 17 * 78
= 13 * 122 + 17 * 325
= 13 * 360 + 17 * 143
= 13 * 37 + 17 * 390
= 13 * 275 + 17 * 208
= 13 * 513 + 17 * 26
Celkem variant: 33
```
---
```
= 13 * 428 + 17 * 91
= 13 * 190 + 17 * 273
= 13 * 105 + 17 * 338
= 13 * 343 + 17 * 156
= 13 * 20 + 17 * 403
= 13 * 258 + 17 * 221
= 13 * 496 + 17 * 39
= 13 * 173 + 17 * 286
= 13 * 411 + 17 * 104
= 13 * 88 + 17 * 351
= 13 * 326 + 17 * 169
= 13 * 3 + 17 * 416
= 13 * 241 + 17 * 234
= 13 * 479 + 17 * 52
= 13 * 156 + 17 * 299
= 13 * 394 + 17 * 117
= 13 * 71 + 17 * 364
= 13 * 309 + 17 * 182
= 13 * 547 + 17 * 0
= 13 * 224 + 17 * 247
= 13 * 462 + 17 * 65
= 13 * 139 + 17 * 312
= 13 * 377 + 17 * 130
= 13 * 54 + 17 * 377
= 13 * 292 + 17 * 195
= 13 * 530 + 17 * 13
= 13 * 207 + 17 * 260
= 13 * 445 + 17 * 78
= 13 * 122 + 17 * 325
= 13 * 360 + 17 * 143
= 13 * 37 + 17 * 390
= 13 * 275 + 17 * 208
= 13 * 513 + 17 * 26
Celkem variant: 33
```
---
```
= 13 * 20 + 17 * 403
= 13 * 428 + 17 * 91
= 13 * 190 + 17 * 273
= 13 * 105 + 17 * 338
= 13 * 343 + 17 * 156
= 13 * 258 + 17 * 221
= 13 * 496 + 17 * 39
= 13 * 173 + 17 * 286
= 13 * 411 + 17 * 104
= 13 * 88 + 17 * 351
= 13 * 326 + 17 * 169
= 13 * 3 + 17 * 416
= 13 * 241 + 17 * 234
= 13 * 479 + 17 * 52
= 13 * 156 + 17 * 299
= 13 * 394 + 17 * 117
= 13 * 71 + 17 * 364
= 13 * 309 + 17 * 182
= 13 * 547 + 17 * 0
= 13 * 224 + 17 * 247
= 13 * 462 + 17 * 65
= 13 * 139 + 17 * 312
= 13 * 377 + 17 * 130
= 13 * 54 + 17 * 377
= 13 * 292 + 17 * 195
= 13 * 530 + 17 * 13
= 13 * 207 + 17 * 260
= 13 * 445 + 17 * 78
= 13 * 122 + 17 * 325
= 13 * 360 + 17 * 143
= 13 * 37 + 17 * 390
= 13 * 275 + 17 * 208
= 13 * 513 + 17 * 26
Celkem variant: 33
```
a libovolná další ze zbývajících 8683317618811886495518194401279999997 permutací.
- Při kontrole výstupů Vašeho programu nelze přímo porovnávat Váš výpis a referenční výpis. Před porovnáním budete nejspíše muset upravit pořadí nalezených kombinací. Odpovídající nástroje jsou probírané v BI-UOS.
- Při programování si dejte pozor na rozsah použitých datových typů. Pro povinné testy lze vystačit s datovým typem int. Pokud chcete projít i bonusovým testem, je potřeba používat datový typ s větším rozsahem (long long).
- Rozsah datových typů lze snadno překročit i nevhodným pořadím prováděných operací. Pokud například potřrbujete spočítat výraz
- Pro načtení znaménka +/- ze vstupu se hodí formát "%c" nebo " %c". Rozdíl mezi těmito konverzemi je dobře popsaný v manuálu k funkci scanf.

View File

@ -1,159 +0,0 @@
#include <math.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#ifdef __PROGTEST__
#define debug(...) ((void)0)
#else
#define debug(fmt, ...) \
printf("[DEBUG %s:%d %s()] " fmt "\n", __FILE__, __LINE__, \
__func__, ##__VA_ARGS__)
#endif
typedef long long int lli;
typedef long double ld;
typedef struct rails_t {
lli r1;
lli r2;
lli d;
} rails_t;
typedef struct eea_gcd_t {
lli g;
lli x;
lli y;
} eea_gcd_t;
int invalid_input() {
printf("Nespravny vstup.\n");
return EXIT_FAILURE;
}
eea_gcd_t extended_euclidian_gcd(lli a, lli b) {
if (a == 0) {
eea_gcd_t res;
res.g = b;
res.x = 0;
res.y = 1;
return res;
}
eea_gcd_t res = extended_euclidian_gcd(b % a, a);
lli x = res.y - (b / a) * res.x;
lli y = res.x;
res.x = x;
res.y = y;
return res;
}
lli find_solutions(rails_t rails, bool verbose) {
lli variants = 0;
if (rails.d == 0) {
debug("Zero total distance");
if (verbose) {
printf("= %lld * 0 + %lld * 0\n", rails.r1, rails.r2);
}
return 1;
}
if (rails.r1 == 0 && rails.d % rails.r2 == 0) {
if (verbose) {
printf("= %lld * %lld + %lld * 0\n", rails.r1, rails.d / rails.r2,
rails.r2);
}
return 1;
}
if (rails.r2 == 0 && rails.d % rails.r1 == 0) {
if (verbose) {
printf("= %lld * 0 + %lld * %lld\n", rails.r1, rails.r2,
rails.d / rails.r1);
}
return 1;
}
eea_gcd_t eea = extended_euclidian_gcd(rails.r1, rails.r2);
lli g = eea.g;
if (rails.d % g != 0) {
return 0;
}
ld d_g = (ld)rails.d / (ld)g;
ld x0 = (ld)eea.x * d_g;
ld y0 = (ld)eea.y * d_g;
lli a_g = rails.r1 / g;
lli b_g = rails.r2 / g;
lli n_min = (lli)ceil(-x0 / (ld)b_g);
lli n_max = (lli)floor(y0 / (ld)a_g);
if (n_max < n_min) {
return 0;
}
variants += n_max - n_min + 1;
if (verbose) {
for (lli n = n_min; n <= n_max; n++) {
lli x = x0 + n * b_g;
lli y = y0 - n * a_g;
printf("= %lld * %lld + %lld * %lld\n", rails.r1, x, rails.r2, y);
}
}
return variants;
}
int main() {
printf("Delky koleji:\n");
lli rail_length_1 = -1, rail_length_2 = -1;
if (scanf(" %lld %lld", &rail_length_1, &rail_length_2) != 2 ||
(rail_length_1 <= 0 || rail_length_2 <= 0) ||
(rail_length_1 == rail_length_2)) {
return invalid_input();
}
printf("Vzdalenost:\n");
lli total_distance = 0;
char operand;
if (scanf(" %c %lld", &operand, &total_distance) != 2 ||
(operand != '+' && operand != '-')) {
return invalid_input();
}
if (total_distance < 0) {
return invalid_input();
}
lli variants = 0;
bool verbose = operand == '+';
if (rail_length_1 > 0 && rail_length_2 > 0) {
rails_t rails;
rails.r1 = rail_length_1;
rails.r2 = rail_length_2;
rails.d = total_distance;
variants += find_solutions(rails, verbose);
}
if (variants != 0) {
printf("Celkem variant: %lld\n", variants);
} else {
printf("Reseni neexistuje.\n");
}
}

View File

@ -1,2 +0,0 @@
10 13
+ 100

View File

@ -1,4 +0,0 @@
Delky koleji:
Vzdalenost:
= 10 * 10 + 13 * 0
Celkem variant: 1

View File

@ -1,4 +0,0 @@
Delky koleji:
Vzdalenost:
= 10 * 10 + 13 * 0
Celkem variant: 1

View File

@ -1,2 +0,0 @@
10 13
+ 749

View File

@ -1,9 +0,0 @@
Delky koleji:
Vzdalenost:
= 10 * 6 + 13 * 53
= 10 * 19 + 13 * 43
= 10 * 32 + 13 * 33
= 10 * 45 + 13 * 23
= 10 * 58 + 13 * 13
= 10 * 71 + 13 * 3
Celkem variant: 6

View File

@ -1,9 +0,0 @@
Delky koleji:
Vzdalenost:
= 10 * 32 + 13 * 33
= 10 * 19 + 13 * 43
= 10 * 6 + 13 * 53
= 10 * 71 + 13 * 3
= 10 * 58 + 13 * 13
= 10 * 45 + 13 * 23
Celkem variant: 6

View File

@ -1,2 +0,0 @@
10 13
+ 71

View File

@ -1,3 +0,0 @@
Delky koleji:
Vzdalenost:
Reseni neexistuje.

View File

@ -1,3 +0,0 @@
Delky koleji:
Vzdalenost:
Reseni neexistuje.

View File

@ -1,2 +0,0 @@
10 13
+ 0

View File

@ -1,4 +0,0 @@
Delky koleji:
Vzdalenost:
= 10 * 0 + 13 * 0
Celkem variant: 1

View File

@ -1,4 +0,0 @@
Delky koleji:
Vzdalenost:
= 10 * 0 + 13 * 0
Celkem variant: 1

View File

@ -1,2 +0,0 @@
54 16
+ 121

View File

@ -1,3 +0,0 @@
Delky koleji:
Vzdalenost:
Reseni neexistuje.

View File

@ -1,3 +0,0 @@
Delky koleji:
Vzdalenost:
Reseni neexistuje.

View File

@ -1,2 +0,0 @@
54 16
+ 2400

View File

@ -1,9 +0,0 @@
Delky koleji:
Vzdalenost:
= 54 * 16 + 16 * 96
= 54 * 8 + 16 * 123
= 54 * 0 + 16 * 150
= 54 * 40 + 16 * 15
= 54 * 32 + 16 * 42
= 54 * 24 + 16 * 69
Celkem variant: 6

View File

@ -1,9 +0,0 @@
Delky koleji:
Vzdalenost:
= 54 * 16 + 16 * 96
= 54 * 8 + 16 * 123
= 54 * 0 + 16 * 150
= 54 * 40 + 16 * 15
= 54 * 32 + 16 * 42
= 54 * 24 + 16 * 69
Celkem variant: 6

View File

@ -1,2 +0,0 @@
173 459
- 5219

View File

@ -1,3 +0,0 @@
Delky koleji:
Vzdalenost:
Reseni neexistuje.

View File

@ -1,3 +0,0 @@
Delky koleji:
Vzdalenost:
Reseni neexistuje.

View File

@ -1,2 +0,0 @@
173 459
- 234875

View File

@ -1,3 +0,0 @@
Delky koleji:
Vzdalenost:
Celkem variant: 3

View File

@ -1,3 +0,0 @@
Delky koleji:
Vzdalenost:
Celkem variant: 3

View File

@ -1,2 +0,0 @@
22 33
* 12

View File

@ -1,3 +0,0 @@
Delky koleji:
Vzdalenost:
Nespravny vstup.

View File

@ -1,3 +0,0 @@
Delky koleji:
Vzdalenost:
Nespravny vstup.

View File

@ -1 +0,0 @@
10 abc

View File

@ -1,2 +0,0 @@
Delky koleji:
Nespravny vstup.

View File

@ -1,2 +0,0 @@
Delky koleji:
Nespravny vstup.

View File

@ -1,2 +0,0 @@
21 27
- 567

View File

@ -1,3 +0,0 @@
Delky koleji:
Vzdalenost:
Celkem variant: 4

View File

@ -1,2 +0,0 @@
121 121
- 3878

View File

@ -1,2 +0,0 @@
Delky koleji:
Nespravny vstup.

View File

@ -1,2 +0,0 @@
0 0
- 150

View File

@ -1,2 +0,0 @@
Delky koleji:
Nespravny vstup.

View File

@ -1,2 +0,0 @@
13 15
+ -25

Some files were not shown because too many files have changed in this diff Show More