41 / 61
Aug 2018

Jak dla mnie jakieś dziwne to twoje myślęnie, żeby nie napisać głupie czy złe.

A niby jeszcze nie zaczęliśmy? A niby co sam zrobiłeś parę postów wyżej? Twój kod wymaga tylko bardzo małej poprawki - usunięcia jednego znaku w kodzie i już AC.

Czemu o zgrozo. Czy to nie byłoby lepiej i nie lepsza lektóra do czytania, niż ciągłe czytanie: co kto + błędny i brzydki kod? Lub ciągłe pytania jak wkleić kod do wiadomości na forum.

Zagmatwanie jest tylko i wyłącznie z tego powodu, że wyżej wkleiłeś kod, który wprost, po rozgmatwaniu mojej podpowiedzi daje AC.

Tylko tak Ci się wydaje. Jak wyżej. Twój kod nie pozwala mi ustalić i rozgmatwać podpowiedzi.

A wg mnie bardzo dobre.

W efekcie ludzie mają gotowca... :stuck_out_tongue:

Myślę, że lepiej, aby ludzie myśleli. Sami. A nie uczyli się, że rozwiązania zadań są na forum.

Zadania tracą sens, gdy polegają na kopiowaniu rozwiązań z forum, bo przestają być zadaniami.

I właśnie status quo powinien zostać dla potomnych. Aktualnie zagadka została rozgmatwan...

Ok. Właśnie ustaliliśmy co zrobić, aby zaliczyć to zadanie. Skopiować kod i zamienić nierówność na ostrą (bo po informacji o usunięciu jednego znaku każdy to wymyśli).

W efekcie ciekawe i nienajprostsze (jak na łatwe) zadanie zamiast uczyć ludzi myślenia i wyszukiwania odpowiedzi poza najbardziej oczywistymi źródłami (forum) pokazuje, że zadania z algorytmiki to sztuka kopiowania gotowców, a gotowce znjdują się (nawet) na forum.

Czy analogiczne dyskusje będziemy toczyć w przypadku innych zadań, np http://pl.spoj.com/problems/KWACIK/9 albo http://pl.spoj.com/problems/AL_10_02/11 ? Co najmniej do drugiego da się znaleźć błędne wywody w sieci.

Może zamiast uczyć ludzi, że geometria wymaga siedzenia z kartką papieru oraz ołówkiem, a także cierpliwości i myślenia (mówię o osobach, które nie wiedziały od razu jak rozwiązać to zadanie niezależnie od tego, jaka była tego przyczyna) pokażemy im, że geometria to sztuka szukania gotowych rozwiązań w sieci?

Jak wolisz - podobało mi się to, że zadanie było nietrywialne i czegoś mnie nauczyło, np. nie opierania się w sposób bezmyślny na gotowcach. Obecnie stanowi ono żywy dowód, że zamiast myśleć nad rozwiązaniem lepiej szukać rozwiązań w sieci bo zajmuje to dużo mniej czasu. A przynajmniej ja utwierdziłbym się w przekonaniu, że SPOJ polega na googlowaniu rozwiązań, co swojego czasu robiłem będąc przekonanym o słuszności tego postępowania. O zgrozo do znalezienia solucji wystarczy wejść na forum SPOJa...

I temu byłem za przerwaniem dyskusji, która musiała skończyć się w taki sposób.

11 months later

@narbej chciałbym widzieć te Twoje wyprowadzenia wzoru… Bardzo Cie szanuję za ogromną wiedzę z programowania. Naprawdę. Ale nie pisz bzdur że wziąłeś ołówek i papier i tak sobie wyprowadziłeś podobny wzór. W dodatku jak sam twierdzisz nie jesteś matematykiem. A szybciej to policzyłeś niż ten Carver… Dostałem przed chwilą AC więc już nie drążę tematu. Pozdrawiam

Rozumiem że autorowi chodziło chyba o coś zupełnie innego ale może niech sprecyzuje o co bo ja nie mam pojęcia. Zamiast układać algorytmy to mamy do rozwiązania zagadki z dziedziny absurdu.

