Soy pasivo agresivo y quiero insultar a mi jefe sin que se entere


93

Han sido unos pocos meses difíciles en el trabajo y siento que solo quiero gritarle a la cara a mi jefe. Sin embargo, no soy alguien con quien confrontar directamente a las personas con las que tengo un problema. Tampoco quiero perder mi trabajo.

Así que aquí hay una idea: quiero poder insultarlo, sin que él se entere. Y me di cuenta de la manera perfecta: necesito algún tipo de software que codifique un insulto dentro de un mensaje que de otra manera estaría perfectamente bien. Y viendo cómo se sabe que no ve los bosques por árboles, creo que sé cómo:

Escríbeme un programa que tome como entrada una cadena de longitud desconocida, pero que no contenga saltos de línea. Este será el mensaje sin procesar que quiero enviar.

Si es posible, devuelva la cadena formateada de modo que el mensaje "MUERTE EN UN FUEGO DE GRASA" constituya toda la columna izquierda. Con nuevos párrafos donde deben ir los espacios entre las palabras. Ahora, como estoy muy enojado, es igualmente importante que cada letra esté en mayúscula.

No puede modificar la cadena de ninguna otra manera, es decir, no puede convertir toda la cadena en mayúsculas.

Si la cadena en cuestión no se puede formatear de esta manera, debe devolver la cadena original. Leer entrada de entrada estándar.

Se aplican reglas normales: sin solicitudes HTTP, sin consultar a Marvin de THGTTG, etc.

Entrada de ejemplo:

Querido jefe, ¿cómo están las cosas? Me ha llamado la atención que recibí toda la culpa del accidente el viernes pasado. No solo la mayoría. Hasta la última parte. ¿Me equivoca pensar que el resto del equipo fue al menos en parte responsable? Después de todo, los seis estábamos involucrados desde el primer momento. No es que piense que debería estar sin culpa. De ningún modo. Todo lo que digo es esto: hago lo mejor que puedo. Me esfuerzo. Yo mejoro constantemente. Y estoy constantemente asumiendo la responsabilidad. En términos generales, estoy muy de acuerdo con asumir toda la responsabilidad de mis acciones. Pero después de esta primavera, parece que obtengo más de lo que merezco. ¿Recuerdas el contrato de Flakenhauser? Todo cayó casi tan suave como uno podría haber esperado. O eso parecía al principio. Fue justo en el último minuto que las cosas se desmoronaron. Todo el equipo estuvo de acuerdo en que era más parecido a un extraño accidente que una planificación descuidada o recursos mal administrados. Aún así, yo, solo, me eché la culpa. Aunque no dije nada entonces, mi nivel de tolerancia para echar la culpa sufrió una grave abolladura en ese momento. A partir de ese momento, he sentido necesario intentar siempre el doble, solo para escapar del escrutinio. Y aún así, aquí estamos de nuevo. A pesar de todos mis logros. Justo donde siempre parecemos terminar estos días. Cada proyecto individual. Se está volviendo insoportable. solo para escapar del escrutinio. Y aún así, aquí estamos de nuevo. A pesar de todos mis logros. Justo donde siempre parecemos terminar estos días. Cada proyecto individual. Se está volviendo insoportable. solo para escapar del escrutinio. Y aún así, aquí estamos de nuevo. A pesar de todos mis logros. Justo donde siempre parecemos terminar estos días. Cada proyecto individual. Se está volviendo insoportable.

Salida de ejemplo:

Querido jefe, ¿cómo están las cosas?
Me ha llamado la atención que recibí toda la culpa del accidente el viernes pasado. No solo la mayoría.
Hasta el último momento.

¿Me equivoca pensar que el resto del equipo fue al menos en parte responsable? Después de todo, los seis estábamos involucrados desde el primer momento.
No es que piense que debería estar sin culpa. De ningún modo.

Todo lo que digo es esto: hago lo mejor que puedo. Me esfuerzo. Yo mejoro constantemente. Y estoy constantemente asumiendo la responsabilidad.

En términos generales, estoy muy de acuerdo con asumir toda la responsabilidad de mis acciones. Pero después de esta primavera, parece que obtengo más de lo que merezco.
Recuerda el contrato de Flakenhauser.
Todo cayó casi tan suave como uno podría haber esperado. O eso parecía al principio. Fue justo en el último minuto que las cosas se desmoronaron.
Todo el equipo estuvo de acuerdo en que era más parecido a un extraño accidente que una planificación descuidada o recursos mal administrados.
Aún así, yo, solo, me eché la culpa.
Aunque no dije nada entonces, mi nivel de tolerancia para echar la culpa sufrió una grave abolladura en ese momento.

