私は受動的で攻撃的で、上司が気付かないうちに上司をin辱したい


93

仕事で数ヶ月大変だったので、ただ上司の顔に向かって叫びたくなりました。しかし、私は問題を抱えている人々に直接立ち向かう者ではありません。私も仕事を失いたくありません。

だからここにアイデアがあります:私は彼が決して見つけることなく、彼をin辱できるようにしたいです。そして、私は完璧な方法を実現しました。それ以外の場合は完全にすばらしいメッセージ内にin辱をエンコードする何らかのソフトウェアが必要です。そして、彼が木の森を見ないことが知られているように見て、私はちょうどその方法を知っていると思う:

入力として未知の長さの文字列を受け取るが、改行を含まないプログラムを書いてください。これは、送信したい生のメッセージになります。

可能であれば、メッセージ「DIE IN A GREASE FIRE」が左列全体を構成するようにフォーマットされた文字列を返します。単語の間にスペースを入れるべき新しい段落。今、私は非常に怒っているので、すべての文字が大文字であることも同様に重要です。

他の方法で文字列を変更することはできません。つまり、すべての文字列を大文字に変換することはできません。

問題の文字列をこの方法でフォーマットできない場合、元の文字列を返します。標準入力から入力を読み取ります。

通常のルールが適用されます:HTTP要求なし、THGTTGからのコンサルティングなしMarvinなど。

入力例:

親愛なるボス、物事はどうですか?先週の金曜日に事故のせいですべての責任を負ったことに気付いた。それだけではありません。それのすべての最後のビット。チームの他のメンバーが少なくとも部分的に責任を負っていると考えるのは間違っていますか?結局のところ、私たち6人全員が始めから関与していた。私が非難せずに立つべきだと思うわけではありません。どういたしまして。私が言っているのはこれだけです:私は最善を尽くします。がんばります 私は常に改善しています。そして私は常に責任を負っています。一般的に言えば、自分の行動に全責任を負うことは非常に大丈夫です。しかし、この春の後、私は私が値する以上のものを得るようです。Flakenhauserの契約を覚えていますか?すべてが期待通りにスムーズに落ちました。または、最初はそうでした。物事がバラバラになったのはまさに最後の瞬間でした。すべてのチームは、ずさんな計画やリソースの不適切な管理よりも、異常な事故に似ていることに同意しました。それでも、私は-それだけで-非難しました。そのとき私は何も言わなかったが、そのせいにするための私の寛容度は深刻なへこみをとった。その時点から、私は精査から逃れるために常に2倍の努力をする必要があると感じました。それでも、ここに再び来ました。すべての私の成果にもかかわらず。私たちがいつも最近終わるように見える場所。すべてのプロジェクト。それは耐えられなくなってきています。精査から逃れるためだけに。それでも、ここに再び来ました。私のすべての成果にもかかわらず。私たちがいつも最近終わるように見える場所。すべてのプロジェクト。それは耐えられなくなってきています。精査から逃れるためだけに。それでも、ここに再び来ました。私のすべての成果にもかかわらず。私たちがいつも最近終わるように見える場所。すべてのプロジェクト。それは耐えられなくなってきています。

出力例:

親愛なるボス、物事はどうですか?
先週の金曜日に事故のせいですべての責任を負ったことに気付いた。それだけではありません。
それのすべての最後のビット。

チームの他のメンバーが少なくとも部分的に責任を負っていると考えるのは間違っていますか?結局のところ、私たち6人全員が始めから関与していた。
私が非難せずに立つべきだと思うわけではありません。どういたしまして。

私が言っているのはこれだけです:私は最善を尽くします。がんばります 私は常に改善しています。そして私は常に責任を負っています。

一般的に言えば、自分の行動に全責任を負うことは非常に大丈夫です。しかし、この春の後、私は私が値する以上のものを得るようです。
Flakenhauser契約を覚えておいてください。
すべてが期待通りにスムーズに落ちました。または、最初はそうでした。物事がバラバラになったのはまさに最後の瞬間でした。
すべてのチームは、ずさんな計画やリソースの不適切な管理よりも、異常な事故に似ていることに同意しました。
それでも、私は-それだけで-非難しました。
その時は何も言わなかったが、そのせいにすることに対する私の寛容度はその時深刻なへこみをとった。

