Jestem pasywnie agresywny i chcę obrażać mojego szefa, bez jego wiedzy


93

Minęło kilka trudnych miesięcy w pracy i mam ochotę krzyczeć wprost na twarz mojego szefa. Nie jestem jednak osobą, która bezpośrednio konfrontuje ludzi, z którymi mam problem. Nie chcę też stracić pracy.

Oto pomysł: chcę go obrażać, bez jego wiedzy. I zdałem sobie sprawę z idealnego sposobu: potrzebuję jakiegoś oprogramowania, które koduje zniewagę wewnątrz doskonale doskonałej wiadomości. I widząc, jak wiadomo, że nie widzi lasów dla drzew, myślę, że wiem po prostu, jak:

Napisz do mnie program, który przyjmuje jako dane wejściowe ciąg o nieznanej długości, ale nie zawierający podziałów linii. To będzie nieprzetworzona wiadomość, którą chcę wysłać.

Jeśli to możliwe, zwróć ciąg sformatowany w taki sposób, aby komunikat „DIE IN A GREASE FIRE” stanowił całą lewą kolumnę. Z nowymi akapitami, w których powinny się znajdować spacje między wyrazami. Teraz, ponieważ jestem bardzo zły, równie ważne jest, aby każda litera była pisana wielkimi literami.

Nie możesz modyfikować łańcucha w żaden inny sposób, tzn. Nie możesz zamieniać całego łańcucha na wielkie litery.

Jeśli danego ciągu nie można sformatować w ten sposób, należy zwrócić oryginalny ciąg. Odczytaj wejście ze standardowego wejścia.

Obowiązują normalne zasady: brak żądań HTTP, brak konsultacji z Marvinem z THGTTG ​​itp.

Przykładowe dane wejściowe:

Drogi Szefie, jak się sprawy mają? Zwróciłem uwagę, że całą winę za nieszczęście w zeszły piątek. Nie tylko większość. W każdym calu tego. Czy błędem jest myślenie, że reszta zespołu była przynajmniej częściowo odpowiedzialna? W końcu cała szóstka z nas była zaangażowana od samego początku. Nie dlatego, że myślę, że powinienem stać bez winy. Ani trochę. Mówię tylko: staram się. Staram się. Ciągle się poprawiam. I ciągle biorę odpowiedzialność. Ogólnie rzecz biorąc, nie mam nic przeciwko ponoszeniu pełnej odpowiedzialności za swoje działania. Ale po tej wiosny wydaje się, że dostaję więcej, niż zasłużyłem. Pamiętasz umowę Flakenhauser? Wszystko poszło tak gładko, jak można się było spodziewać. Tak przynajmniej się początkowo wydawało. W ostatniej chwili wszystko się rozpadło. Cały zespół zgodził się, że bardziej przypomina dziwny wypadek niż niechlujne planowanie lub źle zarządzane zasoby. Mimo to ja - sam - ponosiłem za to winę. Chociaż wtedy nic nie powiedziałem, mój poziom tolerancji dla wzięcia na siebie winy poważnie się pogorszył. Od tego momentu uważałem za konieczne, aby zawsze starać się dwa razy bardziej, aby uniknąć kontroli. A jednak znów tu jesteśmy. Pomimo wszystkich moich osiągnięć. Właśnie tam, gdzie zawsze wydaje się, że kończymy. Każdy pojedynczy projekt. To staje się nie do zniesienia. tylko po to, by uniknąć kontroli. A jednak znów tu jesteśmy. Pomimo wszystkich moich osiągnięć. Właśnie tam, gdzie zawsze wydaje się, że kończymy. Każdy pojedynczy projekt. To staje się nie do zniesienia. tylko po to, by uniknąć kontroli. A jednak znów tu jesteśmy. Pomimo wszystkich moich osiągnięć. Właśnie tam, gdzie zawsze wydaje się, że kończymy. Każdy pojedynczy projekt. To staje się nie do zniesienia.

Przykładowe dane wyjściowe:

Drogi Szefie, jak się sprawy mają?
Zwróciłem uwagę, że całą winę za nieszczęście w zeszły piątek. Nie tylko większość.
W każdym calu tego.