A partir de ese momento, he sentido necesario intentar siempre el doble, solo para escapar del escrutinio. Y aún así, aquí estamos de nuevo.
A pesar de todos mis logros.
Justo donde siempre parecemos terminar estos días.
Cada proyecto individual. Se está volviendo insoportable.

Este es el código de golf. El código más corto gana.


44
¿Los saltos de línea tienen que ocurrir solo después de la puntuación que termina la oración? ¿O podría tener un salto de línea, antes de algo correcto ahora o tal vez incluso dentro de una abreviatura, siempre que la siguiente letra sea mayúscula? Dicho esto, a los desafíos relacionados con el insulto no les fue bien aquí en el pasado, pero es posible que puedas escapar, porque no pediste la creatividad de los participantes para encontrar nuevas obscenidades.
Martin Ender

1
El salto de línea antes de los nombres propios está perfectamente bien.
Christofer Ohlsson

3
@NateKerkhofs Creo que es al revés: dado que el mensaje secreto es solo unos pocos caracteres en un mensaje completo, creo que el insulto son los árboles y el mensaje es el bosque. Realmente esperamos que el jefe vea el bosque, no los árboles.
Joshua Taylor

11
¿Fue la inspiración de la carta de Arnold Schwarzenegger ?
200_success

57
Debo admitir que hice un poco de doble análisis cuando vi esto en la lista de Preguntas más frecuentes. Cuando vi que era PCG y no The Workplace ... bueno ... no diré que no estaba un poco decepcionado.
BenM

Respuestas:


54

CJam, 56 53 bytes

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

Pruébalo en línea!

Cómo funciona

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
¿Por qué me encuentro votando tantas de sus respuestas? Oh sí, porque están locos.
primo

¿Qué hace al ingreso que contiene palabras MUY ENOJADAS en TODAS LAS MAYÚSCULAS?
Adam Davis

2
@AdamDavis: anteponer espacios a "C" y "A" se asegura de que las palabras no se rompan con saltos de línea.
Dennis

25

Perl - 60 bytes

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

Contando el shebang como uno.

Esta solución utiliza la cadena más interna para construir la siguiente expresión regular:

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

que es similar a la expresión regular utilizada en la solución de m.buettner . La expresión regular generada se compara con la entrada. En un contexto de lista, esto devolverá una matriz que contiene cada uno de los grupos de coincidencia, que están unidos por una nueva línea (el motivo de los grupos de "no coincidir nada" (\.*)es insertar una nueva línea adicional) Si no hay coincidencia, la cadena original se emite en su lugar.


Perl - 73 bytes

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

Contando el shebang como dos.

Esto divide la cadena en los delimitadores apropiados y recoge las piezas en una matriz. Si alguno de ellos no coincide, el separador de registro de salida (que se estableció en una nueva línea con la -lopción) no está establecido, por lo que la cadena se genera sin modificar.


¿El shebang no necesita un camino absoluto?
celtschk

por qué los puntos (DIEI.NA. ...?
edc65

@celtschk Tal vez, dependiendo de su sistema y de cómo pretende invocar el script. Invocado como ./script.pl, entonces muy probablemente sí. Si se invoca como perl script.pl, entonces no.
primo

1
@ edc65 El .after Iinsertará una nueva línea adicional antes I (porque coincide nuevamente en la misma posición). Quizás un poco contra-intuitivo.
primo

2
@celtschk Los interruptores en el shebang aún se interpretarán. Puede probar esto agregando la -Mopción al shebang, que morirá con el error fatal: Too late for "-M" option at line 1.pero la razón principal por la que lo puse allí, también evito tener que explicar que debe ejecutarse ya que perl -pl script.pl, en su forma actual, se ejecuta como es.
primo

12

GolfScript, 53 bytes

Parece que Dennis y yo se nos ocurrieron cosas bastante similares en paralelo ... Pero aquí está mi intento.

Haga clic en los enlaces antes de cada bloque de código para probarlo en línea. Desafortunadamente, el intérprete en línea no le permitirá ejecutar código de más de 1024 caracteres, por lo que tuve que realizar alguna ... "compresión" de la entrada de prueba. Pero aún funciona.

Versión aplastada

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

Versión no comentada, comentada

.       # (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 punto planteado por Dennis: todos los programas de GolfScript imprimen una nueva línea final automática. Si esto debería o no invalidar mi solución tal como está, no estoy seguro. Creo que costaría 4 caracteres suprimir la nueva línea final agregando "":nalgo cerca del final.


1
No parece verificar si el carácter es el primer carácter de una palabra. Por ejemplo. "FIFA" solo debe usarse para F, no para "I" o "A".
Dennis

@ Dennis No vi ninguna parte de la especificación que lo requiera. Pero si te impusiste esa restricción a ti mismo, sacar eso de tu solución parece que solidificaría su superioridad en el golf.
Runer112

1
Así es como m.buettner y yo interpretamos la pregunta (tendría que echar un vistazo más de cerca a las otras respuestas), pero tienes razón, no dice en ninguna parte que no podamos romper palabras.
Dennis

7

Rubí - 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)

