Wyzwanie
Otrzymasz tabelę jako dane wejściowe, narysowane za pomocą ASCII |
i _
. Twoim zadaniem jest ustawienie wokół niego krzeseł.
Przykład
Wejście:
____
| |
| |
| |
| |
|____|
Wynik:
_^_^_
< >
| |
< >
| |
<_ _ _>
v v
Te krzesła są wykonane z <>
i v^
.
Inny przykład:
Linia musi zawierać jak najwięcej krzeseł.
_____
| |_____
| |
| |
| |
| _____|
|_____|
_^_^_
< |_^_^_
| >
< |
| |
< _ _ _>
|_ _ _| v v
v v
Między każdym krzesłem muszą być odstępy. I >_^_^_<
jest nieważne, powinno być |_^_^_|
.
_____ _____
| |_____| |
| |
| |
| |
| ___________|
|_____|
_^_^_ _^_^_
< |_^_^_| >
| |
< >
| |
< _ _ _ _ _ _>
|_ _ _| v v v v v
v v
Wewnątrz „pączka” nie mogą znajdować się żadne krzesła.
_________________
| _____ |
| | | |
| | | |
| |_____| |
|_________________|
_^_^_^_^_^_^_^_^_
< _____ >
| | | |
< | | >
| |_____| |
<_ _ _ _ _ _ _ _ _>
v v v v v v v v
^
oraz v
nadaj priorytety <
i >
. Żadne krzesło samo w sobie (musi mieć co najmniej jedno |
lub _
w rzędzie).
_________________
| _____ |
| | | |
| | |_____|
| |_____
|___________|
_^_^_^_^_^_^_^_^_
< _ _ _ >
| | v v | |
< > <_ _ _>
| |_^_^_ v v
<_ _ _ _ _ _|
v v v v v
To jest kod golfowy, więc wygrywa najkrótszy kod.
Odpowiedzi:
Python 2,
10331007924879829787713699692691688687672670664659654648643642630625623620570560554545518514513510505492476454451443 bajtów6 bajtów zapisanych dzięki Riley
6 bajtów zapisanych dzięki Adnan
Ponieważ to pytanie ma ponad rok i wciąż nie ma odpowiedzi, pomyślałem, że spróbuję.
Wypróbuj online!
Program odczytuje tabelę o nazwie pliku
I
i drukuje tabelę z krzesłami dostd::out
. Nie byłam pewna co do kilku skrajnych przypadków, więc dokonałam najlepszej oceny (cokolwiek wymagało najmniejszego wysiłku), ale wydaje się, że zdała wszystkie testy. Niektóre wyjścia nie pasują dokładnie, ale wszystkie mają taką samą liczbę krzeseł.Wyjaśnienie
Pierwszy wiersz po prostu ustanawia niektóre definicje, które pozwolą nam zaoszczędzić bajty w przyszłości:
(Rozpakuję te makra, aby były czytelne w przyszłych wierszach)
Następnie otworzymy plik o nazwie,
I
ponieważ mamy już zmienną, która jest krótka, więc zapisuje kilka bajtów.Dzielimy się wzdłuż nowego wiersza, aby utworzyć listę ciągów (wiersze obrazu)
Następnie znajduję długość najdłuższej linii, aby móc dopełnić wszystkie linie do tej długości. (Dodaję również 3, ponieważ potrzebujemy trochę dodatkowego wypełnienia)
Następnie wykonujemy rzeczywiste wypełnienie i tworzymy ramkę
I
znaków wokół krawędzi. Wynika to z tego, że później będziemy musieli odróżnić wnętrze od zewnętrznej strony kształtu. Zmienimy również typ danych z listy ciągów na listę znaków (długość 1 ciągów).Następny wiersz to kolejna definicja zapisywania bajtów.
(Rozpakuję również ten)
Teraz chcemy rozprowadzać
I
postacie wszędzie poza kształtem. Możemy to zrobić za pomocą automatu pseudokomórkowego. KażdaI
zostanie przeniesiona na dowolne sąsiedniepostacie. Możemy zapętlać, dopóki automat się nie ustabilizuje, jednak nie może to zająć więcej iteracji niż znaków, więc po prostu zapętlamy każdy znak w
b
(oryginalne wejście)Dla każdej iteracji chcemy pominąć każdy znak na liście 2D (wyłączając najbardziej zewnętrzne dopełnienie)
Dla każdej pozycji uruchamiamy następujący kod:
Rozbijmy to.
Mamy if z dwoma warunkami oddzielonymi przez
&
(bitoweand
)Pierwszy sprawdza po prostu, czy jest
I
w którejś z sąsiednich komórek, a drugi sprawdza, czy bieżąca komórka to" "
. Jeśli spełnimy te warunki, ustawimy bieżącą komórkę naI
.Teraz, gdy ustaliliśmy zewnętrzną i wewnętrzną postać kształtu, możemy zacząć ustawiać krzesła wokół stołu.
Po raz kolejny przeglądamy wszystkie komórki (i ustawiamy więcej skrótów)
Oto moja ulubiona część. Jeśli przeszedłeś przez moje nudne, w większości oparte na definicji golfa, do tej pory nagrodzę cię przyjemnym smakiem sprytnego golfa (jeśli sam to powiem).
Małe tło w pythonie:
W Pythonie, jeśli spróbujesz dwukrotnie przypisać klucz słownika, przypisuje on ten drugi. Na przykład
Wykorzystamy tę właściwość, aby przypisać bieżącą komórkę do określonej postaci.
Pierwszy warunek to
Jeśli komórka znajduje się pośrodku krawędzi 3
_
znaków, ponownie przypisamy bieżącą komórkę i komórkę poniżej niej. Przypiszemy go do wyniku indeksowania przeciążonego słownika wedługI
. Najpierw ustawiamy nasze domyślne ustawienie na parę,"I":"_"+a[x+1][y]
co oznacza, że jeśli nie będzie żadnych zmian, przywrócimy pierwotne wartości obu komórek. Następnie dodajemy paręa[x-1][y]:"^ "
. Nie zrobi to nic (ważnego), chyba że komórka powyżej bieżącego (a[x-1][y]
) zostanie wypełniona znakiemI
. Jeśli maI
w sobie, zastąpi domyślną, mówiącą nam, abyśmy ustawili krzesło w bieżącej komórce. Następnie przechodzimy do komórki poniżej bieżącej komórki, jeśli ta komórkaI
ponownie przeskakuje, aby ustawić krzesło skierowane w górę poniżej bieżącego miejsca.Kolejny warunek jest odrobinę prostszy
Sprawdzamy, czy bieżąca komórka i komórka nad nią są jednocześnie
|
. Jeśli tak, tworzymy słownik.Pierwsza para w słowniku
"I":"|"
ustawia wartość domyślną. Ponieważ uzyskamy dostęp do klucza,I
jeśliI
nie zostanie on ponownie przypisany, domyślnie powróci do|
(postać, którą już jest) i nic nie zrobi.Dodajemy dwa klucze.
A[y+1]:">",A[y-1]:"<"
Jeśli którakolwiek z dwóch komórek po lewej i prawej stronie znajduje się,I
wówczas ponownie przypisze bieżącą komórkę do krzesła wskazującego w kierunku na zewnątrz.Teraz musimy po prostu wyjść. Jednak nie możemy po prostu drukować, musimy najpierw zrobić kilka czynności porządkowych. Musimy przekonwertować z powrotem na ciąg i usunąć wszystkie
I
stworzone przez nas s. Odbywa się to w jednej linii.źródło
i,o="I "
zamiasti="I";o=" "
pracy?n
Koszt 4 bajtów i oszczędza mi 6. Chociaż nie używam go często, oszczędza 2 bajty.