Sou passivo agressivo e quero insultar meu chefe sem que ele descubra

93

Faz alguns meses no trabalho e sinto que só quero gritar na cara do meu chefe. No entanto, eu não sou o único a confrontar diretamente pessoas com as quais tenho problemas. Eu também não quero perder meu emprego.

Então, eis uma idéia: quero poder insultá-lo, sem que ele descubra. E percebi da maneira perfeita: preciso de algum tipo de software que codifique um insulto dentro de uma mensagem perfeitamente perfeita. E, como ele sabe que não vê florestas para árvores, acho que sei exatamente como:

Escreva-me um programa que tenha como entrada uma sequência de comprimento desconhecido, mas sem quebras de linha. Essa será a mensagem não processada que desejo enviar.

Se possível, retorne a seqüência de caracteres formatada de forma que a mensagem "MORTE EM UM GRANDE INCÊNDIO" constitua a coluna esquerda inteira. Com novos parágrafos onde os espaços entre as palavras devem ir. Agora, como estou com muita raiva, é igualmente importante que todas as letras estejam em maiúsculas.

Você não pode modificar a string de nenhuma outra maneira, ou seja, não pode transformar toda a string em caracteres maiúsculos.

Se a sequência em questão não puder ser formatada dessa maneira, você deve retornar a sequência original. Leia a entrada da entrada padrão.

Aplicam-se regras normais: sem solicitações HTTP, sem consultar Marvin da THGTTG, etc.

Exemplo de entrada:

Caro chefe, como estão as coisas? Chegou ao meu conhecimento que recebi toda a culpa pelo acidente na sexta-feira passada. Não é apenas a maioria. Todo último pedaço. É errado eu pensar que o resto da equipe seja pelo menos em parte responsável? Afinal, nós seis estávamos envolvidos desde o início. Não que eu ache que devo ficar sem culpa. De modo nenhum. Tudo o que estou dizendo é o seguinte: eu faço o meu melhor. Eu esforço-me. Eu melhoro constantemente. E eu estou constantemente assumindo a responsabilidade. De um modo geral, estou muito bem em assumir total responsabilidade por minhas ações. Mas depois desta primavera, parece que recebo mais do que mereço. Lembra do contrato da Flakenhauser? Tudo correu tão suave quanto se poderia esperar. Ou assim parecia a princípio. Foi apenas no último minuto que as coisas desmoronaram. Toda a equipe concordou que era mais parecido com um acidente do que com planejamento mal feito ou recursos mal administrados. Ainda assim, eu - sozinho - fui culpado por isso. Mesmo que eu não tenha dito nada, meu nível de tolerância para levar a culpa levou um sério impacto então. A partir daí, senti que era necessário sempre tentar duas vezes mais, apenas para escapar do escrutínio. E ainda assim, aqui estamos novamente. Apesar de todas as minhas realizações. Exatamente onde sempre parecemos acabar hoje em dia. Todo projeto. Está se tornando insuportável. apenas para escapar do escrutínio. E ainda assim, aqui estamos novamente. Apesar de todas as minhas realizações. Exatamente onde sempre parecemos acabar hoje em dia. Todo projeto. Está se tornando insuportável. apenas para escapar do escrutínio. E ainda assim, aqui estamos novamente. Apesar de todas as minhas realizações. Exatamente onde sempre parecemos acabar hoje em dia. Todo projeto. Está se tornando insuportável.

Exemplo de saída:

Caro chefe, como estão as coisas?
Chegou ao meu conhecimento que recebi toda a culpa pelo acidente na sexta-feira passada. Não é apenas a maioria.
Todo último pedaço.

É errado eu pensar que o resto da equipe seja pelo menos em parte responsável? Afinal, nós seis estávamos envolvidos desde o início.
Não que eu ache que devo ficar sem culpa. De modo nenhum.

Tudo o que estou dizendo é o seguinte: eu faço o meu melhor. Eu esforço-me. Eu melhoro constantemente. E eu estou constantemente assumindo a responsabilidade.

De um modo geral, estou muito bem em assumir total responsabilidade por minhas ações. Mas depois desta primavera, parece que recebo mais do que mereço.
Lembre-se do contrato da Flakenhauser.
Tudo correu tão suave quanto se poderia esperar. Ou assim parecia a princípio. Foi apenas no último minuto que as coisas desmoronaram.
Toda a equipe concordou que era mais parecido com um acidente do que com planejamento mal feito ou recursos mal administrados.
Ainda assim, eu - sozinho - fui culpado por isso.
Mesmo que eu não tenha dito nada, meu nível de tolerância para levar a culpa levou um sério impacto então.