Czy błędem jest myślenie, że reszta zespołu była przynajmniej częściowo odpowiedzialna? W końcu cała szóstka z nas była zaangażowana od samego początku.
Nie dlatego, że myślę, że powinienem stać bez winy. Ani trochę.

Mówię tylko: staram się. Staram się. Ciągle się poprawiam. I ciągle biorę odpowiedzialność.

Ogólnie rzecz biorąc, nie mam nic przeciwko ponoszeniu pełnej odpowiedzialności za swoje działania. Ale po tej wiosny wydaje się, że dostaję więcej, niż zasłużyłem.
Pamiętaj o umowie Flakenhauser.
Wszystko poszło tak gładko, jak można się było spodziewać. Tak przynajmniej się początkowo wydawało. W ostatniej chwili wszystko się rozpadło.
Cały zespół zgodził się, że bardziej przypomina dziwny wypadek niż niechlujne planowanie lub źle zarządzane zasoby.
Mimo to ja - sam - ponosiłem za to winę.
Chociaż wtedy nic nie powiedziałem, mój poziom tolerancji dla wzięcia na siebie winy poważnie się pogorszył.

Od tego momentu uważałem za konieczne, aby zawsze starać się dwa razy bardziej, aby uniknąć kontroli. A jednak znów tu jesteśmy.
Pomimo wszystkich moich osiągnięć.
Właśnie tam, gdzie zawsze wydaje się, że kończymy.
Każdy pojedynczy projekt. To staje się nie do zniesienia.

To jest kod golfowy. Najkrótszy kod wygrywa.


4
Czy łamanie linii musi następować dopiero po interpunkcji kończącej zdanie? A może mógłbym złamać linię, zanim jakieś właściwe teraz, a może nawet w skrócie, o ile następująca litera jest wielka? To powiedziawszy, wyzwania związane z obelgami nie dawały się tutaj dobrze w przeszłości, ale możesz być w stanie uciec, ponieważ nie poprosiłeś uczestników o kreatywność w wymyślaniu nowych nieprzyzwoitości.
Martin Ender,

1
Łamanie linii przed właściwymi rzeczownikami jest w porządku.
Christofer Ohlsson,

3
@NateKerkhofs Myślę, że to wstecz: ponieważ tajna wiadomość składa się tylko z kilku znaków w całej wiadomości, myślę, że obrazą są drzewa, a wiadomość to las. Naprawdę mamy nadzieję, że szef zobaczy las, a nie drzewa.
Joshua Taylor,


57
Muszę przyznać, że zrobiłem trochę podwójnego ujęcia, kiedy zobaczyłem to na liście gorących pytań. Kiedy zobaczyłem, że to PCG, a nie The Workplace ... cóż ... Nie powiem, że nie byłem trochę rozczarowany.
BenM

Odpowiedzi:


54

CJam, 56 53 bajtów

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

Wypróbuj online!

Jak to działa

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
Dlaczego głosuję tak wiele z twoich odpowiedzi? O tak, bo są szalone.
primo

Co robi z wprowadzaniem danych, które zawierają BARDZO Gniewne słowa we WSZYSTKICH CZAPKACH?
Adam Davis,

2
@AdamDavis: Dodanie spacji do „C” i „A” zapewnia, że ​​słowa WORDS nie zostaną przerwane przez linie.
Dennis

25

Perl - 60 bajtów

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

Licząc shebang jako jeden.

To rozwiązanie używa najbardziej wewnętrznego ciągu do utworzenia następującego wyrażenia regularnego:

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

który jest podobny do wyrażenia regularnego używanego w rozwiązaniu m.buettner . Wygenerowany regex jest następnie dopasowywany do danych wejściowych. W kontekście listy zwróci tablicę zawierającą każdą z grup dopasowań, które są połączone nową linią (powodem grup „nic nie dopasowuj” (\.*)jest wstawienie dodatkowej nowej linii). Jeśli nie ma dopasowania, zamiast tego wyprowadzany jest oryginalny ciąg.


Perl - 73 bajty

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

Licząc shebang jako dwa.