No hay expresiones regulares en este . Simultáneamente recorre los caracteres en la entrada ARGV [0], y una cadena que contiene caracteres que necesitamos romper para hacer nuestro mensaje en la columna izquierda. Originalmente iba a pegar espacios después de las letras que necesitan tener una nueva línea, pero descubrió que era un poco más corto codificar los índices en los que insertar el salto de línea.

Una vez que todo está dicho y hecho, verifica que el iíndice se haya incrementado suficientes veces como para haber revisado cada letra que necesitaba romperse. Si no es así, simplemente imprimimos la cadena original. Si es así, les damos el formateado.

n-[i]!=nfue un buen truco para guardar caracteres cuando se verificaba si el índice actual era uno que necesitaba un salto de línea adicional (en comparación con n.include? i). También guardé algunos caracteres usando {}s en lugar de a do/endpesar de ser un bloque multilínea, y usé una condición ternaria en los últimos puestos para guardar caracteres al determinar cuál emitir.

No es el más corto, pero pensé que sería bueno hacerlo sin expresiones regulares.


7

Perl, 184 bytes

No es un puntaje espectacular para Perl, pero aquí hay una solución simple de expresiones regulares.

$_=<>;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
¿Seguramente es posible construir la expresión regular en código y ahorrar una tonelada?
Peter Taylor

@PeterTaylor ciertamente, pero no tengo el tiempo ni el conocimiento de Perl para hacer eso en este momento. Podría echar un vistazo más tarde hoy.
Martin Ender

Aun así, supera mi respuesta PERL, que no me molestaré en publicar ahora: p
Tal

Ahorre 4 caracteres: print($_)== print. +1 punto de legibilidad: es notablemente fácil ver lo que está sucediendo, que no es exactamente el caso de otras soluciones.
Ole Tange

Esto se considera simple en Perl?
Lincoln Bergeson

6

JavaScript 116

Implementación de Javascript de la idea de m-buettner

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

Fragmento de prueba

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>



Esto falla en la FIFAprueba (comentarios OP)
Mwr247

@ Mwr247 difícil de entender: ¿qué prueba de FIFA probaste?
edc65

Prueba la cadena de prueba con la siguiente edición: From that FIFA point on. Pone una nueva línea antes FAy antes del espacio anterior FI.
Mwr247

@ Mwr247 no es para mí. Probado con Firefox, obtengo la misma línea exacta, no hay nuevas líneas en ella
edc65

4

Python3 ( 166 138)

Golfizado:

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])

Aunque el uso de la lambda me agrada un poco, ese número masivo de variables utilizadas y el desarrollo algo desordenado tienen el efecto contrario. Regex puede haber sido una buena idea también. Hay ho, al menos funciona :).

Editar: se reemplazó la variable lambda con una función countincorporada y una declaración dividida acortada.


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)

Sin golf

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)

Explicación

chunk divide recursivamente el final del mensaje que contiene el último encabezado y lo antepone a una lista.

Advertencia: esto no funcionará si no hay espacios entre dos encabezados propuestos en su carta por alguna razón, pero eso parece poco probable en una carta a su jefe.


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 bytes

¿Por qué J no tiene buenas funciones para manejar cadenas, sino solo funciones de matriz? Revisaré esto si descubro algo inteligente.

Editar: salida acortada y fija (antes tenía espacios adicionales) y verificación. También mejoré la explicación.

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

Explicación:

Denotaré el uso de la función como [<left argument>] <function name> <right argument> , por ejemplo f <text>. Tampoco explicaré todos los detalles porque la función es bastante larga.

@ aplica la función derecha a la función izquierda, por ejemplo. f@g x == f(g(x))