A partir daí, senti que era necessário sempre tentar duas vezes mais, apenas para escapar do escrutínio. E ainda assim, aqui estamos novamente.
Apesar de todas as minhas realizações.
Exatamente onde sempre parecemos acabar hoje em dia.
Todo projeto. Está se tornando insuportável.

Isso é código de golfe. O menor código vence.

Christofer Ohlsson
fonte
4
As quebras de linha devem ocorrer somente após a pontuação do final da frase? Ou eu poderia ter uma quebra de linha, antes de alguma adequada agora ou talvez até dentro de uma abreviação, desde que a letra a seguir esteja em maiúscula? Dito isto, os desafios relacionados a insultos não se saíram bem aqui no passado, mas você pode se safar, porque não pediu a criatividade dos participantes para criar novas obscenidades.
Martin Ender
1
A quebra de linha antes dos substantivos próprios está perfeitamente correta.
Christofer Ohlsson
3
@NateKerkhofs Eu acho que é ao contrário: como a mensagem secreta tem apenas alguns caracteres em uma mensagem inteira, acho que o insulto são as árvores e a mensagem é a floresta. Realmente esperamos que o chefe veja a floresta, não as árvores.
21414 Joshua Taylor #:
11
Era a carta de Arnold Schwarzenegger sua inspiração?
200_success
57
Devo admitir que dei uma olhada dupla quando vi isso na lista de Perguntas frequentes. Quando vi que era PCG e não The Workplace ... bem ... não vou dizer que não fiquei um pouco decepcionado.
BenM 20/06/2014

Respostas:

54

CJam, 56 53 bytes

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

Experimente online!

Como 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.
Dennis
fonte
14
Por que me vejo votando em tantas respostas? Oh sim, porque eles são loucos.
primo
O que faz com a entrada que contém palavras MUITO IRRITADAS em TODAS AS CAPS?
Adam Davis
2
@ AdamDavis: Anexar espaços a "C" e "A" garante que as PALAVRAS não sejam quebradas pelos feeds de linha.
Dennis
25

Perl - 60 bytes

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

Contando o shebang como um.

Esta solução usa a cadeia mais interna para criar o seguinte regex:

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

que é semelhante ao regex usado na solução de m.buettner . O regex gerado é comparado com a entrada. Em um contexto de lista, isso retornará uma matriz que contém cada um dos grupos de correspondência, que são unidos por uma nova linha (a razão para os grupos 'combinar nada' (\.*)é inserir uma nova linha adicional). Se não houver correspondência, a sequência original será exibida.


Perl - 73 bytes

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

Contando o shebang como dois.

Isso divide a string nos delimitadores apropriados e coleta as peças em uma matriz. Se algum deles falhar na correspondência, o separador de registro de saída (que foi definido como uma nova linha com a -lopção) será desabilitado e, portanto, a sequência será emitida sem modificação.

