Criar um analisador de Twitter

14

Introdução

Você usa o Twitter (vamos fingir, se não), onde você está limitado a 140 caracteres por tweet individual que deseja compartilhar com o mundo. Se você quiser twittar para seus seguidores no endereço Gettysburg de Abraham Lincoln , precisará dividir o texto em vários blocos de 140 caracteres, a fim de divulgar toda a mensagem. No entanto, esses blocos nem sempre devem ter exatamente 140 caracteres. Digamos, por exemplo, dividimos o discurso em partes de 17 caracteres, e acabamos com estes tweets:

  • QUATRO PONTUAÇÃO E SE
  • DEZ ANOS ATRÁS DE NOSSA
  • PAIS COMPRADOS
  • QUARTA NESTE CON
  • TINENTE UM NOVO NATI
  • EM CONCEITO EM L
  • (e assim por diante)

Isso não é bom! Quando palavras individuais são divididas, pode ser difícil entender o que você está tentando dizer. Além disso, no verso do twitter, um de seus seguidores pode se deparar com um tweet específico e não perceber que há mais na mensagem; portanto, você deseja numerar seus tweets para que eles tenham algum contexto para trabalhar (ainda usando trechos de 17 caracteres) ):

  • (1/7) QUATRO PONTOS E
  • (2/7) SETE ANOS ATRÁS
  • (3/7) NOSSOS PAIS
  • (4/7) COMPRADO EM TRÊS
  • (5/7) ESTE CONTINENTE A
  • (6/7) NOVA NAÇÃO
  • (7/7) CONCEBIDO EM ...

Você pode descobrir manualmente a melhor configuração para seus tweets manualmente, mas é para isso que temos computadores!

Desafio

No código mais curto possível, analise o endereço de Gettysburg (ou qualquer texto, mas vamos ficar com este aqui como exemplo) em um conjunto de tweets que consiste em não mais que 140 caracteres (assuma ASCII, pois nosso texto de exemplo não deve ter quaisquer bits incomuns / incomuns nele).

Detalhes

  • Sua função / programa / etc deve receber um argumento de cadeia única e gerar uma linha de texto para cada tweet.
    • Suponha que essa entrada nunca resultará em mais de 99 tweets totais quando analisados, independentemente de como você escolher analisar (desde que essa escolha ainda se ajuste aos outros pontos do desafio).
  • Tweets precisa incluir um tweet numberde total tweetsindicador no formato " (x/y)" precedendo o corpo do tweet.
    • Essa contagem ocupará parte do seu espaço de 140 caracteres!
  • Os pedaços de Tweet podem ser divididos apenas em novas linhas ou espaços.
    • Não é permitido hífen, ponto, vírgula ou outra pontuação, a menos que seja imediatamente precedido ou seguido por um espaço ou nova linha.
  • Os tweets devem consistir em tantas palavras completas quanto possível.
    • Essa restrição é um pouco flexível, por exemplo, quando seu tweet final tem apenas uma palavra
  • Isso é código de golfe, então o código mais curto vence.

Texto completo do endereço de Gettysburg

(Seu código ainda deve poder manipular qualquer sequência ASCII passada para ele.)

QUATRO PONTOS E SETE ANOS ATRAVÉS DE NOSSOS PAIS APRESENTARAM SOBRE ESTE CONTINENTE UMA NOVA NAÇÃO CONCEBIDA NA LIBERDADE E DEDICADA À PROPOSTA DE QUE TODOS OS HOMENS SÃO CRIADOS IGUAIS. Agora, estamos envolvidos em uma grande guerra civil, testando se essa nação ou qualquer nação tão conceituada e tão depreciada pode durar muito. ESTAMOS ENCONTRADOS EM UM GRANDE CAMPO DE BATALHA DA GUERRA. VIMOS DEDICAR UMA PARTE DESSE DOMÍNIO COMO UM LUGAR FINAL PARA OS QUE AQUI DARAM SUA VIDA QUE A NAÇÃO PODE VIVER. É TAMBÉM ADEQUADO E ADEQUADO QUE DEVEMOS FAZER ISSO. MAS EM UM SENTIDO MAIOR, NÃO PODEMOS DEDICAR, NÃO PODEMOS CONSAGRAR, NÃO PODEMOS ESCONDER, ESTE TERRENO. OS CORAJOS VIVOS E MORTOS QUE LUTARAM AQUI CONSAGRARAM MUITO ATÉ O NOSSO POBRE PODER DE ADICIONAR OU DETRAR. O MUNDO INDICARÁ POUCO NEM LEMBRARÁ O QUE DIZEMOS AQUI, MAS NUNCA PODE ESQUECER O QUE ELES FIZERAM AQUI. É PARA NÓS O PAI VIVO A SER DEDICADO AQUI AO TRABALHO INACABADO QUE OS QUE AQUI PEGARAM AQUI ATÉ AGORA TÃO AVANÇAMAMENTE. É UM POUCO QUE ESTAMOS DEDICADOS AQUI PARA A GRANDE TAREFA RESTANTE ANTES DE NÓS, QUE DESTES MORTOS HOMENAGEADOS, DÁ UMA DEVOÇÃO AUMENTADA À CAUSA POR QUE TÊM A ÚLTIMA MEDIDA DE DEVOÇÃO, QUE AQUI RESOLVEREM ALTAMENTE QUE ESTES MORTOS MORREM EM VAIN, QUE ESTA NAÇÃO DE DEUS TERÁ UM NOVO NASCIMENTO DE LIBERDADE, E QUE O GOVERNO DO POVO PELO POVO PELO POVO NÃO PERECERÁ DA TERRA.