To dzieli łańcuch przy odpowiednich ogranicznikach i zbiera elementy w tablicy. Jeśli któryś z nich nie pasuje, separator rekordu wyjściowego (który został ustawiony na nową linię z -lopcją) jest nieuzbrojony, a zatem ciąg znaków jest niezmodyfikowany.


Czy shebang nie potrzebuje absolutnej ścieżki?
celtschk

dlaczego kropki (DIEI.NA. ...?
edc65

@celtschk Może, w zależności od systemu i tego, jak zamierzasz wywołać skrypt. Wywoływany jako ./script.pl, najprawdopodobniej tak. Jeśli zostanie wywołany jako perl script.pl, to nie.
primo

1
@ edc65 .po Iwstawi dodatkowe przełamane przed I (ponieważ pasuje ponownie w tym samym miejscu). Być może nieco sprzeczne z intuicją.
primo

2
@celtschk Przełączniki shebang będą nadal interpretowane. Możesz to przetestować, dodając -Mopcję do shebang, który umrze z fatalnym błędem: Too late for "-M" option at line 1.Ale głównym powodem, dla którego go tam umieściłem, ja również unikam konieczności wyjaśniania, że ​​należy go uruchomić, ponieważ perl -pl script.pl- w obecnej formie, działa jak jest.
primo

12

GolfScript, 53 bajty

Wygląda na to, że Dennis i ja wymyśliliśmy równolegle całkiem podobne rzeczy ... Ale oto moja próba.

Kliknij łącza przed każdym blokiem kodu, aby wypróbować go online. Niestety, interpreter online nie pozwala na uruchomienie kodu większego niż 1024 znaki, więc musiałem wykonać ... kompresję danych wejściowych testu. Ale nadal działa.

Wersja skrócona

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

Niewykonana, skomentowana wersja

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

Punkt podniesiony przez Dennisa: wszystkie programy GolfScript drukują automatyczną końcową nową linię. Nie wiem, czy to powinno unieważnić moje obecne rozwiązanie. Sądzę, że stłumienie ostatniego nowego wiersza kosztowałoby 4 znaki, dodając "":ngdzieś pod koniec.


1
Wydaje się, że nie sprawdzasz, czy znak jest pierwszym znakiem słowa. Na przykład. „FIFA” powinno być używane tylko dla F, a nie dla „I” lub „A”.
Dennis

@Dennis Nie widziałem żadnej części specyfikacji, która tego wymaga. Ale jeśli narzucisz sobie to ograniczenie, zniesienie go z twojego rozwiązania wydaje się utrwalić jego lepszą grę w golfa.
Runer112,

1
W ten sposób z m.buettner zinterpretowaliśmy pytanie (musiałbym przyjrzeć się bliżej innym odpowiedziom), ale masz rację, nigdzie nie mówi się, że nie możemy łamać słów.
Dennis

7

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

Brak wyrażeń regularnych w tym . Jednocześnie podąża za znakami na wejściu ARGV [0], a ciąg zawierający znaki, które musimy przełamać, aby wysłać wiadomość z lewej kolumny. Pierwotnie zamierzał wstawiać spacje po literach, które muszą mieć nowy wiersz, ale stwierdził, że nieco trudniej było na stałe zakodować indeksy, w których wstawiono podział wiersza.

Gdy wszystko zostanie powiedziane i zrobione, sprawdza, czy iindeks zwiększył się wystarczająco dużo razy, aby przejść przez każdą literę, która wymagała złamania. Jeśli nie, po prostu drukujemy oryginalny ciąg. Jeśli tak, dajemy im sformatowany.

n-[i]!=nbyła fajną sztuczką do zapisywania znaków podczas sprawdzania, czy bieżący indeks wymagał dodatkowego podziału wiersza (w porównaniu do n.include? i). Zapisano także niektóre znaki, używając {}s zamiast do/endbycia blokiem wielowierszowym, i zastosowano warunek trójskładnikowy na końcowych putach, aby zapisać znaki podczas określania, który z nich wyprowadzić.

Nie najkrótszy, ale pomyślałem, że dobrze byłoby obejść się bez wyrażeń regularnych.


7

Perl, 184 bajty

Nie jest to spektakularny wynik dla Perla, ale oto proste rozwiązanie wyrażenia regularnego

$_=<>;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
Czy na pewno można zbudować wyrażenie regularne w kodzie i zaoszczędzić tonę?
Peter Taylor

@PeterTaylor z pewnością, ale nie mam czasu ani wiedzy Perla, aby to zrobić w tej chwili. Mogę dziś rzucić okiem.
Martin Ender

Mimo to bije moją odpowiedź PERL, o której teraz nie zawracam sobie głowy: p
Tal

Zapisz 4 znaki: print($_)== print. +1 punkt za czytelność: niezwykle łatwo jest zobaczyć, co się dzieje, co nie jest dokładnie tak w przypadku innych rozwiązań.
Ole Tange

W Perlu jest to uważane za proste ?
Lincoln Bergeson

6

JavaScript 116

Implementacja Javascript pomysłu m-buettner

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

Testowy fragment kodu

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>



Nie udaje się to w FIFAteście (komentarze OP)
Mwr247,

@ Mwr247 trudno zrozumieć: jaki test FIFA próbowałeś?
edc65

Spróbuj ciąg testowy z następującym EDIT: From that FIFA point on. To stawia nową linię przed FAi przed spacją przed FI.
Mwr247

@ Mwr247 nie dla mnie. Przetestowany z Firefoksem, otrzymuję tę samą dokładną linię, bez żadnych nowych linii
edc65

4

Python3 ( 166 138)

Gra w golfa:

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

Niegolfowane:

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

Chociaż użycie lambda nieco mnie cieszy, ta masowa liczba użytych zmiennych i nieco niechlujny rozwój ma odwrotny skutek. Regex mógł być również dobrym pomysłem. Hay ho, przynajmniej działa :).

