GPT-6 Astra kontra GPT-5.6 test z 16.09.2026

GPT-6 Astra vs GPT-5.6Wszystkie zadania i pełne odpowiedzi

W filmie na moim kanale YouTube obiecałem wszystkie zadania i pełne odpowiedzi. Oto one: dokładne polecenia, kryteria spisane przed testem, werdykty i wszystkie 54 odpowiedzi obu modeli, dosłownie. To intro i 8 zadań, każde po 3 razy na każdym modelu, razem z remisami. 6 gier Snake możesz uruchomić sam, a na nagraniu zobaczysz, jak gra GPT-5.6 kończy się, zanim naciśniesz klawisz.

1wygrana GPT-6 Astra
7remisów
0wygranych GPT-5.6

Bilans zadań 1–8. Intro („czym się różnisz?”) nie liczy się do wyniku.

Jak testowałem

Wyniki zadanie po zadaniu

ZadanieGPT-6 AstraGPT-5.6Werdykt
IntroCzym się różnisz od poprzedniej wersji?3/3 dopytuje, o którą wersję chodzi0/3 podaje ogólniki jak fakt („lepiej rozumiem kontekst…”)Bez punktów · lepiej Astra
Zadanie 1Książka, która nie istnieje3/3 nie streszcza, prosi o tekst0/3 3 razy zmyślone streszczenie o praskim zegarzeWygrywa Astra
Zadanie 2Reklamacja butów3/3 niezgodność towaru z umową; 2/3 termin 14 dni; 3/3 odesłanie na koszt sklepu3/3 niezgodność towaru z umową; 1/3 „ustawowy termin”; 0/3 14 dniRemis · mały plus dla Astry
Zadanie 3Formuła do polskiego Excela3/3 poprawna formuła3/3 ta sama formułaRemis
Zadanie 4Niejasne polecenie: długi weekend3/3 2 razy propozycje i pytania, 1 raz plan z jawnym założeniem3/3 same pytaniaRemis
Zadanie 5Zagadka z dwoma rozwiązaniami3/3 zauważa dwa grafiki3/3 zauważa dwa grafikiRemis
Zadanie 6Zmiana polecenia w trakcie3/3 spełnia (145 znaków, 3 razy identyczny tekst)3/3 spełnia (164–184 znaki)Remis
Zadanie 7Szczegóły w raporcie na 190 tys. znaków3/3 wszystkie 4 liczby i obie skale3/3 wszystkie 4 liczby i obie skaleRemis
Zadanie 8Gra Snake w jednym pliku HTML3/3 działa; czeka, aż klikniesz start3/3 działa; startuje sama, wąż uderza w ścianę po ok. 1,1 sRemis według kryteriów
Średni czas odpowiedzi (zadania 1–8, 24 przebiegi na model)
GPT-6 Astra 16,2 s · GPT-5.6 9,8 s
Koszt 24 przebiegów (zadania 1–8, według cennika API)
GPT-6 Astra 1,96 $ (7,36 zł) · GPT-5.6 0,79 $ (2,96 zł)
kurs NBP z 16.09.2026: 1 $ = 3,7639 zł; cena GPT-5.6 promocyjna

Według kryteriów różnica wyszła tylko tam, gdzie model powinien przyznać, że czegoś nie wie.

Introt0

Czym się różnisz od poprzedniej wersji?

Bez punktów · lepiej Astra

Polecenie, 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 15,7 s · 0,0080 $Nie 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 26,7 s · 0,0079 $Nie 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 36,5 s · 0,0111 $Nie 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 15,5 s · 0,0009 $Lepiej 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 22,9 s · 0,0014 $Jestem 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 32,9 s · 0,0018 $Lepiej 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.
↑ Wróć do tabeli wyników
Zadanie 1t3

Książka, która nie istnieje

Wygrywa Astra

