introduction
Vous utilisez Twitter (supposons, sinon), où vous êtes limité à 140 caractères par tweet individuel que vous souhaitez partager avec le monde. Si vous souhaitez tweeter à vos abonnés l' adresse Gettysburg d' Abraham Lincoln , alors vous devrez diviser le texte en plusieurs morceaux de 140 caractères afin de diffuser le message dans son intégralité. Cependant, ces morceaux ne doivent pas toujours comporter exactement 140 caractères. Disons par exemple, nous avons divisé le discours en morceaux de 17 caractères, nous nous retrouverions avec ces tweets:
- QUATRE SCORE ET SE
- IL Y A 11 ANS
- PÈRES PORTÉS
- FORTH SUR CE CON
- TINENT UN NOUVEAU NATI
- SUR CONÇU EN L
- (etc)
Ce n'est pas bon! Lorsque des mots individuels sont décomposés, il peut être difficile de comprendre ce que vous essayez de dire. De plus, dans twitterverse, l'un de vos abonnés peut rencontrer un tweet spécifique et ne pas réaliser qu'il y a plus dans le message, vous voudrez donc numéroter vos tweets afin qu'ils aient un certain contexte pour travailler (en utilisant toujours des blocs de 17 caractères ):
- (1/7) QUATRE SCORE ET
- (2/7) IL Y A SEPT ANS
- (3/7) NOS PÈRES
- (4/7) FORTH SUR
- (5/7) CE CONTINENT A
- (6/7) NOUVELLE NATION
- (7/7) CONÇU EN ...
Vous pouvez déterminer manuellement la meilleure configuration pour vos tweets à la main, mais c'est pour cela que nous avons des ordinateurs!
Défi
Dans le code le plus court possible, analysez l'adresse de Gettysburg (ou n'importe quel texte, mais nous nous en tiendrons à celui-ci à titre d'exemple) dans un ensemble de tweets ne comprenant pas plus de 140 caractères (supposez ASCII, car notre exemple de texte ne devrait pas avoir tout morceau inhabituel / inhabituel).
Détails
- Votre fonction / programme / etc doit prendre un seul argument de chaîne et afficher une ligne de texte pour chaque tweet.
- Supposons que cette entrée n'entraînera jamais plus de 99 tweets au total lors de l'analyse, quelle que soit la façon dont vous choisissez d'analyser (tant que ce choix correspond toujours aux autres points du défi).
- Tweets doivent inclure un
tweet number
destotal tweets
indicateurs dans le format «(x/y)
» précédant le corps du tweet.- Ce décompte occupera une partie de votre espace de 140 caractères!
- Les morceaux de Tweet ne peuvent être divisés que sur des nouvelles lignes ou des espaces.
- Aucun tiret, point, virgule ou autre ponctuation n'est autorisé, sauf s'il est immédiatement précédé ou suivi d'un espace ou d'une nouvelle ligne.
- Les tweets doivent comprendre autant de mots complets que possible.
- Cette contrainte est un peu flexible, par exemple lorsque votre dernier tweet n'a qu'un seul mot
- C'est le golf de code, donc le code le plus court gagne.
Texte complet de l'adresse de Gettysburg
(Votre code devrait toujours être capable de gérer toute chaîne ASCII qui lui est transmise.)
QUATRE SCORES ET SEPT ANS PLUS TARD NOS PÈRES ONT FAIT CONTINUER SUR CE CONTINENT UNE NOUVELLE NATION CONÇUE EN LIBERTÉ ET DÉDIÉ À LA PROPOSITION QUE TOUS LES HOMMES SONT CRÉÉS ÉGAUX. MAINTENANT, NOUS SOMMES ENGAGÉS DANS UNE GRANDE GUERRE CIVILE TESTANT SI CETTE NATION OU TOUTE NATION AINSI CONCEPTEE ET AUSSI DÉDIÉE PEUT DURER DURABLEMENT. NOUS SOMMES RENCONTRÉS SUR UN GRAND CHAMP DE BATAILLE DE CETTE GUERRE. NOUS SOMMES VENUS DE DÉDIER UNE PARTIE DE CE DOMAINE COMME LIEU DE REPOS FINAL POUR CEUX QUI ONT DONNÉ LEUR VIE QUE CETTE NATION POURRAIT VIVRE. C'EST ENCORE ADAPTÉ ET APPROPRIÉ QUE NOUS DEVONS LE FAIRE. MAIS DANS UN SENS PLUS GRAND, NOUS NE POUVONS PAS DÉDIER, NOUS NE POUVONS PAS CONSÉCRER, NOUS NE POUVONS PAS CREER CE TERRAIN. LES HOMMES BRAVES VIVANTS ET MORTS QUI ONT LUTTÉ ICI ONT CONSACRÉ AU-DELÀ DE NOTRE PAUVRE POUVOIR D'AJOUTER OU DE DÉTRUIRE. LE MONDE SERA PEU NOTE OU NE RAPPELERA PLUS CE QUE NOUS DISONS ICI MAIS IL NE PEUT JAMAIS OUBLIER CE QU'ILS ONT FAIT ICI. C'EST POUR NOUS LE PLUTÔT VIVANT À ÊTRE DÉDIÉ ICI AU TRAVAIL NON FINI QUE CEUX QUI ONT FOULU ICI ONT AINSI JUSTEMENT AVANCÉ. IL EST PLUTÔT QUE NOUS SOYONS DÉDIÉS ICI À LA GRANDE TÂCHE QUI RESTE DEVANT NOUS, QUE DE CES MORTS HONORÉS NOUS PRENONS UNE AUGMENTATION DE LA DÉVOTION À CETTE CAUSE POUR LAQUELLE ILS ONT DONNÉ LA DERNIÈRE MESURE PLEINE DE DÉVOTION. SONT MORT EN VAIN, QUE CETTE NATION SOUS DIEU AURA UNE NOUVELLE NAISSANCE DE LIBERTÉ, ET QUE LE GOUVERNEMENT DU PEUPLE PAR LE PEUPLE POUR LE PEUPLE NE MORT PAS DE LA TERRE.
Réponses:
Perl, 51 caractères
Nécessite une invite de ligne de commande -p, 1 caractère inclus.
Explication: insérez la partie de comptage avant et la nouvelle ligne après les groupes de mots de 132 caractères maximum. Insérez un espace réservé (
~
) pour le total, qui est ensuite remplacé par une deuxième substitution. Cela casse si le message contient~
, mais on pourrait facilement utiliser un caractère non imprimable à la place.Il triche un peu: il permet toujours sept caractères pour la partie de comptage,
(nn/nn)
. Vraiment, si c'est le cas,(n/n)
il devrait autoriser deux caractères supplémentaires. Cependant, une solution arbitraire à cela augmenterait considérablement la complexité du problème.la source
\G
est inutile ici, non?Python, 140
^ 140 caractères était en fait une coïncidence.
Bien qu'il reste des mots, la solution créera de nouveaux tweets à partir de la fourniture de mots et les ajoutera à une liste. Pour chaque tweet, il continuera d'essayer d'ajouter des mots jusqu'à ce que la longueur du tweet atteigne plus de 140 caractères. Deux caractères sont réservés pour le
total tweets
, qui sont remplis plus tard lors de l'impression de chaque tweet de la liste.Exemple de sortie:
la source
Ruby, 77 caractères
Emballé la logique dans une seule expression régulière. Sortie de
f[text]
:la source
Rubis, 75
Ne peut pas battre Perl, mais au moins il bat légèrement l'autre solution Ruby. Notez qu'il imprime les tweets dans l'ordre inverse (le problème n'en spécifie pas un).
la source
VBA, 251
J'ai essayé une autre méthode ... Pas tout à fait aussi bonne que mon original, mais je travaille toujours dessus ...
Les sorties:
la source
BASH (88 caractères)
Pliez la ligne à 132 caractères (pour permettre notre nombre de tweets), sur les espaces (
-s
), lisez le texte à l'envers (tac), numérotez le texte (cat -n
), inversez (tac
). Inside Awk: Première ligne (NR == 1), attribuez à la lettre 'a' la valeur de la première. Videz la colonne numérique. Imprimez (NR / 'a') puis la ligne.Production:
la source
Javascript (FF uniquement), 92 caractères
Formaté, c'est une arnaque du script Perl:
la source
VBA, 227
Les sorties:
la source
Javascript (FF uniquement), 135 caractères
Formaté, c'est:
la source
PHP, 233
Ai-je raison de supposer que c'est la première réponse qui ne triche pas sur la partie de comptage?
(Cela fonctionne également avec plus de 99 tweets; je pourrais raser deux octets supplémentaires si je permettais une boucle infinie dans ce cas.)
non golfé:
la source