Biorąc pod uwagę wejście dwóch ciągów znaków z sekwencjami znaków podkreślających odpowiadające słowa, wypisz zdania z wypełnionymi „pustymi miejscami”.
Najlepszym sposobem opisania tego wyzwania jest przykład. Oto przykładowe dane wejściowe:
programming _____________ and code golf
programming puzzles ______ code ____
A oto odpowiednie wyjście:
programming ___puzzles___ and code golf
programming puzzles _and__ code golf
Na potrzeby tego wyzwania „słowo” jest zdefiniowane jako sekwencja jednej lub więcej małych liter, a „puste” jest zdefiniowane jako jeden lub więcej podkreślników (dane wejściowe zawsze będą zawierać tylko małe litery, spacje i podkreślenia) . Słowa i półfabrykaty w ciągach są oddzielone pojedynczymi odstępami, a suma liczby słów i pustych w zdaniach zawsze będą równe.
Celem wyzwania jest wypełnienie wszystkich pustych pól prawidłowymi słowami , które są słowami, które zajmują ten sam indeks w drugim ciągu po podzieleniu spacjami.
Słowo musi być wyśrodkowane na pustym miejscu, jak pokazano słowem „puzzle” w powyższym przykładzie - po obu stronach pozostaje taka sama liczba znaków podkreślenia.
Jeśli słowa nie można dokładnie wyśrodkować, dodatkowy znak podkreślenia może znajdować się po lewej lub po prawej stronie (np. Słowo „i” w powyższym przykładzie).
Zawsze będzie wystarczająca liczba znaków podkreślających, aby dopasować słowo, ale może być dokładnie tyle, ile długość słowa (np. Słowo „golf” w powyższym przykładzie).
Nigdy nie będzie spacji w tej samej pozycji w obu ciągach.
Dane wejściowe / wyjściowe mogą być dowolne z poniższych (dane wejściowe / wyjściowe niekoniecznie muszą być wykonywane tą samą metodą):
pojedynczy ciąg oddzielony dowolnym znakiem, który nie jest alfabetyczny, spacja lub znak podkreślenia (np. ciąg oddzielony znakiem nowej linii lub przecinek)
tablica / lista / itp. dwóch strun
dwa argumenty funkcji / wiersza poleceń (tylko dane wejściowe)
Ponieważ jest to code-golf , wygra najkrótszy kod w bajtach.
Powyższy przykład można wykorzystać jako przypadek testowy. Oto większy przypadek testowy (drugi ciąg wyjściowy może się nieznacznie różnić ze względu na różne zachowanie centrowania):
lorem _____ dolor _____ amet _______________ adipiscing elit mauris dapibus tincidunt _____________________________ accumsan fringilla proin vulputate viverra lorem fermentum dictum
lorem ipsum ______ sit _______ consectetur _______________ elit mauris dapibus tincidunt metus accumsan fringilla proin vulputate viverra lorem ____________________________ dictum
lorem ipsum dolor _sit_ amet __consectetur__ adipiscing elit mauris dapibus tincidunt ____________metus____________ accumsan fringilla proin vulputate viverra lorem fermentum dictum
lorem ipsum dolor_ sit _amet__ consectetur __adipiscing___ elit mauris dapibus tincidunt metus accumsan fringilla proin vulputate viverra lorem _________fermentum__________ dictum
Odpowiedzi:
Pyth, 30
Pobiera dane wejściowe i wyjściowe jako listę dwóch ciągów. Stosuje dość podstawowe podejście dzielenia - zip - podwójna mapa - środek - zip - łączenie.
Wypróbuj tutaj
Rozszerzony:
Wyjaśnię więcej, gdy będę naprawdę zadowolony, że nie mogę już grać w golfa, chociaż powinno to być dość jasne, biorąc pod uwagę wszechobecność podejścia split-zip-double map-center-zip-join i wszystko.
źródło
Siatkówka ,
1021009388 bajtówLiczba bajtów zakłada kodowanie ISO 8859-1.
Ciągi znaków zostaną oddzielone linią. Jeśli pozostanie nieparzysta liczba podkreśleń, obce będzie po słowie.
Wypróbuj online!
Wyjaśnienie
Wydaje mi się, że jest to „podejście duplicate-append-lookback-match-add-center” lub coś bliskiego ...
Zaczynamy od zduplikowania danych wejściowych (oddzielonych znakiem
!
a i linią). Celem tego jest to, że możemy następnie przetwarzać oba wiersze, pobierając słowa z następnego wiersza (zamiast traktować drugi wiersz osobno).To dodaje poprawne słowo do każdej przerwy. Zaczynamy od zliczenia bieżącej pozycji słowa za pomocą lookbehind
(?<=^(\w+ )*)
(pozycja jest zapisywana jako głębokość grupy1
). Następnie lookahead a) upewnia się, że jesteśmy na początku luki, dopasowując_
, a następnie przechodząc do następnej linii z.*¶
, dopasowuje prawidłową liczbę słów z,(?<-1>\w+ )*
aby dostać się do właściwej pozycji, a następnie dopasowuje znalezione tam słowo(\w+)
do grupa2
.Ten etap wykonuje trzy czynności:
2
z,([a-z])+
a następnie dopasowanie do tylu znaków podkreślenia (które nigdy nie są odpisywane).(_*)\3
i odpisując$3$1$3
.!\D+
i zastępując niczym.źródło
Python 2, 109
Funkcja przyjmuje dwa ciągi jako argumenty i wypisuje dane wyjściowe jak w przykładach. Wykorzystuje nudne podejście,
str.center(width, fillchar)
wykonując większość pracy.Wypróbuj online .
źródło
z
, chyba że coś mi umknie, możesz po prostu zrobić zamianę po wydrukowaniu i wstawieniuz
.Ruby,
111109 znakówDane wejściowe: tablica 2 ciągów; wyjście: tablica 2 ciągów znaków.
Przykładowy przebieg:
źródło
JavaScript,
194185 bajtówPobiera dwa ciągi jako parametry i zwraca dwa ciągi jako tablicę / listę
Pokaż fragment kodu
źródło
Mathematica 223
Aby to zrobić, musi istnieć krótszy sposób.
Przykładowy przebieg
źródło
Gema,
208203 znakówTylko dlatego, Gema ma doskonałą funkcję dla tego zadania: .
@fill-center{background;value}
Dane wejściowe: 2 oddzielone wiersze nowej linii (bez końcowej nowej linii); wynik: 2 oddzielone wiersze nowego wiersza (ze spacjami końcowymi - nie wydaje się to zabronione).
Przykładowy przebieg:
źródło
C, 197 bajtów
Wynik
źródło
ES6, 122 bajty
Bierze tablicę dwóch ciągów jako pojedynczy parametr i zwraca kolejną tablicę dwóch ciągów.
źródło