Oto schemat więzienia używającego znaków ASCII:
+------------------------------+
| |
| X X |
| |
| D
D |
| |
| |
| X X X |
| |
+------------------------------+
Ściany są zbudowane z postaci z rur |
, myślników -
i filarów +
na narożach i skrzyżowaniach. Są też dwoje drzwi oznaczonych D
(które zawsze będą na lewej i prawej ścianie). Więzienie jest pełne przerażających ludzi oznaczonych X
.
Celem jest budowanie ścian spełniających następujące warunki:
- Każda osoba jest w izolatce;
- Między dwojgiem drzwi biegnie korytarz;
- Każda komórka zawiera dokładnie jedne drzwi, które są bezpośrednio połączone z głównym korytarzem;
- Cała przestrzeń w więzieniu jest wykorzystywana przez komórki i korytarz;
- Każda komórka zawiera osobę (tzn. Nie ma pustych komórek).
Korytarz jest pojedynczą ścieżką, nie rozgałęzia się i zawsze ma szerokość jednej postaci. Oto rozwiązanie dla powyższego więzienia:
+---------+--------------------+
| | |
| X | X |
| | +--------+
+------D--+-----D-----+ D
D +---D--+
+----D--------+---D-----+ |
| | | |
| X | X |X |
| | | |
+-------------+---------+------+
Możesz założyć, że każde więzienie wejściowe zawsze będzie miało ważne wyjście. Oto kilka więzień wejściowych wraz z możliwymi wynikami:
+------------------------------+
|X X X X X X X X X X X X X X X |
| |
D D
| |
| X |
+------------------------------+
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+--+
|X|X|X|X|X|X|X|X|X|X|X|X|X|X|X |
+D+D+D+D+D+D+D+D+D+D+D+D+D+D+D-+
D D
+----------------------D-------+
| X |
+------------------------------+
+-----------+
|X |
| |
| |
|X X|
| |
| X|
| |
D D
+-----------+
+-+-------+-+
|X| D |
| D +---+ | |
+-+ | | |
|X| | +---+X|
| | | | +-+
| D | | X|
+-+ | +-D---+
D | D
+---+-------+
+----------------+
|X X X X|
| |
D |
| |
|X X X |
| |
| |
| |
| X X D
| |
| |
+----------------+
+---+---+----+---+
|X | X | X | X|
+--D+--D+---D+--D+
D |
+---+---+------+ |
|X | X | X | |
+--D+--D+---D--+ |
| |
| +-----+------+-+
| | X | X | D
| +----D+---D--+ |
| |
+----------------+
Odpowiedzi:
Python 2 ,
2986288129492135207520711996 bajtówWypróbuj online!
Zostało znacznie obniżone; jednak wciąż może być miejsce na poprawę. Ten fragment kodu rozwiązuje jednak wszystkie przypadki testowe. Nie działa bardzo wydajnie; w przypadku dużych więzień architekt może nie spieszyć się z tym.
Korzysta z prostego algorytmu wyszukiwania ścieżki, aby połączyć drzwi i więźniów z korytarzem. Następnie otacza wszystkich więźniów i ich ściany i popycha te ściany w pustej przestrzeni, aż wszystko zostanie wypełnione. Ostatnim krokiem jest zaimplementowanie wyglądu grafiki ASCII.
Na pewno zajęło mi to kilka godzin. Mam nadzieję, że działa również na innych więzieniach niż przypadki testowe. (Nie możesz przetestować ich wszystkich, prawda?)
źródło
P
). To nie jest dozwolony format IO. Powinieneś użyć alboinput()
zdefiniować funkcję.C,
37323642 bajtówMógłbym zdecydowanie zagrać w golfa nieco dalej, ale to całkiem niezły początek. Początkowo nie wiedziałem, że moje podejście ma nazwę, więc wykrzyczcie @TehPers za nadanie mi nazwy do badań. Zdecydowanie podobało mi się wyzwanie, jakie oferuje to pytanie. :)
-63 bajty z sugestii @ Jonathana. Ja również otrzymuje
char
siętypedef char R
i zastępuje wszystkie literały znakowe, które są mniejsze niż 100 z ich wartości ASCII w sumie 90 bajtówSzybkie wyjaśnienie mojego kodu.
Aby użyć tego programu, przekaż mapę jako ciąg znaków ze znakami nowej linii lub z każdym poziomem oddzielonym spacją, jak w poniższym przykładzie.
kod
źródło
free(t);free(u);
na końcu programu. Jest także'\0'
równy0
, oszczędzając kolejne 3 bajty.typedef int Q;
i zastąpić wszystkie wystąpieniaint
zQ
, można zaoszczędzić kolejne 44 bajtów.