その時点から、私は精査から逃れるために、常に2倍の努力をする必要があると感じました。それでも、ここに再び来ました。
すべての私の成果にもかかわらず。
私たちがいつも最近終わるように見える場所。
すべてのプロジェクト。それは耐えられなくなってきています。

これはコードゴルフです。最短のコードが優先されます。


4
改行は文末の句読点の後にのみ発生する必要がありますか?または、次の文字が大文字である限り、適切な現在の前に、またはおそらく略語内で改行することができますか?そうは言っても、過去にはin辱に関連した課題はうまくいきませんでしたが、新しいわいせつを思い付く際の参加者の創造性を求めなかったので、逃げることができるかもしれません。
マーティンエンダー14年

1
固有名詞の前の改行は完全に問題ありません。
クリストファーオルソン14年

3
@NateKerkhofsそれは後方だと思います:秘密のメッセージはメッセージ全体のほんの数文字なので、s辱は木であり、メッセージは森だと思います。ボスが木ではなく森を見ることを本当に願っています。
ジョシュアテイラー14年

11
アーノルド・シュワルツェネッガーの手紙はあなたのインスピレーション?
200_success 14年

57
ホットクエスチョンリストでこれを見たとき、私は少しダブルテイクしたことを認めなければなりません。私がそれを見たとき、それはPCGであり、職場ではありませんでした...まあ...私は少しがっかりしていなかったとは言いません。
BenM 14年

回答:


54

CJam、56 53バイト

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

オンラインでお試しください!

使い方

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
なぜ私はあなたの答えの多くを支持しているのでしょうか?ああ、彼らはクレイジーだからです。
primo 14年

すべての大文字の非常に怒っている単語を含む入力に対してはどうなりますか?
アダムデイビス14年

2
@AdamDavis:「C」と「A」の前にスペースを追加すると、WORDSが改行で分割されないようになります。
デニス14年

25

Perl-60バイト

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

シバンを1つとして数えます。

このソリューションでは、最も内側の文字列を使用して、次の正規表現を作成します。

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

これはm.buettnerのソリューションで使用されている正規表現に似ています。生成された正規表現は、入力と照合されます。リストコンテキストでは、これは、改行で結合された各一致グループを含む配列を返します(「match nothing」グループの理由(\.*)は、追加の改行を挿入するためです)。一致するものがない場合、代わりに元の文字列が出力されます。


Perl-73バイト

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

シバンを2として数えます。

これにより、適切な区切り文字で文字列が分割され、配列内の断片が収集されます。それらのいずれかが一致しなかった場合、出力レコード区切り文字-lオプションで改行に設定されていた)が設定解除されるため、文字列は変更されずに出力されます。


シバンには絶対パスは必要ありませんか?
celtschk 14年

なぜドット(DIEI.NA. ...?
edc65 14年

@celtschkたぶん、お使いのシステムと、スクリプトの起動方法によって異なります。として呼び出され./script.pl、ほとんどの場合はyesです。として呼び出されたperl script.pl場合、いいえ。
primo 14年

1
@ edc65 .after Iは、前に 追加の改行を挿入しますI(同じ位置で再び一致するため)。おそらく少し直感に反するかもしれません。
primo 14年

2
@celtschkシバンのスイッチは引き続き解釈されます。-M致命的なエラーで死ぬシバンにオプションを追加することでこれをテストすることができます:Too late for "-M" option at line 1.しかし、私がそこに置いた主な理由は、実行する必要があることを説明する必要もありませんperl -pl script.pl-現在の形式では、実行されますそのまま。
primo 14年

12

GolfScript、53バイト

デニスのように見えて、私はかなり似たようなことを並行して思いつきました...しかし、ここに私の試みがあります。

各コードブロックの前にあるリンクをクリックして、オンラインで試してください。残念ながら、オンラインインタープリターでは1024文字を超えるコードを実行できないため、テスト入力の「圧縮」をいくつか実行する必要がありました。しかし、それはまだ機能します。

つぶしたバージョン

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

コメントのないバージョン

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

Dennisが提起したポイント:すべてのGolfScriptプログラムは、自動最終改行を出力します。これが私のソリューションをそのまま無効にするかどうかはわかりません。最終改行を抑制するには"":n、末尾近くに追加することで4文字かかると思います。


1
文字が単語の最初の文字であるかどうかを確認しないようです。例えば。「FIFA」はFにのみ使用し、「I」または「A」には使用しないでください。
デニス14年

@Dennis私はそれを必要とする仕様の部分を見ませんでした。しかし、自分自身にその制限を課した場合、ソリューションからそれを解除すると、その優れたゴルフ感が固まるようです。
Runer112 14年

1
これがm.buettnerと私が質問を解釈した方法です(他の回答を詳しく調べる必要があります)が、そうです、言葉を壊すことができないとは言いません。
デニス14年

7

ルビー-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)

