Я пассивно агрессивен и хочу оскорблять моего босса без его ведома


93

Это были тяжелые несколько месяцев на работе, и я чувствую, что просто хочу кричать прямо в лицо своему боссу. Однако я не из тех, кто напрямую сталкивается с людьми, с которыми у меня проблемы. Я также не хочу потерять свою работу.

Итак, вот идея: я хочу быть в состоянии оскорбить его, но он никогда не узнает. И я понял идеальный способ: мне нужно какое-то программное обеспечение, которое кодирует оскорбление внутри в остальном совершенно прекрасного сообщения. И, видя, как он знает, что не видит леса за деревьями, я думаю, что я знаю, как:

Напишите мне программу, которая принимает в качестве входных данных строку неизвестной длины, но не содержит разрывов строк. Это будет необработанное сообщение, которое я хочу отправить.

Если возможно, верните строку, отформатированную таким образом, чтобы сообщение «DIE IN A GREASE FIRE» составляло весь левый столбец. С новыми параграфами, где пробелы между словами должны идти. Теперь, когда я очень зол, одинаково важно, чтобы каждая буква была в верхнем регистре.

Вы не можете изменять строку любым другим способом, т.е. вы не можете превратить всю строку в символы верхнего регистра.

Если рассматриваемая строка не может быть отформатирована таким образом, вы должны вернуть исходную строку. Чтение ввода со стандартного ввода.

Применяются обычные правила: никаких HTTP-запросов, никаких консультаций с Marvin из THGTTG ​​и т. Д.

Пример ввода:

Дорогой Босс, как дела? До моего сведения дошло, что я получил всю вину за неудачу в прошлую пятницу. Не только большинство из них. Каждый последний бит этого. Это неправильно для меня думать, что остальная часть команды была по крайней мере частично ответственна? В конце концов, все шесть из нас были вовлечены с самого начала. Не то чтобы я думал, что должен стоять без вины. Не за что. Все, что я говорю, это: я делаю все возможное. Я стараюсь изо всех сил. Я постоянно совершенствуюсь. И я постоянно беру на себя ответственность. Вообще говоря, я вполне согласен взять на себя полную ответственность за свои действия. Но после этой весны, кажется, я получаю больше, чем заслуживаю. Помните контракт с Flakenhauser? Все прошло так гладко, как можно было надеяться. Или так казалось на первый взгляд. Это было в самую последнюю минуту, что вещи развалились. Вся команда согласилась, что это было больше похоже на странную аварию, чем на неаккуратное планирование или неэффективное управление ресурсами. Тем не менее, я - один - взял вину за это. Даже тогда, когда я ничего не сказал, мой уровень терпимости к тому, чтобы взять на себя вину, тогда серьезно пошатнулся. С этого момента я чувствовал, что необходимо всегда стараться в два раза сильнее, просто чтобы избежать проверки. И все же, мы снова здесь. Несмотря на все мои достижения. Именно там, где мы, кажется, всегда оказываемся в эти дни. Каждый проект. Это становится невыносимым. просто чтобы избежать проверки. И все же, мы снова здесь. Несмотря на все мои достижения. Прямо там, где мы, кажется, всегда оказываемся в эти дни. Каждый проект. Это становится невыносимым. просто чтобы избежать проверки. И все же, мы снова здесь. Несмотря на все мои достижения. Прямо там, где мы, кажется, всегда оказываемся в эти дни. Каждый проект. Это становится невыносимым.

Пример вывода:

Дорогой Босс, как дела?
До моего сведения дошло, что я получил всю вину за неудачу в прошлую пятницу. Не только большинство из них.
Каждый последний бит этого.

Это неправильно для меня думать, что остальная часть команды была по крайней мере частично ответственна? В конце концов, все шесть из нас были вовлечены с самого начала.
Не то чтобы я думал, что должен стоять без вины. Не за что.

Все, что я говорю, это: я делаю все возможное. Я стараюсь изо всех сил. Я постоянно совершенствуюсь. И я постоянно беру на себя ответственность.