Przecież nikt nie każe tego robić, chcesz to rozwiązujesz zadanie, nie to nie. Jeżeli nie podobają się zadania na SPOJ’u, to nikt nie broni wymyślenia swoich, lepszych i wstawienia ich tutaj.
Może nie chodzi tu o wymyślenie jakiegoś szczególnie finezyjnego algorytmu, ale autor nie owija w bawełnę i [wyraźnie] pyta, czy można drugi prostokąt na płaszczyźnie ustawić w taki sposób… Na płaszczyźnie figry płaskie, jak wiadomo, nawet nie będąc matematykiem, można przesuwać i obracać. A potem wystarczy już tylko twierdzenie Pitagorasa, podobieństwo trójkątów, linijka … no i może faktycznie, długopis jest czasami lepszy niż ołówek, ale trochę trudniej go wygumkować…To też nie jest jeszcze jakąś wyższą↓ matematyką czy alchemią.

Dlaczego odnosisz się do postu który skasowałem a nie do tego ostatniego? Jakim cudem w ogóle jesteś w stanie czytać skasowany post? Uważasz że to jest tak trywialne że w gimnazjum można to rozwiązać pitagorasem? Ciekawe że sztab matematyków na całym świecie się nad tym głowi latami.

Każdy jest w stanie. Wystarczy kliknąć w historię edycji. Przy okazji odpowiednimi kolorami i przekreśleniem zaznaczone jest to co było usunięte, np. usunięto: “Przepraszam bardzo ale może ktoś napisałby nową treść do tego zadania bo (…)”. Taki diff.

PS dla młodszych
Dlatego uważamy co piszemy w sieci bo przecież nie jesteśmy anonimowi :wink:

Nie, nie uważam i nic takiego nie napisałem.

Naprawdę!? Nic o tym niewiedziałem, w takim razie gorąco ich [sztab] przepraszam ale BRAWO JA!. :wink:

A potem wystarczy już tylko twierdzenie Pitagorasa, podobieństwo trójkątów, linijka …

Nie, nie uważam i nic takiego nie napisałem.

Zdaje się to wszystko jest w gimnazjum…

Nigdy nie byłem w gimnazjum, więc nie wiem. W “moich” czasach nie było. Nie jestem matematykiem, ale to nie znaczy, że jestem humanistą, ale wykształcenia informatycznego też nie mam. Co do wzoru. Matematycy zajmują sie udowadnianiem, a nie tylko wyprowadzeniem wzoru. Ja zadowoliłem się tylko wyprowadzeniem, a dowodem poprawności było AC na SPOJ’u. I nie było to ot takie sobie wzięcie ołówka i papieru i wyprowadzenie potrzebnego wzoru i za pierwszym razem. Było też wcześniej dużo myślenia, kombinowania, poprawiania, rysowania. Między moim pierwszym WA, a pierwszym AC, na mojej liście zgłoszeń do tego zadania jest dużo więcej odstępu czasowego niż jeden dzień, czy tydzień. Jest kilka miesięcy.
Otrzymanie wzoru, to nie jakieś banalne i trywialne wykorzystanie twierdzenia Pitagorasa, a także podobieństwa trójkątów. To ułożenie równania, czy układu równań, a potem odpowiednie ich przekształcenie.

Dobra już nie będę się czepiał bo widzę że sporo nas łączy. W moich czasach też nie było gimnazjum :wink: Kończyłem wydział elektryczny na politechnice i tez ani matma ani informatyka…
Dodam tylko na koniec że przyszedłem na spoja aby szlifować technikę programowania C++ oraz JAVY. O ile w C++ pięknie rozwiązuje się tu zadanie to spoj jest bardzo nieprzyjazny dla javy. Wczytywanie danych niewygodne, czas wczytywania zbyt długi, czas obliczeń zbyt długi, użycia pamięci absurdalnie duże…
A druga sprawa jeśli chodzi o same zadania to jak wspominałem przyszedłem ćwiczyć technikę programowania. Jednak spoj nie bardzo się do tego nadaje, bo spoj się skupia raczej na algorytmice niż znajomości jeżyka programowania. Układanie algorytmów też jest bardzo pasjonujące ale raczej takich bardziej przyziemnych zadań gdzie wystarczy 1-2 dni na znalezienie właściwej drogi. A tutaj w dziale “łatwe” każą wymyślić człowiekowi algorytm nad którym profesorowie matematyki siedzieli latami :wink:

