Wprowadzenie
Używasz Twittera (udawajmy, jeśli nie), gdzie masz do 140 znaków na każdy tweet, którym chcesz się podzielić ze światem. Jeśli chcesz napisać na Twitterze do swoich zwolenników, adres Gettysburga Abrahama Lincolna , musisz podzielić tekst na wiele 140-znakowych części, aby wyciągnąć całą wiadomość. Jednak te fragmenty nie zawsze powinny mieć dokładnie 140 znaków. Powiedzmy na przykład, że podzieliliśmy mowę na 17-znakowe fragmenty, w końcu otrzymalibyśmy tweety:
- CZTERY WYNIKI I SE
- VEN YEARS AGO NASZE
- BRACIE OJCIEC
- PONADTO W TYM CON
- NADAJ NOWY NATI
- NA POJĘTE W L
- (i tak dalej)
To nie dobrze! Po rozbiciu poszczególnych słów może być trudno zrozumieć, co próbujesz powiedzieć. Ponadto, na twitterverse, jeden z twoich obserwujących może natknąć się na określony tweet i nie zdawać sobie sprawy, że wiadomość zawiera więcej, więc będziesz chciał numerować swoje tweety, aby mieli pewien kontekst do pracy (nadal używając fragmentów 17-znakowych ):
- (1/7) CZTERY WYNIKI
- (2/7) SIEDEM LAT AGO
- (3/7) NASI OJCOWIE
- (4/7) NIESAMOWITE FORTH ON
- (5/7) TEN KONTYNENT A
- (6/7) NOWY NARÓD
- (7/7) POJĘTE W ...
Możesz ręcznie ustalić najlepszą konfigurację dla twoich tweetów, ale do tego mamy komputery!
Wyzwanie
W najkrótszym możliwym kodzie parsuj adres Gettysburga (lub dowolny tekst, ale będziemy go trzymać jako przykład) w zestawie tweetów składających się z nie więcej niż 140 znaków (załóż ASCII, ponieważ nasz przykładowy tekst nie powinien mieć wszelkie nietypowe / nietypowe fragmenty).
Detale
- Twoja funkcja / program / etc powinna przyjmować pojedynczy argument łańcuchowy i wypisywać jeden wiersz tekstu dla każdego tweeta.
- Załóżmy, że te dane wejściowe nigdy nie spowodują więcej niż 99 wszystkich tweetów podczas parsowania, niezależnie od tego, jak zdecydujesz się parsować (o ile ten wybór nadal pasuje do innych punktów wyzwania).
- Tweety trzeba obejmują
tweet number
odtotal tweets
wskaźnika w formacie „(x/y)
” poprzedzający ciało tweet.- Ta liczba zajmie część twojego 140-znakowego miejsca!
- Fragmenty tweetów mogą być dzielone tylko na nowej linii lub spacji.
- Niedozwolone są łączniki, kropki, przecinki i inne znaki interpunkcyjne, chyba że bezpośrednio poprzedzają lub następują po nich spacja lub nowa linia.
- Tweety powinny składać się z jak największej liczby pełnych słów.
- To ograniczenie jest trochę elastyczne, np. Kiedy twój ostatni tweet zawiera tylko jedno słowo
- To jest kod golfowy, więc wygrywa najkrótszy kod.
Pełny tekst adresu Gettysburg
(Twój kod powinien nadal być w stanie obsłużyć dowolny przekazany do niego ciąg ASCII.)
CZTERY PUNKTY I SIEDEM LAT PRZECIWKO NASZYM OJCOWI ZRÓWNOWAŻIŁO TEN KONTYNENT, NOWY NARÓD POJĘTY W LIBERTY I ZAANGAŻOWANY W PROPOZYCJĘ, ŻE WSZYSTKIE MĘŻCZYZNY SĄ TWORZENI RÓWNE. TERAZ JESTEŚMY ZAANGAŻOWANI W WIELKĄ WOJNĘ CYWILNĄ TESTUJĄCĄ, CZY NARÓD LUB DOWOLNY NARÓD TAK POJĘTY I DEDYKOWANY MOŻE DŁUGO ZABRANIAĆ. POZNAJEMY SIĘ NA WIELKIM BITWIE TEGO WOJNY. POTRZEBUJEMY POTRZEBOWAĆ CZĘŚĆ TEGO DZIEDZINY JAKO OSTATECZNE MIEJSCE ODPOCZYNKU DLA TYCH, KTÓRZY OTRZYMUJĄ ŻYCIE, ŻE NARÓD MOŻE ŻYĆ. JEST RÓWNIEŻ MONTAŻEM I WŁAŚCIWOŚCIĄ, ŻE NALEŻY TO ROBIĆ. ALE W WIĘKSZYM ROZUMIENIU NIE MOŻEMY DEDYKOWAĆ, NIE MOŻEMY POTRZEBOWAĆ, NIE MOŻEMY POŁOŻYĆ TEGO UZIEMIENIA. ODWAŻNI MĘŻCZYZNI, ŻYJĄCY I MARTWY, KTÓRZY MÓWIĄ SIĘ TUTAJ, POTRAFILI GO DALEKO O NASZEJ NISKIEJ MOCY, BY DODAWAĆ LUB ODCZYTAĆ. ŚWIAT MA MAŁO PAMIĘTAĆ LUB DŁUGO PAMIĘTAĆ, CO MÓWIMY TUTAJ, ALE NIGDY NIE ZAPOMNIĆ, CO TUTAJ TUTAJ. OD NAS ŻYWĄ RATERĘ POTRZEBUJESZ TUTAJ DO NIEKOŃCZĄCEJ SIĘ PRACY, KTÓRZY TU WYSYŁAJĄ TEN DALEKO ZNACZNIE ZAAWANSOWANY. ZNAMY, ŻE NAS POTRZEBUJE WIELKIE ZADANIE POZOSTAŁE PRZED NAMI, ŻE Z TYCH UCZCIWYCH MARTWYCH PODKREŚLAMY UWAGĘ, ŻE NASTĘPUJĄ OSTATNIE PEŁNE DZIAŁANIE DEKORACJI, ŻE NIE MAMY DOKŁADNIE ODWAŻNIŁA SIĘ, ŻE NARÓD POD WZGLĘDEM BOGA NOWA NARODZENIE WOLNOŚCI I ŻE RZĄD LUDU LUDZI LUDZI LUDZI NIE ZGINĄ ZIEMI.
Odpowiedzi:
Perl, 51 znaków
Wymaga wiersza polecenia -p, zawiera 1 znak.
Objaśnienie: wstaw część zliczającą przed i znak nowej linii po grupach wyrazów o długości do 132 znaków. Wstaw symbol zastępczy (
~
) dla sumy, który jest następnie zastępowany przez drugą zamianę. Dzieje się tak, jeśli wiadomość zawiera~
, ale zamiast tego można łatwo użyć znaku niedrukowalnego.To nieco oszukuje: to zawsze pozwala siedem znaków dla części hrabio
(nn/nn)
. Naprawdę, jeśli tak(n/n)
, powinno pozwolić na dwa dodatkowe znaki. Jednak dowolne rozwiązanie tego problemu znacznie zwiększyłoby złożoność problemu.źródło
\G
jest tu bezużyteczne, prawda?Python, 140
^ 140 znaków to tak naprawdę przypadek.
Chociaż pozostały słowa, rozwiązanie utworzy nowe tweety z podanej liczby słów i doda je do listy. Do każdego tweeta będzie próbował dodawać słowa, dopóki długość tweetu nie osiągnie ponad 140 znaków. Zarezerwowane są dwa znaki
total tweets
, które są wypełniane później, gdy drukowany jest każdy tweet na liście.Przykładowe dane wyjściowe:
źródło
Ruby, 77 znaków
Upakowano logikę w pojedyncze wyrażenie regularne. Wyjście
f[text]
:źródło
Ruby, 75
Nie można pokonać Perla, ale przynajmniej minimalnie wyprzedza inne rozwiązanie Rubiego. Pamiętaj, że drukuje tweety w odwrotnej kolejności (problem nie określa jednego).
źródło
VBA, 251
Wypróbowałem inną metodę ... Nie tak dobrą jak moja oryginalna, ale wciąż nad nią pracuję ...
Wyjścia:
źródło
BASH (88 znaków)
Zwiń linię o 132 znaki (aby uwzględnić liczbę naszych wpisów), na spacjach (
-s
), Czytaj tekst do tyłu (tac), numeruj tekst (cat -n
), ponownie odwróć (tac
). Wewnątrz Awk: pierwszy wiersz (NR == 1), przypisz literę „a” wartość w pierwszym. Puste kolumny liczbowe. Wydrukuj (NR / „a”), a następnie linię.Wynik:
źródło
JavaScript (tylko FF), 92 znaki
Sformatowany, jest to zrywka skryptu Perla:
źródło
VBA, 227
Wyjścia:
źródło
JavaScript (tylko FF), 135 znaków
Sformatowane, to:
źródło
PHP, 233
Czy mam rację, zakładając, że jest to pierwsza odpowiedź, która nie oszukuje części liczenia?
(Działa również z ponad 99 tweetami; mógłbym zgolić jeszcze dwa bajty, jeśli w takim przypadku pozwoliłbym na nieskończoną pętlę).
bez golfa:
źródło