Вообще говоря, я вполне согласен взять на себя полную ответственность за свои действия. Но после этой весны, кажется, я получаю больше, чем заслуживаю.
Помните контракт с Flakenhauser.
Все прошло так гладко, как можно было надеяться. Или так казалось на первый взгляд. Это было в самую последнюю минуту, что вещи развалились.
Вся команда согласилась, что это было больше похоже на странную аварию, чем на неаккуратное планирование или неэффективное управление ресурсами.
Тем не менее, я - один - взял вину за это.
Даже тогда, когда я ничего не сказал, мой уровень терпимости к тому, чтобы взять на себя вину, тогда серьезно пошатнулся.

С этого момента я чувствовал, что необходимо всегда стараться в два раза сильнее, просто чтобы избежать проверки. И все же, мы снова здесь.
Несмотря на все мои достижения.
Прямо там, где мы, кажется, всегда оказываемся в эти дни.
Каждый проект. Это становится невыносимым.

Это код гольф. Самый короткий код выигрывает.


4
Должны ли разрывы строк появляться только после пунктуации, заканчивающейся предложением? Или я мог бы иметь разрыв строки, до некоторого времени сейчас или, может быть, даже в аббревиатуре, если следующая буква заглавная? Тем не менее, проблемы, связанные с оскорблением, в прошлом не давали о себе знать, но вы могли бы уйти, потому что вы не просили участников проявить творческий подход к новым ругательствам.
Мартин Эндер

1
Разрыв строки перед собственно существительными вполне подходит.
Кристофер Олссон

3
@NateKerkhofs Я думаю, что это задом наперед: поскольку секретное сообщение - это всего лишь несколько символов во всем сообщении, я думаю, что оскорбление - это деревья, а сообщение - это лес. Мы очень надеемся, что босс видит лес, а не деревья.
Джошуа Тейлор

11
Было ли письмо Арнольда Шварценеггера вашим вдохновением?
200_success

57
Я должен признать, что сделал двойной дубль, когда увидел это в списке горячих вопросов. Когда я увидел, что это PCG, а не The Workplace ... ну ... я не скажу, что я не был немного разочарован.
BenM

Ответы:


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
Почему я считаю, что голосую так много твоих ответов? Ах да, потому что они сумасшедшие.
Примо

Что он делает для ввода, который содержит ОЧЕНЬ сердитые слова во ВСЕХ КОПИЯХ?
Адам Дэвис

2
@AdamDavis: добавление пробелов к «C» и «A» гарантирует, что СЛОВА не будут нарушены переводами строки.
Деннис

25

Perl - 60 байт

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

Считая Шебанг как один.

Это решение использует самую внутреннюю строку для построения следующего регулярного выражения:

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

который похож на регулярное выражение, используемое в решении m.buettner . Сгенерированное регулярное выражение затем сопоставляется с входом. В контексте списка это вернет массив, содержащий каждую из групп соответствия, которые объединены новой строкой (причина для групп «ничего не найдено» (\.*)заключается в том, чтобы вставить дополнительный символ новой строки). Если совпадений нет, вместо них выводится исходная строка.


Perl - 73 байта

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

Считая Шебанг как два.

Это разбивает строку на соответствующие разделители и собирает части в массив. Если какой-либо из них не совпадает, разделитель выходных записей (который был установлен на новую -lстроку с параметром) не устанавливается, и поэтому строка выводится без изменений.


Разве шебангу не нужен абсолютный путь?
celtschk