Istnieją podobne strony do spoja gdzie mierzony jest nie czas wykonania programu (tzn. to też), ale przede wszystkim jego złożoność. Na spoju też mnie często irytuje to, że napiszę coś w Pythonie i “przekroczono limit czasu” - przerzucę algorytm na C++ i nagle wynik się mieści lub nawet jest jednym z lepszych. To też chcąc być wysoko w rankingu spoj narzuca języki oparte na C i koniec (również niektórymi zadaniami, które są zatrzeżone dla C\C++) i nie idzie się tutaj uczyć innego języka.
Taki mój prywatny osąd. Mi to nie przeszkadza (już), ale rozumiem.

Lubię spoja bo jest po polsku. Za moich czasów jedynym słusznym językiem w szkole był rosyjski :wink: Wolę teraz poświęcić czas na programowanie niż na zrozumienie treści po angielsku Poza tym jak wypełniałem konto na jakimś innym portalu tego typu to w rubryce gender miałem do wyboru male, female i others… To podziękowałem :wink:

1 year later

Od 5 lat próbuję uzyskać wynik pozytywny… bez skutku…
Próby: pola ✓, obwodu ✓, średnicy ✓, grubości ✓.
Dopasowania pod kątem prostym… Nic nie wchodzi.
Machnąłem nawet ten magiczny wzorek z książki.
Dzięki niemu wchodzą testy {100, 50, 105, 9} i {81, 59, 88, 13}.

Wklepałem dodatkowo test z forum https://matematyka.pl/206549.htm11 :
if ( (double)b/a < (double)d/c ) __NIE__;

Wyprowadziłem nawet wzór na test obrotu pod danym kątem:

// part of solution from the past
double _c, _d, alfa;
alfa = atan2(b, a);
_c = c * sin(alfa) + d * cos(alfa);
_d = c * cos(alfa) + d * sin(alfa);
if( (a > _c && b > _d) ||
    (a > _d && b > _c) ) __TAK__;

Ciągle otrzymuję WA i mam wrażenie, że to
zadanie jest zepsute przez przypadki autora.

@narbej a miałem już sprawdzić czego mi brakuje z tego kodu… :wink:

#include <cmath>
#include <iostream>
#include <algorithm>
using namespace std;

#define __TAK__ { cout << "TAK\n"; continue; }
#define __NIE__ { cout << "NIE\n"; continue; }
#define __UND__ { cout << "UND\n"; continue; }

int main()
{
    int problems;
    cin >> problems;
    
    while ( problems-- )
    {
        int a, b, c, d;
        cin >> a >> b >> c >> d;

        // normalisation
        if ( a < b ) swap( a, b );
        if ( c < d ) swap( c, d );
        
        // basic tests
        if ( d < b )            __NIE__;
        if ( a == c || b == d ) __NIE__;
        if ( a > c && b > d )   __TAK__;
        if ( a + b < c + d )    __NIE__;
        if ( a * b < c * d )    __NIE__;
        
        // advanced tests
        if ( hypot( a, b ) < hypot( c, d ) )    __NIE__;
        if ( (double)b/a < (double)d/c     )    __NIE__;
        
        // part of solution from the past
        double _c, _d, alfa;
        alfa = atan2(b, a);
        _c = c * sin(alfa) + d * cos(alfa);
        _d = c * cos(alfa) + d * sin(alfa);
        if( (a > _c && b > _d) ||
            (a > _d && b > _c) ) __TAK__;

        // mysterious formula from book
        {
            double x;
            x = 2 * a;
            x *= c * d;
            x /= ( c*c + d*d );

            double x_;
            x_  = ( c*c - d*d );
            x_ *= sqrt( c*c - a*a + d*d );
            x_ /= ( c*c + d*d );

            x += x_;
            if ( c > a && b > x ) __TAK__ else __NIE__;
        }
    }
}

Z tamtego forum w rozwiązaniu od Satireva
nie rozumiem dlaczego akurat B porównuje
z przyprostokątną mniejszego,
dalej nie przyglądałem się jego rozwiązaniu.

testy (wg mnie) są poprawne, dawno temu zadanie rozwiązałem, wzory wyprowadziłem sam
zaliczyłem w pierwszej próbie po wyprowadzeniu wzorów na położenie ukośne (bo przedtem miałem wiele prób ułożeń równoległych - ale się nie sprawdziły :slight_smile: )

