Alice jest stażystką w firmie, która używa Brainfuck jako podstawowego języka do programowania zarówno po stronie klienta, jak i serwera. Alice właśnie napisała swój pierwszy kod i trochę się denerwuje, przygotowując się do pierwszej recenzji kodu.
Alice chce, aby kod był odpowiednio sformatowany i wyglądał ładnie, ale nie ma czasu na zapoznanie się z 328-stronicowym przewodnikiem po stylu kodu firmy, więc postanowiła sformatować go jako idealny kwadrat . Niestety, długość kodu może być niewystarczająca do utworzenia kwadratu, więc postanowiła pozostawić prostokątną przerwę na środku. Luki muszą być idealnie wyśrodkowane i możliwie jak najbliżej kwadratu .
Przykłady
++++++ +++++ +++++ +++++ +++++ +++++
++++++ +++++ +++++ + ++ ++ ++ +++++
++++++ ++ ++ + + + ++ + +
++++++ +++++ +++++ +++++ ++ ++ +++++
++++++ +++++ +++++ +++++ +++++ +++++
Perfect OK Acceptable Unacceptable No way! Nope.
Napisz program lub funkcję, która pomoże Alice. Biorąc pod uwagę kod Alice jako ciąg wejściowy, w miarę możliwości wyślij poprawnie sformatowany kod, jak opisano poniżej. Jeśli formatowanie jest niemożliwe, wyjdź płaczącą emoji :~(
.
To jest golf golfowy, więc odpowiedzi są punktowane w bajtach, a celem jest mniejsza liczba bajtów.
Ograniczenia
- Twój program lub funkcja powinna przyjmować pojedynczy ciąg znaków jako dane wejściowe i wyprowadzać jeden lub więcej wierszy tekstu (lub zwracać ciąg wielu wierszy lub tablicę ciągów, jeśli zaimplementujesz funkcję).
- Łańcuch wejściowy może zawierać dowolne znaki ASCII, w tym spacje.
- Wszystkie białe znaki na wejściu należy zignorować. Nie powinny one liczyć się do długości kodu i nie powinny być używane w danych wyjściowych.
- Łańcuch wejściowy zawiera co najmniej jeden znak spacji.
- Sformatowany kod musi mieć te same znaki spacji w tej samej kolejności, co w kodzie wejściowym.
- Sformatowany kod musi być doskonałym kwadratem, tzn. Wszystkie linie powinny mieć tę samą długość, a liczba linii powinna być równa długości linii.
- Sformatowany kod może zawierać przerwę w środku.
- W odstępie można stosować tylko znaki spacji (kod ASCII 32).
- Przerwa (jeśli występuje) musi być prostokątna.
- Każdy wiersz sformatowanego kodu musi zawierać co najmniej jeden znak spacji, tzn. Szerokość przerwy musi być ściśle mniejsza niż szerokość kwadratu (przerwa 5x1 jest niedopuszczalna dla kwadratu 5x5).
- Odstęp powinien być poziomy, tzn. Szerokość odstępu powinna być większa lub równa wysokości odstępu.
- Luka musi być idealnie wyśrodkowana.
- W związku z tym parzystość szerokości i wysokości parzystości powinna być taka sama jak parzystość szerokości kwadratu (na przykład dla 5x5 odstępu kwadratowego może wynosić 1x1, 3x1 lub 3x3).
- Jeśli to możliwe, generuj kwadrat bez żadnej przerwy.
- W przypadku wielu rozwiązań wybierz jedno z odstępem najbliższym kwadratowi, tzn. Różnica między szerokością odstępu a wysokością odstępu jest minimalna (na przykład: odstęp 10x10 jest bardziej preferowany niż 8x6, a 8x6 jest bardziej korzystny niż 6x2).
- Jeśli nadal występuje remis, wybierz rozwiązanie o minimalnej powierzchni przerwy (na przykład przerwa 2x2 jest bardziej preferowana niż 4x4).
- Jeśli w ogóle nie można sformatować kodu, wyjdź
:~(
. - Nowa linia po ostatniej linii jest opcjonalna.
- [Nowość] Możesz bezpiecznie założyć, że każdy znak o kodzie poniżej 33 to biała spacja. Mam nadzieję, że pomoże ci to w grze w golfa.
Testy
Input Output Code length Comment
+++++++++ +++ 9 Alice is lucky,
+++ her code perfectly fits a square.
+++
++++++++ +++ 8 Though code length isn't enough for a square,
+ + a small gap fixes it.
+++
++++++ :~( 6 No luck, code cannot be formatted.
Hello, Hell 12 Input may contain any ASCII characters,
World! o , but whitespaces in input should be ignored.
W o
rld!
+++++ + +++++ +++++ 22 Gap is not required to be a square,
+++++ + +++++ +++++ it can be a rectangle.
+ +
+++++
+++++
+++ + +++ ++++++++ 28 There exists another solution:
+++ + +++ + + 6x6 square with 4x2 gap,
+++ + +++ + + but in Alice's opinion square gap
+++ + +++ + + makes code more readable.
+ +
+ +
+ +
++++++++
Trudne testy
This must be Thism 24 7x7 with 5x5 gap looks good,
5x5 with 1x1 ustbe but 5x5 with 1x1 gap is better,
gap. 5x 5w because gap area is smaller.
ith1x
1gap.
+++ +++ +++ :~( 18 In case you tried 5x5 square
+++ +++ +++ with 7x1 gap ;)
Zasoby
Aby zaoszczędzić miejsce, możesz znaleźć przykładowy kod i dodatkowe przypadki testowe na tio.run
[Nowość] Możesz rzucić okiem na tabelę przyjętych rozwiązań dla wprowadzania do 100 znaków . Zmieniłem szerokość i wysokość, ponieważ wydaje się to bardziej intuicyjne.
Inspirowany przez: Kwadrat tekstu
Zmiany
Dodano 2 testy, naprawiono błąd w przykładowym kodzie.
Dodano tabelę rozwiązań do 100, dodano wyjaśnienie białych znaków.
Odpowiedzi:
C (gcc) , 354 bajty
Wypróbuj online!
źródło
isspace(x)
zx<33
.JavaScript (ES6),
284 ... 274270 bajtówZaoszczędź 4 bajty dzięki @Shaggy
Zwraca tablicę ciągów.
Wypróbuj online!
źródło
This must be 5x5 with 1x1 gap.
(24 znaki)[\s\n]
być po prostu\s
?++w>x-2
w++>=x-2
w++>=x
\s
oszczędza 4 bajty. Dzięki. :)Stax , 80 bajtów
Uruchom i debuguj
Jak to działa?
Rozpakowane, niepolowane i skomentowane to wygląda tak.
Uruchom ten
źródło
Węgiel drzewny , 120 bajtów
Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:
Usuń spacje z danych wejściowych, a następnie odwróć i podziel je na znaki, abyśmy mogli później łatwiej zapętlić znaki.
Zacznij od rozmiaru zero, co oznacza, że nie znaleziono (jeszcze) wyniku.
Sprawdź wszystkie długości boczne do długości sznurka. (Dodanie podziału oczywiście przyspieszyłoby kod).
Jeśli wynik okaże się idealnym kwadratem, zapisz rozmiar kwadratu, a także ustaw go jako rozmiar ramki.
Pętla nad możliwymi wysokościami i szerokościami granic (szerokość krawędzi nie jest większa niż wysokość granicy, dzięki czemu wysokość szczeliny nie jest większa niż szerokość szczeliny).
Jeśli rozmiar obramowania jest pożądaną długością i nie mamy jeszcze rozwiązania lub nie jest on tak kwadratowy jak to rozwiązanie, zaktualizuj rozwiązanie przy użyciu tego rozmiaru kwadratu i obramowania.
Jeśli mamy rozwiązanie ...
Narysuj prostokąt o dowolnym charakterze o danym rozmiarze kwadratu.
Jeśli granica jest wystarczająco mała, aby pozostawić lukę, usuń ją. (Polecenie rysowania będzie rysować w górę i w lewo dla wartości ujemnych i wcale nie lubi wartości zerowych.)
Zamień wszystkie (pozostałe) znaki na znaki z wejścia.
W przeciwnym razie wyjście
:~(
.źródło
Galaretka ,
9185 bajtówWypróbuj online!
Łącze monadyczne, które przyjmuje ciąg wejściowy jako argument i zwraca ciąg znaków ze sformatowanym wyjściem lub
:~(
.źródło
Python 2,
287281279 bajtówWypróbuj online!
Korzysta z porównania listy leksykograficznej Pythona, używając tych samych wartości do wyboru rozwiązania i wydrukowania go. Jestem prawie pewien, że
1042 bajtów wciąż można zgolić.Wyjaśnienie
Usuń białe znaki, dzieląc je białymi znakami i łącząc się z nimi
""
, a następnie przekonwertuj dane wejściowe na listę na później. Zainicjuj takżel
długość aktualnego kodu ip
listę prawidłowych możliwości.Pętla przez wszystkie możliwości wielkości szczelin od
0*0
dol*l
. Oblicz długość krawędzi kwadratu za pomocąl
znaków kodowych ix*y
spacji jakos
.Sprawdź, czy spełnione są następujące warunki:
s % 1 == 0
, tzn. powstałby idealny kwadratx < s-1 > y
, To znaczyx
iy
co najwyżejs-2
i zmieścić wewnątrz kwadratus % 2 == x % 2 == y % 2
, tj. zarównox
iy
dopasować parytetu krawędzi i może być wyśrodkowanyx < 1
, tj.x == 0
zignorujesz wszystko oprócz idealnego kwadratuJeśli warunki są zgodne, dodaj następujące elementy w krotce,
p
aby znaleźć optymalny:abs(x-y)/2
; najpierw znajdź minimalną różnicęx
iy
uzyskaj jak najwięcej kwadratowych odstępów. Dzieje się tak zawsze, więc dzielimy przez 2.int(s)
; następnie znajdź minimalną długość boku. Ponieważs
jest liczbą całkowitą i zwiększa się wraz z obszarem przerwyx*y
, sortuje się według obszaru przerwy.-x
; następnie znajdź maksymalną szerokość, aby preferować odstępy poziome. Dzieje się tak po tym obszarze, ponieważ został opracowany, ale obszar jest taki samx*y
iy*x
działa.Jeśli znaleźliśmy prawidłowe układy, znajdź optymalny, jak opisano powyżej. Oblicz granicę poziomą
b
i zainicjuj numer liniiY
na 0.Jeśli numer linii
Y
znajduje się wewnątrz odstępu (pionowa ramka jestb+d
, zd
krotką), dodaj wartość odstępów szerokości odstępu po poziomej granicy wc
. (Zmianac
polega na tym, że potrzebujemy listy). Następnie wydrukuj linię kwadratu i usuń jąc
. Powtarzajs
czasy, zwiększając numer linii.Jeśli nie znaleziono żadnych układów, nie powiodło się.
źródło
"some\ntext"
jako separatory. (input()
ocenia wiersz danych wejściowych jako kod Pythona). Jeśli nie jest to dopuszczalne, daj mi znać. Długość 22 również mi odpowiada.Pyth ,
9998 bajtówWypróbuj online!
Używa tego samego algorytmu, co moja odpowiedź w Pythonie, ale wiele szczegółów zostało znacznie zmienionych, aby były krótsze w Pyth.
Pyth pokazuje tutaj swój wiek, ponieważ nie był aktualizowany od wieków i używa tylko drukowalnych znaków ASCII (dla kodu, a nie danych), marnując dużo miejsca.
Co ciekawe, jeśli Pyth używałby tego samego rodzaju pakowania base-256 co Stax, ten program mógłby mieć ⌈98 log 256 95⌉ = 81 bajtów długości, tuż obok Stax (80 bajtów) i Galaretki (85 bajtów). Myślę, że to ładnie pokazuje, jak bliskie są golfowe języki nawet przy ich drastycznie różnych paradygmatach.
Objaśnienie (tylko nieco mniej nieczytelne niż kod)
#
otacza wszystko,while True:
co pomija komunikat i kończy działanie po błędzie.JscQ)
c
wejście chmielu (Q
) w białychs
znakach, łączy części razem i zapisuje wynikJ
.^UJ2
tworzy listę indeksów (U
)J
i przyjmuje swoją2
potęgę kartezjańską (^
), co daje wszystkie pary[h,w]
z0<=h<len(J)
i0<=w<len(J)
.+L@+lJ*Fd
: dla wszystkich (L
) takich pard
dodaje (+
) pierwiastek kwadratowy (@
…2
) z (l
engJ
plus plus+
) produktu (*F
) paryd
) z lewej strony pary, tworząc triplet[side length, gap height, gap width]
.f!|%hT1&eT|t{%R2TgeStThT
:f
ilter dla trojaczkówT
gdzie!|
):hT
) modulo 1 (%
…1
) jest różna od zera&
):eT
) jest różna od zera|
):R
) modulo 2 (%
…2
), z duplikatami ({
) i pierwszym unikalnym (t
usuniętymi ), jest niepustaeS
) wysokość szczeliny i szerokość szczeliny (tT
) jestg
równa lub większa niż długość boku (hT
)S
sortuje trojaczki leksykograficznie (według długości boku, a następnie według wysokości szczeliny).oaFtN
następnieo
ociera trojaczki oa
bsolute różnicę między wysokością i szerokością szczeliny (tN
).W tym momencie, jeśli nie mamy prawidłowych rozwiązań,
|
ocenia swój drugi argument\n":~("
, który drukuje i zwraca:~(
.h
przyjmuje optymalne rozwiązanie (lub":"
jeśli nie ma) i zostaje zapisaneK
. Następnieh
przyjmuje długość boku (lub":"
jeśli nie ma),s
rzutuje na liczbę całkowitą (lub kończy się niepowodzeniem i kończy pracę, jeśli nie ma) i jest zapisywany (=
) wQ
.Każda z (
m
)[gap height, gap width]
(tK
) jest następnie odejmowana (-
) od długości boku (Q
), a wynik dzielony przez 2 (/
…2
). Wyniki sąA
przypisane doG
iH
.Wreszcie wchodzimy w
W
pętlę Hile.Z
zaczyna się od 0 i każdą iterację zwiększamy, ale używamy starej wartości (~hZ
, pomyślZ++
w C).W
) stara wartość jest w ({
)r
angeG
do (długość boku -G
) (-QG
), przypisz (=
) doJ
:c
przeskoczJ
w pozycji (]
)H
ij
o połówki o szerokości szczelinyeK
razy (*
) spację (d
). Jeśli wartość nie była w zakresie, po prostu wróćJ
. Jeśli ten wynik jest pusty, zatrzymaj pętlę.>
) pierwszyQ
znaki zJ
i przypisz (~
) wynik doJ
. Ze starej wartościJ
weź (<
) pierwszeQ
znaki i wydrukuj je.Wreszcie
#
pętla rozpoczyna się od nowa, bo błędy i zamknięciacQ)
zQ
zawierającym numer jest nieprawidłowy.źródło
05AB1E ,
9589 bajtówKilka bajtów tu i tam na pewno można grać w golfa.
Pierwsze trzy kroki programu zostały zainspirowane odpowiedzią Stax @recursive , więc upewnij się, że go głosujesz!
Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie:
Krok 1: Usuń wszystkie białe spacje:
Krok 2: Utwórz wszystkie możliwe trojaczki[ a , b , c ] , gdzie za jest wymiarem wynikowym a × a kwadrat i b × c jest wielkością luki. Robimy to, tworząc wszystkie możliwe trojaczki za pomocą liczb całkowitych z zakresu[ 0 , a ] . A następnie filtrujemy je tam, gdzie wszystkie poniższe elementy są zgodne z prawdą dla trypletu:
Na przykład:L = 28 spowoduje trojaczki
[[6,2,4],[6,4,2],[8,6,6]]
.Krok 3: Sprawdź, czy nadal mamy jakieś trojaczki. Jeśli nie, wyjdź( a b s ( b - c ) , b × c ) .
":~("
; jeśli tak, określ, którego użyć, sortując i pozostawiając tylko pierwszy. Robimy to, sortując krotkiNa przykład: trojaczki
[[6,2,4],[6,4,2],[8,6,6]]
zostaną posortowane[[8,6,6],[6,2,4],[6,4,2]]
, po czym[8,6,6]
pozostanie tylko .Krok 4: Utwórz listę, w jaki sposób powinniśmy podzielić ciąg, aby wstawić spacje. Odbywa się to w następujący sposób:
Dany[ a , b , c ] , utwórz listę z:
Na przykład: triplet
[7,3,5]
spowoduje wyświetlenie listy[15,2,2,35]
.Krok 5: I w końcu podzieliliśmy ciąg znaków na podstawie tej listy, połączmy go z powrotem razem zdo ilość spacji, podziel ją na części wielkości do i dołącz do nich razem przez nowe linie. Na przykład:
Stringc = 5 ilość miejsc do a = 7 do tego:
"Alongtesttoseeifitworksasintended."
podzielone według listy[15,2,2,35]
spowoduje:["Alongtesttoseei","fi","tw","orksasintended."]
. Następnie dołącza"Alongtesttoseei fi tw orksasintended."
. A następnie podzielony na części wielkości["Alongte","sttosee","i f","i t","w o","rksasin","tended."]
. Do których następnie dołączane są znaki nowej linii.źródło