Utwórz parser Twittera

14

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 numberod total tweetswskaź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.

Gaffi
źródło
W przykładowych tweetach łamałeś słowa - ale w zasadach mówisz, że nie. Upewnij się, że jest to spójne - zmień zasady lub przykłady.
stoisko
@boothby Cóż, przykładem jest jawne pokazanie, co jest niedozwolone ... Zobaczę, czy nie mogę tego powtórzyć.
Gaffi,
Proszę wyjaśnić pytanie, aby wyjaśnić, czy odpowiedzi muszą uwzględniać możliwość ponownego obliczenia pakietów słowo -> tweet ze względu na część (X / Y). To sprawia, że ​​problem jest znacznie trudniejszy i wprowadza ograniczenie największej wiadomości, jaką można komunikować bez kodowania danych w części (X / Y).
arrdem
@rmckenzie Przepraszam, nie jestem pewien czy cię dostanę? Masz na myśli fakt, że możesz mieć ponad 100 tweetów w zestawie?
Gaffi,
@Gaffi - Tak, czy istnieje maksymalna liczba części, na które podzielone zostaną nasze wiadomości (w których przypadkach można przyjąć założenia i sol sol grc jest ważny), czy też musimy poprzeć ogólny przypadek, taki jak serializacja wielotysięcznego słowa do tweeta, który sugeruje opis problemu.
arrdem

Odpowiedzi:

12

Perl, 51 znaków

s#\G(.{1,132})(\s+|$)#(${\++$a}/~) $1\n#g;s#~#$a#g

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
\Gjest tu bezużyteczne, prawda?
user2846289
26

Python, 140

^ 140 znaków to tak naprawdę przypadek.

def f(s):
 s=s.split();i=0;l=[]
 while s:
  i+=1;t='(%d/%%d)'%i
  while s and len(t+s[0])<140:t+=' '+s.pop(0)
  l+=[t]
 for t in l:print t%i

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:

(1/11) FOUR SCORE AND SEVEN YEARS AGO OUR FATHERS BROUGHT FORTH ON THIS CONTINENT A NEW NATION CONCEIVED IN LIBERTY AND DEDICATED TO THE
(2/11) PROPOSITION THAT ALL MEN ARE CREATED EQUAL. NOW WE ARE ENGAGED IN A GREAT CIVIL WAR TESTING WHETHER THAT NATION OR ANY NATION SO
(3/11) CONCEIVED AND SO DEDICATED CAN LONG ENDURE. WE ARE MET ON A GREAT BATTLEFIELD OF THAT WAR. WE HAVE COME TO DEDICATE A PORTION OF THAT
(4/11) FIELD AS A FINAL RESTING PLACE FOR THOSE WHO HERE GAVE THEIR LIVES THAT THAT NATION MIGHT LIVE. IT IS ALTOGETHER FITTING AND PROPER
(5/11) THAT WE SHOULD DO THIS. BUT IN A LARGER SENSE WE CAN NOT DEDICATE, WE CAN NOT CONSECRATE, WE CAN NOT HALLOW, THIS GROUND. THE BRAVE
(6/11) MEN LIVING AND DEAD WHO STRUGGLED HERE HAVE CONSECRATED IT FAR ABOVE OUR POOR POWER TO ADD OR DETRACT. THE WORLD WILL LITTLE NOTE NOR
(7/11) LONG REMEMBER WHAT WE SAY HERE BUT IT CAN NEVER FORGET WHAT THEY DID HERE. IT IS FOR US THE LIVING RATHER TO BE DEDICATED HERE TO THE
(8/11) UNFINISHED WORK WHICH THEY WHO FOUGHT HERE HAVE THUS FAR SO NOBLY ADVANCED. IT IS RATHER FOR US TO BE HERE DEDICATED TO THE GREAT
(9/11) TASK REMAINING BEFORE US, THAT FROM THESE HONORED DEAD WE TAKE INCREASED DEVOTION TO THAT CAUSE FOR WHICH THEY GAVE THE LAST FULL
(10/11) MEASURE OF DEVOTION, THAT WE HERE HIGHLY RESOLVE THAT THESE DEAD SHALL NOT HAVE DIED IN VAIN, THAT THIS NATION UNDER GOD SHALL HAVE
(11/11) A NEW BIRTH OF FREEDOM, AND THAT GOVERNMENT OF THE PEOPLE BY THE PEOPLE FOR THE PEOPLE SHALL NOT PERISH FROM THE EARTH.
grc
źródło
Właśnie tego potrzebowałem. To rozwiązanie jest fajne. Dzięki @grc
iChux
7

Ruby, 77 znaków

f=->t{i=0;$><<t.gsub(/(.{1,132})([ \n]|$)/m){"(#{i+=1}/%{i}) #{$1}\n"}%{i:i}}

