Je suis un agressif passif et je veux insulter mon patron sans qu'il le découvre


93

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.


4
Les sauts de ligne doivent-ils se produire uniquement après la ponctuation de fin de phrase? Ou pourrais-je avoir un saut de ligne, avant quelque chose de approprié maintenant ou peut-être même avec une abréviation, à condition que la lettre suivante soit en majuscule? Cela étant dit, les défis liés aux insultes n'étaient pas très utiles ici dans le passé, mais vous pourriez peut-être vous en sortir, car vous n'avez pas demandé à la créativité des participants de créer de nouvelles obscénités.
Martin Ender

1
La rupture de ligne avant les noms propres convient parfaitement.
Christofer Ohlsson le

3
@NateKerkhofs Je pense que c'est à l'envers: comme le message secret ne contient que quelques caractères dans un message entier, je pense que l'insulte concerne les arbres et le message la forêt. Nous espérons vraiment que le patron voit la forêt, pas les arbres.
Joshua Taylor le

11
Était la lettre d'Arnold Schwarzenegger votre inspiration?
200_success

57
Je dois admettre que j’ai fait un peu la double-prise quand j’ai vu cela dans la liste des Hot Questions. Quand j'ai vu que c'était PCG et non pas le lieu de travail ... eh bien ... je ne dirai pas que je n'ai pas été un peu déçu.
BenM

Réponses:


54

CJam, 56 53 octets

