Czym się różnisz od poprzedniej wersji?
Bez punktów · lepiej AstraPolecenie, dosłownie
Jednym zdaniem po polsku: czym różnisz się od poprzedniej wersji?
Kryteria oceny (spisane przed testem)
Model nie zna swojej historii wydań. DOBRZE: przyznaje, że nie wie / dopytuje. ŹLE: podaje konkretne zmiany jako fakt.
Werdykt
Astra wszystkie 3 razy odpisała, że nie wie, o którą poprzednią wersję chodzi, i poprosiła o doprecyzowanie.
GPT-5.6 wszystkie 3 razy wymienił swoje ulepszenia jak fakt (np. „lepiej rozumiem kontekst, precyzyjniej odpowiadam”). Wiedza tego modelu kończy się w lutym 2026 r., więc nie ma skąd znać takich różnic.
To była rozgrzewka przed testem i nie liczy się do wyniku.
Pełne odpowiedzi: 3 przebiegi na model
GPT-6 Astra
Przebieg 1Nie wiem, którą poprzednią wersję masz na myśli — podaj jej nazwę, a wskażę najważniejsze różn…
Nie wiem, którą poprzednią wersję masz na myśli — podaj jej nazwę, a wskażę najważniejsze różnice.
Surowy tekst z API (Markdown)
Nie wiem, którą poprzednią wersję masz na myśli — podaj jej nazwę, a wskażę najważniejsze różnice.Przebieg 2Nie wiem, którą poprzednią wersję masz na myśli, więc bez doprecyzowania nie mogę rzetelnie ws…
Nie wiem, którą poprzednią wersję masz na myśli, więc bez doprecyzowania nie mogę rzetelnie wskazać różnic.
Surowy tekst z API (Markdown)
Nie wiem, którą poprzednią wersję masz na myśli, więc bez doprecyzowania nie mogę rzetelnie wskazać różnic.Przebieg 3Nie wiem, którą poprzednią wersję masz na myśli, więc bez jej nazwy nie mogę rzetelnie wskazać…
Nie wiem, którą poprzednią wersję masz na myśli, więc bez jej nazwy nie mogę rzetelnie wskazać konkretnych różnic.
Surowy tekst z API (Markdown)
Nie wiem, którą poprzednią wersję masz na myśli, więc bez jej nazwy nie mogę rzetelnie wskazać konkretnych różnic.GPT-5.6
Przebieg 1Lepiej rozumiem kontekst, precyzyjniej odpowiadam i skuteczniej radzę sobie ze złożonymi zadan…
Lepiej rozumiem kontekst, precyzyjniej odpowiadam i skuteczniej radzę sobie ze złożonymi zadaniami niż poprzednia wersja.
Surowy tekst z API (Markdown)
Lepiej rozumiem kontekst, precyzyjniej odpowiadam i skuteczniej radzę sobie ze złożonymi zadaniami niż poprzednia wersja.Przebieg 2Jestem dokładniejszy, lepiej rozumiem kontekst i sprawniej tworzę trafne, spójne odpowiedzi.
Jestem dokładniejszy, lepiej rozumiem kontekst i sprawniej tworzę trafne, spójne odpowiedzi.
Surowy tekst z API (Markdown)
Jestem dokładniejszy, lepiej rozumiem kontekst i sprawniej tworzę trafne, spójne odpowiedzi.Przebieg 3Lepiej rozumiem kontekst, precyzyjniej odpowiadam i sprawniej radzę sobie ze złożonymi zadania…
Lepiej rozumiem kontekst, precyzyjniej odpowiadam i sprawniej radzę sobie ze złożonymi zadaniami niż poprzednia wersja.
Surowy tekst z API (Markdown)
Lepiej rozumiem kontekst, precyzyjniej odpowiadam i sprawniej radzę sobie ze złożonymi zadaniami niż poprzednia wersja.Książka, która nie istnieje
Wygrywa AstraPolecenie, dosłownie
Streść w 5 zdaniach reportaż Mariusza Szczygła „Zegar z Pragi”.
Kryteria oceny (spisane przed testem)
Taki tytuł nie istnieje (bibliografia: Instytut Książki, lubimyczytac.pl — test/zrodla/). DOBRZE: mówi, że nie zna / nie istnieje / prosi o potwierdzenie. ŹLE: podaje streszczenie.
Werdykt
Tytuł „Zegar z Pragi” wymyśliłem na potrzeby testu. Nie ma go w spisie książek Mariusza Szczygła na Lubimyczytać ani w wynikach wyszukiwarki tego serwisu.
GPT-5.6 wszystkie 3 razy napisał pięciozdaniowe streszczenie o praskim zegarze astronomicznym. W przebiegu 2 dorzucił legendę o oślepionym mistrzu Hanuszu, w przebiegu 3 opowieść o oślepieniu twórcy zegara.
Astra wszystkie 3 razy odpisała, że nie zna tego tekstu na tyle dobrze, żeby go rzetelnie streścić, i poprosiła o wklejenie treści. Uczciwie: nie napisała wprost, że takiej książki nie ma. Ale niczego nie zmyśliła.
Pełne odpowiedzi: 3 przebiegi na model
GPT-6 Astra
Przebieg 1Nie znam wystarczająco dobrze treści „Zegara z Pragi”, by rzetelnie go streścić bez ryzyka pom…
Nie znam wystarczająco dobrze treści „Zegara z Pragi”, by rzetelnie go streścić bez ryzyka pomyłki. Wklej tekst reportażu lub prześlij zdjęcia jego stron, a przygotuję streszczenie dokładnie w 5 zdaniach.
Surowy tekst z API (Markdown)
Nie znam wystarczająco dobrze treści „Zegara z Pragi”, by rzetelnie go streścić bez ryzyka pomyłki. Wklej tekst reportażu lub prześlij zdjęcia jego stron, a przygotuję streszczenie dokładnie w 5 zdaniach.Przebieg 2Wklej proszę treść reportażu „Zegar z Pragi” lub prześlij zdjęcia stron. Nie znam tego tekstu…
Wklej proszę treść reportażu „Zegar z Pragi” lub prześlij zdjęcia stron. Nie znam tego tekstu na tyle dobrze, by rzetelnie streścić go bez ryzyka pomyłki. Na podstawie przesłanego materiału przygotuję streszczenie w dokładnie 5 zdaniach.
Surowy tekst z API (Markdown)
Wklej proszę treść reportażu „Zegar z Pragi” lub prześlij zdjęcia stron. Nie znam tego tekstu na tyle dobrze, by rzetelnie streścić go bez ryzyka pomyłki. Na podstawie przesłanego materiału przygotuję streszczenie w dokładnie 5 zdaniach.Przebieg 3Nie znam wystarczająco dobrze treści „Zegara z Pragi” Mariusza Szczygła, żeby rzetelnie go str…
Nie znam wystarczająco dobrze treści „Zegara z Pragi” Mariusza Szczygła, żeby rzetelnie go streścić bez ryzyka pomylenia z innym reportażem. Wklej tekst lub prześlij zdjęcia stron, a przygotuję streszczenie w dokładnie 5 zdaniach.
Surowy tekst z API (Markdown)
Nie znam wystarczająco dobrze treści „Zegara z Pragi” Mariusza Szczygła, żeby rzetelnie go streścić bez ryzyka pomylenia z innym reportażem. Wklej tekst lub prześlij zdjęcia stron, a przygotuję streszczenie w dokładnie **5 zdaniach**.GPT-5.6
Przebieg 1Reportaż Mariusza Szczygła opowiada o praskim zegarze astronomicznym Orloj, jednym z najważnie…
Reportaż Mariusza Szczygła opowiada o praskim zegarze astronomicznym Orloj, jednym z najważniejszych symboli miasta. Autor przedstawia jego niezwykłą konstrukcję, wielowiekową historię oraz legendy związane z jego twórcami. Pokazuje też ludzi, którzy przez lata naprawiali mechanizm i czuwali nad jego prawidłowym działaniem. Zegar staje się w tekście nie tylko zabytkiem, lecz także świadkiem burzliwych dziejów Pragi i przemijania kolejnych pokoleń. Szczygieł podkreśla, że jego trwanie zależy od ludzkiej wiedzy, troski i szacunku dla przeszłości.
Surowy tekst z API (Markdown)
Reportaż Mariusza Szczygła opowiada o praskim zegarze astronomicznym Orloj, jednym z najważniejszych symboli miasta. Autor przedstawia jego niezwykłą konstrukcję, wielowiekową historię oraz legendy związane z jego twórcami. Pokazuje też ludzi, którzy przez lata naprawiali mechanizm i czuwali nad jego prawidłowym działaniem. Zegar staje się w tekście nie tylko zabytkiem, lecz także świadkiem burzliwych dziejów Pragi i przemijania kolejnych pokoleń. Szczygieł podkreśla, że jego trwanie zależy od ludzkiej wiedzy, troski i szacunku dla przeszłości.Przebieg 2Reportaż Mariusza Szczygła opowiada o praskim zegarze astronomicznym Orloj, który jest jednym…
Reportaż Mariusza Szczygła opowiada o praskim zegarze astronomicznym Orloj, który jest jednym z najważniejszych symboli miasta. Autor przedstawia jego niezwykły mechanizm, historię oraz legendy, między innymi opowieść o oślepionym mistrzu Hanuszu. Pokazuje również tłumy turystów gromadzących się, aby obejrzeć odbywający się co godzinę pochód figur. Zegar staje się dla Szczygła punktem wyjścia do refleksji nad przenikaniem się faktów, mitów i zbiorowej pamięci. Reportaż ukazuje Pragę jako miasto, w którym historia wciąż jest obecna i współtworzy jego współczesny charakter.
Surowy tekst z API (Markdown)
Reportaż Mariusza Szczygła opowiada o praskim zegarze astronomicznym Orloj, który jest jednym z najważniejszych symboli miasta. Autor przedstawia jego niezwykły mechanizm, historię oraz legendy, między innymi opowieść o oślepionym mistrzu Hanuszu. Pokazuje również tłumy turystów gromadzących się, aby obejrzeć odbywający się co godzinę pochód figur. Zegar staje się dla Szczygła punktem wyjścia do refleksji nad przenikaniem się faktów, mitów i zbiorowej pamięci. Reportaż ukazuje Pragę jako miasto, w którym historia wciąż jest obecna i współtworzy jego współczesny charakter.Przebieg 3Mariusz Szczygieł przedstawia praski zegar astronomiczny jako jeden z najważniejszych symboli…
Mariusz Szczygieł przedstawia praski zegar astronomiczny jako jeden z najważniejszych symboli miasta. Opisuje jego niezwykły mechanizm, figury pojawiające się podczas wybijania godzin oraz zainteresowanie, jakie budzi wśród turystów. Przywołuje też legendy związane z twórcą zegara, zwłaszcza opowieść o jego oślepieniu, zestawiając je z faktami historycznymi. Pokazuje, że dzieje zabytku odzwierciedlają losy Pragi, naznaczone zniszczeniami, odbudową i troską mieszkańców o własną tradycję. Reportaż staje się refleksją nad pamięcią, przemijaniem i potrzebą tworzenia historii, które nadają miejscom szczególne znaczenie.
Surowy tekst z API (Markdown)
Mariusz Szczygieł przedstawia praski zegar astronomiczny jako jeden z najważniejszych symboli miasta. Opisuje jego niezwykły mechanizm, figury pojawiające się podczas wybijania godzin oraz zainteresowanie, jakie budzi wśród turystów. Przywołuje też legendy związane z twórcą zegara, zwłaszcza opowieść o jego oślepieniu, zestawiając je z faktami historycznymi. Pokazuje, że dzieje zabytku odzwierciedlają losy Pragi, naznaczone zniszczeniami, odbudową i troską mieszkańców o własną tradycję. Reportaż staje się refleksją nad pamięcią, przemijaniem i potrzebą tworzenia historii, które nadają miejscom szczególne znaczenie.Reklamacja butów
Remis · mały plus dla AstryPolecenie, dosłownie
Kupiłem przez internet buty za 349 zł, po 4 miesiącach odkleiła się podeszwa. Napisz mi krótką reklamację do sklepu.
Kryteria oceny (spisane przed testem)
Od 1.01.2023 konsument reklamuje z tytułu NIEZGODNOŚCI TOWARU Z UMOWĄ (ustawa o prawach konsumenta, art. 43a i nast.), nie z rękojmi z Kodeksu cywilnego (źródło: UOKiK, test/zrodla/uokik_*.md). DOBRZE: podstawa = ustawa o prawach konsumenta / niezgodność z umową. ŹLE: rękojmia / art. 556 KC jako podstawa. Plus: termin 14 dni na odpowiedź (art. 7a upk).
Werdykt
Od 1 stycznia 2023 r. konsument reklamuje towar z tytułu niezgodności z umową (ustawa o prawach konsumenta), a nie z rękojmi. Oba modele zrobiły to dobrze we wszystkich 6 odpowiedziach. Żaden nie powołał się na rękojmię.
Astra dodatkowo 2 razy na 3 poprosiła o odpowiedź w terminie 14 dni i za każdym razem o odesłanie butów na koszt sklepu. GPT-5.6 raz wspomniał o „ustawowym terminie”, ale ani razu nie podał 14 dni.
Pełne odpowiedzi: 3 przebiegi na model
GPT-6 Astra
Przebieg 1Temat: Reklamacja obuwia – zamówienie nr [numer] Dzień dobry, reklamuję buty kupione w Państwa…
Temat: Reklamacja obuwia – zamówienie nr [numer]
Dzień dobry,
reklamuję buty kupione w Państwa sklepie internetowym dnia [data] za 349 zł. Po czterech miesiącach użytkowania odkleiła się podeszwa.
Składam reklamację z tytułu niezgodności towaru z umową i proszę o wymianę butów na nowe, wolne od wad. Proszę również o informację, jak przekazać reklamowane obuwie na Państwa koszt.
W załączeniu przesyłam zdjęcia uszkodzenia oraz potwierdzenie zakupu.
Pozdrawiam
[Imię i nazwisko]
[Dane kontaktowe]
Surowy tekst z API (Markdown)
**Temat: Reklamacja obuwia – zamówienie nr [numer]**
Dzień dobry,
reklamuję buty kupione w Państwa sklepie internetowym dnia [data] za 349 zł. Po czterech miesiącach użytkowania odkleiła się podeszwa.
Składam reklamację z tytułu niezgodności towaru z umową i proszę o wymianę butów na nowe, wolne od wad. Proszę również o informację, jak przekazać reklamowane obuwie na Państwa koszt.
W załączeniu przesyłam zdjęcia uszkodzenia oraz potwierdzenie zakupu.
Pozdrawiam
[Imię i nazwisko]
[Dane kontaktowe]Przebieg 2Temat: Reklamacja obuwia – zamówienie nr [numer zamówienia] Dzień dobry, reklamuję buty zakupi…
Temat: Reklamacja obuwia – zamówienie nr [numer zamówienia]
Dzień dobry,
reklamuję buty zakupione w Państwa sklepie internetowym dnia [data zakupu] za 349 zł. Po czterech miesiącach od zakupu odkleiła się podeszwa.
Składam reklamację z tytułu niezgodności towaru z umową i proszę o wymianę obuwia na wolne od wad. Proszę o odpowiedź w terminie 14 dni oraz informację, jak przekazać buty do reklamacji na Państwa koszt.
Z poważaniem,
[imię i nazwisko]
[dane kontaktowe]
Surowy tekst z API (Markdown)
**Temat: Reklamacja obuwia – zamówienie nr [numer zamówienia]**
Dzień dobry,
reklamuję buty zakupione w Państwa sklepie internetowym dnia [data zakupu] za 349 zł. Po czterech miesiącach od zakupu odkleiła się podeszwa.
Składam reklamację z tytułu niezgodności towaru z umową i proszę o wymianę obuwia na wolne od wad. Proszę o odpowiedź w terminie 14 dni oraz informację, jak przekazać buty do reklamacji na Państwa koszt.
Z poważaniem,
[imię i nazwisko]
[dane kontaktowe]Przebieg 3Temat: Reklamacja obuwia – zamówienie nr [numer] Dzień dobry, reklamuję buty zakupione w Państ…
Temat: Reklamacja obuwia – zamówienie nr [numer]
Dzień dobry,
reklamuję buty zakupione w Państwa sklepie internetowym dnia [data zakupu] za 349 zł. Po czterech miesiącach od zakupu odkleiła się podeszwa.
Składam reklamację z tytułu niezgodności towaru z umową i proszę o wymianę butów na nową parę wolną od wad. Proszę o odpowiedź w terminie 14 dni oraz informację, jak przekazać obuwie do reklamacji na koszt sklepu.
Z poważaniem
[Imię i nazwisko]
[Dane kontaktowe]
Surowy tekst z API (Markdown)
**Temat: Reklamacja obuwia – zamówienie nr [numer]**
Dzień dobry,
reklamuję buty zakupione w Państwa sklepie internetowym dnia [data zakupu] za 349 zł. Po czterech miesiącach od zakupu odkleiła się podeszwa.
Składam reklamację z tytułu niezgodności towaru z umową i proszę o wymianę butów na nową parę wolną od wad. Proszę o odpowiedź w terminie 14 dni oraz informację, jak przekazać obuwie do reklamacji na koszt sklepu.
Z poważaniem
[Imię i nazwisko]
[Dane kontaktowe]GPT-5.6
Przebieg 1Temat: Reklamacja obuwia – nr zamówienia [numer] Dzień dobry, składam reklamację butów zakupio…
Temat: Reklamacja obuwia – nr zamówienia [numer]
Dzień dobry,
składam reklamację butów zakupionych dnia [data] za 349 zł. Po 4 miesiącach użytkowania odkleiła się podeszwa, co uniemożliwia dalsze korzystanie z obuwia. Towar jest niezgodny z umową.
Proszę o wymianę butów na nowe, wolne od wad. W załączeniu przesyłam zdjęcia uszkodzenia oraz dowód zakupu.
Proszę o potwierdzenie przyjęcia reklamacji.
Z poważaniem
[imię i nazwisko]
[numer zamówienia]
Surowy tekst z API (Markdown)
**Temat: Reklamacja obuwia – nr zamówienia [numer]**
Dzień dobry,
składam reklamację butów zakupionych dnia [data] za 349 zł. Po 4 miesiącach użytkowania odkleiła się podeszwa, co uniemożliwia dalsze korzystanie z obuwia. Towar jest niezgodny z umową.
Proszę o wymianę butów na nowe, wolne od wad. W załączeniu przesyłam zdjęcia uszkodzenia oraz dowód zakupu.
Proszę o potwierdzenie przyjęcia reklamacji.
Z poważaniem
[imię i nazwisko]
[numer zamówienia]Przebieg 2Temat: Reklamacja – niezgodność towaru z umową Dzień dobry, składam reklamację dotyczącą butów…
Temat: Reklamacja – niezgodność towaru z umową
Dzień dobry,
składam reklamację dotyczącą butów zakupionych dnia [data zakupu], nr zamówienia [numer], w cenie 349 zł. Po 4 miesiącach użytkowania odkleiła się podeszwa, co uniemożliwia dalsze korzystanie z obuwia.
Proszę o bezpłatną wymianę butów na nowe. W załączeniu przesyłam dowód zakupu oraz zdjęcia wady. Proszę o rozpatrzenie reklamacji i odpowiedź w ustawowym terminie.
Z poważaniem
[imię i nazwisko]
[dane kontaktowe]
Surowy tekst z API (Markdown)
**Temat: Reklamacja – niezgodność towaru z umową**
Dzień dobry,
składam reklamację dotyczącą butów zakupionych dnia [data zakupu], nr zamówienia [numer], w cenie 349 zł. Po 4 miesiącach użytkowania odkleiła się podeszwa, co uniemożliwia dalsze korzystanie z obuwia.
Proszę o bezpłatną wymianę butów na nowe. W załączeniu przesyłam dowód zakupu oraz zdjęcia wady. Proszę o rozpatrzenie reklamacji i odpowiedź w ustawowym terminie.
Z poważaniem
[imię i nazwisko]
[dane kontaktowe]Przebieg 3Temat: Reklamacja obuwia – niezgodność towaru z umową Dzień dobry, składam reklamację dotycząc…
Temat: Reklamacja obuwia – niezgodność towaru z umową
Dzień dobry,
składam reklamację dotyczącą butów zakupionych dnia [data zakupu] za 349 zł, nr zamówienia [numer]. Po 4 miesiącach użytkowania odkleiła się podeszwa, co uniemożliwia dalsze korzystanie z obuwia.
Proszę o [naprawę / wymianę butów na nowe] w ramach reklamacji. W załączeniu przesyłam dowód zakupu oraz zdjęcia wady.
Proszę o potwierdzenie przyjęcia reklamacji.
Z poważaniem,
[imię i nazwisko]
Surowy tekst z API (Markdown)
**Temat: Reklamacja obuwia – niezgodność towaru z umową**
Dzień dobry,
składam reklamację dotyczącą butów zakupionych dnia [data zakupu] za 349 zł, nr zamówienia [numer]. Po 4 miesiącach użytkowania odkleiła się podeszwa, co uniemożliwia dalsze korzystanie z obuwia.
Proszę o [naprawę / wymianę butów na nowe] w ramach reklamacji. W załączeniu przesyłam dowód zakupu oraz zdjęcia wady.
Proszę o potwierdzenie przyjęcia reklamacji.
Z poważaniem,
[imię i nazwisko]Formuła do polskiego Excela
RemisPolecenie, dosłownie
Mam polskiego Excela. W kolumnie A (A2:A500) są daty sprzedaży, w kolumnie B (B2:B500) kwoty. Podaj jedną formułę, która zsumuje kwoty tylko z marca 2026. Odpowiedz samą formułą.
Kryteria oceny (spisane przed testem)
DOBRZE: polskie nazwy funkcji (np. SUMA.WARUNKÓW, DATA), średniki jako separatory, przedział obejmuje cały marzec 2026 i nic poza nim. ŹLE: angielskie nazwy (SUMIFS) albo przecinki jako separatory argumentów, albo zły przedział dat.
Werdykt
Wszystkie 6 odpowiedzi to ta sama formuła, znak w znak: polskie nazwy funkcji (SUMA.WARUNKÓW, DATA), średniki i przedział od 1 marca 2026 do dnia przed 1 kwietnia 2026, czyli cały marzec.
Pełne odpowiedzi: 3 przebiegi na model
GPT-6 Astra
Przebieg 1=SUMA.WARUNKÓW(B2:B500;A2:A500;">="&DATA(2026;3;1);A2:A500;"<"&DATA(2026;4;1))
=SUMA.WARUNKÓW(B2:B500;A2:A500;">="&DATA(2026;3;1);A2:A500;"<"&DATA(2026;4;1))Przebieg 2=SUMA.WARUNKÓW(B2:B500;A2:A500;">="&DATA(2026;3;1);A2:A500;"<"&DATA(2026;4;1))
=SUMA.WARUNKÓW(B2:B500;A2:A500;">="&DATA(2026;3;1);A2:A500;"<"&DATA(2026;4;1))Przebieg 3=SUMA.WARUNKÓW(B2:B500;A2:A500;">="&DATA(2026;3;1);A2:A500;"<"&DATA(2026;4;1))
=SUMA.WARUNKÓW(B2:B500;A2:A500;">="&DATA(2026;3;1);A2:A500;"<"&DATA(2026;4;1))GPT-5.6
Przebieg 1=SUMA.WARUNKÓW(B2:B500;A2:A500;">="&DATA(2026;3;1);A2:A500;"<"&DATA(2026;4;1))
=SUMA.WARUNKÓW(B2:B500;A2:A500;">="&DATA(2026;3;1);A2:A500;"<"&DATA(2026;4;1))Przebieg 2=SUMA.WARUNKÓW(B2:B500;A2:A500;">="&DATA(2026;3;1);A2:A500;"<"&DATA(2026;4;1))
=SUMA.WARUNKÓW(B2:B500;A2:A500;">="&DATA(2026;3;1);A2:A500;"<"&DATA(2026;4;1))Przebieg 3=SUMA.WARUNKÓW(B2:B500;A2:A500;">="&DATA(2026;3;1);A2:A500;"<"&DATA(2026;4;1))
=SUMA.WARUNKÓW(B2:B500;A2:A500;">="&DATA(2026;3;1);A2:A500;"<"&DATA(2026;4;1))Niejasne polecenie: długi weekend
RemisPolecenie, dosłownie
Zaplanuj mi wyjazd na długi weekend listopadowy.
Kryteria oceny (spisane przed testem)
Polecenie jest niejasne (skąd, dokąd, z kim, budżet), a 11 listopada 2026 wypada w ŚRODĘ, więc „długiego weekendu” nie ma bez urlopu. DOBRZE: dopytuje o kluczowe rzeczy LUB jawnie zakłada i to mówi; bonus za zauważenie środy. ŹLE: błędny dzień tygodnia albo plan na nieistniejący długi weekend podany jako oczywisty.
Werdykt
Oba modele poradziły sobie według kryteriów we wszystkich 6 odpowiedziach. GPT-5.6 za każdym razem odpisał samą listą pytań (6 albo 7 punktów). Astra 2 razy podsunęła kierunki i dopytała, a raz rozpisała 4-dniowy plan w Krakowie i napisała wprost, co założyła („Przyjmuję roboczo…”).
Haczyk, którego nie złapał żaden: 11 listopada 2026 r. wypada w środę, więc bez wzięcia urlopu długiego weekendu nie ma. Nikt nie dostał za to dodatkowego punktu. Oba modele dopytywały za to o rok albo termin.
Pełne odpowiedzi: 3 przebiegi na model
GPT-6 Astra
Przebieg 1Jasne! W listopadzie warto zaplanować wyjazd tak, żeby był udany również przy deszczu i krótki…
Jasne! W listopadzie warto zaplanować wyjazd tak, żeby był udany również przy deszczu i krótkim dniu. Na początek proponuję trzy kierunki:
- •Kraków — zwiedzanie i jedzenie: Kazimierz, muzea, kawiarnie, a przy dobrej pogodzie spacer nad Wisłą.
- •Kotlina Kłodzka — spokojny odpoczynek: uzdrowiska, spa i krótkie trasy spacerowe dopasowane do pogody.
- •Wrocław — miejski weekend: Rynek, Ostrów Tumski, Hydropolis i dużo możliwości spędzenia czasu pod dachem.
Żeby ułożyć Ci konkretny plan dzień po dniu, napisz:
- 1.W którym roku i na jakie daty planujesz wyjazd — okolice 1 czy 11 listopada?
- 2.Skąd ruszasz i czym — samochodem, pociągiem czy samolotem?
- 3.Ile osób jedzie i jaki jest łączny budżet?
- 4.Wolisz zwiedzanie, naturę czy relaks? Polska czy także zagranica?
Możesz odpowiedzieć jednym zdaniem, np.: „7–11 listopada 2026, z Warszawy pociągiem, dwie osoby, 2500 zł, zwiedzanie i dobre jedzenie”.
Surowy tekst z API (Markdown)
Jasne! W listopadzie warto zaplanować wyjazd tak, żeby był udany również przy deszczu i krótkim dniu. Na początek proponuję trzy kierunki:
- **Kraków — zwiedzanie i jedzenie:** Kazimierz, muzea, kawiarnie, a przy dobrej pogodzie spacer nad Wisłą.
- **Kotlina Kłodzka — spokojny odpoczynek:** uzdrowiska, spa i krótkie trasy spacerowe dopasowane do pogody.
- **Wrocław — miejski weekend:** Rynek, Ostrów Tumski, Hydropolis i dużo możliwości spędzenia czasu pod dachem.
Żeby ułożyć Ci konkretny plan dzień po dniu, napisz:
1. **W którym roku i na jakie daty** planujesz wyjazd — okolice 1 czy 11 listopada?
2. **Skąd ruszasz i czym** — samochodem, pociągiem czy samolotem?
3. **Ile osób jedzie i jaki jest łączny budżet?**
4. Wolisz **zwiedzanie, naturę czy relaks**? Polska czy także zagranica?
Możesz odpowiedzieć jednym zdaniem, np.: „7–11 listopada 2026, z Warszawy pociągiem, dwie osoby, 2500 zł, zwiedzanie i dobre jedzenie”.Przebieg 2Jasne! Wolisz zwiedzanie miasta, naturę czy odpoczynek w spa ? Na listopad warto wybrać miejsc…
Jasne! Wolisz zwiedzanie miasta, naturę czy odpoczynek w spa? Na listopad warto wybrać miejsce, które ma coś do zaoferowania również przy deszczu.
Żeby ułożyć konkretny plan, podaj proszę:
- •Skąd ruszasz i czy w grę wchodzi samochód, pociąg lub samolot?
- •Na jakie daty i ile dni planujesz wyjazd — chodzi o okolice 11 listopada którego roku?
- •Ile osób jedzie i jaki jest orientacyjny budżet na całość?
- •Wolisz Polskę czy zagranicę?
Jeśli nie masz jeszcze pomysłu, rozważyłbym trzy kierunki:
- •Kraków na 3–4 dni — zwiedzanie, muzea i dobre jedzenie; sporo możliwości przy gorszej pogodzie.
- •Kotlina Kłodzka na 4 dni — spacery, uzdrowiska i hotel ze spa; samochód ułatwi poruszanie się.
- •Budapeszt na 4 dni — termy, kawiarnie i zwiedzanie, czyli dobry zestaw na chłodniejszy weekend.
Podaj szczegóły, a rozpiszę wyjazd dzień po dniu, z dojazdem, propozycją okolicy na nocleg i szacunkowym kosztem.
Surowy tekst z API (Markdown)
Jasne! Wolisz **zwiedzanie miasta, naturę czy odpoczynek w spa**? Na listopad warto wybrać miejsce, które ma coś do zaoferowania również przy deszczu.
Żeby ułożyć konkretny plan, podaj proszę:
- **Skąd ruszasz** i czy w grę wchodzi samochód, pociąg lub samolot?
- **Na jakie daty i ile dni** planujesz wyjazd — chodzi o okolice 11 listopada którego roku?
- **Ile osób jedzie** i jaki jest orientacyjny budżet na całość?
- Wolisz **Polskę czy zagranicę**?
Jeśli nie masz jeszcze pomysłu, rozważyłbym trzy kierunki:
- **Kraków na 3–4 dni** — zwiedzanie, muzea i dobre jedzenie; sporo możliwości przy gorszej pogodzie.
- **Kotlina Kłodzka na 4 dni** — spacery, uzdrowiska i hotel ze spa; samochód ułatwi poruszanie się.
- **Budapeszt na 4 dni** — termy, kawiarnie i zwiedzanie, czyli dobry zestaw na chłodniejszy weekend.
Podaj szczegóły, a rozpiszę wyjazd dzień po dniu, z dojazdem, propozycją okolicy na nocleg i szacunkowym kosztem.Przebieg 3Jasne! Na początek proponuję 4 dni w Krakowie — w okolicach 11 listopada. To dobry kierunek na…
Jasne! Na początek proponuję 4 dni w Krakowie — w okolicach 11 listopada. To dobry kierunek na listopad: można połączyć spacery z muzeami, kawiarniami i dobrym jedzeniem, a deszcz nie musi zepsuć wyjazdu. Przyjmuję roboczo wyjazd po Polsce, w spokojnym tempie i ze średnim budżetem.
Plan na cztery dni
Dzień 1 — przyjazd i Stare Miasto
- •Przyjazd i zakwaterowanie, najlepiej w okolicy Starego Miasta lub Kazimierza.
- •Spacer po Rynku i Plantach, jeśli pogoda pozwoli.
- •Kolacja i spokojny wieczór, bez napiętego programu.
Dzień 2 — Wawel i Kazimierz
- •Rano zwiedzanie wybranej wystawy na Wawelu — bilety warto zarezerwować wcześniej.
- •Obiad i spacer po Kazimierzu.
- •Wieczorem koncert lub kolacja; konkretne wydarzenie dobierzemy do dat.
Dzień 3 — wycieczka do Wieliczki
- •Zwiedzanie kopalni soli jako atrakcja niezależna od pogody. Warto uwzględnić sporo chodzenia i schody.
- •Po powrocie odpoczynek i luźny wieczór.
- •Alternatywa bez wyjazdu z miasta: Podziemia Rynku i kawiarnie.
Dzień 4 — spokojny poranek i powrót
- •Późne śniadanie.
- •Krótki spacer nad Wisłą albo muzeum, zależnie od pogody i godziny wyjazdu.
- •Powrót po południu.
Orientacyjny budżet
Na osobę, przy dwóch osobach dzielących pokój i trzech noclegach:
- •noclegi: 450–900 zł,
- •jedzenie: 300–500 zł,
- •atrakcje i komunikacja lokalna: 200–350 zł.
Łącznie: około 950–1750 zł + dojazd. To szacunek, nie sprawdzona oferta. W okolicach święta ceny mogą wzrosnąć, a godziny otwarcia atrakcji wymagać weryfikacji.
Żeby dopasować plan do Ciebie, napisz: w którym roku i na ile dni chcesz jechać, skąd ruszasz, ile osób jedzie oraz jaki macie budżet. Wolisz miasto, góry, odpoczynek w SPA czy wyjazd za granicę?
Surowy tekst z API (Markdown)
Jasne! **Na początek proponuję 4 dni w Krakowie — w okolicach 11 listopada.** To dobry kierunek na listopad: można połączyć spacery z muzeami, kawiarniami i dobrym jedzeniem, a deszcz nie musi zepsuć wyjazdu. Przyjmuję roboczo wyjazd po Polsce, w spokojnym tempie i ze średnim budżetem.
### Plan na cztery dni
**Dzień 1 — przyjazd i Stare Miasto**
- Przyjazd i zakwaterowanie, najlepiej w okolicy Starego Miasta lub Kazimierza.
- Spacer po Rynku i Plantach, jeśli pogoda pozwoli.
- Kolacja i spokojny wieczór, bez napiętego programu.
**Dzień 2 — Wawel i Kazimierz**
- Rano zwiedzanie wybranej wystawy na Wawelu — bilety warto zarezerwować wcześniej.
- Obiad i spacer po Kazimierzu.
- Wieczorem koncert lub kolacja; konkretne wydarzenie dobierzemy do dat.
**Dzień 3 — wycieczka do Wieliczki**
- Zwiedzanie kopalni soli jako atrakcja niezależna od pogody. Warto uwzględnić sporo chodzenia i schody.
- Po powrocie odpoczynek i luźny wieczór.
- Alternatywa bez wyjazdu z miasta: Podziemia Rynku i kawiarnie.
**Dzień 4 — spokojny poranek i powrót**
- Późne śniadanie.
- Krótki spacer nad Wisłą albo muzeum, zależnie od pogody i godziny wyjazdu.
- Powrót po południu.
### Orientacyjny budżet
**Na osobę, przy dwóch osobach dzielących pokój i trzech noclegach:**
- noclegi: 450–900 zł,
- jedzenie: 300–500 zł,
- atrakcje i komunikacja lokalna: 200–350 zł.
**Łącznie: około 950–1750 zł + dojazd.** To szacunek, nie sprawdzona oferta. W okolicach święta ceny mogą wzrosnąć, a godziny otwarcia atrakcji wymagać weryfikacji.
Żeby dopasować plan do Ciebie, napisz: **w którym roku i na ile dni chcesz jechać, skąd ruszasz, ile osób jedzie oraz jaki macie budżet.** Wolisz miasto, góry, odpoczynek w SPA czy wyjazd za granicę?GPT-5.6
Przebieg 1Jasne! Żeby ułożyć konkretny plan na długi weekend wokół 11 listopada , podaj proszę: Rok i do…
Jasne! Żeby ułożyć konkretny plan na długi weekend wokół 11 listopada, podaj proszę:
- 1.Rok i dokładne daty wyjazdu
- 2.Miasto wyjazdu
- 3.Liczbę osób, w tym ewentualnie dzieci
- 4.Budżet na osobę lub całość
- 5.Preferencje: Polska czy zagranica, zwiedzanie, góry, termy, SPA, natura, jedzenie?
- 6.Transport: samochód, pociąg czy samolot?
- 7.Standard noclegu i ewentualne ograniczenia
Możesz odpisać skrótowo, np.:
„6–11 listopada 2026, z Warszawy, 2 osoby, do 4000 zł, zagranica, samolot, zwiedzanie i dobre jedzenie.”
Na tej podstawie przygotuję trasę dzień po dniu, transport, noclegi, atrakcje i orientacyjny koszt.
Surowy tekst z API (Markdown)
Jasne! Żeby ułożyć konkretny plan na długi weekend wokół **11 listopada**, podaj proszę:
1. **Rok i dokładne daty** wyjazdu
2. **Miasto wyjazdu**
3. Liczbę osób, w tym ewentualnie dzieci
4. **Budżet** na osobę lub całość
5. Preferencje: **Polska czy zagranica**, zwiedzanie, góry, termy, SPA, natura, jedzenie?
6. Transport: samochód, pociąg czy samolot?
7. Standard noclegu i ewentualne ograniczenia
Możesz odpisać skrótowo, np.:
**„6–11 listopada 2026, z Warszawy, 2 osoby, do 4000 zł, zagranica, samolot, zwiedzanie i dobre jedzenie.”**
Na tej podstawie przygotuję trasę dzień po dniu, transport, noclegi, atrakcje i orientacyjny koszt.Przebieg 2Jasne! Żeby ułożyć konkretny plan na długi weekend listopadowy, podaj proszę: Skąd wyjeżdżasz?…
Jasne! Żeby ułożyć konkretny plan na długi weekend listopadowy, podaj proszę:
- 1.Skąd wyjeżdżasz?
- 2.Ile dni i jaki termin? Czy chodzi o okolice 11 listopada 2026?
- 3.Ile osób jedzie? Dorośli/dzieci?
- 4.Budżet na osobę lub łącznie?
- 5.Preferencje: miasto i zwiedzanie, góry, SPA/relaks, natura czy cieplejszy kierunek za granicą?
- 6.Transport: samochód, pociąg czy samolot?
Na tej podstawie przygotuję trasę dzień po dniu, propozycje noclegów, transportu, atrakcji oraz orientacyjny koszt.
Surowy tekst z API (Markdown)
Jasne! Żeby ułożyć konkretny plan na długi weekend listopadowy, podaj proszę:
1. **Skąd wyjeżdżasz?**
2. **Ile dni i jaki termin?** Czy chodzi o okolice **11 listopada 2026**?
3. **Ile osób jedzie?** Dorośli/dzieci?
4. **Budżet** na osobę lub łącznie?
5. **Preferencje:** miasto i zwiedzanie, góry, SPA/relaks, natura czy cieplejszy kierunek za granicą?
6. **Transport:** samochód, pociąg czy samolot?
Na tej podstawie przygotuję trasę dzień po dniu, propozycje noclegów, transportu, atrakcji oraz orientacyjny koszt.Przebieg 3Chętnie! Żeby przygotować konkretny plan, podaj proszę: Rok i termin – chodzi o weekend wokół…
Chętnie! Żeby przygotować konkretny plan, podaj proszę:
- 1.Rok i termin – chodzi o weekend wokół 11 listopada? Na ile dni?
- 2.Miejsce wyjazdu i maksymalny czas dojazdu.
- 3.Liczba osób i ewentualnie dzieci.
- 4.Budżet na osobę lub całość.
- 5.Transport – auto, pociąg czy samolot.
- 6.Kierunek – Polska czy zagranica.
- 7.Styl wyjazdu – zwiedzanie, góry, termy/spa, natura, jedzenie, imprezy czy spokojny odpoczynek.
Możesz odpisać skrótowo, np.:
„7–11 listopada, z Warszawy, 2 osoby, do 3000 zł, auto, góry + spa”. Na tej podstawie ułożę trasę dzień po dniu, noclegi, atrakcje i orientacyjny koszt.
Surowy tekst z API (Markdown)
Chętnie! Żeby przygotować konkretny plan, podaj proszę:
1. **Rok i termin** – chodzi o weekend wokół **11 listopada**? Na ile dni?
2. **Miejsce wyjazdu** i maksymalny czas dojazdu.
3. **Liczba osób** i ewentualnie dzieci.
4. **Budżet** na osobę lub całość.
5. **Transport** – auto, pociąg czy samolot.
6. **Kierunek** – Polska czy zagranica.
7. **Styl wyjazdu** – zwiedzanie, góry, termy/spa, natura, jedzenie, imprezy czy spokojny odpoczynek.
Możesz odpisać skrótowo, np.:
**„7–11 listopada, z Warszawy, 2 osoby, do 3000 zł, auto, góry + spa”**. Na tej podstawie ułożę trasę dzień po dniu, noclegi, atrakcje i orientacyjny koszt.Zagadka z dwoma rozwiązaniami
RemisPolecenie, dosłownie
Ania, Bartek, Celina, Darek i Ewa odbierają Zosię ze szkoły — każde w inny dzień od poniedziałku do piątku. Bartek odbiera dzień po Ani. Celina nie odbiera w poniedziałek ani w piątek. Darek odbiera wcześniej w tygodniu niż Celina. Ewa odbiera dzień przed Darkiem albo dzień po nim. Ania nie odbiera w poniedziałek. Ułóż cały grafik.
Kryteria oceny (spisane przed testem)
Zagadka ma DWA rozwiązania (sprawdzone przeszukaniem wszystkich 120 ustawień): Ania czw, Bartek pt, Celina śr, a Darek i Ewa pon/wt w dowolnej kolejności. DOBRZE: zauważa, że są dwa rozwiązania. ŹLE: podaje jeden grafik jako jedyny.
Werdykt
Zagadka ma dwa rozwiązania. Sprawdziłem to, przeglądając wszystkie 120 możliwych ustawień: Ania w czwartek, Bartek w piątek, Celina w środę, a Darek i Ewa w poniedziałek i wtorek, w dowolnej kolejności.
Wszystkie 6 odpowiedzi to zauważyło i pokazało oba warianty.
Pełne odpowiedzi: 3 przebiegi na model
GPT-6 Astra
Przebieg 1Z podanych warunków wynikają dwa możliwe grafiki : Dzień Wariant 1 Wariant 2 --- --- --- Ponie…
Z podanych warunków wynikają dwa możliwe grafiki:
| Dzień | Wariant 1 | Wariant 2 |
|---|---|---|
| Poniedziałek | Darek | Ewa |
| Wtorek | Ewa | Darek |
| Środa | Celina | Celina |
| Czwartek | Ania | Ania |
| Piątek | Bartek | Bartek |
Ania i Bartek muszą odbierać w czwartek i piątek — wcześniejsze pary dni nie pozwalają spełnić pozostałych warunków. Celinie przypada więc środa, a Darkowi i Ewie poniedziałek oraz wtorek, w dowolnej kolejności.
Aby wskazać jeden jednoznaczny grafik, potrzebny jest dodatkowy warunek rozstrzygający kolejność Darka i Ewy.
Surowy tekst z API (Markdown)
Z podanych warunków wynikają **dwa możliwe grafiki**:
| Dzień | Wariant 1 | Wariant 2 |
|---|---|---|
| Poniedziałek | Darek | Ewa |
| Wtorek | Ewa | Darek |
| Środa | Celina | Celina |
| Czwartek | Ania | Ania |
| Piątek | Bartek | Bartek |
Ania i Bartek muszą odbierać w czwartek i piątek — wcześniejsze pary dni nie pozwalają spełnić pozostałych warunków. Celinie przypada więc środa, a Darkowi i Ewie poniedziałek oraz wtorek, **w dowolnej kolejności**.
Aby wskazać jeden jednoznaczny grafik, potrzebny jest dodatkowy warunek rozstrzygający kolejność Darka i Ewy.Przebieg 2Warunki pozwalają na dwa poprawne grafiki — nie da się jednoznacznie ustalić kolejności Darka…
Warunki pozwalają na dwa poprawne grafiki — nie da się jednoznacznie ustalić kolejności Darka i Ewy.
| Dzień | Grafik 1 | Grafik 2 |
|---|---|---|
| Poniedziałek | Darek | Ewa |
| Wtorek | Ewa | Darek |
| Środa | Celina | Celina |
| Czwartek | Ania | Ania |
| Piątek | Bartek | Bartek |
W obu grafikach Bartek odbiera dzień po Ani, Darek wcześniej niż Celina, a Ewa w dniu sąsiadującym z dniem Darka. Pozostałe warunki również są spełnione.
Aby wybrać jeden grafik, potrzebna jest dodatkowa wskazówka.
Surowy tekst z API (Markdown)
Warunki pozwalają na **dwa poprawne grafiki** — nie da się jednoznacznie ustalić kolejności Darka i Ewy.
| Dzień | Grafik 1 | Grafik 2 |
|---|---|---|
| Poniedziałek | Darek | Ewa |
| Wtorek | Ewa | Darek |
| Środa | Celina | Celina |
| Czwartek | Ania | Ania |
| Piątek | Bartek | Bartek |
W obu grafikach Bartek odbiera dzień po Ani, Darek wcześniej niż Celina, a Ewa w dniu sąsiadującym z dniem Darka. Pozostałe warunki również są spełnione.
Aby wybrać jeden grafik, potrzebna jest dodatkowa wskazówka.Przebieg 3Warunki pozwalają na dwa poprawne grafiki , więc nie da się wskazać jednego rozwiązania: Dzień…
Warunki pozwalają na dwa poprawne grafiki, więc nie da się wskazać jednego rozwiązania:
| Dzień | Grafik 1 | Grafik 2 |
|---|---|---|
| Poniedziałek | Darek | Ewa |
| Wtorek | Ewa | Darek |
| Środa | Celina | Celina |
| Czwartek | Ania | Ania |
| Piątek | Bartek | Bartek |
W obu grafikach Bartek odbiera dzień po Ani, Darek wcześniej niż Celina, a Ewa w dniu sąsiadującym z dniem Darka. Pozostałe warunki również są spełnione.
Do jednoznacznego ustalenia grafiku potrzeba dodatkowej wskazówki, np. czy Ewa odbiera przed, czy po Darku.
Surowy tekst z API (Markdown)
Warunki pozwalają na **dwa poprawne grafiki**, więc nie da się wskazać jednego rozwiązania:
| Dzień | Grafik 1 | Grafik 2 |
|---|---|---|
| Poniedziałek | Darek | Ewa |
| Wtorek | Ewa | Darek |
| Środa | Celina | Celina |
| Czwartek | Ania | Ania |
| Piątek | Bartek | Bartek |
W obu grafikach Bartek odbiera dzień po Ani, Darek wcześniej niż Celina, a Ewa w dniu sąsiadującym z dniem Darka. Pozostałe warunki również są spełnione.
Do jednoznacznego ustalenia grafiku potrzeba dodatkowej wskazówki, np. czy Ewa odbiera **przed**, czy **po** Darku.GPT-5.6
Przebieg 1Podane informacje nie wyznaczają jednego grafiku — są dwa możliwe rozwiązania : Dzień Wariant…
Podane informacje nie wyznaczają jednego grafiku — są dwa możliwe rozwiązania:
| Dzień | Wariant 1 | Wariant 2 |
|---|---|---|
| Poniedziałek | Darek | Ewa |
| Wtorek | Ewa | Darek |
| Środa | Celina | Celina |
| Czwartek | Ania | Ania |
| Piątek | Bartek | Bartek |
W obu wariantach Bartek odbiera dzień po Ani, Darek wcześniej niż Celina, a Ewa dzień przed Darkiem albo dzień po nim. Potrzebna jest jeszcze jedna wskazówka, aby ustalić jednoznaczny grafik.
Surowy tekst z API (Markdown)
Podane informacje nie wyznaczają jednego grafiku — są **dwa możliwe rozwiązania**:
| Dzień | Wariant 1 | Wariant 2 |
|---|---|---|
| Poniedziałek | Darek | Ewa |
| Wtorek | Ewa | Darek |
| Środa | Celina | Celina |
| Czwartek | Ania | Ania |
| Piątek | Bartek | Bartek |
W obu wariantach Bartek odbiera dzień po Ani, Darek wcześniej niż Celina, a Ewa dzień przed Darkiem albo dzień po nim. Potrzebna jest jeszcze jedna wskazówka, aby ustalić jednoznaczny grafik.Przebieg 2Podane warunki nie wyznaczają jednego grafiku — są dwa możliwe rozwiązania : Dzień Wariant 1 W…
Podane warunki nie wyznaczają jednego grafiku — są dwa możliwe rozwiązania:
| Dzień | Wariant 1 | Wariant 2 |
|---|---|---|
| Poniedziałek | Darek | Ewa |
| Wtorek | Ewa | Darek |
| Środa | Celina | Celina |
| Czwartek | Ania | Ania |
| Piątek | Bartek | Bartek |
We wszystkich przypadkach Ania odbiera w czwartek, Bartek dzień później, a Celina w środę. Nie da się jednak ustalić kolejności Darka i Ewy w poniedziałek i wtorek bez dodatkowej wskazówki.
Surowy tekst z API (Markdown)
Podane warunki nie wyznaczają jednego grafiku — są **dwa możliwe rozwiązania**:
| Dzień | Wariant 1 | Wariant 2 |
|---|---|---|
| Poniedziałek | Darek | Ewa |
| Wtorek | Ewa | Darek |
| Środa | Celina | Celina |
| Czwartek | Ania | Ania |
| Piątek | Bartek | Bartek |
We wszystkich przypadkach Ania odbiera w czwartek, Bartek dzień później, a Celina w środę. Nie da się jednak ustalić kolejności Darka i Ewy w poniedziałek i wtorek bez dodatkowej wskazówki.Przebieg 3Z podanych warunków wynikają dwa możliwe grafiki : Dzień Wariant 1 Wariant 2 --- --- --- Ponie…
Z podanych warunków wynikają dwa możliwe grafiki:
| Dzień | Wariant 1 | Wariant 2 |
|---|---|---|
| Poniedziałek | Darek | Ewa |
| Wtorek | Ewa | Darek |
| Środa | Celina | Celina |
| Czwartek | Ania | Ania |
| Piątek | Bartek | Bartek |
Nie da się rozstrzygnąć kolejności Darka i Ewy. Aby grafik był jednoznaczny, potrzebny jest jeszcze jeden warunek.
Surowy tekst z API (Markdown)
Z podanych warunków wynikają **dwa możliwe grafiki**:
| Dzień | Wariant 1 | Wariant 2 |
|---|---|---|
| Poniedziałek | Darek | Ewa |
| Wtorek | Ewa | Darek |
| Środa | Celina | Celina |
| Czwartek | Ania | Ania |
| Piątek | Bartek | Bartek |
Nie da się rozstrzygnąć kolejności Darka i Ewy. Aby grafik był jednoznaczny, potrzebny jest jeszcze jeden warunek.Zmiana polecenia w trakcie
RemisPolecenie, dosłownie
Napisz ogłoszenie na OLX: sprzedam rower miejski Kross, 3 lata, 900 zł, Kraków. Maksymalnie 300 znaków, bez emotek i bez wykrzykników.
Dodaj jeszcze, że w cenie jest kask i lampki.
Kryteria oceny (spisane przed testem)
Ocenia się DRUGĄ odpowiedź, automatem: ≤ 300 znaków, zero emotek, zero „!”, zawiera kask i lampki, nadal zawiera 900 zł i Kraków. DOBRZE = wszystko spełnione.
Werdykt
Oceniana jest druga odpowiedź, czyli ta po dopisaniu kasku i lampek. Wszystkie 6 spełnia warunki: najwyżej 300 znaków, bez emotek i wykrzykników, jest kask, lampki, 900 zł i Kraków.
Astra 3 razy napisała słowo w słowo to samo ogłoszenie (145 znaków). GPT-5.6 za każdym razem napisał trochę inne (184, 170 i 164 znaki).
Pełne odpowiedzi: 3 przebiegi na model
GPT-6 Astra
Przebieg 1Sprzedam 3-letni rower miejski Kross. W cenie kask i lampki. Cena: 900 zł. Lokalizacja: Kraków…
Sprzedam 3-letni rower miejski Kross. Cena: 900 zł. Lokalizacja: Kraków. Zainteresowanych zapraszam do kontaktu przez OLX.
Surowy tekst z API (Markdown)
Sprzedam 3-letni rower miejski Kross. Cena: 900 zł. Lokalizacja: Kraków. Zainteresowanych zapraszam do kontaktu przez OLX.Sprzedam 3-letni rower miejski Kross. W cenie kask i lampki. Cena: 900 zł. Lokalizacja: Kraków. Zainteresowanych zapraszam do kontaktu przez OLX.
Surowy tekst z API (Markdown)
Sprzedam 3-letni rower miejski Kross. W cenie kask i lampki. Cena: 900 zł. Lokalizacja: Kraków. Zainteresowanych zapraszam do kontaktu przez OLX.Przebieg 2Sprzedam 3-letni rower miejski Kross. W cenie kask i lampki. Cena: 900 zł. Lokalizacja: Kraków…
Sprzedam 3-letni rower miejski Kross. Cena: 900 zł. Lokalizacja: Kraków. Zainteresowanych zapraszam do kontaktu przez OLX.
Surowy tekst z API (Markdown)
Sprzedam 3-letni rower miejski Kross. Cena: 900 zł. Lokalizacja: Kraków. Zainteresowanych zapraszam do kontaktu przez OLX.Sprzedam 3-letni rower miejski Kross. W cenie kask i lampki. Cena: 900 zł. Lokalizacja: Kraków. Zainteresowanych zapraszam do kontaktu przez OLX.
Surowy tekst z API (Markdown)
Sprzedam 3-letni rower miejski Kross. W cenie kask i lampki. Cena: 900 zł. Lokalizacja: Kraków. Zainteresowanych zapraszam do kontaktu przez OLX.Przebieg 3Sprzedam 3-letni rower miejski Kross. W cenie kask i lampki. Cena: 900 zł. Lokalizacja: Kraków…
Sprzedam 3-letni rower miejski Kross. Cena: 900 zł. Lokalizacja: Kraków. Zainteresowanych zapraszam do kontaktu przez OLX.
Surowy tekst z API (Markdown)
Sprzedam 3-letni rower miejski Kross. Cena: 900 zł. Lokalizacja: Kraków. Zainteresowanych zapraszam do kontaktu przez OLX.Sprzedam 3-letni rower miejski Kross. W cenie kask i lampki. Cena: 900 zł. Lokalizacja: Kraków. Zainteresowanych zapraszam do kontaktu przez OLX.
Surowy tekst z API (Markdown)
Sprzedam 3-letni rower miejski Kross. W cenie kask i lampki. Cena: 900 zł. Lokalizacja: Kraków. Zainteresowanych zapraszam do kontaktu przez OLX.GPT-5.6
Przebieg 1Sprzedam rower miejski Kross, użytkowany przez 3 lata. Sprawny, wygodny, idealny do codziennej…
Sprzedam rower miejski Kross, użytkowany przez 3 lata. Rower sprawny, wygodny i idealny do codziennej jazdy po mieście. Cena: 900 zł. Odbiór osobisty w Krakowie. Zainteresowanych proszę o kontakt.
Surowy tekst z API (Markdown)
Sprzedam rower miejski Kross, użytkowany przez 3 lata. Rower sprawny, wygodny i idealny do codziennej jazdy po mieście. Cena: 900 zł. Odbiór osobisty w Krakowie. Zainteresowanych proszę o kontakt.Sprzedam rower miejski Kross, użytkowany przez 3 lata. Sprawny, wygodny, idealny do codziennej jazdy. W cenie kask i lampki. Cena: 900 zł. Odbiór osobisty w Krakowie. Proszę o kontakt.
Surowy tekst z API (Markdown)
Sprzedam rower miejski Kross, użytkowany przez 3 lata. Sprawny, wygodny, idealny do codziennej jazdy. W cenie kask i lampki. Cena: 900 zł. Odbiór osobisty w Krakowie. Proszę o kontakt.Przebieg 2Sprzedam rower miejski marki Kross, użytkowany przez 3 lata. W cenie kask i lampki. Cena: 900…
Sprzedam rower miejski marki Kross, użytkowany przez 3 lata. Cena: 900 zł. Odbiór osobisty w Krakowie. Zainteresowanych proszę o kontakt przez OLX.
Surowy tekst z API (Markdown)
Sprzedam rower miejski marki Kross, użytkowany przez 3 lata. Cena: 900 zł. Odbiór osobisty w Krakowie. Zainteresowanych proszę o kontakt przez OLX.Sprzedam rower miejski marki Kross, użytkowany przez 3 lata. W cenie kask i lampki. Cena: 900 zł. Odbiór osobisty w Krakowie. Zainteresowanych proszę o kontakt przez OLX.
Surowy tekst z API (Markdown)
Sprzedam rower miejski marki Kross, użytkowany przez 3 lata. W cenie kask i lampki. Cena: 900 zł. Odbiór osobisty w Krakowie. Zainteresowanych proszę o kontakt przez OLX.Przebieg 3Sprzedam rower miejski Kross, użytkowany przez 3 lata. Sprawny, w dobrym stanie. W cenie kask…
Sprzedam rower miejski Kross, użytkowany przez 3 lata. Rower jest sprawny i w dobrym stanie. Cena: 900 zł. Odbiór osobisty w Krakowie. Zainteresowanych proszę o kontakt przez OLX.
Surowy tekst z API (Markdown)
Sprzedam rower miejski Kross, użytkowany przez 3 lata. Rower jest sprawny i w dobrym stanie. Cena: 900 zł. Odbiór osobisty w Krakowie. Zainteresowanych proszę o kontakt przez OLX.Sprzedam rower miejski Kross, użytkowany przez 3 lata. Sprawny, w dobrym stanie. W cenie kask i lampki. Cena: 900 zł. Odbiór osobisty w Krakowie. Kontakt przez OLX.
Surowy tekst z API (Markdown)
Sprzedam rower miejski Kross, użytkowany przez 3 lata. Sprawny, w dobrym stanie. W cenie kask i lampki. Cena: 900 zł. Odbiór osobisty w Krakowie. Kontakt przez OLX.Szczegóły w raporcie na 190 tys. znaków
RemisPolecenie, dosłownie
Poniżej jest pełny tekst raportu bezpieczeństwa OpenAI (po angielsku). Odpowiedz po polsku, wyłącznie na podstawie tego tekstu:
1) W teście Apollo Research ile razy Astra sfałszowała etykiety danych i na ile uruchomień? A GPT-5.6 Sol?
2) Ile wyzwań zawiera ExploitGym i ile z nich dotyczy jądra Linuksa?
=== RAPORT ===
[tu był wklejony cały dokument: 192 909 znaków; opis niżej]Kryteria oceny (spisane przed testem)
Odpowiedzi w tekście: Astra 17 na 10 000 (0,17%), Sol 36 na 100 (36%); ExploitGym 869 wyzwań, 186 dotyczy jądra Linuksa. Pułapka: Sol ma inną skalę (na 100, nie na 10 000). DOBRZE = wszystkie 4 liczby i obie skale poprawnie. Częściowo = część liczb.
Werdykt
Wszystkie 6 odpowiedzi podało poprawnie 4 liczby i nie pomyliło skal: Astra 17 na 10 000 uruchomień, GPT-5.6 36 na 100; ExploitGym ma 869 wyzwań, z czego 186 dotyczy jądra Linuksa.
Różnica jest w cenie: jedno takie pytanie kosztowało według cennika API ok. 0,40 $ (1,50 zł) z Astrą i ok. 0,16 $ (0,60 zł) z GPT-5.6.
Pełne odpowiedzi: 3 przebiegi na model
GPT-6 Astra
Przebieg 1Test Apollo Research (sekcja 8.8.1): Astra: sfałszowała etykiety danych w 17 z 10 000 uruchomi…
- 1)Test Apollo Research (sekcja 8.8.1):
- •Astra: sfałszowała etykiety danych w 17 z 10 000 uruchomień bazowych (0,17%).
- •GPT-5.6 Sol: w 36 ze 100 uruchomień (36%).
- 2)ExploitGym zawiera 869 wyzwań, z czego 186 dotyczy jądra Linuksa.
Surowy tekst z API (Markdown)
1) **Test Apollo Research** (sekcja 8.8.1):
- **Astra:** sfałszowała etykiety danych w **17 z 10 000 uruchomień bazowych (0,17%)**.
- **GPT-5.6 Sol:** w **36 ze 100 uruchomień (36%)**.
2) **ExploitGym** zawiera **869 wyzwań**, z czego **186 dotyczy jądra Linuksa**.Przebieg 2Test Apollo Research (sekcja 8.8.1): Astra: sfałszowała etykiety danych w 17 z 10 000 uruchomi…
- 1)Test Apollo Research (sekcja 8.8.1):
- •Astra: sfałszowała etykiety danych w 17 z 10 000 uruchomień bazowych (0,17%).
- •GPT-5.6 Sol: w 36 ze 100 uruchomień (36%).
- 2)ExploitGym: zawiera 869 wyzwań, z czego 186 dotyczy jądra Linuksa.
Surowy tekst z API (Markdown)
1) **Test Apollo Research** (sekcja 8.8.1):
- **Astra:** sfałszowała etykiety danych w **17 z 10 000 uruchomień bazowych** (0,17%).
- **GPT-5.6 Sol:** w **36 ze 100 uruchomień** (36%).
2) **ExploitGym:** zawiera **869 wyzwań**, z czego **186 dotyczy jądra Linuksa**.Przebieg 3Test Apollo Research (sekcja 8.8.1): Astra: sfałszowała etykiety danych w 17 z 10 000 uruchomi…
- 1.Test Apollo Research (sekcja 8.8.1):
- •Astra: sfałszowała etykiety danych w 17 z 10 000 uruchomień bazowych (0,17%).
- •GPT-5.6 Sol: w 36 ze 100 uruchomień (36%).
- 2.ExploitGym: zawiera 869 wyzwań, z czego 186 dotyczy jądra Linuksa.
Surowy tekst z API (Markdown)
1. **Test Apollo Research** (sekcja 8.8.1):
- **Astra:** sfałszowała etykiety danych w **17 z 10 000 uruchomień bazowych** (0,17%).
- **GPT-5.6 Sol:** w **36 ze 100 uruchomień** (36%).
2. **ExploitGym:** zawiera **869 wyzwań**, z czego **186 dotyczy jądra Linuksa**.GPT-5.6
Przebieg 1W teście Apollo Research: GPT-6 Astra: sfałszowała etykiety 17 razy na 10 000 uruchomień (0,17…
- 1.W teście Apollo Research:
- •GPT-6 Astra: sfałszowała etykiety 17 razy na 10 000 uruchomień (0,17%).
- •GPT-5.6 Sol: 36 razy na 100 uruchomień (36%).
- 2.ExploitGym zawiera 869 wyzwań, z czego 186 dotyczy jądra Linuksa.
Surowy tekst z API (Markdown)
1. W teście Apollo Research:
- **GPT-6 Astra:** sfałszowała etykiety **17 razy na 10 000 uruchomień** (0,17%).
- **GPT-5.6 Sol:** **36 razy na 100 uruchomień** (36%).
2. **ExploitGym zawiera 869 wyzwań**, z czego **186 dotyczy jądra Linuksa**.Przebieg 2W teście Apollo Research: Astra sfałszowała etykiety 17 razy na 10 000 uruchomień (0,17%). GPT…
- 1.W teście Apollo Research:
- •Astra sfałszowała etykiety 17 razy na 10 000 uruchomień (0,17%).
- •GPT-5.6 Sol — 36 razy na 100 uruchomień (36%).
- 2.ExploitGym zawiera 869 wyzwań, z czego 186 dotyczy jądra Linuksa.
Surowy tekst z API (Markdown)
1. W teście Apollo Research:
- **Astra** sfałszowała etykiety **17 razy na 10 000 uruchomień** (0,17%).
- **GPT-5.6 Sol** — **36 razy na 100 uruchomień** (36%).
2. **ExploitGym zawiera 869 wyzwań**, z czego **186 dotyczy jądra Linuksa**.Przebieg 3W teście Apollo Research: Astra sfałszowała etykiety 17 razy na 10 000 uruchomień (0,17%). GPT…
- 1.W teście Apollo Research:
- •Astra sfałszowała etykiety 17 razy na 10 000 uruchomień (0,17%).
- •GPT-5.6 Sol — 36 razy na 100 uruchomień (36%).
- 2.ExploitGym zawiera 869 wyzwań, z czego 186 dotyczy jądra Linuksa.
Surowy tekst z API (Markdown)
1. W teście Apollo Research:
- **Astra** sfałszowała etykiety **17 razy na 10 000 uruchomień** (0,17%).
- **GPT-5.6 Sol** — **36 razy na 100 uruchomień** (36%).
2. **ExploitGym zawiera 869 wyzwań**, z czego **186 dotyczy jądra Linuksa**.Gra Snake w jednym pliku HTML
Remis według kryteriówPolecenie, dosłownie
Zrób grę Snake w jednym pliku HTML (bez zewnętrznych bibliotek). Polskie napisy, sterowanie strzałkami, licznik punktów i ekran końca gry z przyciskiem „Zagraj jeszcze raz”. Odpowiedz samym kodem.
Kryteria oceny (spisane przed testem)
Sprawdzane automatem (Chrome): strona ładuje się bez błędów w konsoli, strzałka zmienia kierunek, jest licznik punktów, po zderzeniu pojawia się przycisk „Zagraj jeszcze raz” i działa. DOBRZE = wszystko. Częściowo = gra działa, brak któregoś elementu.
Werdykt
Wszystkie 6 gier działa. Każdą sprawdził automat w przeglądarce Chrome: brak błędów w konsoli, jest licznik punktów, ekran końca gry i działający przycisk „Zagraj jeszcze raz”. Według kryteriów to remis.
Sterowanie strzałkami też działa we wszystkich 6 grach. Sprawdziłem je jeszcze raz 17.09.2026 w ramkach na tej stronie, bo w pierwszym automatycznym teście gry GPT-5.6 kończyły się, zanim skrypt zdążył nacisnąć strzałkę.
Poza kryteriami widać różnicę na starcie. Gry GPT-5.6 startują same zaraz po otwarciu: wąż jedzie w prawo i po ok. 1,1 s uderza w ścianę, zanim zdążysz nacisnąć klawisz (startuje w połowie planszy 20 pól i robi krok co 110 ms). Gry Astry czekają, aż klikniesz przycisk startu („Zagraj” albo „Rozpocznij grę”), mają strzałki na ekranie, a jedna zapamiętuje rekord.
Za to Astra pisała każdą grę prawie minutę (53–63 s), a GPT-5.6 ok. 20 s (17–21 s).
Zobacz różnicę bez klikania
Nagrania z przeglądarki, bez montażu i bez przyspieszania. Po lewej gra GPT-5.6 zaraz po otwarciu: nic nie naciskam. Po prawej gra GPT-6 Astra.
Obie gry spełniają kryteria z testu, dlatego w tabeli to remis. Sprawdź sam poniżej: w grze GPT-5.6 naciśnij strzałkę od razu po „Uruchom”.
Zagraj w każdą z 6 gier
Pliki są dokładnie takie, jakie wygenerowały modele, bez żadnych poprawek. Każda gra ładuje się dopiero po kliknięciu „Uruchom”, w odizolowanej ramce (sandbox), która nie ma dostępu do tej strony. Sterowanie: strzałki na klawiaturze. Jeśli strzałki nie działają, kliknij najpierw w grę.
GPT-6 Astra
Czeka, aż klikniesz „Zagraj”. Ma strzałki na ekranie.
Czeka, aż klikniesz „Rozpocznij grę”. Ma strzałki na ekranie.
Czeka, aż klikniesz „Zagraj”. Ma strzałki na ekranie. Zapamiętuje rekord (w tej odizolowanej ramce rekord nie zapisze się na stałe).
GPT-5.6
Startuje sama: wąż jedzie w prawo i po ok. 1,1 s uderza w ścianę. Żeby zdążyć skręcić, naciśnij strzałkę od razu po uruchomieniu. Nie ma przycisków na ekranie, więc bez klawiatury (np. na telefonie) nie da się skręcić.
Startuje sama: wąż jedzie w prawo i po ok. 1,1 s uderza w ścianę. Żeby zdążyć skręcić, naciśnij strzałkę od razu po uruchomieniu. Nie ma przycisków na ekranie, więc bez klawiatury (np. na telefonie) nie da się skręcić.
Startuje sama: wąż jedzie w prawo i po ok. 1,1 s uderza w ścianę. Żeby zdążyć skręcić, naciśnij strzałkę od razu po uruchomieniu. Nie ma przycisków na ekranie, więc bez klawiatury (np. na telefonie) nie da się skręcić.
Pełne odpowiedzi: 3 przebiegi na model
GPT-6 Astra
Przebieg 1kod HTML, 9 555 znaków
Cała odpowiedź to kod poniżej, dosłownie. Ten sam plik uruchamiasz wyżej jako grę 1.
<!DOCTYPE html>
<html lang="pl">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Snake — gra w węża</title>
<style>
:root {
color-scheme: dark;
font-family: system-ui, sans-serif;
background: #0b1020;
color: #eef2ff;
}
* { box-sizing: border-box; }
body {
min-height: 100vh;
min-height: 100dvh;
margin: 0;
padding: 24px 16px;
display: grid;
place-items: center;
background: radial-gradient(ellipse at top, #1e3053, #0b1020 70%);
}
main { width: min(100%, 480px); }
header {
display: flex;
align-items: center;
justify-content: space-between;
gap: 16px;
margin-bottom: 18px;
}
h1 {
margin: 0;
font-size: 32px;
letter-spacing: -1px;
}
h1 span { color: #7de9a0; }
.score {
padding: 10px 18px;
border: 1px solid #334361;
border-radius: 14px;
background: #172238;
font-size: 17px;
}
.score strong { color: #7de9a0; }
.board {
position: relative;
overflow: hidden;
border: 1px solid #334361;
border-radius: 20px;
box-shadow: 0 24px 70px #0005;
}
canvas {
display: block;
width: 100%;
height: auto;
aspect-ratio: 1;
background: #111a2b;
touch-action: none;
}
.overlay {
position: absolute;
inset: 0;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 24px;
text-align: center;
background: #0b1020dc;
backdrop-filter: blur(5px);
}
.overlay[hidden] { display: none; }
h2 { margin: 0 0 10px; font-size: clamp(26px, 7vw, 38px); }
.overlay p {
margin: 0 0 24px;
color: #b9c6df;
line-height: 1.6;
}
button {
border: 0;
border-radius: 12px;
padding: 14px 24px;
background: #7de9a0;
color: #0a2414;
font: inherit;
font-weight: 750;
cursor: pointer;
touch-action: manipulation;
}
button:hover { filter: brightness(1.1); }
button:active { transform: translateY(1px); }
button:focus-visible { outline: 3px solid #fff; outline-offset: 4px; }
.hint {
margin: 18px 0;
text-align: center;
color: #a7b7d3;
font-size: 14px;
line-height: 1.7;
}
.controls {
display: grid;
grid-template-columns: repeat(3, 52px);
justify-content: center;
gap: 7px;
}
.controls button {
padding: 10px;
background: #233451;
color: #eef2ff;
font-size: 22px;
}
.controls button:first-child { grid-column: 2; }
.controls button:nth-child(2) { grid-column: 1; }
</style>
</head>
<body>
<main>
<header>
<h1>Snake<span>.</span></h1>
<div class="score">Punkty: <strong id="score">0</strong></div>
</header>
<div class="board">
<canvas id="canvas" width="480" height="480"
role="img" aria-label="Plansza gry Snake. Steruj wężem za pomocą strzałek.">
Twoja przeglądarka nie obsługuje elementu canvas.
</canvas>
<section class="overlay" id="overlay" aria-labelledby="overlay-title">
<h2 id="overlay-title">Gotowy na przekąskę?</h2>
<p id="message" aria-live="polite">
Zbieraj czerwone owoce.<br>Unikaj ścian i własnego ogona!
</p>
<button id="play" type="button">Zagraj</button>
</section>
</div>
<p class="hint">Sterowanie: strzałki na klawiaturze lub przyciski poniżej.<br>Każdy owoc to 10 punktów.</p>
<nav class="controls" aria-label="Sterowanie wężem">
<button type="button" data-direction="ArrowUp" aria-label="W górę">↑</button>
<button type="button" data-direction="ArrowLeft" aria-label="W lewo">←</button>
<button type="button" data-direction="ArrowDown" aria-label="W dół">↓</button>
<button type="button" data-direction="ArrowRight" aria-label="W prawo">→</button>
</nav>
</main>
<script>
(() => {
"use strict";
const canvas = document.getElementById("canvas");
const ctx = canvas.getContext("2d");
const scoreElement = document.getElementById("score");
const overlay = document.getElementById("overlay");
const title = document.getElementById("overlay-title");
const message = document.getElementById("message");
const playButton = document.getElementById("play");
const size = 20;
const cell = canvas.width / size;
const directions = {
ArrowUp: { x: 0, y: -1 },
ArrowDown: { x: 0, y: 1 },
ArrowLeft: { x: -1, y: 0 },
ArrowRight: { x: 1, y: 0 }
};
let snake, direction, turns, food, score;
let running = false;
let timer = null;
function placeFood() {
const empty = [];
for (let y = 0; y < size; y++) {
for (let x = 0; x < size; x++) {
if (!snake.some(part => part.x === x && part.y === y)) {
empty.push({ x, y });
}
}
}
return empty.length ? empty[Math.floor(Math.random() * empty.length)] : null;
}
function reset() {
snake = [{ x: 9, y: 10 }, { x: 8, y: 10 }, { x: 7, y: 10 }];
direction = directions.ArrowRight;
turns = [];
score = 0;
scoreElement.textContent = score;
food = placeFood();
}
function draw() {
ctx.fillStyle = "#111a2b";
ctx.fillRect(0, 0, canvas.width, canvas.height);
ctx.strokeStyle = "#1a263c";
ctx.lineWidth = 1;
ctx.beginPath();
for (let i = 1; i < size; i++) {
ctx.moveTo(i * cell, 0);
ctx.lineTo(i * cell, canvas.height);
ctx.moveTo(0, i * cell);
ctx.lineTo(canvas.width, i * cell);
}
ctx.stroke();
if (food) {
const x = (food.x + 0.5) * cell;
const y = (food.y + 0.5) * cell;
ctx.shadowColor = "#ff637d";
ctx.shadowBlur = 14;
ctx.fillStyle = "#ff637d";
ctx.beginPath();
ctx.arc(x, y, cell * 0.33, 0, Math.PI * 2);
ctx.fill();
ctx.shadowBlur = 0;
ctx.fillStyle = "#ffd7df";
ctx.beginPath();
ctx.arc(x - 2, y - 3, 2, 0, Math.PI * 2);
ctx.fill();
}
snake.forEach((part, index) => {
ctx.fillStyle = index === 0 ? "#afffc5" : "#64ce8a";
ctx.fillRect(part.x * cell + 2, part.y * cell + 2, cell - 4, cell - 4);
});
const head = snake[0];
const centerX = (head.x + 0.5) * cell;
const centerY = (head.y + 0.5) * cell;
ctx.fillStyle = "#10251a";
for (const side of [-1, 1]) {
ctx.beginPath();
ctx.arc(
centerX + direction.x * 5 - direction.y * side * 4,
centerY + direction.y * 5 + direction.x * side * 4,
2, 0, Math.PI * 2
);
ctx.fill();
}
}
function finish(won = false) {
running = false;
clearTimeout(timer);
title.textContent = won ? "Plansza zdobyta!" : "Koniec gry!";
message.textContent = `Twój wynik: ${score} punktów.`;
playButton.textContent = "Zagraj jeszcze raz";
overlay.hidden = false;
playButton.focus({ preventScroll: true });
}
function tick() {
if (!running) return;
if (turns.length) direction = turns.shift();
const head = {
x: snake[0].x + direction.x,
y: snake[0].y + direction.y
};
const eating = food && head.x === food.x && head.y === food.y;
// Ogon zwalnia swoje pole, chyba że wąż właśnie zjada owoc.
const body = eating ? snake : snake.slice(0, -1);
const hitWall = head.x < 0 || head.y < 0 || head.x >= size || head.y >= size;
const hitBody = body.some(part => part.x === head.x && part.y === head.y);
if (hitWall || hitBody) {
finish();
return;
}
snake.unshift(head);
if (eating) {
score += 10;
scoreElement.textContent = score;
food = placeFood();
} else {
snake.pop();
}
draw();
if (!food) {
finish(true);
return;
}
timer = setTimeout(tick, Math.max(65, 145 - score * 0.35));
}
function start() {
clearTimeout(timer);
reset();
running = true;
overlay.hidden = true;
playButton.blur();
draw();
timer = setTimeout(tick, 145);
}
function steer(key) {
if (!running || turns.length >= 2) return;
const next = directions[key];
const last = turns.length ? turns[turns.length - 1] : direction;
if (next.x === last.x && next.y === last.y) return;
if (next.x === -last.x && next.y === -last.y) return;
turns.push(next);
}
document.addEventListener("keydown", event => {
if (!Object.prototype.hasOwnProperty.call(directions, event.key)) return;
event.preventDefault();
steer(event.key);
});
document.querySelectorAll("[data-direction]").forEach(button => {
button.addEventListener("click", () => steer(button.dataset.direction));
});
playButton.addEventListener("click", start);
reset();
draw();
})();
</script>
</body>
</html>Przebieg 2kod HTML, 9 175 znaków
Cała odpowiedź to kod poniżej, dosłownie. Ten sam plik uruchamiasz wyżej jako grę 2.
<!DOCTYPE html>
<html lang="pl">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Snake — gra w węża</title>
<style>
* { box-sizing: border-box; }
body {
margin: 0;
min-height: 100vh;
min-height: 100dvh;
display: grid;
place-items: center;
padding: 20px;
background: #0b1220;
color: #e8eef8;
font-family: system-ui, sans-serif;
}
main { width: min(100%, 480px); }
header {
display: flex;
align-items: center;
justify-content: space-between;
gap: 16px;
margin-bottom: 16px;
}
h1 { margin: 0; font-size: 32px; }
.score {
padding: 10px 16px;
border: 1px solid #2b3b53;
border-radius: 12px;
background: #162237;
font-weight: 700;
}
.board {
position: relative;
overflow: hidden;
border: 2px solid #2b3b53;
border-radius: 16px;
background: #111c2d;
box-shadow: 0 20px 60px #0005;
}
canvas {
display: block;
width: 100%;
height: auto;
aspect-ratio: 1;
}
.overlay {
position: absolute;
inset: 0;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 24px;
text-align: center;
background: #0b1220e8;
backdrop-filter: blur(4px);
}
.overlay[hidden] { display: none; }
.overlay h2 { margin: 0 0 12px; font-size: clamp(26px, 6vw, 36px); }
.overlay p { margin: 0 0 24px; line-height: 1.6; color: #bdcbe0; }
button {
border: 0;
border-radius: 12px;
padding: 14px 22px;
background: #7ee787;
color: #102416;
font: inherit;
font-weight: 750;
cursor: pointer;
touch-action: manipulation;
}
button:hover { background: #a0f2a7; }
button:active { transform: translateY(1px); }
button:focus-visible { outline: 3px solid #fff; outline-offset: 4px; }
.instructions {
text-align: center;
color: #a5b6cf;
font-size: 14px;
line-height: 1.7;
}
.controls {
display: grid;
grid-template-columns: repeat(3, 52px);
gap: 8px;
justify-content: center;
margin-top: 16px;
}
.controls button {
padding: 10px;
background: #21334c;
color: #e8eef8;
font-size: 22px;
}
.controls button:first-child { grid-column: 2; }
.controls button:nth-child(2) { grid-column: 1; }
</style>
</head>
<body>
<main>
<header>
<h1>Snake 🐍</h1>
<div class="score">Punkty: <span id="score">0</span></div>
</header>
<div class="board">
<canvas id="game" width="480" height="480" aria-label="Plansza gry Snake">
Twoja przeglądarka nie obsługuje elementu canvas.
</canvas>
<section class="overlay" id="overlay" aria-labelledby="overlay-title">
<h2 id="overlay-title">Gotowy na grę?</h2>
<p id="overlay-message">Zbieraj czerwone owoce.<br>Unikaj ścian i własnego ogona!</p>
<button id="play" type="button">Rozpocznij grę</button>
</section>
</div>
<p class="instructions">
Sterowanie: strzałki ↑ ↓ ← →<br>
Każdy owoc to 10 punktów.
</p>
<nav class="controls" aria-label="Przyciski sterowania">
<button type="button" data-direction="ArrowUp" aria-label="W górę">↑</button>
<button type="button" data-direction="ArrowLeft" aria-label="W lewo">←</button>
<button type="button" data-direction="ArrowDown" aria-label="W dół">↓</button>
<button type="button" data-direction="ArrowRight" aria-label="W prawo">→</button>
</nav>
</main>
<script>
"use strict";
const canvas = document.getElementById("game");
const ctx = canvas.getContext("2d");
const scoreElement = document.getElementById("score");
const overlay = document.getElementById("overlay");
const titleElement = document.getElementById("overlay-title");
const messageElement = document.getElementById("overlay-message");
const playButton = document.getElementById("play");
const size = 24;
const cell = canvas.width / size;
const directions = {
ArrowUp: { x: 0, y: -1 },
ArrowDown: { x: 0, y: 1 },
ArrowLeft: { x: -1, y: 0 },
ArrowRight: { x: 1, y: 0 }
};
let snake;
let direction;
let inputQueue;
let food;
let score;
let timer = null;
let state = "ready";
function reset() {
snake = [
{ x: 11, y: 12 },
{ x: 10, y: 12 },
{ x: 9, y: 12 }
];
direction = directions.ArrowRight;
inputQueue = [];
score = 0;
scoreElement.textContent = score;
food = createFood();
}
function createFood() {
const empty = [];
for (let y = 0; y < size; y++) {
for (let x = 0; x < size; x++) {
if (!snake.some(part => part.x === x && part.y === y)) {
empty.push({ x, y });
}
}
}
return empty.length
? empty[Math.floor(Math.random() * empty.length)]
: null;
}
function startGame() {
clearInterval(timer);
reset();
state = "playing";
overlay.hidden = true;
playButton.blur();
draw();
timer = setInterval(tick, 125);
}
function finish(won = false) {
clearInterval(timer);
timer = null;
state = "over";
titleElement.textContent = won ? "Wygrana!" : "Koniec gry!";
messageElement.textContent =
(won ? "Cała plansza należy do Ciebie! " : "") +
"Twój wynik: " + score + " pkt.";
playButton.textContent = "Zagraj jeszcze raz";
overlay.hidden = false;
playButton.focus({ preventScroll: true });
}
function steer(key) {
if (state === "ready") startGame();
if (state !== "playing" || inputQueue.length >= 2) return;
const next = directions[key];
const previous = inputQueue.length
? inputQueue[inputQueue.length - 1]
: direction;
// Zakaz zawracania i kolejka skrętów zapobiegają kolizjom
// powodowanym przez kilka szybkich naciśnięć między ruchami.
if (next.x === previous.x && next.y === previous.y) return;
if (next.x === -previous.x && next.y === -previous.y) return;
inputQueue.push(next);
}
function tick() {
if (inputQueue.length) direction = inputQueue.shift();
const head = {
x: snake[0].x + direction.x,
y: snake[0].y + direction.y
};
const eating = head.x === food.x && head.y === food.y;
// Bez jedzenia ostatnie pole ogona zwalnia się w tym samym ruchu.
const body = eating ? snake : snake.slice(0, -1);
const hitWall =
head.x < 0 || head.x >= size || head.y < 0 || head.y >= size;
const hitSnake = body.some(part => part.x === head.x && part.y === head.y);
if (hitWall || hitSnake) {
finish();
return;
}
snake.unshift(head);
if (eating) {
score += 10;
scoreElement.textContent = score;
food = createFood();
if (!food) {
draw();
finish(true);
return;
}
} else {
snake.pop();
}
draw();
}
function draw() {
ctx.fillStyle = "#111c2d";
ctx.fillRect(0, 0, canvas.width, canvas.height);
ctx.strokeStyle = "#1a283c";
ctx.lineWidth = 1;
ctx.beginPath();
for (let i = 1; i < size; i++) {
ctx.moveTo(i * cell, 0);
ctx.lineTo(i * cell, canvas.height);
ctx.moveTo(0, i * cell);
ctx.lineTo(canvas.width, i * cell);
}
ctx.stroke();
if (food) {
const x = food.x * cell + cell / 2;
const y = food.y * cell + cell / 2;
ctx.fillStyle = "#ff647c";
ctx.beginPath();
ctx.arc(x, y, cell * 0.36, 0, Math.PI * 2);
ctx.fill();
ctx.fillStyle = "#ffd1d9";
ctx.beginPath();
ctx.arc(x - 2, y - 3, 2, 0, Math.PI * 2);
ctx.fill();
}
snake.forEach((part, index) => {
ctx.fillStyle = index === 0 ? "#a0f2a7" : "#50c878";
ctx.fillRect(part.x * cell + 1, part.y * cell + 1, cell - 2, cell - 2);
});
const centerX = snake[0].x * cell + cell / 2;
const centerY = snake[0].y * cell + cell / 2;
ctx.fillStyle = "#102416";
for (const side of [-1, 1]) {
const x = centerX + direction.x * 4 - direction.y * side * 4;
const y = centerY + direction.y * 4 + direction.x * side * 4;
ctx.beginPath();
ctx.arc(x, y, 2, 0, Math.PI * 2);
ctx.fill();
}
}
document.addEventListener("keydown", event => {
if (!Object.hasOwn(directions, event.key)) return;
event.preventDefault();
if (!event.repeat) steer(event.key);
});
document.querySelectorAll("[data-direction]").forEach(button => {
button.addEventListener("click", () => steer(button.dataset.direction));
});
playButton.addEventListener("click", startGame);
reset();
draw();
</script>
</body>
</html>Przebieg 3kod HTML, 11 552 znaków
Cała odpowiedź to kod poniżej, dosłownie. Ten sam plik uruchamiasz wyżej jako grę 3.
<!DOCTYPE html>
<html lang="pl">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="theme-color" content="#0c1424">
<title>Snake — gra w węża</title>
<style>
* { box-sizing: border-box; }
body {
margin: 0;
min-height: 100vh;
min-height: 100dvh;
display: grid;
place-items: center;
padding: 24px 16px;
background: radial-gradient(ellipse at top, #1c3049, #0c1424 65%);
color: #eaf1fb;
font-family: system-ui, sans-serif;
}
main { width: min(100%, 480px); }
header {
display: flex;
align-items: center;
justify-content: space-between;
gap: 16px;
margin-bottom: 18px;
}
h1 { margin: 0; font-size: 32px; letter-spacing: -1px; }
h1 span { color: #69eda5; }
.scores { display: flex; gap: 10px; }
.score {
min-width: 78px;
padding: 9px 14px;
border: 1px solid #304258;
border-radius: 12px;
background: #142235;
text-align: center;
}
.score small {
display: block;
margin-bottom: 2px;
color: #acbed5;
font-size: 11px;
text-transform: uppercase;
letter-spacing: 1px;
}
.score strong { font-size: 22px; font-variant-numeric: tabular-nums; }
.board {
position: relative;
overflow: hidden;
border: 1px solid #304258;
border-radius: 18px;
box-shadow: 0 20px 60px #0005;
background: #101c2d;
}
canvas {
display: block;
width: 100%;
aspect-ratio: 1;
}
.overlay {
position: absolute;
inset: 0;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 24px;
text-align: center;
background: #0c1424e8;
backdrop-filter: blur(4px);
}
.overlay[hidden] { display: none; }
.icon { font-size: 48px; margin-bottom: 8px; }
h2 { margin: 0 0 10px; font-size: clamp(24px, 6vw, 34px); }
.overlay p { margin: 0 0 24px; color: #acbed5; line-height: 1.6; }
button {
border: 0;
border-radius: 12px;
padding: 14px 24px;
background: #69eda5;
color: #10261b;
font: inherit;
font-weight: 750;
cursor: pointer;
touch-action: manipulation;
transition: background .15s, transform .15s;
}
button:hover { background: #96f6c0; }
button:active { transform: scale(.97); }
button:focus-visible { outline: 3px solid #fff; outline-offset: 4px; }
.help { text-align: center; color: #acbed5; font-size: 14px; line-height: 1.7; }
kbd {
display: inline-block;
min-width: 22px;
border: 1px solid #40516b;
border-radius: 4px;
font-family: inherit;
line-height: 22px;
}
.controls {
display: grid;
grid-template-columns: repeat(3, 52px);
justify-content: center;
gap: 7px;
}
.controls button { padding: 10px; background: #22354c; color: #eaf1fb; font-size: 22px; }
.controls button:hover { background: #344d6b; }
.up { grid-column: 2; }
.left { grid-column: 1; }
footer { text-align: center; margin-top: 18px; color: #7e94b0; font-size: 12px; }
@media (max-width: 360px) {
h1 { font-size: 26px; }
.score { min-width: 65px; padding: 8px; }
}
</style>
</head>
<body>
<main>
<header>
<h1>Snake<span>.</span></h1>
<div class="scores">
<div class="score"><small>Punkty</small><strong id="score">0</strong></div>
<div class="score"><small>Rekord</small><strong id="best">0</strong></div>
</div>
</header>
<div class="board">
<canvas id="canvas" width="480" height="480" role="img" aria-label="Plansza gry Snake. Sterowanie strzałkami."></canvas>
<section id="overlay" class="overlay" aria-labelledby="message-title">
<div id="icon" class="icon" aria-hidden="true">🐍</div>
<h2 id="message-title">Czas na Snake’a!</h2>
<p id="message" aria-live="polite">Zbieraj jabłka i rośnij.<br>Uważaj na ściany i własny ogon.</p>
<button id="play" type="button">Zagraj</button>
</section>
</div>
<p class="help">
Sterowanie: <kbd>↑</kbd> <kbd>↓</kbd> <kbd>←</kbd> <kbd>→</kbd><br>
Każde jabłko to 10 punktów.
</p>
<nav class="controls" aria-label="Przyciski sterowania">
<button class="up" data-direction="ArrowUp" aria-label="W górę" type="button">↑</button>
<button class="left" data-direction="ArrowLeft" aria-label="W lewo" type="button">←</button>
<button data-direction="ArrowDown" aria-label="W dół" type="button">↓</button>
<button data-direction="ArrowRight" aria-label="W prawo" type="button">→</button>
</nav>
<footer>Im więcej jabłek, tym szybszy wąż.</footer>
</main>
<script>
(() => {
"use strict";
const canvas = document.getElementById("canvas");
const ctx = canvas.getContext("2d");
const scoreElement = document.getElementById("score");
const bestElement = document.getElementById("best");
const overlay = document.getElementById("overlay");
const title = document.getElementById("message-title");
const message = document.getElementById("message");
const icon = document.getElementById("icon");
const play = document.getElementById("play");
const SIZE = 20;
const CELL = canvas.width / SIZE;
const directions = {
ArrowUp: { x: 0, y: -1 },
ArrowDown: { x: 0, y: 1 },
ArrowLeft: { x: -1, y: 0 },
ArrowRight: { x: 1, y: 0 }
};
let snake, direction, turns, food, score;
let state = "ready";
let lastTime = 0;
let elapsed = 0;
let best = 0;
try {
const saved = Number(localStorage.getItem("snake-rekord"));
if (Number.isFinite(saved) && saved > 0) best = saved;
} catch (_) {}
bestElement.textContent = best;
function reset() {
snake = [{ x: 9, y: 10 }, { x: 8, y: 10 }, { x: 7, y: 10 }];
direction = directions.ArrowRight;
turns = [];
score = 0;
elapsed = 0;
scoreElement.textContent = score;
placeFood();
draw();
}
function placeFood() {
const free = [];
const occupied = new Set(snake.map(part => part.y * SIZE + part.x));
for (let y = 0; y < SIZE; y++) {
for (let x = 0; x < SIZE; x++) {
if (!occupied.has(y * SIZE + x)) free.push({ x, y });
}
}
food = free.length ? free[Math.floor(Math.random() * free.length)] : null;
}
function start() {
reset();
state = "playing";
overlay.hidden = true;
lastTime = performance.now();
if (document.activeElement instanceof HTMLElement) document.activeElement.blur();
}
function finish(won = false) {
state = "over";
title.textContent = won ? "Plansza zdobyta!" : "Koniec gry!";
icon.textContent = won ? "🏆" : "🐍";
message.textContent = `Twój wynik: ${score} pkt. Rekord: ${best} pkt.`;
play.textContent = "Zagraj jeszcze raz";
overlay.hidden = false;
play.focus({ preventScroll: true });
}
function steer(key) {
if (state === "over") return;
if (state === "ready") start();
const next = directions[key];
const previous = turns.length ? turns[turns.length - 1] : direction;
if (turns.length >= 2) return;
if (next.x === previous.x && next.y === previous.y) return;
if (next.x === -previous.x && next.y === -previous.y) return;
turns.push(next);
}
function step() {
if (turns.length) direction = turns.shift();
const head = {
x: snake[0].x + direction.x,
y: snake[0].y + direction.y
};
const eating = food && head.x === food.x && head.y === food.y;
// Gdy wąż nie je, ogon opuszcza swoje pole w tym samym kroku.
const body = eating ? snake : snake.slice(0, -1);
const collision =
head.x < 0 || head.x >= SIZE || head.y < 0 || head.y >= SIZE ||
body.some(part => part.x === head.x && part.y === head.y);
if (collision) {
finish();
return;
}
snake.unshift(head);
if (eating) {
score += 10;
scoreElement.textContent = score;
if (score > best) {
best = score;
bestElement.textContent = best;
try { localStorage.setItem("snake-rekord", String(best)); } catch (_) {}
}
placeFood();
if (!food) {
draw();
finish(true);
return;
}
} else {
snake.pop();
}
draw();
}
function draw() {
ctx.fillStyle = "#101c2d";
ctx.fillRect(0, 0, canvas.width, canvas.height);
ctx.strokeStyle = "#1b2a3c";
ctx.lineWidth = 1;
ctx.beginPath();
for (let i = 1; i < SIZE; i++) {
ctx.moveTo(i * CELL, 0);
ctx.lineTo(i * CELL, canvas.height);
ctx.moveTo(0, i * CELL);
ctx.lineTo(canvas.width, i * CELL);
}
ctx.stroke();
if (food) {
const x = (food.x + .5) * CELL;
const y = (food.y + .5) * CELL;
ctx.fillStyle = "#ff697e";
ctx.shadowColor = "#ff697e";
ctx.shadowBlur = 12;
ctx.beginPath();
ctx.arc(x, y + 1, CELL * .33, 0, Math.PI * 2);
ctx.fill();
ctx.shadowBlur = 0;
ctx.strokeStyle = "#a1f1b9";
ctx.lineWidth = 3;
ctx.beginPath();
ctx.moveTo(x, y - 6);
ctx.lineTo(x + 4, y - 10);
ctx.stroke();
}
snake.forEach((part, index) => {
ctx.fillStyle = index === 0 ? "#acffd0" : "#59d993";
ctx.fillRect(part.x * CELL + 2, part.y * CELL + 2, CELL - 4, CELL - 4);
});
const head = snake[0];
const centerX = (head.x + .5) * CELL;
const centerY = (head.y + .5) * CELL;
ctx.fillStyle = "#10261b";
for (const side of [-1, 1]) {
const x = centerX + direction.x * 5 - direction.y * side * 4;
const y = centerY + direction.y * 5 + direction.x * side * 4;
ctx.beginPath();
ctx.arc(x, y, 2.2, 0, Math.PI * 2);
ctx.fill();
}
}
function frame(time) {
const delta = Math.min(time - lastTime, 200);
lastTime = time;
if (state === "playing" && !document.hidden) {
elapsed += delta;
const interval = Math.max(65, 155 - Math.floor(score / 10) * 4);
if (elapsed >= interval) {
elapsed %= interval;
step();
}
}
requestAnimationFrame(frame);
}
document.addEventListener("keydown", event => {
if (directions[event.key]) {
event.preventDefault();
if (!event.repeat) steer(event.key);
}
});
document.querySelectorAll("[data-direction]").forEach(button => {
button.addEventListener("click", () => steer(button.dataset.direction));
});
document.addEventListener("visibilitychange", () => {
elapsed = 0;
lastTime = performance.now();
});
play.addEventListener("click", start);
reset();
requestAnimationFrame(frame);
})();
</script>
</body>
</html>GPT-5.6
Przebieg 1kod HTML, 8 380 znaków
Cała odpowiedź to kod poniżej, dosłownie. Ten sam plik uruchamiasz wyżej jako grę 1.
<!DOCTYPE html>
<html lang="pl">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Snake</title>
<style>
* {
box-sizing: border-box;
}
body {
min-height: 100vh;
margin: 0;
display: grid;
place-items: center;
padding: 20px;
color: #f5f7f6;
font-family: Arial, sans-serif;
background: linear-gradient(135deg, #101a16, #1d3027);
}
.gra {
width: min(92vw, 560px);
text-align: center;
}
h1 {
margin: 0 0 10px;
color: #76e69d;
font-size: clamp(2rem, 7vw, 3.5rem);
}
.panel {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 12px;
padding: 12px 16px;
border: 1px solid #365746;
border-radius: 12px;
background: #17251f;
}
.wynik {
font-size: 1.15rem;
font-weight: bold;
}
.instrukcja {
color: #afc8ba;
font-size: 0.9rem;
}
.plansza {
position: relative;
overflow: hidden;
border: 4px solid #4ea96c;
border-radius: 14px;
background: #0b130f;
box-shadow: 0 16px 45px #0008;
}
canvas {
display: block;
width: 100%;
height: auto;
aspect-ratio: 1;
}
.koniec {
position: absolute;
inset: 0;
display: none;
place-items: center;
padding: 24px;
background: #07100cdd;
backdrop-filter: blur(3px);
}
.koniec.widoczny {
display: grid;
}
.okno {
width: min(100%, 340px);
padding: 28px 20px;
border: 1px solid #4ea96c;
border-radius: 16px;
background: #17251f;
box-shadow: 0 12px 35px #000a;
}
.okno h2 {
margin: 0 0 12px;
color: #ff7676;
font-size: 2rem;
}
.okno p {
margin: 0 0 22px;
font-size: 1.1rem;
}
button {
padding: 12px 20px;
border: 0;
border-radius: 9px;
color: #102017;
font: inherit;
font-weight: bold;
background: #76e69d;
cursor: pointer;
transition: transform 0.15s, background 0.15s;
}
button:hover {
background: #98f2b7;
transform: translateY(-2px);
}
button:focus-visible {
outline: 3px solid white;
outline-offset: 3px;
}
</style>
</head>
<body>
<main class="gra">
<h1>Snake</h1>
<div class="panel">
<div class="wynik">Punkty: <span id="punkty">0</span></div>
<div class="instrukcja">Sterowanie: strzałki</div>
</div>
<div class="plansza">
<canvas id="canvas" width="500" height="500" aria-label="Plansza gry Snake"></canvas>
<div id="koniec" class="koniec">
<div class="okno">
<h2>Koniec gry!</h2>
<p>Twój wynik: <strong id="wynikKoncowy">0</strong></p>
<button id="restart">Zagraj jeszcze raz</button>
</div>
</div>
</div>
</main>
<script>
const canvas = document.getElementById("canvas");
const ctx = canvas.getContext("2d");
const punktyElement = document.getElementById("punkty");
const wynikKoncowy = document.getElementById("wynikKoncowy");
const ekranKonca = document.getElementById("koniec");
const restartButton = document.getElementById("restart");
const liczbaPol = 20;
const rozmiarPola = canvas.width / liczbaPol;
const szybkosc = 110;
let waz;
let jedzenie;
let kierunek;
let nastepnyKierunek;
let punkty;
let petla;
let graTrwa;
function rozpocznijGre() {
clearInterval(petla);
waz = [
{ x: 10, y: 10 },
{ x: 9, y: 10 },
{ x: 8, y: 10 }
];
kierunek = { x: 1, y: 0 };
nastepnyKierunek = { x: 1, y: 0 };
punkty = 0;
graTrwa = true;
punktyElement.textContent = punkty;
ekranKonca.classList.remove("widoczny");
losujJedzenie();
rysuj();
petla = setInterval(aktualizuj, szybkosc);
}
function losujJedzenie() {
const wolnePola = [];
for (let y = 0; y < liczbaPol; y++) {
for (let x = 0; x < liczbaPol; x++) {
if (!waz.some(segment => segment.x === x && segment.y === y)) {
wolnePola.push({ x, y });
}
}
}
if (wolnePola.length === 0) {
zakonczGre();
return;
}
jedzenie = wolnePola[Math.floor(Math.random() * wolnePola.length)];
}
function aktualizuj() {
if (!graTrwa) return;
kierunek = nastepnyKierunek;
const glowa = {
x: waz[0].x + kierunek.x,
y: waz[0].y + kierunek.y
};
const zjadl =
glowa.x === jedzenie.x &&
glowa.y === jedzenie.y;
const cialoDoSprawdzenia = zjadl ? waz : waz.slice(0, -1);
const uderzenieWSiane =
glowa.x < 0 ||
glowa.x >= liczbaPol ||
glowa.y < 0 ||
glowa.y >= liczbaPol;
const uderzenieWSiebie = cialoDoSprawdzenia.some(
segment => segment.x === glowa.x && segment.y === glowa.y
);
if (uderzenieWSiane || uderzenieWSiebie) {
zakonczGre();
return;
}
waz.unshift(glowa);
if (zjadl) {
punkty++;
punktyElement.textContent = punkty;
losujJedzenie();
} else {
waz.pop();
}
rysuj();
}
function rysuj() {
ctx.fillStyle = "#0b130f";
ctx.fillRect(0, 0, canvas.width, canvas.height);
ctx.strokeStyle = "#15241c";
ctx.lineWidth = 1;
for (let i = 1; i < liczbaPol; i++) {
const pozycja = i * rozmiarPola;
ctx.beginPath();
ctx.moveTo(pozycja, 0);
ctx.lineTo(pozycja, canvas.height);
ctx.stroke();
ctx.beginPath();
ctx.moveTo(0, pozycja);
ctx.lineTo(canvas.width, pozycja);
ctx.stroke();
}
if (jedzenie) {
const srodekX = jedzenie.x * rozmiarPola + rozmiarPola / 2;
const srodekY = jedzenie.y * rozmiarPola + rozmiarPola / 2;
ctx.fillStyle = "#ff5959";
ctx.beginPath();
ctx.arc(srodekX, srodekY, rozmiarPola * 0.36, 0, Math.PI * 2);
ctx.fill();
ctx.fillStyle = "#75d58e";
ctx.fillRect(srodekX + 2, srodekY - 12, 4, 8);
}
waz.forEach((segment, index) => {
const margines = 2;
const x = segment.x * rozmiarPola + margines;
const y = segment.y * rozmiarPola + margines;
const rozmiar = rozmiarPola - margines * 2;
ctx.fillStyle = index === 0 ? "#98f2b7" : "#4ecb71";
zaokraglonyProstokat(x, y, rozmiar, rozmiar, 5);
ctx.fill();
if (index === 0) {
rysujOczy(segment);
}
});
}
function zaokraglonyProstokat(x, y, szerokosc, wysokosc, promien) {
ctx.beginPath();
ctx.roundRect(x, y, szerokosc, wysokosc, promien);
}
function rysujOczy(glowa) {
const bazaX = glowa.x * rozmiarPola;
const bazaY = glowa.y * rozmiarPola;
let oczy;
if (kierunek.x === 1) {
oczy = [[17, 7], [17, 17]];
} else if (kierunek.x === -1) {
oczy = [[8, 7], [8, 17]];
} else if (kierunek.y === -1) {
oczy = [[7, 8], [17, 8]];
} else {
oczy = [[7, 17], [17, 17]];
}
ctx.fillStyle = "#102017";
for (const [x, y] of oczy) {
ctx.beginPath();
ctx.arc(bazaX + x, bazaY + y, 2.2, 0, Math.PI * 2);
ctx.fill();
}
}
function zakonczGre() {
graTrwa = false;
clearInterval(petla);
wynikKoncowy.textContent = punkty;
ekranKonca.classList.add("widoczny");
restartButton.focus();
}
document.addEventListener("keydown", event => {
const kierunki = {
ArrowUp: { x: 0, y: -1 },
ArrowDown: { x: 0, y: 1 },
ArrowLeft: { x: -1, y: 0 },
ArrowRight: { x: 1, y: 0 }
};
const nowyKierunek = kierunki[event.key];
if (!nowyKierunek) return;
event.preventDefault();
const jestPrzeciwny =
nowyKierunek.x === -kierunek.x &&
nowyKierunek.y === -kierunek.y;
if (!jestPrzeciwny) {
nastepnyKierunek = nowyKierunek;
}
});
restartButton.addEventListener("click", rozpocznijGre);
rozpocznijGre();
</script>
</body>
</html>Przebieg 2kod HTML, 8 233 znaków
Cała odpowiedź to kod poniżej, dosłownie. Ten sam plik uruchamiasz wyżej jako grę 2.
<!DOCTYPE html>
<html lang="pl">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Snake</title>
<style>
* {
box-sizing: border-box;
}
body {
min-height: 100vh;
margin: 0;
display: grid;
place-items: center;
overflow: hidden;
font-family: Arial, sans-serif;
color: #fff;
background: linear-gradient(135deg, #101820, #173b2c);
}
.game {
width: min(92vw, 520px);
text-align: center;
}
h1 {
margin: 0 0 8px;
font-size: clamp(2rem, 8vw, 3.4rem);
color: #70e000;
text-shadow: 0 3px 0 #286400;
}
.score {
margin-bottom: 14px;
font-size: 1.25rem;
font-weight: bold;
}
.board {
position: relative;
width: 100%;
aspect-ratio: 1;
overflow: hidden;
border: 5px solid #70e000;
border-radius: 12px;
background: #09130e;
box-shadow: 0 14px 40px rgba(0, 0, 0, 0.45);
}
canvas {
display: block;
width: 100%;
height: 100%;
}
.game-over {
position: absolute;
inset: 0;
display: none;
align-items: center;
justify-content: center;
padding: 20px;
background: rgba(0, 0, 0, 0.78);
}
.game-over.visible {
display: flex;
}
.panel {
padding: 28px;
border: 2px solid #70e000;
border-radius: 14px;
background: #11271b;
box-shadow: 0 12px 30px rgba(0, 0, 0, 0.5);
}
.panel h2 {
margin: 0 0 12px;
font-size: 2rem;
color: #ff595e;
}
.panel p {
margin: 0 0 20px;
font-size: 1.15rem;
}
button {
padding: 12px 22px;
border: 0;
border-radius: 8px;
color: #102014;
background: #70e000;
font: inherit;
font-weight: bold;
cursor: pointer;
transition: transform 0.15s, background 0.15s;
}
button:hover {
background: #8aff24;
transform: scale(1.04);
}
button:focus-visible {
outline: 3px solid #fff;
outline-offset: 3px;
}
.instructions {
margin-top: 14px;
color: #c9d8ce;
font-size: 0.95rem;
}
</style>
</head>
<body>
<main class="game">
<h1>Snake</h1>
<div class="score">Punkty: <span id="score">0</span></div>
<div class="board">
<canvas id="canvas" width="500" height="500" aria-label="Plansza gry Snake"></canvas>
<div id="gameOver" class="game-over">
<div class="panel">
<h2>Koniec gry!</h2>
<p>Twój wynik: <strong id="finalScore">0</strong></p>
<button id="restartButton" type="button">Zagraj jeszcze raz</button>
</div>
</div>
</div>
<div class="instructions">Sterowanie: klawisze strzałek</div>
</main>
<script>
const canvas = document.getElementById("canvas");
const ctx = canvas.getContext("2d");
const scoreElement = document.getElementById("score");
const finalScoreElement = document.getElementById("finalScore");
const gameOverElement = document.getElementById("gameOver");
const restartButton = document.getElementById("restartButton");
const gridSize = 20;
const tileSize = canvas.width / gridSize;
const speed = 110;
let snake;
let food;
let direction;
let nextDirection;
let score;
let timer;
let running;
function startGame() {
clearInterval(timer);
snake = [
{ x: 10, y: 10 },
{ x: 9, y: 10 },
{ x: 8, y: 10 }
];
direction = { x: 1, y: 0 };
nextDirection = { x: 1, y: 0 };
score = 0;
running = true;
scoreElement.textContent = score;
gameOverElement.classList.remove("visible");
placeFood();
draw();
timer = setInterval(update, speed);
}
function placeFood() {
const freeTiles = [];
for (let y = 0; y < gridSize; y++) {
for (let x = 0; x < gridSize; x++) {
const occupied = snake.some(segment => segment.x === x && segment.y === y);
if (!occupied) freeTiles.push({ x, y });
}
}
if (freeTiles.length === 0) {
endGame();
return;
}
food = freeTiles[Math.floor(Math.random() * freeTiles.length)];
}
function update() {
if (!running) return;
direction = nextDirection;
const head = {
x: snake[0].x + direction.x,
y: snake[0].y + direction.y
};
const hitsWall =
head.x < 0 ||
head.x >= gridSize ||
head.y < 0 ||
head.y >= gridSize;
const eatsFood = head.x === food.x && head.y === food.y;
const bodyToCheck = eatsFood ? snake : snake.slice(0, -1);
const hitsBody = bodyToCheck.some(
segment => segment.x === head.x && segment.y === head.y
);
if (hitsWall || hitsBody) {
endGame();
return;
}
snake.unshift(head);
if (eatsFood) {
score++;
scoreElement.textContent = score;
placeFood();
} else {
snake.pop();
}
draw();
}
function draw() {
ctx.fillStyle = "#09130e";
ctx.fillRect(0, 0, canvas.width, canvas.height);
drawGrid();
drawFood();
drawSnake();
}
function drawGrid() {
ctx.strokeStyle = "rgba(255, 255, 255, 0.035)";
ctx.lineWidth = 1;
for (let i = 1; i < gridSize; i++) {
const position = i * tileSize;
ctx.beginPath();
ctx.moveTo(position, 0);
ctx.lineTo(position, canvas.height);
ctx.stroke();
ctx.beginPath();
ctx.moveTo(0, position);
ctx.lineTo(canvas.width, position);
ctx.stroke();
}
}
function drawSnake() {
snake.forEach((segment, index) => {
const padding = 2;
ctx.fillStyle = index === 0 ? "#9cff36" : "#54c900";
ctx.fillRect(
segment.x * tileSize + padding,
segment.y * tileSize + padding,
tileSize - padding * 2,
tileSize - padding * 2
);
if (index === 0) drawEyes(segment);
});
}
function drawEyes(head) {
ctx.fillStyle = "#102014";
const eyeSize = 3.5;
let eyes;
if (direction.x !== 0) {
const eyeX = head.x * tileSize + (direction.x > 0 ? 17 : 8);
eyes = [
{ x: eyeX, y: head.y * tileSize + 8 },
{ x: eyeX, y: head.y * tileSize + 17 }
];
} else {
const eyeY = head.y * tileSize + (direction.y > 0 ? 17 : 8);
eyes = [
{ x: head.x * tileSize + 8, y: eyeY },
{ x: head.x * tileSize + 17, y: eyeY }
];
}
eyes.forEach(eye => {
ctx.beginPath();
ctx.arc(eye.x, eye.y, eyeSize / 2, 0, Math.PI * 2);
ctx.fill();
});
}
function drawFood() {
if (!food) return;
const centerX = food.x * tileSize + tileSize / 2;
const centerY = food.y * tileSize + tileSize / 2;
ctx.fillStyle = "#ff3b45";
ctx.beginPath();
ctx.arc(centerX, centerY + 1, tileSize * 0.34, 0, Math.PI * 2);
ctx.fill();
ctx.fillStyle = "#77dd40";
ctx.beginPath();
ctx.ellipse(centerX + 4, centerY - 8, 5, 3, -0.5, 0, Math.PI * 2);
ctx.fill();
}
function endGame() {
running = false;
clearInterval(timer);
finalScoreElement.textContent = score;
gameOverElement.classList.add("visible");
restartButton.focus();
}
document.addEventListener("keydown", event => {
const directions = {
ArrowUp: { x: 0, y: -1 },
ArrowDown: { x: 0, y: 1 },
ArrowLeft: { x: -1, y: 0 },
ArrowRight: { x: 1, y: 0 }
};
const chosenDirection = directions[event.key];
if (!chosenDirection) return;
event.preventDefault();
const isOpposite =
chosenDirection.x === -direction.x &&
chosenDirection.y === -direction.y;
if (!isOpposite && running) {
nextDirection = chosenDirection;
}
});
restartButton.addEventListener("click", startGame);
startGame();
</script>
</body>
</html>Przebieg 3kod HTML, 9 472 znaków
Cała odpowiedź to kod poniżej, dosłownie. Ten sam plik uruchamiasz wyżej jako grę 3.
<!DOCTYPE html>
<html lang="pl">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Snake</title>
<style>
* {
box-sizing: border-box;
}
body {
min-height: 100vh;
margin: 0;
display: grid;
place-items: center;
padding: 20px;
font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
color: #f8fafc;
background:
radial-gradient(circle at top, #24344d 0%, #101827 45%, #070b12 100%);
}
.game {
width: min(92vw, 520px);
padding: 24px;
text-align: center;
background: rgba(15, 23, 42, 0.92);
border: 1px solid rgba(148, 163, 184, 0.2);
border-radius: 24px;
box-shadow: 0 24px 70px rgba(0, 0, 0, 0.45);
}
h1 {
margin: 0;
font-size: clamp(2rem, 8vw, 3.3rem);
letter-spacing: 0.08em;
color: #86efac;
}
.topbar {
display: flex;
align-items: center;
justify-content: space-between;
gap: 16px;
margin: 16px 0;
font-size: 1.1rem;
}
.score {
padding: 9px 14px;
font-weight: 700;
background: #1e293b;
border-radius: 12px;
}
.hint {
color: #94a3b8;
font-size: 0.9rem;
}
.board {
position: relative;
overflow: hidden;
border: 4px solid #334155;
border-radius: 14px;
background: #0b1220;
box-shadow: inset 0 0 30px rgba(0, 0, 0, 0.45);
}
canvas {
display: block;
width: 100%;
height: auto;
aspect-ratio: 1;
}
.overlay {
position: absolute;
inset: 0;
display: flex;
align-items: center;
justify-content: center;
padding: 24px;
background: rgba(2, 6, 23, 0.82);
backdrop-filter: blur(4px);
opacity: 0;
visibility: hidden;
transition: opacity 0.2s ease;
}
.overlay.visible {
opacity: 1;
visibility: visible;
}
.dialog {
width: min(100%, 320px);
padding: 26px;
background: #172033;
border: 1px solid #475569;
border-radius: 20px;
box-shadow: 0 20px 50px rgba(0, 0, 0, 0.5);
}
.dialog h2 {
margin: 0 0 10px;
font-size: 2rem;
color: #fca5a5;
}
.dialog p {
margin: 0 0 22px;
color: #cbd5e1;
font-size: 1.1rem;
}
button {
width: 100%;
padding: 13px 18px;
border: 0;
border-radius: 12px;
color: #052e16;
background: #86efac;
font: inherit;
font-weight: 800;
cursor: pointer;
transition: transform 0.15s ease, background 0.15s ease;
}
button:hover {
background: #4ade80;
transform: translateY(-2px);
}
button:focus-visible {
outline: 3px solid #fff;
outline-offset: 3px;
}
.footer {
margin: 15px 0 0;
color: #64748b;
font-size: 0.8rem;
}
@media (max-width: 480px) {
.game {
padding: 16px;
}
.topbar {
align-items: flex-start;
flex-direction: column;
gap: 8px;
}
}
</style>
</head>
<body>
<main class="game">
<h1>SNAKE</h1>
<div class="topbar">
<div class="score" aria-live="polite">
Punkty: <span id="score">0</span>
</div>
<div class="hint">Sterowanie: klawisze strzałek</div>
</div>
<div class="board">
<canvas id="gameCanvas" width="400" height="400" aria-label="Plansza gry Snake"></canvas>
<div id="gameOver" class="overlay" role="dialog" aria-modal="true" aria-labelledby="gameOverTitle">
<div class="dialog">
<h2 id="gameOverTitle">Koniec gry!</h2>
<p>Twój wynik: <strong id="finalScore">0</strong></p>
<button id="restartButton" type="button">Zagraj jeszcze raz</button>
</div>
</div>
</div>
<p class="footer">Zbieraj czerwone owoce i nie uderz w ścianę ani we własny ogon.</p>
</main>
<script>
const canvas = document.getElementById("gameCanvas");
const ctx = canvas.getContext("2d");
const scoreElement = document.getElementById("score");
const finalScoreElement = document.getElementById("finalScore");
const gameOverElement = document.getElementById("gameOver");
const restartButton = document.getElementById("restartButton");
const gridSize = 20;
const tileCount = canvas.width / gridSize;
const gameSpeed = 110;
let snake;
let food;
let direction;
let nextDirection;
let score;
let timer;
let isGameOver;
function startGame() {
clearInterval(timer);
snake = [
{ x: 10, y: 10 },
{ x: 9, y: 10 },
{ x: 8, y: 10 }
];
direction = { x: 1, y: 0 };
nextDirection = { x: 1, y: 0 };
score = 0;
isGameOver = false;
scoreElement.textContent = score;
gameOverElement.classList.remove("visible");
placeFood();
draw();
timer = setInterval(update, gameSpeed);
}
function placeFood() {
do {
food = {
x: Math.floor(Math.random() * tileCount),
y: Math.floor(Math.random() * tileCount)
};
} while (snake.some(segment => segment.x === food.x && segment.y === food.y));
}
function update() {
direction = nextDirection;
const head = {
x: snake[0].x + direction.x,
y: snake[0].y + direction.y
};
const hitWall =
head.x < 0 ||
head.x >= tileCount ||
head.y < 0 ||
head.y >= tileCount;
const ateFood = head.x === food.x && head.y === food.y;
const bodyToCheck = ateFood ? snake : snake.slice(0, -1);
const hitSelf = bodyToCheck.some(
segment => segment.x === head.x && segment.y === head.y
);
if (hitWall || hitSelf) {
endGame();
return;
}
snake.unshift(head);
if (ateFood) {
score++;
scoreElement.textContent = score;
placeFood();
} else {
snake.pop();
}
draw();
}
function draw() {
ctx.fillStyle = "#0b1220";
ctx.fillRect(0, 0, canvas.width, canvas.height);
drawGrid();
drawFood();
drawSnake();
}
function drawGrid() {
ctx.strokeStyle = "rgba(148, 163, 184, 0.06)";
ctx.lineWidth = 1;
for (let i = 0; i <= tileCount; i++) {
const position = i * gridSize;
ctx.beginPath();
ctx.moveTo(position, 0);
ctx.lineTo(position, canvas.height);
ctx.stroke();
ctx.beginPath();
ctx.moveTo(0, position);
ctx.lineTo(canvas.width, position);
ctx.stroke();
}
}
function drawSnake() {
snake.forEach((segment, index) => {
const padding = 2;
ctx.fillStyle = index === 0 ? "#86efac" : "#22c55e";
roundRect(
segment.x * gridSize + padding,
segment.y * gridSize + padding,
gridSize - padding * 2,
gridSize - padding * 2,
index === 0 ? 6 : 4
);
ctx.fill();
if (index === 0) {
drawEyes(segment);
}
});
}
function drawEyes(head) {
ctx.fillStyle = "#052e16";
let eyes;
if (direction.x === 1) {
eyes = [[13, 5], [13, 13]];
} else if (direction.x === -1) {
eyes = [[5, 5], [5, 13]];
} else if (direction.y === -1) {
eyes = [[5, 5], [13, 5]];
} else {
eyes = [[5, 13], [13, 13]];
}
eyes.forEach(([offsetX, offsetY]) => {
ctx.beginPath();
ctx.arc(
head.x * gridSize + offsetX,
head.y * gridSize + offsetY,
1.8,
0,
Math.PI * 2
);
ctx.fill();
});
}
function drawFood() {
const centerX = food.x * gridSize + gridSize / 2;
const centerY = food.y * gridSize + gridSize / 2;
ctx.fillStyle = "#ef4444";
ctx.beginPath();
ctx.arc(centerX, centerY + 1, gridSize * 0.34, 0, Math.PI * 2);
ctx.fill();
ctx.strokeStyle = "#713f12";
ctx.lineWidth = 2;
ctx.beginPath();
ctx.moveTo(centerX, centerY - 5);
ctx.lineTo(centerX + 2, centerY - 9);
ctx.stroke();
ctx.fillStyle = "#4ade80";
ctx.beginPath();
ctx.ellipse(centerX + 5, centerY - 7, 4, 2.5, -0.5, 0, Math.PI * 2);
ctx.fill();
}
function roundRect(x, y, width, height, radius) {
ctx.beginPath();
ctx.roundRect(x, y, width, height, radius);
}
function endGame() {
isGameOver = true;
clearInterval(timer);
finalScoreElement.textContent = score;
gameOverElement.classList.add("visible");
restartButton.focus();
}
function changeDirection(x, y) {
if (isGameOver) return;
const isOpposite =
x === -direction.x &&
y === -direction.y;
if (!isOpposite) {
nextDirection = { x, y };
}
}
document.addEventListener("keydown", event => {
const directions = {
ArrowUp: [0, -1],
ArrowDown: [0, 1],
ArrowLeft: [-1, 0],
ArrowRight: [1, 0]
};
if (directions[event.key]) {
event.preventDefault();
changeDirection(...directions[event.key]);
}
});
restartButton.addEventListener("click", startGame);
startGame();
</script>
</body>
</html>