Edycja: zastąpiono zmienną lambda countwbudowanym i skrócono instrukcję 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)

Nie golfił

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)

Wyjaśnienie

chunk rekurencyjnie dzieli koniec wiadomości zawierającej ostatni nagłówek i umieszcza go na liście.

Zastrzeżenie: to nie zadziała, jeśli między dwoma proponowanymi nagłówkami w liście nie ma żadnych spacji, ale wydaje się to mało prawdopodobne w liście do szefa.


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 bajtów

Dlaczego J nie ma dobrych funkcji do obsługi ciągów, a jedynie funkcje tablicowe? Skoryguję to, jeśli wymyślę coś mądrego.

Edycja: Skrócone i naprawione dane wyjściowe (wcześniej były spacje) i sprawdzanie. Poprawiłem także wyjaśnienie.

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

Wyjaśnienie:

Oznaczę użycie funkcji jako [<left argument>] <function name> <right argument>np f <text>. Nie wyjaśnię też każdego szczegółu, ponieważ funkcja jest dość długa.

@ stosuje prawą funkcję do lewej funkcji, np. f@g x == f(g(x))

t=:(}.@[t{.@[(}:@],(((0{I.@E.)({.;LF;}.)])>@{:))])']@.(0=#@[)to funkcja rekurencyjna, <delimiters> t <boxed string>która dzieli ciąg z każdym separatorem, w kolejności. Nie działa, jeśli jakiś separator nie zostanie znaleziony.