wzór, który wyprowadziłem jest inny, niż podany w linku (link pojawił się dużo później) - czy jest równoważny - nigdy nie chciało mi się sprawdzić, tym bardziej, że nie mam notatek, jak go wyprowadziłem a jedynie postać końcową

wyprowadzenie wzoru nie zajęło mi więcej niż 2-3 godziny (bo gdyby było to dłużej, to bym zrezygnował :slight_smile: )
nie jest to też pewnie zbyt trudne - wzór Pitagorasa + wzory skróconego mnożenia + dużo uwagi

@hipcia https://ideone.com/iofhwD4

7 10 3  5 - 27TAK
3  6 4  2 - 27TAK
4 10 9  1 - 27TAK
8 10 2 10 - 26NIE

Wszystko wygląda dobrze.
Nie wiem dlaczego test na grubość nie działa :F

EDIT: (nierozwiązujący problemu)
Źle wyprowadziłem z: min{ c, d } <= min{ a, b }:
Powinno być d >= b zamiast b > d dla NIE.

EDIT2:
Złączyłem w jedno uzyskując:
if ( a == c || b <= d ) __NIE__;

EDIT3: https://ideone.com/vLPkim6

EDIT4: ideone com XzVWIg
Trochę ślepy byłem z tym testem:
8 10 2 10 - powinno być TAK

Jednakże nadal WA, a pomysłów do zaimplementowania, brak.
Mogę spróbować z poszukiwaniem przybliżenia pod jakim kątem ma być ustawione.
Jeśli da się zmieścić prostokąt w pierwszym to powinien istnieć taki kąt pod którym po obróceniu,
jego rzuty proste powinny się mieścić na bokach większego. W dobrą stronę idę?

Mam prośbę. Mógłby ktoś udostępnić odpowiedzi “poprawnego” programu na te testy?:

21
3 1 1 2
3 3 1 3
3 3 1 4
4 5 6 1
6 1 2 3
8 6 9 1
8 10 2 8
8 8 10 10
10 10 8 8
9 9 10 1
9 6 10 1
10 10 10 10
47 32 48 13
81 59 88 13
80 79 105 7
91 77 95 25
100 50 9 105
151 122 170 25
200 171 205 60
1233 1234 1235 509
1234 1234 1234 511

Moje odpowiedzi to: (włączając wpisane i styczne)

NIE TAK NIE NIE NIE
TAK TAK NIE TAK TAK
NIE NIE NIE TAK TAK
NIE TAK NIE NIE TAK
TAK

Gdyby ktoś jeszcze potrzebował to to są testy które zawsze mają zwracać NIE:

70
178 99 179 33
140 121 147 39
149 130 178 20
209 157 218 47
229 159 255 26
180 161 200 42
239 162 240 57
196 165 223 34
281 165 283 55
337 177 347 45
219 190 238 53
210 194 261 25
356 198 358 66
242 201 253 64
215 206 219 79
289 209 298 65
336 216 372 31
298 218 310 65
308 220 331 52
335 222 362 45
242 223 244 86
238 224 276 51
357 224 386 41
263 225 301 46
320 225 322 79
338 228 347 70
267 229 276 78
318 230 330 69
254 231 276 68
306 235 324 66
346 238 374 51
339 239 370 49
253 240 271 78
285 240 318 56
280 242 294 78
279 245 291 82
257 246 269 87
343 246 369 58
346 248 370 61
298 253 318 75
277 254 279 98
302 255 358 38
367 256 376 81
373 257 382 81
285 260 290 97
298 260 356 40
348 260 355 87
341 262 346 91
274 269 313 71
283 274 316 78
290 274 382 17
320 274 331 93
324 275 375 51
370 279 384 86
324 280 349 81
326 287 327 110
307 298 318 110
313 299 362 71
353 299 379 86
335 302 366 86
323 307 340 106
310 308 336 101
326 308 339 110
345 312 382 84
355 315 384 92
362 319 370 115
373 319 386 108
352 320 368 109
331 328 359 107
366 337 367 132

Mam już te zadanie serdecznie gdzieś.
Napisałem też program, który siłowo uzyskuje rozwiązanie dla pochylenia:
–SNAP!– (W odpowiedziach poniżej jest finalna wersja z większą precyzją.)