これには正規表現はありません。ARGV [0]入力の文字と、左列メッセージを作成するためにブレークする必要がある文字を含む文字列を同時にウォークします。もともとは改行が必要な文字の後にスペースを貼り付けるつもりでしたが、改行を挿入するインデックスをハードコードする方が少し短いことがわかりました。

すべての処理が完了したら、i分割が必要なすべての文字を処理するのに十分な回数インデックスが増加したことを確認します。そうでない場合は、元の文字列を出力します。持っている場合、フォーマットされたものを提供します。

n-[i]!=nは、現在のインデックスが(と比較してn.include? i)余分な改行を必要とするインデックスであるかどうかをチェックするときに文字を保存するための巧妙なトリックでした。また、複数行のブロックでは{}なくs を使用して一部の文字do/endを保存し、最終入力に3項条件を使用して、出力する文字を決定するときに文字を保存しました。

最短ではありませんが、正規表現を使わずにすればいいと思いました。


7

Perl、184バイト

Perlの壮大なスコアではありませんが、ここに単純な正規表現ソリューションがあります

$_=<>;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
確かにコードで正規表現を構築し、トンを節約することは可能ですか?
ピーターテイラー14年

確かに@PeterTaylorですが、私には今それをする時間もPerlの知識もありません。今日は後で見るかもしれません。
マーティンエンダー14年

P:それは私が今投稿し気にしないだろう、私のPERLの答えは、ビート、そうであっても
タル

4文字を保存:print($_)== print。読みやすさのために+1ポイント:何が起こっているかを見るのは非常に簡単であり、他のソリューションではそうではありません。
オレタンゲ14

これはPerlで単純と見なされますか?
リンカーンベルクソン14年

6

JavaScript 116

m-buettnerのアイデアのJavascript実装

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

テストスニペット

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>



これはFIFAテストで失敗します(OPコメント)
Mwr247

@ Mwr247理解するのは難しい:どのFIFAテストを試しましたか?
edc65

次の編集でテスト文字列を試してくださいFrom that FIFA point on。の前FA、および前のスペースの前に新しい行を追加しFIます。
Mwr247

@ Mwr247私のためではない。Firefoxでテストしたところ、まったく同じ行が表示され、改行はありません
-edc65

4

python3(166 138)

ゴルフ:

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

非ゴルフっぽい:

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

ラムダを使用することで多少満足しますが、使用する変数の質量とやや厄介な開発は逆の効果をもたらします。正規表現も良い考えかもしれません。ほらほら、少なくともうまくいく:)。

編集:ラムダ変数をcountビルトインに置き換え、分割ステートメントを短縮しました。


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)

非ゴルフ

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)

説明

chunk 最後の見出しを含むメッセージの末尾を再帰的に分割し、リストの先頭に追加します。

警告:何らかの理由で手紙の2つの提案された見出しの間にスペースがまったくない場合、これは機能しませんが、上司への手紙ではそうは思えません。


1

ルビー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

ルビー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バイト

Jには文字列を処理するのに適切な関数がなく、配列関数だけがあるのはなぜですか?賢い何かを見つけたらこれを修正します。

編集:出力の短縮および修正(以前に余分なスペースがあった)およびチェック。説明も改善しました。

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

説明:

[<left argument>] <function name> <right argument>たとえば、関数の使用法を示しますf <text>。また、この関数は非常に長いため、詳細については説明しません。