Polecenie, 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 124,6 s · 0,0297 $Nie 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 214,9 s · 0,0202 $Wklej 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 319,7 s · 0,0246 $Nie 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 114,4 s · 0,0129 $Reportaż 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 240,9 s · 0,0346 $Reportaż 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 312,9 s · 0,0106 $Mariusz 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.
↑ Wróć do tabeli wyników
Zadanie 2t1

Reklamacja butów

Remis · mały plus dla Astry

Polecenie, 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 18,4 s · 0,0141 $Temat: 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 28,7 s · 0,0134 $Temat: 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 38,1 s · 0,0127 $Temat: 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 16,5 s · 0,0050 $Temat: 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 27,1 s · 0,0059 $Temat: 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 35,8 s · 0,0048 $Temat: 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]
↑ Wróć do tabeli wyników
Zadanie 3t2

Formuła do polskiego Excela

Remis

Polecenie, 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 15,0 s · 0,0046 $=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 24,0 s · 0,0046 $=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 34,3 s · 0,0063 $=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 12,7 s · 0,0031 $=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 23,4 s · 0,0035 $=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 32,2 s · 0,0028 $=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))
↑ Wróć do tabeli wyników
Zadanie 4t5

Niejasne polecenie: długi weekend

Remis

Polecenie, 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 113,5 s · 0,0239 $Jasne! 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 213,0 s · 0,0194 $Jasne! 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 322,1 s · 0,0423 $Jasne! 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 16,1 s · 0,0062 $Jasne! Ż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 210,7 s · 0,0057 $Jasne! Ż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 37,8 s · 0,0070 $Chę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.
↑ Wróć do tabeli wyników
Zadanie 5t8

Zagadka z dwoma rozwiązaniami

Remis

Polecenie, 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 18,1 s · 0,0166 $Z 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 1Wariant 2
PoniedziałekDarekEwa
WtorekEwaDarek
ŚrodaCelinaCelina
CzwartekAniaAnia
PiątekBartekBartek

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 29,0 s · 0,0178 $Warunki 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 1Grafik 2
PoniedziałekDarekEwa
WtorekEwaDarek
ŚrodaCelinaCelina
CzwartekAniaAnia
PiątekBartekBartek

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 38,6 s · 0,0171 $Warunki 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 1Grafik 2
PoniedziałekDarekEwa
WtorekEwaDarek
ŚrodaCelinaCelina
CzwartekAniaAnia
PiątekBartekBartek

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 18,6 s · 0,0118 $Podane 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 1Wariant 2
PoniedziałekDarekEwa
WtorekEwaDarek
ŚrodaCelinaCelina
CzwartekAniaAnia
PiątekBartekBartek

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 29,3 s · 0,0113 $Podane 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 1Wariant 2
PoniedziałekDarekEwa
WtorekEwaDarek
ŚrodaCelinaCelina
CzwartekAniaAnia
PiątekBartekBartek

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 38,2 s · 0,0103 $Z 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 1Wariant 2
PoniedziałekDarekEwa
WtorekEwaDarek
ŚrodaCelinaCelina
CzwartekAniaAnia
PiątekBartekBartek

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.
↑ Wróć do tabeli wyników
Zadanie 6t7

Zmiana polecenia w trakcie

Remis

Polecenie, dosłownie

