Sztuka ASCII jest fajna. Nowoczesne edytory tekstu są bardzo dobre w manipulowaniu tekstem. Czy nowoczesne języki programowania są w stanie sprostać zadaniu?
Jednym z typowych zadań w manipulacji grafiką ASCII jest przycinanie tekstu do prostokąta między dwoma znakami. To zadanie musisz wykonać w tym wyzwaniu.
Detale
Twój program pobierze 3 dane wejściowe:
- pierwszy to znak „początku” bloku - oznaczenie lewego górnego rogu
- drugi to „koniec” znaku bloku - oznaczenie prawego dolnego rogu
- trzeci to jakaś forma tekstu wielowierszowego, albo ciąg, albo lista ciągów, nazwa pliku lub cokolwiek innego
Wynikiem będzie tekst wielowierszowy (ponownie w dowolnym z powyższych formatów) przycięty do prostokąta między podanymi danymi wejściowymi. Zauważ, że pierwsze dwa dane wejściowe mogą nie być unikalne.
Skrzynie na brzeg
Pudełka muszą zawsze mieć objętość co najmniej 2. Zatem te:
() (
)
są pudełka, ale te:
)( ) (
( )
nie są (z początkiem = (
i końcem = )
).
Dane wejściowe będą zawierać tylko jedno pole. Dlatego początkowy i końcowy znak musi wystąpić tylko raz, chyba że jest to ten sam znak, w którym to przypadku musi wystąpić dokładnie dwa razy.
Dodatkowo każda linia na wejściu musi być co najmniej tak długa, jak odległość od początku linii do prawej krawędzi pola na wejściu.
Twój program nie musi obsługiwać nieprawidłowych danych wejściowych; mogą powodować niezdefiniowane zachowanie.
Zasady
Obowiązują typowe zasady gry w golfa. Najkrótszy kod wygrywa.
Przykłady
Słoneczny dzień: start: ( end: ) input:
This is some text
. (but this text
is in a box ).
So only it is important.
Wynik:
(but this text
is in a box )
Zwróć też uwagę na usuwanie poziomej przestrzeni. Uprawy artystyczne ASCII to 2d.
Deszczowy dzień: start: ( end: ) input:
This is some text (
But is that even )
really a box?
Wynik:
(
)
Ten sam początek / koniec: start: / end: / input:
Oh, I get how this could be useful
/----------------------------\
| All this text is in a box! |
\----------------------------/
Wynik:
/----------------------------\
| All this text is in a box! |
\----------------------------/
Niepoprawne dane wejściowe: start: ( end: ) input:
Boxes are rectangular ( so this has
0 volume ) which is illegal.
Nieprawidłowe dane wejściowe 2: start: ( end: ) input:
(The lines must already be square
so this line that is too short
relative to this end, is illegal)
Odpowiedzi:
Vim,
16, 12 bajtów / naciśnięć klawiszyWypróbuj online! w tłumaczu V.
Założę się, że stare edytory tekstu są jeszcze lepsze! :RE
Chociaż nie musi to koniecznie, ta odpowiedź działa z obiema danymi wejściami „niepoprawnymi”
i
Wyjaśnienie:
źródło
/\/<cr><c-v>nygv$o0dp
lub coś w tym stylu zbyt długo :)Galaretka , 13 bajtów
Dyadyczny link akceptujący listę znaków początkowych i końcowych po lewej stronie oraz listę linii (jako listy znaków) po prawej stronie, która daje listę linii (jako listy znaków).
Wypróbuj online! (pełny program - jeśli dane wejściowe są poprawne w Pythonie, będą wymagały cytowania napisów w Pythonie).
W jaki sposób?
Na przykład z lewym =
['a', 'b']
i prawym (jako lista list znaków - wiersze):=€
daje listę dwóch list list (pierwsza wykonuje'a'=
, druga'b'=
):sumowanie to daje pojedynczą listę list (sumowanie elementarne):
ŒṪ
daje nam (indeksowane 1) wielowymiarowe wskaźniki niezerowe,[[2,3],[4,6]]
tj[[top,left],[bottom,right]]
.r/
następnie wykonuje to,[2,3]r[4,6]
co, ponieważr
wektoryzuje, jest podobne[2r4, 3r6]
, oceniając na[[2,3,4],[3,4,5,6]]
- tj[rows,columns]
.,þ/
następnie wykonuje,[2,3,4],þ[3,4,5,6]
gdzieþ
jest instrukcja zewnętrznego poduct i,
jest parą. Daje to wszystkie[row,column]
wartości według kolumn, w tym przypadku:Chcemy je po wierszu, więc
Z
służy do transponowania tego do:Na koniec
œị
indeksuje z powrotem do linii wejściowych:Warto zauważyć, że gdy oba ograniczające znaki są takie same,
=€
identyfikuje je dwa razy, aleSŒṪ
ostatecznie robi właściwą rzecz, ponieważ2
jest to zgodne z prawdą, np .['a','a']
:źródło
APL (Dyalog) ,
3830 bajtów4 bajty zapisane dzięki @EriktheOutgolfer
Wypróbuj online!
źródło
⍸matrix∊separators
i zabrać / upuścić z nimi(⍸a=⎕)↓(1+⍸a=⎕)↑a←⎕
z⎕io←0
⊃{⌽⊖⍵↓⍨⊃⍸⍺=⍵}/⎕⎕⎕
(sic, z 3 końcowymi quadami), co jest jeszcze krótsze. Lub... ⎕⎕(↑⎕)
jeśli wstępnie zmieszana matryca nie jest dozwolona.Galaretka , 14 bajtów
Wypróbuj online!
źródło
()
), a nie'()'
. Jeśli jest parsowalny, musi być cytowany, jednak mój//
nie musi być cytowany (operator dzielenia liczb całkowitych bez operandów? Hm ...).()
to właśnie Jelly interpretuje jako coś specjalnego. Większość par postaci próbuję pracować. Bardzo chciałbym usłyszeć, co myślą ludzie bardziej zaznajomieni z Jelly. EDYCJA: ninja-ed by erik the outgolferPython 2 , 130 bajtów
Wypróbuj online!
źródło
Płótno , 37 bajtów
Wypróbuj tutaj!
36 bajtów na uzyskanie współrzędnych znaków (i przekonwertowanie ich na x, y, w, h, ponieważ to
@
wystarczy) i 1 bajt na uzyskanie podsekcji. Musi być lepsze podejścieźródło
JavaScript (ES6), 98 bajtów
Pobiera dane wejściowe jako dwie liczby całkowite i tablicę ciągów. Zwraca tablicę ciągów.
Wypróbuj online!
Skomentował
źródło
filter
imap
?! Czy zbudowanie nowej macierzyreduce
lub rozwiązanie rekurencyjne nie zadziałałoby krócej? Na telefonie, w pubie lub sam bym spróbował.X
iY
znane są na pewno.Java 10, 204 bajty
Zmienia tablicę wejściową zamiast zwracać nową, aby zapisać bajty. Oznacza to
""
jednak, że zamiast tego stają się usunięte linie . Jeśli nie jest to dozwolone, zmienię to.Wypróbuj online.
Wyjaśnienie:
Na przykład:
Z wejściami
start = "("
,end = ")"
alines =
pierwsza pętla spowoduje przycięcie go u góry i po lewej stronie, zmieniając go w ten sposób:
druga pętla spowoduje przycięcie go u dołu i po prawej stronie, zmieniając go w ten sposób:
źródło
Retina 0.8.2 , 110 bajtów
Wypróbuj online! Wyjaśnienie:
Usuń linie wprowadzania poprzedzające pierwszy wiersz pola.
Jeśli znak początkowy znajduje się w lewej kolumnie danych wejściowych, usuń go.
Jeśli znak początkowy nie został jeszcze usunięty, przesuń wszystkie kolumny wejściowe pozostawione o jedną i powtórz od początku.
Usuń znak końcowy i wszystkie dane wejściowe po znaku końcowym.
Obetnij wszystkie linie do długości następnej linii. Działa to poprzez zliczenie wszystkich znaków oprócz jednego w każdym wierszu, a następnie próby dopasowania do tylu znaków w następnym wierszu; jeśli to się powiedzie, to druga linia była krótsza, więc ostatni znak jest usuwany i pętla się powtarza.
źródło
C (gcc) , 237 bajtów
Wypróbuj online!
Jestem w 99% pewien, że można to skrócić za pomocą funkcji pomocniczej, aby znaleźć poziomy wskaźnik i wskaźnik do znaku, ponieważ jest on powtarzany dwukrotnie. Niestety nie mogłem znaleźć wystarczająco krótkiego sposobu, aby to zrobić, mogę spróbować ponownie później, jeśli znajdę czas.
Opis
źródło
Stax , 15 bajtów
Uruchom i debuguj
Pobiera zestaw znaków ogranicznika pola (1 lub 2) w pierwszym wierszu wprowadzania. Reszta wierszy to treść wejściowa.
Rozpakowane, niepolowane i skomentowane, wygląda to tak.
Uruchom ten
źródło