(((0{I.@E.)({.;LF;}.)])>@{:) dzieli ciąg z lewej strony separatora, dodając między nimi linię.

>@{: pobiera ostatni ciąg z listy (tej, która nie została jeszcze podzielona)

0{I.@E. pobiera indeks do podziału, co nie powiedzie się, jeśli separator nie istnieje.

{.;LF;}. łączy lewą stronę podziału, podawanie linii i prawą stronę podziału

}:@], łączy wyniki wcześniejszych podziałów i wynik ostatniej funkcji (ostatnie znaczenie: wyszukaj)

']@.(0=#@[)sprawdza, czy pozostały jakieś separatory, i wywołuje funkcję opisaną powyżej (5 linii), jeśli istnieje. W przeciwnym razie zwraca.

'IEIINAAGGREASEFFIRE'&ustawia lewy argument ttego ciągu

[:>,&.>/@ dołącza do wyników podziału

::] jeśli coś się nie powiedzie (uczyniłem wyszukiwanie indeksu podziału słabym punktem), zwróć oryginalny ciąg.

Przykłady (za długie?):

   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 bajtów

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

`:`
`)+a:a))

Kiedyś replaceprzechodziłem przez łańcuch, dopasowując /\b./ggo, aby znaleźć tylko znaki, które albo poszły za spacją albo rozpoczęły łańcuch. Następnie sprawdziłem każdy znak, aby sprawdzić, czy pasuje on do bieżącego indeksu w tablicy, której szukałem, i dodałem przed nim nowy wiersz, jeśli tak, i zwiększyłem i.

EDYCJA: Pominięto potrzebę tworzenia nowych linii między słowami. Zrobiłem to teraz, co prowadzi do 115.


1

PHP, 328 bajtów

Biorąc pod uwagę plik o nazwie „G” zawierający nieprzetworzony tekst do „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);

Objaśnienie (~ niepoznany i skomentowany kod):

<?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 bajtów

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

jeśli można znieść całą zniewagę; drukuje zmodyfikowany ciąg z wiodącą spacją lub podziałem wiersza; puste wyjście, jeśli nie. Uruchom z -r.

awaria

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 bajtów

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

Nie golfił

To moja pierwsza próba gry w golfa :) Chcąc nauczyć się kilku świetnych technik kodowania, niezależnie od tego, po prostu skupiłem się na użyciu find, a następnie na łączeniu ciągów znaków w celu znalezienia odpowiednich znaków i sformatowania wyniku.

Zmienne -

lr = l ma przypisane znaki, których będziemy używać jako naszego przewodnika do tworzenia nowego sformatowanego akapitu. r przypisuje nam nowy znak wiersza w odstępach nowego wyniku.

k, p = akapit wejściowy. K służy do przywracania oryginału, ponieważ nie jest on ponownie przypisywany podczas wykonywania skryptu. Sprawdzam względem x, aby wiedzieć, kiedy dodać podwójną nową linię w celu uzyskania odstępów.

y, i = y jest swego rodzaju „kursorem”, śledzi ostatnią pozycję, w której znaleziono znak, więc poprawnie znajdujemy akapit w celu splicingu, i sprawdzam poczytalność, jeśli nie trafimy wszystkich naszych znaków, przywróć akapit (zmienną p) do pierwotnego wejścia za pomocą zmiennej k.

h = długość wejściowa, której używamy w łączeniu.

x = Pozycja bieżącego znaku reprezentowanego przez C, również używana do splicingu.

c = Znaki wl do iteracji i wyszukiwania.

Poniższy kod został przeredagowany i usunięty z oryginalnego kodu, aby był czytelny tak, jak to się dzieje:

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

Byłbym wdzięczny za Twoją opinię! Szukam się uczyć.


Zaproponowałem edycję z kilkoma sztuczkami. Zapytaj mnie, czy któryś z nich potrzebuje wyjaśnienia. Zauważ, że może być znacznie bardziej golfa, ale zostawię to tobie. :)
patrz

@TheRare Thanks! Naprawdę podoba mi się linia „i = + x <0”, którą zaproponowałeś w swojej edycji, w przeciwieństwie do mojej linii „if x == - 1: i + = 1”. Żeby się upewnić, że dobrze to czytam, to jedna z trójki rzeczy, o których czytałem ostatniej nocy, prawda? Mówi w zasadzie: „jeśli x jest mniejsze niż 0 (zwracane -1, gdy nie można znaleźć znaku): dodaj x do i” Prawidłowo? Więc nadal spełnia warunek poczytalności z wartością -1 lub mniejszą dla wartości, prawda? Chcesz się upewnić, że dobrze to czytam, bo to świetna oszczędność miejsca!
0xhughes

Właściwie to dodaje x<0się i. W pythonie prawda jest taka sama jak 1, a fałsz równa się 0. Więc jeśli x wynosi -1, dodaje 1, a w przeciwnym razie 0. i+=jest takie samo jaki=i+
patrzqu.

Spróbuj tego, co True == 1daje. :)
patrz
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.