t=:(}.@[t{.@[(}:@],(((0{I.@E.)({.;LF;}.)])>@{:))])']@.(0=#@[) es una función recursiva <delimiters> t <boxed string> que divide la cadena con cada delimitador, en orden. Falla si no se encuentra algún delimitador.

(((0{I.@E.)({.;LF;}.)])>@{:) divide la cadena desde el lado izquierdo del delimitador, agregando un salto de línea entre ellos.

>@{: obtiene la última cadena de una lista (la que aún no se ha dividido)

0{I.@E. consigue que el índice se divida, fallando si el delimitador no existe.

{.;LF;}. concatena el lado izquierdo de la división, salto de línea y el lado derecho de la división

}:@], concatena los resultados de las divisiones anteriores y el resultado de la última función (último significado: buscar)

']@.(0=#@[)comprueba si queda algún delimitador y llama a la función descrita anteriormente (5 líneas) si la hay. De lo contrario vuelve.

'IEIINAAGGREASEFFIRE'& establece el argumento izquierdo de t esa cadena

[:>,&.>/@ se une a los resultados de la división

::] si algo falla (hice la búsqueda del índice dividido en el punto débil), devuelve la cadena original.

Ejemplos (¿demasiado largos?):

   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 bytes

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

`:`
`)+a:a))

Solía replacepasar por la cadena, con una coincidencia para /\b./gsolo encontrar caracteres que siguieran un espacio o comenzaran la cadena. Luego verifiqué cada carácter para ver si coincidía con el índice actual en la matriz que estaba buscando, y agregué una nueva línea antes si lo hacía, y lo incrementé i.

EDITAR: se perdió la necesidad de crear nuevas líneas entre las palabras. Lo he hecho ahora, lo que lo lleva a 115.


1

PHP, 328 bytes

Dado un archivo llamado 'G' que contiene el texto en bruto para "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);

Explicación (~ código no comentado && comentado):

<?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 bytes

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 se puede poner todo el insulto; imprime la cadena modificada con un espacio inicial o salto de línea; salida vacía si no. Corre con-r .

Descompostura

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 bytes

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

Sin golf

Este es mi primer intento de golf :) Buscando aprender algunas excelentes técnicas de codificación, de todos modos, solo me enfoqué en usar find y luego unir cadenas para encontrar los caracteres apropiados y formatear la salida.

Variables

lr = l tiene caracteres asignados que usaremos como nuestra guía para crear nuestro nuevo párrafo formateado. r se le asigna el nuevo carácter de línea para espaciar la nueva salida.

k, p = El párrafo de entrada. K se utiliza para volver al original, ya que no se reasigna durante la ejecución del script. Compruebo contra x para saber cuándo agregar una nueva línea doble con fines de espaciado.

y, i = y es una especie de "cursor", realiza un seguimiento de la última posición en la que se encontró un personaje para que podamos encontrarlo en el párrafo correctamente con fines de empalme. revierta el párrafo (variable p) a su entrada original a través de la variable k.

h = Longitud de entrada, que usamos en empalmes.

x = La posición del carácter actual representado por C, utilizado también para empalmar.

c = Caracteres en l para iterar y buscar.

El siguiente código está redactado y separado del código original para facilitar su lectura según lo que está sucediendo:

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

Agradecería sus comentarios! Estoy buscando aprender


Ofrecí una edición con algunos trucos. Pregúntame si alguno de ellos necesita una explicación. Tenga en cuenta que podría jugar mucho más, por mucho, pero se lo dejaré a usted. :)
seequ

@TheRare Gracias! Realmente me gusta la línea "i = + x <0" que ofreció en su edición, a diferencia de mi línea "if x == - 1: i + = 1". Solo para asegurarme de que lo estoy leyendo bien, esta es una de las cosas ternarias que estaba leyendo anoche, ¿verdad? Básicamente dice: "si x es menor que 0 (-1 devuelto cuando no puede encontrar el carácter): agregue x a i" ¿Correcto? Por lo tanto, aún satisface el control de cordura con un -1 o menos por un valor, ¿verdad? ¡Quiero asegurarme de que estoy leyendo bien, porque es un gran ahorro de espacio!
0xhughes

En realidad se suma x<0a i. En python, True es lo mismo que 1 y False es lo mismo que 0. Entonces, si x es -1, suma 1 y, de lo contrario, 0. i+=es lo mismo quei=i+
vea el

Prueba lo que True == 1da. :)
seequ
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.