почему точки (DIEI.NA. ...?
edc65

@celtschk Возможно, в зависимости от вашей системы и от того, как вы собираетесь запускать скрипт. Вызывается как ./script.pl, то скорее всего да. Если вызывается как perl script.pl, то нет.
Примо

1
@ edc65 .После Iвставит дополнительный символ новой строки перед I (потому что он снова совпадает в той же позиции). Возможно, немного нелогичным.
Примо

2
@celtschk Переключатели на Шебанге все еще будут интерпретироваться. Вы можете проверить это, добавив -Mопцию к shebang, которая умрет с фатальной ошибкой: Too late for "-M" option at line 1.Но главная причина, по которой я ее там поставил, я тоже избегаю объяснения, что его нужно запускать как perl -pl script.pl- в его нынешнем виде он работает как есть.
Примо

12

GolfScript, 53 байта

Похоже, мы с Денисом придумали довольно похожие вещи параллельно ... Но вот моя попытка.

Нажмите на ссылку перед каждым блоком кода, чтобы попробовать его онлайн. К сожалению, онлайн-интерпретатор не позволит вам запускать код длиной более 1024 символов, поэтому мне пришлось выполнить некоторое ... «сжатие» тестового ввода. Но это все еще работает.

Squished версия

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

Unsquished, прокомментированная версия

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

Вопрос, поднятый Деннисом: все программы GolfScript печатают автоматический финальный перевод строки. Должно ли это сделать недействительным мое решение как есть, я не уверен. Я полагаю, что это будет стоить 4 символа, чтобы подавить последний перевод строки, добавив "":nгде-то ближе к концу.


1
Вы, кажется, не проверяете, является ли символ первым символом слова. Например. «FIFA» следует использовать только для F, а не для «I» или «A».
Деннис

@ Денис Я не видел ни одной части спецификации, которая требует этого. Но если вы наложите это ограничение на себя, то снятие этого с вашего решения, похоже, укрепит его превосходство в игре в гольф.
Runer112

1
Вот как мы с m.buettner истолковали вопрос (мне нужно внимательнее присмотреться к другим ответам), но вы правы, нигде не сказано, что мы не можем разбить слова.
Деннис

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чтобы быть многострочным блоком, и использовал троичное условие в последнем путе для сохранения символов при определении того, какой из них вывести.

Не самое короткое, но я думал, что было бы аккуратно обойтись без регулярных выражений.


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
Конечно, можно построить регулярное выражение в коде и сэкономить массу?
Питер Тейлор

@PeterTaylor, конечно, но у меня нет ни времени, ни знаний Perl, чтобы сделать это прямо сейчас. Я мог бы взглянуть позже сегодня.
Мартин Эндер

Несмотря на это, он превосходит мой ответ на PERL, который я не буду постить сейчас: p
Tal

Сохранить 4 символа: print($_)== print. +1 балл за удобочитаемость: на удивление легко увидеть, что происходит, что не совсем так для других решений.
Оле Танге

Это считается простым в Perl?
Линкольн Бергесон

6

JavaScript 116

Javascript реализация идеи m-buettner

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, я получаю ту же самую строку, в ней нет
новых

4

Python3 ( 166 138)

Golfed:

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-иш:

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

Хотя использование лямбды меня несколько радует, то массовое число используемых переменных и несколько грязное развитие имеет противоположный эффект. Regex, возможно, тоже была хорошей идеей. Эй, хо, по крайней мере, это работает :).

Редактировать: заменены лямбда-переменные на countвстроенные, и сокращенный оператор split.


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)

объяснение

chunk рекурсивно разделяет конец сообщения, содержащего последний заголовок, и добавляет его в список.

Предостережение: это не сработает, если по какой-то причине между двумя предлагаемыми заголовками в вашем письме вообще нет пробелов, но это вряд ли в письме вашему боссу.


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

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 байта

Почему у 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 байт

Дан файл с именем «G», содержащий необработанный текст «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);

Пояснение (~ ungolfed && закомментированный код):

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

может ли быть нанесено все оскорбление; печатает измененную строку с начальным пробелом или переводом строки; пустой вывод, если нет. Бежать с-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

Ungolfed

Это моя первая попытка игры в гольф :) В поисках некоторых отличных методов кодирования, я просто сосредоточился на использовании find, а затем на связывании строк, чтобы найти подходящие символы и отформатировать вывод.

Переменные -

lr = l назначенные символы, которые мы будем использовать в качестве руководства для создания нашего нового отформатированного абзаца. Для нас назначен символ новой строки в интервале между новым выводом.

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

@TheRare Спасибо! Мне действительно нравится строка «i = + x <0», которую вы предложили в своем редактировании, в отличие от моей строки «if x == - 1: i + = 1». Просто чтобы убедиться, что я правильно читаю, это одна из троичных вещей, о которых я читал вчера вечером, верно? Это в основном гласит: «если х меньше 0 (-1 возвращается, когда он не может найти символ): добавить х к i» Правильно? Так что он все еще удовлетворяет проверке работоспособности с -1 или меньше для значения, верно? Хочу убедиться, что я читаю это правильно, потому что это отличная экономия места!
0xhughes

На самом деле это добавляет x<0к i. В python значение True равно 1, а значение False равно 0. Поэтому, если x равно -1, он добавляет 1, а в противном случае 0. i+=соответствуетi=i+
seequ

Попробуйте то, что True == 1дает. :)
seequ
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.