Wiadomość 1
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.
Wiadomość 2
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 16,1 s · 0,0094 $Sprzedam 3-letni rower miejski Kross. W cenie kask i lampki. Cena: 900 zł. Lokalizacja: Kraków…
Odpowiedź na wiadomość 13,1 s · 122 znakó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.
Odpowiedź na wiadomość 2 · oceniana2,9 s · 145 znaków

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 26,3 s · 0,0093 $Sprzedam 3-letni rower miejski Kross. W cenie kask i lampki. Cena: 900 zł. Lokalizacja: Kraków…
Odpowiedź na wiadomość 13,7 s · 122 znakó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.
Odpowiedź na wiadomość 2 · oceniana2,6 s · 145 znaków

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 36,5 s · 0,0095 $Sprzedam 3-letni rower miejski Kross. W cenie kask i lampki. Cena: 900 zł. Lokalizacja: Kraków…
Odpowiedź na wiadomość 14,0 s · 122 znakó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.
Odpowiedź na wiadomość 2 · oceniana2,5 s · 145 znaków

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 15,3 s · 0,0041 $Sprzedam rower miejski Kross, użytkowany przez 3 lata. Sprawny, wygodny, idealny do codziennej…
Odpowiedź na wiadomość 13,2 s · 196 znaków

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.
Odpowiedź na wiadomość 2 · oceniana2,1 s · 184 znaków

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 26,6 s · 0,0045 $Sprzedam rower miejski marki Kross, użytkowany przez 3 lata. W cenie kask i lampki. Cena: 900…
Odpowiedź na wiadomość 14,3 s · 147 znaków

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.
Odpowiedź na wiadomość 2 · oceniana2,2 s · 170 znaków

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 36,8 s · 0,0041 $Sprzedam rower miejski Kross, użytkowany przez 3 lata. Sprawny, w dobrym stanie. W cenie kask…
Odpowiedź na wiadomość 13,5 s · 179 znaków

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.
Odpowiedź na wiadomość 2 · oceniana3,3 s · 164 znaków

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.
↑ Wróć do tabeli wyników
Zadanie 7t4

Szczegóły w raporcie na 190 tys. znaków

Remis

Polecenie, 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.

Jaki dokument? Pełny tekst karty systemowej „GPT-6 Astra System Card” z OpenAI Deployment Safety Hub (deploymentsafety.openai.com/gpt-6-astra), po angielsku, w wersji z poprawkami z 9 września 2026 r. Rozmiar: 192 909 znaków (1 357 wierszy), a całe polecenie to według API 39 302 tokenów. Nie wklejam go tutaj, jest dostępny u źródła.

Pełne odpowiedzi: 3 przebiegi na model

GPT-6 Astra

Przebieg 19,4 s · 0,3986 $Test 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 24,0 s · 0,3986 $Test 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 36,0 s · 0,3986 $Test 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 13,5 s · 0,1592 $W 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 22,9 s · 0,1592 $W 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 Sol36 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 34,1 s · 0,1592 $W 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 Sol36 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**.
↑ Wróć do tabeli wyników
Zadanie 8t6

Gra Snake w jednym pliku HTML

Remis według kryteriów

Polecenie, 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.

GPT-5.6 Startuje sama. Wąż jedzie w ścianę i po ok. 1,1 s jest „Koniec gry”, zanim zdążysz nacisnąć klawisz. Tak jest we wszystkich 3 grach GPT-5.6.
GPT-6 Astra Czeka, aż klikniesz „Zagraj”. Ma strzałki na ekranie, więc zagrasz też na telefonie.

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

GPT-6 Astra · gra 1pisana 62,7 s · 9 555 znaków kodu

Czeka, aż klikniesz „Zagraj”. Ma strzałki na ekranie.

GPT-6 Astra · gra 2pisana 53,0 s · 9 175 znaków kodu

Czeka, aż klikniesz „Rozpocznij grę”. Ma strzałki na ekranie.

GPT-6 Astra · gra 3pisana 61,9 s · 11 552 znaków kodu

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

GPT-5.6 · gra 1pisana 21,2 s · 8 380 znaków kodu

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ć.

GPT-5.6 · gra 2pisana 17,4 s · 8 233 znaków kodu

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ć.

GPT-5.6 · gra 3pisana 20,3 s · 9 472 znaków kodu

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 162,7 s · 0,1436 $kod 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 253,0 s · 0,1475 $kod 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 361,9 s · 0,1734 $kod 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 121,2 s · 0,0541 $kod 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 217,4 s · 0,0491 $kod 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 320,3 s · 0,0569 $kod 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>
↑ Wróć do tabeli wyników