Les mois de travail ont été difficiles et j’ai envie de crier sur le visage de mon patron. Cependant, je ne suis pas du genre à confronter directement des personnes avec lesquelles j'ai un problème. Je ne veux pas non plus perdre mon travail.
Alors voici une idée: je veux pouvoir l'insulter, sans qu'il le sache jamais. Et j’ai réalisé de manière parfaite: j’ai besoin d’une sorte de logiciel qui code une insulte dans un message parfaitement parfait. Et comme il sait comment ne pas voir les forêts comme des arbres, je pense savoir comment:
Ecris-moi un programme qui prend en entrée une chaîne de longueur inconnue, mais ne contenant aucun saut de ligne. Ce sera le message brut que je veux envoyer.
Si possible, renvoyez la chaîne formatée de manière à ce que le message "DIE IN A GREASE FIRE" constitue la totalité de la colonne de gauche. Avec de nouveaux paragraphes où les espaces entre les mots devraient aller. Maintenant, comme je suis très en colère, il est également important que chaque lettre soit en majuscule.
Vous ne pouvez pas modifier la chaîne de toute autre manière, c'est-à-dire que vous ne pouvez pas transformer toute la chaîne en caractères majuscules.
Si la chaîne en question ne peut pas être formatée de cette manière, vous devez renvoyer la chaîne d'origine. Lire l'entrée à partir de l'entrée standard.
Les règles normales s'appliquent: pas de requête HTTP, pas de consultation Marvin de THGTTG, etc.
Exemple d'entrée:
Cher patron, comment ça va? Il a été porté à mon attention que j'ai été tenu pour responsable de l'accident vendredi dernier. Pas seulement la majorité. Chaque dernier morceau. Est-ce que je me trompe en pensant que le reste de l'équipe était au moins en partie responsable? Après tout, nous étions tous les six impliqués dès le départ. Non pas que je pense que je devrais rester sans blâme. Pas du tout. Tout ce que je dis, c'est ceci: je fais de mon mieux. J'essaie fort. Je m'améliore constamment. Et je prends constamment des responsabilités. De manière générale, je suis très disposé à assumer l'entière responsabilité de mes actes. Mais après ce printemps, il me semble que je reçois plus que ce que je mérite. Rappelez-vous le contrat Flakenhauser? Tout s'est passé à peu près aussi harmonieusement que l'on aurait pu l'espérer. Ou alors, semblait-il au début. C'est à la toute dernière minute que les choses se sont effondrées. Toute l'équipe a convenu que cela ressemblait davantage à un accident anormal qu'à une planification bâclée ou à des ressources mal gérées. Pourtant, je - seul - pris le blâme pour cela. Même si je n’ai rien dit à ce moment-là, mon niveau de tolérance à l’égard du blâme s’est alors sérieusement détérioré. À partir de ce moment, j’ai senti le besoin de toujours faire deux fois plus d'efforts, juste pour échapper à tout contrôle. Et encore, nous y sommes encore. Malgré toutes mes réalisations. Là où nous semblons toujours nous retrouver ces jours-ci. Chaque projet. Cela devient insupportable. juste pour échapper à l'examen. Et encore, nous y sommes encore. Malgré toutes mes réalisations. Là où nous semblons toujours nous retrouver ces jours-ci. Chaque projet. Cela devient insupportable. juste pour échapper à l'examen. Et encore, nous y sommes encore. Malgré toutes mes réalisations. Là où nous semblons toujours nous retrouver ces jours-ci. Chaque projet. Cela devient insupportable.
Exemple de sortie:
Cher patron, comment ça va?
Il a été porté à mon attention que j'ai été tenu pour responsable de l'accident vendredi dernier. Pas seulement la majorité.
Chaque dernier morceau.Est-ce que je me trompe en pensant que le reste de l'équipe était au moins en partie responsable? Après tout, nous étions tous les six impliqués dès le départ.
Non pas que je pense que je devrais rester sans blâme. Pas du tout.Tout ce que je dis, c'est ceci: je fais de mon mieux. J'essaie fort. Je m'améliore constamment. Et je prends constamment des responsabilités.
De manière générale, je suis très disposé à assumer l'entière responsabilité de mes actes. Mais après ce printemps, il me semble que je reçois plus que ce que je mérite.
Rappelez-vous le contrat Flakenhauser.
Tout s'est passé à peu près aussi harmonieusement que l'on aurait pu l'espérer. Ou alors, semblait-il au début. C'est à la toute dernière minute que les choses se sont effondrées.
Toute l'équipe a convenu que cela ressemblait davantage à un accident anormal qu'à une planification bâclée ou à des ressources mal gérées.
Pourtant, je - seul - pris le blâme pour cela.
Même si je n’ai rien dit à ce moment-là, mon niveau de tolérance à l’égard du blâme a alors sérieusement chuté.À partir de ce moment, j’ai senti le besoin de toujours faire deux fois plus d'efforts, juste pour échapper à tout contrôle. Et encore, nous y sommes encore.
Malgré toutes mes réalisations.
Là où nous semblons toujours nous retrouver ces jours-ci.
Chaque projet. Cela devient insupportable.
C'est du code golf. Le code le plus court gagne.
Réponses:
CJam,
5653 octetsEssayez-le en ligne!
Comment ça fonctionne
la source
Perl - 60 octets
Compter le shebang comme un.
Cette solution utilise la chaîne la plus interne pour construire les expressions rationnelles suivantes:
qui est similaire au regex utilisé dans la solution de m.buettner . La regex générée est ensuite comparée à l'entrée. Dans un contexte de liste, cela retournera un tableau contenant chacun des groupes de correspondance, qui sont joints par une nouvelle ligne (la raison pour laquelle les groupes ne correspondent à aucune correspondance
(\.*)
est d'insérer une nouvelle ligne). S'il n'y a pas de correspondance, la chaîne d'origine est sortie à la place.Perl - 73 octets
Compter le shebang comme deux.
Cela divise la chaîne aux délimiteurs appropriés et collecte les éléments dans un tableau. Si l'un d'entre eux ne correspond pas, le séparateur d'enregistrement de sortie (défini sur une nouvelle ligne avec l'
-l
option) n'est pas défini et la chaîne n'est donc pas modifiée.la source
./script.pl
, alors très probablement oui. Si invoqué en tant queperl script.pl
, alors non..
aprèsI
insère une nouvelle ligne avantI
(car elle correspond à nouveau à la même position). Peut-être un peu contre-intuitif.-M
option au shebang, qui mourra avec l'erreur fatale:Too late for "-M" option at line 1.
Mais la raison principale pour laquelle je l'ai mise ici, j'évite aussi de devoir expliquer qu'elle doit être exécutée sousperl -pl script.pl
la forme actuelle, elle est exécutée . comme si.GolfScript, 53 octets
On dirait que Dennis et moi avons proposé des choses assez similaires en parallèle ... Mais voici ma tentative.
Cliquez sur les liens avant chaque bloc de code pour l'essayer en ligne. Malheureusement, l'interprète en ligne ne vous autorisera pas à exécuter du code supérieur à 1024 caractères. J'ai donc dû effectuer une "compression" de l'entrée de test. Mais ça fonctionne toujours.
Version écrasée
Version non commentée et commentée
Un point soulevé par Dennis: Tous les programmes GolfScript impriment une nouvelle ligne automatique. Que ce soit ou non, cela invaliderait ma solution en l'état, je ne suis pas sûr. Je crois qu'il en coûterait à 4 caractères de supprimer le saut de ligne final en ajoutant
"":n
quelque chose vers la fin.la source
Rubis - 140
Pas de regex dans celui-ci . Il parcourt simultanément les caractères de l'entrée ARGV [0] et une chaîne contenant des caractères que nous devons interrompre pour créer notre message dans la colonne de gauche. Était à l'origine de coller des espaces après les lettres qui doivent avoir une nouvelle ligne, mais a constaté qu'il était un peu plus court pour coder en dur les index auxquels insérer le saut de ligne.
Une fois que tout est dit et fait, il vérifie que l’
i
index s’est incrémenté suffisamment de fois pour traiter chaque lettre à briser. Si ce n'est pas le cas, nous imprimons simplement la chaîne d'origine. Si c'est le cas, nous leur donnons le formaté.n-[i]!=n
était une astuce judicieuse pour enregistrer des caractères lors de la vérification si l'index actuel était un index qui nécessitait un saut de ligne supplémentaire (par rapport àn.include? i
). Également enregistré certains caractères en utilisant{}
s au lieu de, alorsdo/end
qu’il s’agissait d’un bloc multiligne, et utilisé une condition ternaire sur les dernières mises pour enregistrer les caractères lors de la détermination du nom à afficher.Pas le plus court, mais je pensais que ce serait bien de se passer d'expressions régulières.
la source
Perl, 184 octets
Pas un score spectaculaire pour Perl, mais voici une solution simple regex
la source
print($_)
==print
. +1 point pour la lisibilité: Il est remarquablement facile de voir ce qui se passe, ce qui n’est pas exactement le cas pour d’autres solutions.JavaScript 116
Implémentation Javascript de l'idée de m-buettner
Extrait de test
la source
FIFA
examen (commentaires OP)From that FIFA point on
. Il met une nouvelle ligne avant leFA
, et avant l'espace avantFI
.Python3 (
166138)Golfé:
Ungolfed-ish:
Bien que l’utilisation du lambda me plaise un peu, ce nombre important de variables utilisées et son développement quelque peu désordonné ont l’effet inverse. Regex était peut-être une bonne idée aussi. Hay ho, au moins ça marche :).
Éditer: variable lambda remplacée par l'
count
instruction intégrée et abrégée.la source
Python3 (165)
Ungolfed
Explication
chunk
scinde récursivement la fin du message contenant le dernier en-tête et l'ajoute à une liste.Mise en garde: cela ne fonctionnera pas s'il n'y a pas du tout d'espaces entre deux titres proposés dans votre lettre pour une raison quelconque, mais cela semble peu probable dans une lettre à votre patron.
la source
Ruby 115
Ruby 95
la source
J -
110103 octetsPourquoi J n’a-t-il pas de bonnes fonctions pour gérer les chaînes, mais uniquement les fonctions de tableau? Je vais réviser cela si je trouve quelque chose d'intelligent.
Edit: sortie abrégée et fixe (il y avait des espaces supplémentaires avant) et vérification. J'ai aussi amélioré l'explication.
Explication:
Exemples (trop longs?):
la source
JavaScript (ES6),
93115 octetsJ'avais l'habitude
replace
de parcourir la chaîne, avec une correspondance pour/\b./g
ne trouver que les caractères qui suivaient un espace ou commençaient la chaîne. Ensuite, j'ai vérifié chaque caractère pour voir s'il correspondait à l'index actuel du tableau que je cherchais, puis j'ai ajouté un saut de ligne avant le cas échéant et l'incrémentéi
.EDIT: Vous n'avez pas besoin de créer de nouvelles lignes entre les mots. Je l'ai fait maintenant, ce qui porte à 115.
la source
PHP, 328 octets
Étant donné un fichier nommé 'G' contenant le texte brut à "enmessage"
Explication (~ ungolfed && commented code):
la source
PHP, 136 octets
si toute l'insulte peut être mis; affiche la chaîne modifiée avec un espace ou un saut de ligne au début; sortie vide sinon. Courez avec
-r
.panne
la source
Python - 190 octets
Ungolfed
C’est ma première tentative de golf :) En cherchant à apprendre quelques bonnes techniques de codage, peu importe, je me suis concentré sur l’utilisation de find, puis sur l’épissage de chaînes pour trouver les caractères appropriés et formater la sortie.
Variables -
lr = l est attribué aux caractères que nous utiliserons comme guide pour créer notre nouveau paragraphe formaté. r nous attribue le caractère de nouvelle ligne pour espacer la nouvelle sortie.
k, p = le paragraphe d'entrée. K est utilisé pour revenir à l'original car il n'est pas réaffecté lors de l'exécution du script. Je vérifie avec x pour savoir quand ajouter une nouvelle ligne double à des fins d'espacement.
y, i = y est un "curseur" de toutes sortes, garde la trace de la dernière position où un caractère a été trouvé afin que nous trouvions correctement le paragraphe à des fins d'épissure. rétablir le paragraphe (variable p) à son entrée d'origine via la variable k.
h = longueur d'entrée, que nous utilisons en épissage.
x = La position du caractère actuel représenté par C, utilisé également pour l'épissage.
c = Caractères dans l pour itérer et rechercher.
Le code suivant est reformulé et séparé du code d'origine par souci de lisibilité:
J'apprécierais vos commentaires! Je cherche à apprendre.
la source
x<0
ài
. En python, Vrai est égal à 1 et Faux à 0. Donc, si x est -1, il ajoute 1 et sinon 0.i+=
est identique ài=i+
True == 1
donne. :)