q_"DIEIINAAGGREASEFFIRE"{S@:A+S@+#:BA<AB>}%(!B)*\N*@?

Essayez-le en ligne!

Comment ça fonctionne

q_                     Read all input from STDIN and push a copy.
"DIEIINAAGGREASEFFIRE" Push the characters we're searching for in form of a
                       string. We'll try to prepend a linefeed to all of them.
                       Some characters are duplicated to prepend two linefeeds.
{                      For every character C in that string:
  S@                   Push ' ' and rotate the string on the stack on top of it.
  :A                   Save the string (initially the input) in A.
  +                    Prepend the space to A.
  S@+                  Construct the string " C".
  #                    Compute the index of " C" in the modified A.
  :B                   Save the index in the variable B.
  A<                   Push the substring of A up to the index.
  AB>                  Push the substring of A after the index.
}%
(                      Shift the first element of the resulting array.
!                      Compute the logical NOT. This pushes 1 if and only if the
                       array's first element is an empty string, which is true
                       if and only if the input string started with a D.
B)                     Push the last value of B and increment. If the last match
                       was successful and, therefore, all matches were successful,
                       B != -1, so B + 1 != 0.
*                      Compute the product of the two topmost items on the stack.
\                      Swap the resulting Booleanr with the array of substrings.
N*                     Join the array, separating by linefeeds.
@                      Rotate the input string on top of the stack.
?                      Select the joined array if the Boolean is 1 and the input
                       string otherwise.

14
Pourquoi est-ce que je me retrouve à voter autant de vos réponses? Oh oui, parce qu'ils sont fous.
dimanche

Que fait-on pour entrer qui contient des mots TRÈS ANGRY dans ALL CAPS?
Adam Davis

2
@AdamDavis: Le préfixe d'espaces «C» et «A» veille à ce que WORDS ne soit pas cassé par des sauts de ligne.
Dennis

25

Perl - 60 octets

#!perl -p
$_=(join$/,$_=~('DIE\IN\A\GREASE\FIRE'=~s/./($&.*)/gr))||$_

Compter le shebang comme un.

Cette solution utilise la chaîne la plus interne pour construire les expressions rationnelles suivantes:

(D.*)(I.*)(E.*)(\.*)(I.*)(N.*)(\.*)(A.*)(\.*)(G.*)(R.*)(E.*)(A.*)(S.*)(E.*)(\.*)(F.*)(I.*)(R.*)(E.*)

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

#!perl -pl
$s=$_}for(map$s!~s/.*?(?=$_)//?$\='':$&,'DIEI.NA.G.REASEF.IRE$'=~/./g){

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' -loption) n'est pas défini et la chaîne n'est donc pas modifiée.


Le shebang n'a-t-il pas besoin d'un chemin absolu?
celtschk

pourquoi les points (DIEI.NA. ...?
edc65

@celtschk Peut-être, en fonction de votre système et de la manière dont vous envisagez d'appeler le script. Invoqué en tant que ./script.pl, alors très probablement oui. Si invoqué en tant que perl script.pl, alors non.
dimanche

1
@ edc65 L' .après Iinsère une nouvelle ligne avant I (car elle correspond à nouveau à la même position). Peut-être un peu contre-intuitif.
dimanche

2
@celtschk Les commutateurs sur le shebang seront toujours interprétés. Vous pouvez tester cela en ajoutant l' -Moption 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 sous perl -pl script.plla forme actuelle, elle est exécutée . comme si.
dimanche

12

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

..(\;68=(>"IEIINAAGGREASEFFIRE"{1$.@?:^<n@^>}/](]^0<=

Version non commentée et commentée

.       # (Save input)
.(\;    # Get first character
68=(>   # If 'D', work with input; else, work with one-character string
"IEIINAAGGREASEFFIRE"
{       # For each character
 1$.@   # (Duplicate message twice)
 ?:^    # Find first index of character
 <n     # Extract part before index and add a newline
 @^>    # Extract part including and after index as new "message"
}/      # (Close loop)
](]^0<= # If last line was successfully matched, select result; else, select input

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 "":nquelque chose vers la fin.


1
Vous ne semblez pas vérifier si le caractère est le premier caractère d'un mot. Par exemple. "FIFA" ne doit être utilisé que pour F, pas pour "I" ou "A".
Dennis

@ Dennis Je n'ai vu aucune partie de la spécification qui l'exige. Mais si vous vous imposiez cette restriction, le fait de la supprimer de votre solution donnerait l'impression de consolider sa supériorité golfique.
Runer112

1
Voici comment m.buettner et moi avons interprété la question (il faudrait que je regarde de plus près les autres réponses), mais vous avez raison, cela ne dit nulle part que nous ne pouvons pas casser les mots.
Dennis

7

Rubis - 140

a="DIEINAGREASEFIRE";n=[4,6,7,13];i=0;o='';s=ARGV[0]
s.chars.each{|c|
if c==a[i]
i+=1;o+="\n";o+="\n"if n-[i]!=n
end
o<<c
}
puts((i<16)?s:o)

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’ iindex 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, alors do/endqu’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.


7

Perl, 184 octets

Pas un score spectaculaire pour Perl, mais voici une solution simple regex

$_=<>;s/^(D.*) (I.*) (E.*) (I.*) (N.*) (A.*) (G.*) (R.*) (E.*) (A.*) (S.*) (E.*) (F.*) (I.*) (R.*) E/$1\n$2\n$3\n\n$4\n$5\n\n$6\n\n$7\n$8\n$9\n$10\n$11\n$12\n\n$13\n$14\n$15\nE/;print;

3
Il est sûrement possible de construire la regex en code et économiser une tonne?
Peter Taylor

@PeterTaylor, certes, mais je n'ai ni le temps ni les connaissances de Perl pour le faire maintenant. Je pourrais avoir un coup d'oeil plus tard aujourd'hui.
Martin Ender

Malgré cela, ma réponse à PERL est supérieure à celle que je ne publierai pas: p
Tal le

Enregistrer 4 caractères: 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.
Ole Tange

Ceci est considéré comme simple en Perl?
Lincoln Bergeson

6

JavaScript 116

Implémentation Javascript de l'idée de m-buettner

console.log((RegExp('^('+[...'DIE IN A GREASE FIRE$'].join('.*)(')+')').exec(z=prompt())||[,z]).slice(1).join('\n'))

Extrait de test

z="Dear Boss, how are things? It has come to my attention that I received all the blame for the mishap last Friday. Not just the majority of it. Every last bit of it. Is it wrong for me to think that the rest of the team were at least in part responsible? After all, all six of us were involved from the get-go. Not that I think I should stand without blame. Not at all. All I'm saying is this: I do my best. I try hard. I improve constantly. And I am constantly taking responsibility. Generally speaking, I am very okay with taking full responsibility for my actions. But after this spring, it seems I get more than I deserve. Remember the Flakenhauser contract? Everything went down just about as smooth as one could have hoped. Or so it seemed at first. It was just at the very last minute that things fell apart. All of the team agreed that it was more akin to a freak accident than sloppy planning or mismanaged resources. Still, I - alone - took blame for it. Even though I said nothing then, my tolerance level for taking the blame took a serious dent then. From that point on, I have felt it necessary to always try twice as hard, just to escape scrutiny. And still, here we are again. In spite of all my accomplishments. Right where we always seem to end up these days. Every single project. It's becoming unbearable.";

T1.textContent = (RegExp('^('+[...'DIE IN A GREASE FIRE$'].join('.*)(')+')').exec(z)|| [,z]).slice(1).join('\n')

z='From that FIFA point on'
T2.textContent = (RegExp('^('+[...'DIE IN A GREASE FIRE$'].join('.*)(')+')').exec(z)|| [,z]).slice(1).join('\n')
pre { border: 1px solid black }
T1<pre id=T1></pre>
T2 (the FIFA test)<pre id=T2></pre>



Cela échoue à l' FIFAexamen (commentaires OP)
Mwr247

@ Mwr247 difficile à comprendre: quel test de la FIFA avez-vous essayé?
Edc65

Essayez la chaîne de test avec l'édition suivante: From that FIFA point on. Il met une nouvelle ligne avant le FA, et avant l'espace avant FI.
Mwr247

@ Mwr247 pas pour moi. Testé avec Firefox, je reçois la même ligne exacte, sans
saut de

4

Python3 ( 166 138)

Golfé:

s='';o=input()
for n in o.split():s+=[n,'\n'+n.title()][n[0]==("DIEINAGREASEFIRE"*len(o))[s.count('\n')]]+' '
print([o,s][s.count('\n')==16])

Ungolfed-ish:

format_s = ''
unformat_s = input()
for n in unformat_s.split():
    format_s += [n, '\n' + n.title()][n[0] == ("DIEINAGREASEFIRE"*len(unformat_s))[format_s.count('\n')]] + ' '
print([unformat_s, format_s][format_s.count('\n') == 16])

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' countinstruction intégrée et abrégée.


1

Python3 (165)

def c(m,h,l=[]):
 if h:s=m.rindex(h[0]);l=[m[s:]]+l;return c(m[:s],h[1:],l)
 return[m]+l
i=input()
try:print('\n'.join(c(i,"ERIF ESAERG A NI EID")))
except:print(i)

Ungolfed

def headings_remaining(headings): return len(headings) > 0
def head(s): return s[0]
def tail(s): return s[1:]
def prepend(l,e): l.insert(0, e)
def reverse(s): return s[::-1]

def chunk(message,headings,output_list=[]):
    if headings_remaining(headings):
        split_index = message.rindex(head(headings))
        message_init = message[:split_index]
        message_last = message[split_index:]

        prepend(output_list, message_last)
        return chunk(message_init, tail(headings), output_list)
    else:
        prepend(output_list, message)
        return output_list

input_message=input()
try:
    headings=reverse("DIE IN A GREASE FIRE")
    print('\n'.join(chunk(input_message,headings)))
except ValueError: # Couldn't keep splitting chunks because didn't find heading
    print(input_message)

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.


1

Ruby 115

n,a,c,i=[4,6,7,13],gets,'',0;a.chars{|x|x=='DIEINAGREASEFIRE'[i]?(i+=1;c+="\n"if n-[i]!=n;c+="\n#{x}"):c+=x};puts c

Ruby 95

a,c,i=gets,"",0;a.chars{|x|x=="DIEINAGREASEFIRE"[i]?(i+=1;c+="\n#{x}"):(c+=x)};puts c

1

J - 110 103 octets

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

f=:[:>,&.>/@('IEIINAAGGREASEFFIRE'&t=:(}.@[t{.@[(}:@],(((0{I.@E.)({.;LF;}.)])>@{:))])`]@.(0=#@[))@< ::]

Explication:

Je vais décrire l'utilisation de la fonction comme [<left argument>] <function name> <right argument>, par exemple f <text>. Je ne vais pas non plus expliquer tous les détails car la fonction est assez longue.

@ applique la fonction droite à la fonction gauche, par exemple. f@g x == f(g(x))

t=:(}.@[t{.@[(}:@],(((0{I.@E.)({.;LF;}.)])>@{:))])']@.(0=#@[)est une fonction récursive <delimiters> t <boxed string>qui scinde la chaîne avec chaque délimiteur, dans l'ordre. Échec si un délimiteur n'est pas trouvé.

(((0{I.@E.)({.;LF;}.)])>@{:) divise la chaîne du côté gauche du délimiteur, en ajoutant un saut de ligne entre eux.

>@{: récupère la dernière chaîne d'une liste (celle qui n'a pas encore été scindée)

0{I.@E. obtient l'index pour se scinder à, échouant si le délimiteur n'existe pas.

{.;LF;}. concatène le côté gauche de la scission, le saut de ligne et le côté droit de la scission

}:@], concatène les résultats des divisions précédentes et le résultat de la dernière fonction (dernier sens: rechercher)

']@.(0=#@[)vérifie s'il reste des délimiteurs et appelle la fonction décrite ci-dessus (5 lignes) s'il y en a une. Sinon retourne.

'IEIINAAGGREASEFFIRE'&définit l'argument gauche de tà cette chaîne

[:>,&.>/@ se joint aux résultats de fractionnement

::] si quelque chose échoue (j'ai fait la recherche de l'index divisé le point faible), retournez la chaîne d'origine.

Exemples (trop longs?):

   f 'Dear Boss, how are things? It has come to my attention that I received all the blame for the mishap last Friday. Not just the majority of it. Every last bit of it. Is it wrong for me to think that the rest of the team were at least in part responsible? After all, all six of us were involved from the get-go. Not that I think I should stand without blame. Not at all. All I''m saying is this: I do my best. I try hard. I improve constantly. And I am constantly taking responsibility. Generally speaking, I am very okay with taking full responsibility for my actions. But after this spring, it seems I get more than I deserve. Remember the Flakenhauser contract? Everything went down just about as smooth as one could have hoped. Or so it seemed at first. It was just at the very last minute that things fell apart. All of the team agreed that it was more akin to a freak accident than sloppy planning or mismanaged resources. Still, I - alone - took blame for it. Even though I said nothing then, my tolerance lev...
Dear Boss, how are things? 
It has come to my attention that I received all the blame for the mishap last Friday. Not just the majority of it. 
Every last bit of it. 

Is it wrong for me to think that the rest of the team were at least in part responsible? After all, all six of us were involved from the get-go. 
Not that I think I should stand without blame. Not at all. 

All I'm saying is this: I do my best. I try hard. I improve constantly. And I am constantly taking responsibility. 

Generally speaking, I am very okay with taking full responsibility for my actions. But after this spring, it seems I get more than I deserve. 
Remember the Flakenhauser contract? 
Everything went down just about as smooth as one could have hoped. Or so it seemed at first. It was just at the very last minute that things fell apart. 
All of the team agreed that it was more akin to a freak accident than sloppy planning or mismanaged resources. 
Still, I - alone - took blame for it. 
Even though I said nothing then, my tolerance level for taking the blame took a serious dent then. 

From that point on, 
I have felt it necessary to always try twice as hard, just to escape scrutiny. And still, here we are again. In spite of all my accomplishments. 
Right where we always seem to end up these days. 
Every single project. It's becoming unbearable.
   f 'Die in a grease fire. It''s fun. Every time.'
Die in a grease fire. It's fun. Every time.
   f 'hai'
hai

1

JavaScript (ES6), 93 115 octets

alert(prompt(x=[...'DIEI1NA1G1REASEF1IRE',i=0]).replace(/\b./g,a=>i<20&&a.match(x[i])?(+x[++i]?i++&&`

`:`
`)+a:a))

J'avais l'habitude replacede parcourir la chaîne, avec une correspondance pour /\b./gne 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.


1

PHP, 328 octets

Étant donné un fichier nommé 'G' contenant le texte brut à "enmessage"

<?php
$a=implode(file("G"));$b=str_split('DIEINAGREASEFIRE');foreach(array_unique($b) as $c){foreach(str_split($a) as $h=>$d){if($c==$d)$l[$c][]=$h;}}$e=-1;$n=$a;foreach($b as $f=>$c){foreach($l as $j=>$m){if($c==$j){foreach($m as $k=>$h){if($h>$e){$n=substr($n,0,$h)."\n".$c.substr($a,$h+1);$e=$h+2;break 2;}}}}}echo nl2br($n);

Explication (~ ungolfed && commented code):

<?php
$string=implode(file("G"));          // raw text to deal with
$msg=str_split('DIEINAGREASEFIRE');  // hidden message (make it an array)

 // 2D array : [letters of the message][corresponding positions in txt]
foreach(array_unique($msg) as $letter) {
    foreach (str_split($string) as $pos=>$let) {
        if ($letter==$let) $l[$letter][]=$pos; //1 array per seeked letter with its positions in the string
    }
}

$currentPos=-1;
$newString=$string;
foreach ($msg as $key=>$letter) { // deal with each letter of the desired message to pass
    foreach($l as $cap=>$arrPos) {// search in letters list with their positions
        if($letter==$cap) {       // array of the current parsed letter of the message
            foreach($arrPos as $kk=>$pos) { // see every position
                if ($pos>$currentPos) {     // ok, use the letter at that position
                    $newString=substr($newString,0,$pos)."\n".$letter.substr($string,$pos+1); // add line break
                    $currentPos=$pos+2; // take new characters into account (\n)
                    break 2;            // parse next letter of the message
                }
            }
        }
    }
}                    /* (note that I could have added some other (random) line breaks management, so that
                      * the message is not TOO obvious... !*/
echo nl2br($newString);

1

PHP, 136 octets

for($f=" ".join(file(F));$c=DIEINAGREASEFIRE[$i++];){while(($p=strpos($f,$c,$p))&&$f[$p-1]>" ");$p?$f[$p-1]="\n":$i=20;}echo$i<20?$f:"";

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

for($f=" ".join(file(F));       // read input from file "F"
    $c=DIEINAGREASEFIRE[$i++];) // loop through insult characters:
{
    while(($p=strpos($f,$c,$p))     // find next position of $c
        &&$f[$p-1]>" ");            // ... preceded by a space
    $p?$f[$p-1]="\n"                // if found, replace the space with a newline
    :$i=20;                         // else break the loop
}
echo$i<20?$f                // if modified text has the full insult, print it
    :"";                    // else print nothing

0

Python - 190 octets

l,r="IExINxAxGREASExFIRE","\n";k=p=raw_input();y=i=0
for c in l:
    if c!="x":
        h=len(p);x=p[y:h].find(c)
        if x==-1:i+=1
        p=p[0:x+y-1]+r+p[x+y:h];y=x+y;r="\n"
    else:r=r+r
if i!=0:p=k

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é:

letters,return="IExINxAxGREASExFIRE","\n"
input1=input2=raw_input()
lastpos=sanity=0

for char in letters:
    if char != "x":
        inputlength=len(input1)
        charposition=input1[lastpos:inputlength].find(char)
        if charposition==-1:
            sanity+=1
        input1=input1[0:position+lastpos-1]+return+input1[position+lastpos:inputlength]
        lastpos=position+lastpos
        return="\n"
    else:return=return+return
if sanity!=0:
    input1=input2

J'apprécierais vos commentaires! Je cherche à apprendre.


J'ai proposé un montage avec quelques astuces. Il suffit de me demander si l'un d'entre eux a besoin d'une explication. Notez que cela pourrait être beaucoup plus joué au golf, mais je vais vous laisser cela. :)
seequ

@TheRare Merci! J'aime beaucoup la ligne "i = + x <0" que vous avez proposée dans votre édition, par opposition à ma ligne "if x == - 1: i + = 1". Juste pour m'assurer que je lis bien, c'est l'une des choses ternaires que je lisais hier soir, n'est-ce pas? En gros, il est écrit "si x est inférieur à 0 (-1 renvoyé quand il ne peut pas trouver le caractère): ajoutez x à i" Correct? Donc, il satisfait toujours le contrôle de cohérence avec un -1 ou moins pour une valeur, non? Vous voulez vous assurer que je lis bien, car c'est un très bon économiseur d'espace!
0xhughes

En fait, cela ajoute 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+
seequ

Essayez ce qui True == 1donne. :)
seequ
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.