primo
fonte
O shebang não precisa de um caminho absoluto?
Celtschk
por que os pontos (DIEI.NA. ...?
edc65
@celtschk Talvez, dependendo do seu sistema, e como você pretende invocar o script. Invocado como ./script.pl, então provavelmente sim. Se invocado como perl script.pl, então não.
primo
1
@ edc65 O .after Iirá inserir uma nova linha adicional antes I (porque corresponde novamente na mesma posição). Talvez um pouco contra-intuitivo.
primo
2
@celtschk Os interruptores no shebang ainda serão interpretados. Você pode testar isso adicionando a -Mopção ao shebang, que morrerá com o erro fatal: Too late for "-M" option at line 1.Mas a principal razão pela qual eu o coloquei lá, também evito precisar explicar que ele precisa ser executado como perl -pl script.pl- em sua forma atual, ele é executado como é.
primo
12

GolfScript, 53 bytes

Parece que Dennis e eu criamos coisas parecidas em paralelo ... Mas aqui está minha tentativa.

Clique nos links antes de cada bloco de código para experimentá-lo online. Infelizmente, o intérprete on-line não permitirá que você execute códigos maiores que 1024 caracteres, então eu tive que executar alguma ... "compactação" da entrada de teste. Mas ainda funciona.

Versão Squished

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

Versão comentada não terminada

.       # (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

Um ponto levantado por Dennis: Todos os programas GolfScript imprimem uma nova linha final automática. Se isso deve ou não invalidar minha solução como está, não tenho certeza. Acredito que custaria 4 caracteres para suprimir a nova linha final, adicionando "":nalgo próximo ao final.

Runer112
fonte
1
Parece que você não verifica se o caractere é o primeiro caractere de uma palavra. Por exemplo. "FIFA" deve ser usado apenas para F, não para "I" ou "A".
Dennis
@ Dennis Não vi nenhuma parte da especificação que exija isso. Mas se você impôs essa restrição a si mesmo, retirá-la da sua solução parece solidificar sua superioridade no golfe.
Runer112
1
Foi assim que m.buettner e eu interpretamos a pergunta (eu teria que olhar mais de perto as outras respostas), mas você está certo, não diz em nenhum lugar que não possamos quebrar palavras.
Dennis
7

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

Não há regexes neste . Ele caminha simultaneamente os caracteres na entrada ARGV [0] e uma string contendo caracteres que precisamos quebrar para criar nossa mensagem na coluna da esquerda. Originalmente, ele mantinha espaços após as letras que precisavam ter uma nova linha, mas descobriu que era um pouco mais curto para codificar os índices nos quais inserir a quebra de linha.

Depois de tudo dito e feito, ele verifica se o iíndice aumentou o tempo suficiente para passar por todas as letras que precisavam ser quebradas. Caso contrário, apenas imprimimos a string original. Se houver, damos a eles o formatado.

n-[i]!=nfoi um truque interessante para salvar caracteres ao verificar se o índice atual era ou não um que precisava de uma quebra de linha extra (em comparação com n.include? i). Também salvou alguns caracteres usando {}s em vez de do/endapesar de ser um bloco com várias linhas e usou uma condição ternária nas colocações finais para salvar caracteres ao determinar qual deles sair.

Não é o mais curto, mas achei que seria legal ficar sem expressões regulares.

KChaloux
fonte
7

Perl, 184 bytes

Não é uma pontuação espetacular para Perl, mas aqui está uma solução simples para 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;
Martin Ender
fonte
3
Certamente é possível criar a regex em código e economizar uma tonelada?
Peter Taylor
@ PeterTaylor certamente, mas não tenho tempo nem conhecimento em Perl para fazer isso agora. Eu posso dar uma olhada hoje mais tarde.
Martin Ender
Mesmo assim ele bate a minha resposta PERL, que eu não vou incomodar postando agora: p
Tal
Economize 4 caracteres: print($_)== print. +1 ponto de legibilidade: é incrivelmente fácil ver o que está acontecendo, o que não é exatamente o caso de outras soluções.
precisa
Isso é considerado simples no Perl?
Lincoln Bergeson
6

JavaScript 116

Implementação de Javascript da idéia de m-buettner

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

Snippet de teste

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>

edc65
fonte
JavaScript é.
Peter Mortensen
Esta falha no FIFAteste (comentários OP)
Mwr247
@ Mwr247 difícil de entender: que teste da FIFA você tentou?
Edc65
Tente a seqüência de teste com o seguinte edit: From that FIFA point on. Ele coloca uma nova linha antes FAe antes do espaço antes FI.
precisa saber é
@ Mwr247 não para mim. Testado com o Firefox, recebo a mesma linha exata, sem novas linhas
edc65 14/01
4

Python3 ( 166 138)

Golfe:

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

Embora o uso do lambda me agrade um pouco, esse número maciço de variáveis ​​usadas e o desenvolvimento um tanto bagunçado têm o efeito oposto. Regex também pode ter sido uma boa ideia. Hay ho, pelo menos funciona :).

Editar: variável lambda substituída por countbuiltin e instrução de divisão abreviada.

idiot.py
fonte
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)

Explicação

chunk recursivamente divide o final da mensagem que contém o último cabeçalho e o anexa a uma lista.

Advertência: isso não funcionará se não houver espaços entre os dois títulos propostos em sua carta por algum motivo, mas isso parece improvável em uma carta ao seu chefe.

Steven Liao
fonte
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
bjhaid
fonte
1

J - 110 103 bytes

Por que J não possui boas funções para lidar com strings, mas apenas funções de array? Vou revisar isso se descobrir algo inteligente.

Editar: Saída reduzida e fixa (tinha espaços extras antes) e verificação. Eu também melhorei a explicação.

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

Explicação:

Denotarei o uso da função como [<left argument>] <function name> <right argument>, por exemplo f <text>. Também não vou explicar todos os detalhes porque a função é bastante longa.

@ aplica a função correta à esquerda, por exemplo. f@g x == f(g(x))