@ 例えば、右の関数を左の関数に適用します。 f@g x == f(g(x))

t=:(}.@[t{.@[(}:@],(((0{I.@E.)({.;LF;}.)])>@{:))])']@.(0=#@[)は、<delimiters> t <boxed string>文字列をすべての区切り文字で順番に分割する再帰関数です。区切り文字が見つからない場合は失敗します。

(((0{I.@E.)({.;LF;}.)])>@{:) 区切り文字の左側から文字列を分割し、それらの間に改行を追加します。

>@{: リスト(まだ分割されていないもの)から最後の文字列を取得します

0{I.@E. 分割するインデックスを取得します。区切り文字が存在しない場合は失敗します。

{.;LF;}. スプリットの左側、ラインフィード、スプリットの右側を連結します

}:@], 以前の分割の結果と最後の関数の結果を連結します(最後の意味:ルックアップ)

']@.(0=#@[)区切り文字が残っているかどうかをチェックし、残っている場合は上記の関数(5行)を呼び出します。それ以外の場合は戻ります。

'IEIINAAGGREASEFFIRE'&の左引数tをその文字列に設定します

[:>,&.>/@ 分割の結果を結合します

::] 何かが失敗した場合(スプリットインデックスの検索を弱点にした)、元の文字列を返します。

例(長すぎる?):

   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バイト

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

`:`
`)+a:a))

replaceは文字列をステップ実行し、/\b./gスペースに続く文字列または文字列を開始した文字のみを検索するように一致していました。次に、各文字を調べて、探している配列内の現在のインデックスと一致するかどうかを確認し、一致する場合はその前に改行を追加し、増分しましたi

編集:単語間に改行を作成する必要性を逃しました。私はそれを今やったので、115になりました。


1

PHP、328バイト

「enmessage」への生のテキストを含む「G」という名前のファイルがあるとします

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

説明(〜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バイト

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:"";

whole辱全体を置くことができる場合; 変更された文字列を先頭にスペースまたは改行を付けて出力します。そうでない場合は空の出力。で実行し-rます。

壊す

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バイト

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

非ゴルフ

これは私の最初のゴルフの試みです:)優れたコーディングテクニックを学ぶために、とにかく、findを使用し、次に文字列スプライシングを使用して適切な文字を見つけ、出力をフォーマットすることに焦点を合わせました。

変数-

lr = lには、新しい書式設定された段落を作成するためのガイドとして使用する文字が割り当てられます。rには、新しい出力の間隔を空けるために改行文字が割り当てられます。

k、p =入力段落。Kは、スクリプトの実行中に再割り当てされないため、元に戻すために使用されます。xをチェックして、間隔を空けるために二重の新しい行を追加するタイミングを確認します。

y、i = yは一種の「カーソル」であり、文字が最後に見つかった位置を追跡するので、スプライシングの目的で段落全体を正しく検索できます。段落(p変数)をk変数を介した元の入力に戻します。

h =入力長。スプライシングに使用します。

x =スプライシングにも使用される、Cで表される現在の文字の位置。

c =反復および検索するlの文字。

次のコードは、読みやすくするために元のコードから書き直されており、何が起きているかを示しています。

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

フィードバックをお願いします!学びたいと思っています。


編集にいくつかのトリックを提供しました。それらのいずれかが説明を必要とするかどうか私に尋ねてください。さらに多くのゴルフをすることができますが、それはあなたにお任せします。:)
seequ 14年

@TheRareありがとう!私の「if x ==-1:i + = 1」行とは対照的に、編集で提供した「i = + x <0」行が本当に好きです。私がそれを正しく読んでいることを確認するために、これは私が昨夜読んでいた三元的なものの一つですよね?基本的には、「xが0より小さい場合(charが見つからない場合に-1が返されます):iにxを追加します」と表示されます。したがって、値の-1以下で健全性チェックを満たしますか?私がその権利を読んでいることを確認したいので、それは大きなスペース節約になります!
0xhughes

実際に追加さx<0iます。真Pythonで1と同じであるとFalseは、xが-1であれば、それは1を加算0と同じであり、そうでなければ0がi+=同じであるi=i+
seequ

True == 1与えるものを試してください。:)
seequ 14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.