(Zainspirowany podczas rysowania na suchej tablicy do wymazywania)
Wyzwanie:
Biorąc pod uwagę łańcuch wejściowy zawierający znaki reprezentujące różne kolory markerów wymazywania na sucho na białej tablicy, wypisz kolejność, w jakiej zostały narysowane, od pierwszego do ostatniego.
Wejście:
Łańcuch zawierający kolory znaczników wymazywania na sucho, które są reprezentowane przez litery alfabetu (górne są inne niż małe litery, możesz zastąpić dowolne znaki użyte w moich przykładach, o ile każdy kolor ma inną literę). Reszta tablicy będzie białą przestrzenią. Na planszy będzie tylko jedna linia każdego koloru. Nie będzie danych wejściowych, w których wszystkie linie nachodzą na siebie (patrz przypadek testowy 4
). Wszystkie linie będą proste i albo poziome, albo pionowe.
Wynik:
Kolejność rysowania linii na planszy, od pierwszej do ostatniej. Jeśli istnieje wiele rozwiązań dla dowolnego wejścia, możesz wyprowadzić dowolne z nich. Dane wyjściowe można sformatować w dowolny sposób: pojedynczy ciąg znaków lub oddzielone spacjami, znakami nowego wiersza itp., O ile użyte znaki są zgodne z tymi, które zastosowano w danych wejściowych.
Przypadki testowe:
Wejście 1:
R
R
BBRBB
R
Wyjście 1:
BR
Wejście 2:
GY
GY
RRRRGYRRR
GY
GY
BBBBBBBB
GY
GY
Wyjście 2:
RGYB // or RYGB
Wejście 3:
R P
R P
AAAARAAAAPA
R P
R P
GGGGRGGG P
R
Wyjście 3:
AGPR // or APGR
Wejście 4:
O Y
RRRYR
O Y
GOGGG
O Y
Wyjście 4:
// Undefined, does not need to be handled by your program
Wejście 5:
YYYB
B
B
Wyjście 5:
// YB or BY
Zasady:
To jest golf golfowy , więc wygrywa najkrótszy kod w bajtach.
Odpowiedzi:
Perl, 103 + 2 = 105 bajtów
Uruchom z
-n0
(kara 2 bajty).Wyjaśnienie:
Jedna drobna subtelność tutaj zawiera takie dane wejściowe:
Spójrz na czwartą linię tutaj. Gdyby kolejność pisania była zgodna z BACBD, mogłaby istnieć pozioma linia
B
s bez naruszania jakichkolwiek założeń problemu (poza tym, że istnieje tylko jedna linia każdego koloru, coś, czego nie sprawdzamy). Aby obejść ten problem, zapewniamy w ostatnim wyrażeniu regularnym, że każda linia zaczyna się od litery (lub cyfry lub podkreślnika, ale są one niemożliwe), i polegamy na tym, że linie równoległe będą znajdować się od lewej do prawej i od góry -to-bottom (ponieważ wyrażenie regularne znajdzie pierwsze dopasowanie w ciągu). W związku z tym pierwszy znak każdej niejednoznacznej linii jest nadpisywany, zanim sama linia zostanie uznana za dopasowanie, co zapobiega dopasowaniu wyrażenia regularnego.źródło
perl -n0E '/.*/;for$i(/(\S)(?=(?:(?:.{@{+}})?(?:\1| ))*(?!.*\1))/gs){/.*/;unless(/$i+[^$i\s]+$i/||/$i(.{@{+}}[^$i ])+.{@{+}}$i/s){$r="$i$r";s/$i/ /g;last}}/\S/?redo:say$r'
(co wymaga, aby wiersze wejściowe były odpowiednio wypełnione spacjami, aby były tej samej długości))Python 2, 199 bajtów
Skończyło się to znacznie dłużej, niż początkowo myślałem. Poza tym
rindex
mogłem postrzegać to jako bardzo dobry program do tłumaczenia na język Pyth.Pobiera listę wierszy i wyświetla listę znaków. Kod generuje permutacje rekurencyjnie, upewniając się, że żadna z narysowanych linii nie powinna być narysowana nad bieżącą linią.
Kod narusza wiele funkcji Pythona, na przykład przejmuje
w
moc logiczną, testuje puste zestawy, sprawdzając podzbiory{0}
(ponieważ moje zbiory nigdy nie zawierają ciągów znaków), i moją ulubioną, odróżniając dowolną listę odNone
sprawdzania, czy jej reprezentacja jest większa niżZ
.Wyjaśniony kod
źródło