t=:(}.@[t{.@[(}:@],(((0{I.@E.)({.;LF;}.)])>@{:))])']@.(0=#@[)é uma função recursiva <delimiters> t <boxed string>que divide a string com todos os delimitadores, em ordem. Falha se algum delimitador não for encontrado.

(((0{I.@E.)({.;LF;}.)])>@{:) divide a sequência do lado esquerdo do delimitador, adicionando um avanço de linha entre eles.

>@{: obtém a última string de uma lista (a que ainda não foi dividida)

0{I.@E. obtém o índice para divisão, falhando se o delimitador não existir.

{.;LF;}. concatena o lado esquerdo da divisão, avanço de linha e lado direito da divisão

}:@], concatena os resultados das divisões anteriores e o resultado da última função (último significado: procurar)

']@.(0=#@[)verifica se há algum delimitador restante e chama a função descrita acima (5 linhas), se houver. Caso contrário, retorna.

'IEIINAAGGREASEFFIRE'&define o argumento esquerdo tdessa string

[:>,&.>/@ une os resultados da divisão

::] se algo falhar (fiz da pesquisa do índice de divisão o ponto fraco), retorne a string original.

Exemplos (muito tempo?):

   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
seequ
fonte
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))

Eu costumava replacepercorrer a sequência, com uma correspondência para /\b./gencontrar apenas caracteres que seguiam um espaço ou iniciavam a sequência. Em seguida, verifiquei cada caractere para ver se ele correspondia ao índice atual na matriz que eu estava procurando e adicionei uma nova linha antes, se sim, e incrementei i.

EDIT: Perdeu a necessidade de criar novas linhas entre as palavras. Eu fiz isso agora, o que eleva para 115.

Mwr247
fonte
1

PHP, 328 bytes

Dado um arquivo chamado 'G' contendo o texto bruto para "immensagem"

<?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);

Explicação (~ código não digitado && 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);
St3an
fonte
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:"";

se todo o insulto puder ser posto; imprime a string modificada com um espaço à esquerda ou quebra de linha; saída vazia, se não. Corra com -r.

demolir

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
Titus
fonte
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

Ungolfed

Esta é minha primeira tentativa de golfe :) Procurando aprender algumas ótimas técnicas de codificação, independentemente, eu apenas foquei no uso de find e, em seguida, em algumas seqüências de caracteres para encontrar os caracteres apropriados e formatar a saída.

Variáveis ​​-

lr = l possui caracteres atribuídos que usaremos como nosso guia para criar nosso novo parágrafo formatado. r é designado para o novo caractere de linha no espaçamento da nova saída.

k, p = O parágrafo de entrada. K é usado para reverter para o original, pois não é reatribuído durante a execução do script. Verifico contra x para saber quando adicionar uma nova linha dupla para fins de espaçamento.

y, i = y é um tipo de "cursor", acompanha a última posição em que um caractere foi encontrado, para que possamos encontrar o parágrafo corretamente para fins de emenda; reverta o parágrafo (variável p) para sua entrada original através da variável k.

h = Comprimento da entrada, que usamos na emenda.

x = A posição do caractere atual representado por C, usado também para emenda.

c = Caracteres em l para iterar e procurar.

O código a seguir é reformulado e dividido do código original para facilitar a leitura conforme o que está acontecendo:

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

Gostaria muito de receber seu feedback! Eu estou procurando aprender.

0xhughes
fonte
Ofereci uma edição com alguns truques. Apenas me pergunte se algum deles precisa de uma explicação. Note que poderia ser muito mais jogado, mas deixarei isso para você. :)
veja
@TheRare Thanks! Eu realmente gosto da linha "i = + x <0" que você ofereceu em sua edição, em oposição à minha linha "se x == - 1: i + = 1". Só para ter certeza de que estou lendo direito, essa é uma das coisas ternárias sobre as quais estava lendo ontem à noite, certo? Ele basicamente lê "se x for menor que 0 (-1 retornado quando não é possível encontrar o caractere): adicione x a i" Correto? Portanto, ainda satisfaz a verificação de sanidade com -1 ou menos para um valor, certo? Quer ter certeza de que estou lendo direito, porque isso economiza muito espaço!
0xhughes
Na verdade, isso contribui x<0para i. Em python Verdadeiro é o mesmo que 1 e False é o mesmo que 0. Então, se x é -1, ele adiciona 1 e caso contrário, 0. i+=é o mesmo quei=i+
seequ
Experimente o que True == 1dá. :)
Veja