Przedstawmy standardową cegłę murarską jako [__]
(i zignorujemy fakt, że góra jest otwarta). Po ułożeniu tych cegieł w stos co druga warstwa jest przesunięta o pół cegły, jak to zwykle ma miejsce w przypadku konstrukcji z cegły:
[__][__][__][__]
[__][__][__][__]
[__][__][__][__]
[__][__][__][__]
W ten sposób każda cegła ma co najwyżej sześciu sąsiadów i dwie cegły nie mogą ustawić się bezpośrednio w linii.
Kluczową kwestią jest to, że układy tych cegieł nie są zaprawione , lecz jedynie utrzymywane razem przez grawitację. Dlatego ważne jest, aby każda cegła w konstrukcji była stabilna, w przeciwnym razie cała struktura będzie niestabilna.
Istnieją trzy sposoby, w których pojedyncza cegła może być stabilna:
- Każda cegła na ziemi (najniższa linia cegieł) jest stabilna.
Każda cegła, która ma dwie cegły bezpośrednio pod nią, jest stabilna:
[__] <- this brick is stable [__][__] <- because these bricks hold it up
Każda cegła, która ma cegłę zarówno nad, jak i pod nią po tej samej stronie, jest stabilna:
[__] [__] [__] [__] <- these middle bricks are stable [__] [__] because the upper and lower bricks clamp them in [__] [__] [__] [__] <- these middle bricks are NOT stable [__] [__]
Z tych zasad możemy zobaczyć, na przykład, aranżację
[__][__][__][__]
[__][__][__][__]
[__][__][__][__]
[__][__][__][__]
jest niestabilny, ponieważ prawy górny klocek jest niestabilny, co wystarczy.
Struktura cegły jest stabilna tylko wtedy, gdy wszystkie jej cegły są stabilne.
Wyzwanie
Twoim zadaniem jest napisanie funkcji, która pobiera ciąg struktury z cegły i zwraca prawdziwą wartość, jeśli struktura jest stabilna, a wartość fałsz, jeśli jest niestabilna. ( definicja prawdy / fałszu )
Łańcuch wejściowy może być dowolnie duży, ale zawsze będzie prostokątną siatką znaków, ze spacjami wypełniającymi obszary pozbawione cegieł. Szerokość siatki znaków będzie podzielna przez 4, ale wysokość może być nieparzysta lub parzysta.
Kratka z cegły zawsze rozciąga się powyżej i na prawo od dolnej lewej pozycji cegły:
.
.
.
BRK?BRK?BRK?BRK?
BRK?BRK?BRK?BRK?BRK?
BRK?BRK?BRK?BRK?
BRK?BRK?BRK?BRK?BRK? . . .
BRK?BRK?BRK?BRK?
BRK?BRK?BRK?BRK?BRK?
W zależności od struktury każda BRK?
reprezentuje cegłę ( [__]
) lub pustą przestrzeń (4 spacje).
Zauważ, że wnęki z połowy cegły są wypełnione spacjami, aby siatka znaków była prostokątna.
Punktacja
Najkrótszy kod w bajtach wygrywa.
Notatki
- W razie potrzeby możesz użyć
.
zamiast spacji jako znaku pustej spacji. - Pusty ciąg jest uważany za stabilny.
- Jeśli twój język nie ma funkcji, możesz użyć nazwanej zmiennej łańcuchowej jako danych wejściowych i przypisać wynik do innej zmiennej.
- Jeśli twój język nie ma łańcuchów, możesz zrobić wszystko, co wydaje się odpowiednie do wprowadzania danych.
Przypadki testowe
Różne przypadki testowe, oddzielone pustymi liniami. Dla jasności .
zastosowano zamiast spacji puste miejsca.
Stabilny:
[__]
..[__]..
[__][__]
........[__]........
......[__][__]......
........[__]........
..[__][__]..
[__][__][__]
..[__][__]..
[__]....[__]
............[__]..
..[__][__][__][__]
[__][__][__][__]..
..[__][__][__][__]
[__][__][__][__]..
..[__]........[__]..
[__][__][__][__][__]
..[__][__][__][__]..
....[__][__][__]....
......[__][__]......
........[__]........
Nietrwały:
..[__]..
........
..[__]..
[__]....
..[__]..
....[__]
..[__][__]..
[__]....[__]
..[__][__]..
[__]....[__]
..[__][__][__][__]
[__][__][__][__]..
..[__][__][__][__]
[__][__][__][__]..
[__][__][__][__][__]
..[__][__][__][__]..
....[__][__][__]....
......[__][__]......
........[__]........
........[__]....
......[__][__]..
....[__][__]....
..[__][__]......
[__][__]........
..[__]..........
(będziesz musiał mentalnie ułożyć te linie jedna na drugiej. Chodzi o to, że twoje reguły dopuszczają konstrukcje, których środek ciężkości jest daleko odsunięty od ich punktu styku z podłożem. Powinno być możliwe ich zaostrzenie, aby tego uniknąć , bez potrzeby korzystania z silnika fizyki, jeśli masz na to ochotę.)Odpowiedzi:
Kod maszynowy 80386, 98
Kod:
Kod skanuje grafikę ASCII od końca do początku, przeskakując 2 znaki na raz. Robi to dwukrotnie potrzebne kontrole (wystarczy przeskoczyć 4 znaki), ale upraszcza logikę.
Sprawdzanie rozpoczyna się od ostatniego do ostatniego rzędu znaków (nie trzeba sprawdzać ostatniego wiersza). W każdej linii zaczyna 3 znaki od prawej (nie trzeba sprawdzać zbyt daleko w prawo). Dla każdej postaci sprawdza 4 otaczające ją postacie:
Istnieje kilka logicznych warunków do sprawdzenia:
To szczęśliwy zbieg okoliczności, że wszystkie postacie z cegieł
[_]
mają ustawione LSB; wszystkie inne postacie.\n
mają to jasno. Ponadto, 80386 zestaw instrukcji zawiera Te poręczne „wysokie” i „niskie rejestry” (ah
,al
itp), które pomagają parallelize Kontrole trochę. Więc wszystkie sprawdzanie sprowadza się do jakiegoś niezrozumiałego majstrowania.Zacząłem od następującego kodu C:
Przetłumaczyłem kod na język asemblera (jest to w większości jeden na jeden), w tym implementację
strchr
istrlen
. Poniższy kod źródłowy został przetłumaczony przez MS Visual Studio na kod maszynowy na górze mojego postu.źródło
MATLAB - 119 bajtów
Zminimalizowane:
Rozszerzony:
Przykładowe użycie:
Detale
Procedura dołącza wiersz
.
do góry matrycy wejściowej, a następnie konwertuje na matrycę numeryczną, dodając 3 do kodów znaków ASCII. Biorąc pod uwagę tę konwersję, splot 2D z jądremdaje macierz
0
w miejscach, w których wzór znakówjest obecny,
*
reprezentując „dowolny znak”. Ze względu na budowę jądra jest to jedyny prawidłowy wzorzec znaków, który da a0
.Identyczny splot jest wykonywany z wykrytą wersją jądra z odwróconą lewą i prawą stroną
Dane wejściowe są stabilne, jeśli i ) jest puste lub ii ) w żadnym zwojach nie pojawiają się zera.
Są dwie frustracje
Domyślny splot MATLAB-a przebiega poza krawędzie macierzy operandu, tworząc błędne
0
s w przeciwległych rogach dla obu zwojów, wymagając,'valid'
dodania (8 bajtów), abyconv2
wywołać ograniczenie wyjścia do obszaru, w którym splot jest ważny.Obsługa pustej wielkości ciągu powoduje dodanie 12 bajtów.
źródło
JavaScript (E6) 131
261Przetestuj w konsoli FireFox / FireBug
Wydajność
Bez golfa
źródło
[...a]
, jeśli nie masz nic przeciwko mojemu pytaniu? Wiem, że ES6 zezwala...arg
na ostatni argument funkcji do przechwytywania variadics, ale nigdy nie widziałem, aby była używana w ten sposób.{:}
w MATLAB. To będzie bardzo przydatne. Dzięki. :)Python 279
Wydaje mi się, że źle radzę sobie z wyzwaniami związanymi z golfem i może używam do tego niewłaściwych języków: D Uwielbiam kod, który można łatwo odczytać :) Btw Chciałbym zobaczyć kod python, który używa mniej bajtów!
Możliwe przykłady:
źródło
_
i[
<>
, użyłbyś!=
.!=
jest preferowanym sposobemJavaScript 2 (ES6) - 148
151bajtówOczekuje ciągu wierszy z cegieł oddzielonych znakiem nowej linii (uwaga: jeśli moglibyśmy użyć innego znaku separatora, takiego jak „|” do oddzielenia wierszy, można by to zrobić o 1 bajt krótszy).
Testuj w konsoli Firefox za pomocą:
źródło
Python, 209
Testy:
Wydajność:
źródło