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 number
detotal tweets
indicador 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.
Respostas:
Perl, 51 caracteres
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 é?Python, 140
^ 140 caracteres foi na verdade uma coincidência.
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:
fonte
Ruby, 77 caracteres
Empacotou a lógica em uma única expressão regular. Saída de
f[text]
:fonte
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).
fonte
VBA, 251
Tentei outro método ... Não é tão bom quanto o meu original, mas ainda estou trabalhando nisso ...
Saídas:
fonte
BASH (88 caracteres)
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:
fonte
Javascript (somente FF), 92 caracteres
Formatado, isso é uma cópia do script Perl:
fonte
VBA, 227
Saídas:
fonte
Javascript (somente FF), 135 caracteres
Formatado, é isso:
fonte
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.)
ungolfed:
fonte