Gaffi
fonte
Nos tweets de exemplo, você quebrou as palavras - mas nas regras você diz que não. Por favor, faça isso consistente - altere as regras ou os exemplos.
Boothby
@ boothby Bem, o exemplo é mostrar explicitamente o que não é permitido ... Vou ver se não consigo reformular isso.
Gaffi
Esclareça a pergunta para esclarecer se as respostas devem ou não lidar com a possibilidade de ter que recalcular pacotes de palavras -> tuítes devido à parte (X / Y). Isso dificulta significativamente o problema e introduz um limite para a maior mensagem que uma pessoa pode se comunicar sem codificar dados na parte (X / Y).
arrdem
@rmckenzie Desculpe, não tenho certeza se eu te pegar? Você quer dar conta do fato de poder ter mais de 100 tweets em um conjunto?
Gaffi
@Gaffi - Sim, existe um número máximo de partes em que nossas mensagens serão divididas (em que casos podem ser feitas suposições e o sol do grc é válido) ou precisamos apoiar o caso geral, como serializar uma palavra com milhares de palavras? para um tweet que sugere a sua declaração de problema.
arrdem

Respostas:

12

Perl, 51 caracteres

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

Requer um prompt de linha de comando -p, 1 caractere incluído.

Explicação: insira a parte da contagem antes e a nova linha depois dos grupos de palavras com até 132 caracteres. Insira um espaço reservado ( ~) para o total, que será substituído por uma segunda substituição. Isso é interrompido se a mensagem contiver ~, mas é possível usar facilmente um caractere não imprimível.

Trapaça um pouco: sempre permite sete caracteres para a parte da contagem (nn/nn),. Realmente, se for (n/n), deve permitir dois caracteres extras. No entanto, uma solução arbitrária para isso aumentaria bastante a complexidade do problema.


fonte
\Gé inútil aqui, não é?
user2846289
26

Python, 140

^ 140 caracteres foi na verdade uma coincidência.

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

Enquanto houver palavras restantes, a solução criará novos tweets a partir do fornecimento de palavras e os anexará a uma lista. Para cada tweet, ele continuará tentando adicionar palavras até que o comprimento do tweet atinja mais de 140 caracteres. Dois caracteres são reservados para o total tweets, que são preenchidos posteriormente à medida que cada tweet da lista é impresso.

Exemplo de saída:

(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
fonte
Era exatamente o que eu precisava. Esta solução é legal. Obrigado @grc
iChux
7

Ruby, 77 caracteres

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

Empacotou a lógica em uma única expressão regular. Saída de 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
fonte
3

Ruby, 75

Não pode vencer o Perl, mas pelo menos supera marginalmente a outra solução Ruby. Observe que ele imprime os tweets na ordem inversa (o problema não especifica um).

f=->t,i=1{t=~/\S.{,130}\S(?!\S)/?puts("(#{i}/%d) #$&"%n=f[$',i+1])||n :i-1}
Lowjacker
fonte
1
Hum ... suponho que não especificou a ordem. Bom trabalho seqüestrando as regras. ;-)
Gaffi 20/03/2013
1

VBA, 251

Tentei outro método ... Não é tão bom quanto o meu original, mas ainda estou trabalhando nisso ...

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

Saídas:

(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
fonte
1

BASH (88 caracteres)

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

Dobre a linha com 132 caracteres (para permitir a nossa contagem de tweets), em espaços ( -s), leia o texto para trás (tac), numere o texto ( cat -n), inverta ( tac). Dentro do Awk: Primeira linha (NR == 1), atribua à letra 'a' o valor na primeira. Em branco a coluna numérica. Imprima (NR / 'a') e depois a linha.

Resultado:

(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
fonte
Estou confiante há um comando bash mais curto, que abusou wc -l
Pureferret
1

Javascript (somente FF), 92 caracteres

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

Formatado, isso é uma cópia do script Perl:

r=(s)=>{
    s.match(/.{1,132}(\s|$)/gm).map((v,i,a) => console.log(v,'('+(i+1)+'/'+a.length+')'))
}
Não que Charles
fonte
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

Saídas:

(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
fonte
0

Javascript (somente FF), 135 caracteres

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+')'))}

Formatado, é isso:

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+')'))
}
Não que Charles
fonte
Eu acho que isso é mais inteligente do que a minha resposta mais curta
Não que Charles
0

PHP, 233

Estou correto ao assumir que esta é a primeira resposta que não trai a parte da contagem?
(Ele também funciona com mais de 99 tweets; eu poderia cortar mais dois bytes se permitisse um loop infinito nesse caso.)

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),'
';}

ungolfed:

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";
}
Titus
fonte