Upakowano logikę w pojedyncze wyrażenie regularne. Wyjście f[text]:

(1/11) FOUR SCORE AND SEVEN YEARS AGO OUR FATHERS BROUGHT FORTH ON THIS CONTINENT A NEW NATION CONCEIVED IN LIBERTY AND DEDICATED TO THE
(2/11) PROPOSITION THAT ALL MEN ARE CREATED EQUAL. NOW WE ARE ENGAGED IN A GREAT CIVIL WAR TESTING WHETHER THAT NATION OR ANY NATION SO
(3/11) CONCEIVED AND SO DEDICATED CAN LONG ENDURE. WE ARE MET ON A GREAT BATTLEFIELD OF THAT WAR. WE HAVE COME TO DEDICATE A PORTION OF
(4/11) THAT FIELD AS A FINAL RESTING PLACE FOR THOSE WHO HERE GAVE THEIR LIVES THAT THAT NATION MIGHT LIVE. IT IS ALTOGETHER FITTING AND
(5/11) PROPER THAT WE SHOULD DO THIS. BUT IN A LARGER SENSE WE CAN NOT DEDICATE, WE CAN NOT CONSECRATE, WE CAN NOT HALLOW, THIS GROUND. THE
(6/11) BRAVE MEN LIVING AND DEAD WHO STRUGGLED HERE HAVE CONSECRATED IT FAR ABOVE OUR POOR POWER TO ADD OR DETRACT. THE WORLD WILL LITTLE
(7/11) NOTE NOR LONG REMEMBER WHAT WE SAY HERE BUT IT CAN NEVER FORGET WHAT THEY DID HERE. IT IS FOR US THE LIVING RATHER TO BE DEDICATED
(8/11) HERE TO THE UNFINISHED WORK WHICH THEY WHO FOUGHT HERE HAVE THUS FAR SO NOBLY ADVANCED. IT IS RATHER FOR US TO BE HERE DEDICATED TO
(9/11) THE GREAT TASK REMAINING BEFORE US, THAT FROM THESE HONORED DEAD WE TAKE INCREASED DEVOTION TO THAT CAUSE FOR WHICH THEY GAVE THE
(10/11) LAST FULL MEASURE OF DEVOTION, THAT WE HERE HIGHLY RESOLVE THAT THESE DEAD SHALL NOT HAVE DIED IN VAIN, THAT THIS NATION UNDER GOD
(11/11) SHALL HAVE A NEW BIRTH OF FREEDOM, AND THAT GOVERNMENT OF THE PEOPLE BY THE PEOPLE FOR THE PEOPLE SHALL NOT PERISH FROM THE EARTH.
Howard
źródło
3

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).

f=->t,i=1{t=~/\S.{,130}\S(?!\S)/?puts("(#{i}/%d) #$&"%n=f[$',i+1])||n :i-1}
Lowjacker
źródło
1
Hm ... chyba nie podałem kolejności. Dobra robota przejmująca zasady. ;-)
Gaffi
1

VBA, 251

Wypróbowałem inną metodę ... Nie tak dobrą jak moja oryginalna, ale wciąż nad nią pracuję ...

Sub a(s)
Dim n(99)
m=1
r=Split(StrConv(s,64),Chr(0))
For i=0 To Len(s)
If i-g>132 Then n(m)=Mid(s,g+1,u-g):i=u:g=i:m=m+1
If r(i)=" " Or r(i)=vbCr Then i=i+1:u=i
Next
n(m)=Mid(s,g+1)
For o=1 To m
Debug.Print "(" & o & "/" & m & ") " & n(o)
Next
End Sub

Wyjścia:

(1/11) FOUR SCORE AND SEVEN YEARS AGO OUR FATHERS BROUGHT FORTH ON THIS CONTINENT A NEW NATION CONCEIVED IN LIBERTY AND DEDICATED TO THE 
(2/11) PROPOSITION THAT ALL MEN ARE CREATED EQUAL. NOW WE ARE ENGAGED IN A GREAT CIVIL WAR TESTING WHETHER THAT NATION OR ANY NATION SO 
(3/11) CONCEIVED AND SO DEDICATED CAN LONG ENDURE. WE ARE MET ON A GREAT BATTLEFIELD OF THAT WAR. WE HAVE COME TO DEDICATE A PORTION OF 
(4/11) THAT FIELD AS A FINAL RESTING PLACE FOR THOSE WHO HERE GAVE THEIR LIVES THAT THAT NATION MIGHT LIVE. IT IS ALTOGETHER FITTING AND 
(5/11) PROPER THAT WE SHOULD DO THIS. BUT IN A LARGER SENSE WE CAN NOT DEDICATE, WE CAN NOT CONSECRATE, WE CAN NOT HALLOW, THIS GROUND. THE 
(6/11) BRAVE MEN LIVING AND DEAD WHO STRUGGLED HERE HAVE CONSECRATED IT FAR ABOVE OUR POOR POWER TO ADD OR DETRACT. THE WORLD WILL LITTLE 
(7/11) NOTE NOR LONG REMEMBER WHAT WE SAY HERE BUT IT CAN NEVER FORGET WHAT THEY DID HERE. IT IS FOR US THE LIVING RATHER TO BE DEDICATED 
(8/11) HERE TO THE UNFINISHED WORK WHICH THEY WHO FOUGHT HERE HAVE THUS FAR SO NOBLY ADVANCED. IT IS RATHER FOR US TO BE HERE DEDICATED TO 
(9/11) THE GREAT TASK REMAINING BEFORE US, THAT FROM THESE HONORED DEAD WE TAKE INCREASED DEVOTION TO THAT CAUSE FOR WHICH THEY GAVE THE 
(10/11) LAST FULL MEASURE OF DEVOTION, THAT WE HERE HIGHLY RESOLVE THAT THESE DEAD SHALL NOT HAVE DIED IN VAIN, THAT THIS NATION UNDER GOD 
(11/11) SHALL HAVE A NEW BIRTH OF FREEDOM, AND THAT GOVERNMENT OF THE PEOPLE BY THE PEOPLE FOR THE PEOPLE SHALL NOT PERISH FROM THE EARTH.
Gaffi
źródło
1

BASH (88 znaków)

fold -132 -s |tac|cat -n |tac|awk '{if(NR==1)a=$1;$1="";printf "(%d/%d) %s\n",NR,a,$0 }'

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:

(1/12)  FOUR SCORE AND SEVEN YEARS AGO OUR FATHERS BROUGHT FORTH ON THIS CONTINENT A NEW NATION CONCEIVED IN LIBERTY AND DEDICATED TO THE
(2/12)  PROPOSITION THAT ALL MEN ARE CREATED EQUAL. NOW WE ARE ENGAGED IN A GREAT CIVIL WAR TESTING WHETHER THAT NATION OR ANY NATION SO
(3/12)  CONCEIVED AND SO DEDICATED CAN LONG ENDURE. WE ARE MET ON A GREAT BATTLEFIELD OF THAT WAR. WE HAVE COME TO DEDICATE A PORTION OF
(4/12)  THAT FIELD AS A FINAL RESTING PLACE FOR THOSE WHO HERE GAVE THEIR LIVES THAT THAT NATION MIGHT LIVE. IT IS ALTOGETHER FITTING AND
(5/12)  PROPER THAT WE SHOULD DO THIS. BUT IN A LARGER SENSE WE CAN NOT DEDICATE, WE CAN NOT CONSECRATE, WE CAN NOT HALLOW, THIS GROUND.
(6/12)  THE BRAVE MEN LIVING AND DEAD WHO STRUGGLED HERE HAVE CONSECRATED IT FAR ABOVE OUR POOR POWER TO ADD OR DETRACT. THE WORLD WILL
(7/12)  LITTLE NOTE NOR LONG REMEMBER WHAT WE SAY HERE BUT IT CAN NEVER FORGET WHAT THEY DID HERE. IT IS FOR US THE LIVING RATHER TO BE
(8/12)  DEDICATED HERE TO THE UNFINISHED WORK WHICH THEY WHO FOUGHT HERE HAVE THUS FAR SO NOBLY ADVANCED. IT IS RATHER FOR US TO BE HERE
(9/12)  DEDICATED TO THE GREAT TASK REMAINING BEFORE US, THAT FROM THESE HONORED DEAD WE TAKE INCREASED DEVOTION TO THAT CAUSE FOR WHICH
(10/12)  THEY GAVE THE LAST FULL MEASURE OF DEVOTION, THAT WE HERE HIGHLY RESOLVE THAT THESE DEAD SHALL NOT HAVE DIED IN VAIN, THAT THIS
(11/12)  NATION UNDER GOD SHALL HAVE A NEW BIRTH OF FREEDOM, AND THAT GOVERNMENT OF THE PEOPLE BY THE PEOPLE FOR THE PEOPLE SHALL NOT PERISH
(12/12)  FROM THE EARTH.
Pureferret
źródło
Jestem pewien, że istnieje krótsza komenda
uderzenia
1

JavaScript (tylko FF), 92 znaki

r=(s)=>{s.match(/.{1,132}(\s|$)/gm).map((v,i,a)=>console.log(v,'('+(i+1)+'/'+a.length+')'))}

Sformatowany, jest to zrywka skryptu Perla:

r=(s)=>{
    s.match(/.{1,132}(\s|$)/gm).map((v,i,a) => console.log(v,'('+(i+1)+'/'+a.length+')'))
}
Nie ten Charles
źródło
0

VBA, 227

Sub a(s)
Dim n(99)
m=1
x=133
While Len(s)>x
t=Left(s,x):p=InStrRev(t," "):q=InStrRev(t,vbCr):i=IIf(p>q,p,q):t=Left(s,i):s=Mid(s,i+1):n(m)=t:m=m+1
Wend
n(m)=s
For o=1 To m
Debug.Print "(" & o & "/" & m & ") " & n(o)
Next
End Sub

Wyjścia:

(1/11) FOUR SCORE AND SEVEN YEARS AGO OUR FATHERS BROUGHT FORTH ON THIS CONTINENT A NEW NATION CONCEIVED IN LIBERTY AND DEDICATED TO THE 
(2/11) PROPOSITION THAT ALL MEN ARE CREATED EQUAL. NOW WE ARE ENGAGED IN A GREAT CIVIL WAR TESTING WHETHER THAT NATION OR ANY NATION SO 
(3/11) CONCEIVED AND SO DEDICATED CAN LONG ENDURE. WE ARE MET ON A GREAT BATTLEFIELD OF THAT WAR. WE HAVE COME TO DEDICATE A PORTION OF 
(4/11) THAT FIELD AS A FINAL RESTING PLACE FOR THOSE WHO HERE GAVE THEIR LIVES THAT THAT NATION MIGHT LIVE. IT IS ALTOGETHER FITTING AND 
(5/11) PROPER THAT WE SHOULD DO THIS. BUT IN A LARGER SENSE WE CAN NOT DEDICATE, WE CAN NOT CONSECRATE, WE CAN NOT HALLOW, THIS GROUND. THE 
(6/11) BRAVE MEN LIVING AND DEAD WHO STRUGGLED HERE HAVE CONSECRATED IT FAR ABOVE OUR POOR POWER TO ADD OR DETRACT. THE WORLD WILL LITTLE 
(7/11) NOTE NOR LONG REMEMBER WHAT WE SAY HERE BUT IT CAN NEVER FORGET WHAT THEY DID HERE. IT IS FOR US THE LIVING RATHER TO BE DEDICATED 
(8/11) HERE TO THE UNFINISHED WORK WHICH THEY WHO FOUGHT HERE HAVE THUS FAR SO NOBLY ADVANCED. IT IS RATHER FOR US TO BE HERE DEDICATED TO 
(9/11) THE GREAT TASK REMAINING BEFORE US, THAT FROM THESE HONORED DEAD WE TAKE INCREASED DEVOTION TO THAT CAUSE FOR WHICH THEY GAVE THE 
(10/11) LAST FULL MEASURE OF DEVOTION, THAT WE HERE HIGHLY RESOLVE THAT THESE DEAD SHALL NOT HAVE DIED IN VAIN, THAT THIS NATION UNDER GOD 
(11/11) SHALL HAVE A NEW BIRTH OF FREEDOM, AND THAT GOVERNMENT OF THE PEOPLE BY THE PEOPLE FOR THE PEOPLE SHALL NOT PERISH FROM THE EARTH.
Gaffi
źródło
0

JavaScript (tylko FF), 135 znaków

n=(s)=>{for(g=[],i=1,a=s.split(/(\s)/),r='';c=a.shift();g[i]=r+=c)if((c+r)[132]&&i++)r='';g.map((v,k)=>console.log(v,'('+k+'/'+i+')'))}

Sformatowane, to:

n=(s)=>{
    for (g=[],i=1,a=s.split(/(\s)/),r=''; c=a.shift(); g[i]=r+=c) {
        if((c+r)[132]&&i++) {
            r='';
        }
    }
    g.map((v,k)=>console.log(v,'('+k+'/'+i+')'))
}
Nie ten Charles
źródło
Myślę, że jest to mądrzejsze niż moja krótsza odpowiedź
nie że Charles
0

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ę).

function t($s,$e=1){$a=explode(' ',$s);while($a){$t=++$n;while($a&&strlen($t.$a[0])<137-$e)$t.=' '.array_shift($a);$r[]=$t;}if($n>=10**$e)t($s,$e+1);else foreach($r as$i=>$s)echo preg_replace('%(^\d+)%',"(\$1/$n)",$s),'
';}

bez golfa:

function t($s,$e=1)
{
    $a=explode(' ',$s);
    while($a)
    {
        $t=++$n;
        while($a&&strlen($t.$a[0])<137-$e)$t.=' '.array_shift($a);
        $r[]=$t;
    }
    if($n>=10**$e)                  // if tweet count has more than $e digits
        t($s,ceil(log10($n+1)));    // use correct length (golfed: try with length+1)
    else
        foreach($r as$i=>$s)
            echo preg_replace('%(^\d+)%',"(\$1/$n)",$s),"\n";
}
Tytus
źródło