Koniugacja w prawdziwym życiu

14

W @ Adama Dyalog APL Rozszerzona The (pod) operator środki koniugacji: stosować jedną funkcję, a następnie drugą funkcję, a następnie odwrotność pierwszego. Fajnie jest myśleć o rzeczywistych działaniach w kategoriach odmiany:

Problem jest przekształcany przez g w inną domenę, w której łatwiej jest go rozwiązać przez f, a następnie przekształcany z powrotem w pierwotną domenę. Przykładem z prawdziwego życia jest „pod znieczuleniem”:

apply anesthetics
    perform surgery
wake up from anesthetics

Wyzwanie

Odwrotność linii gjest poprzedzana „un” gi odwrotnie. Zdefiniuj dowolną linię między si odwrotną, w tej kolejności, jako znajdującą się „pod” s. Dla każdej wprowadzanej linii fw kolejności:

  • Jeśli fi odwrotnie występują oba, nie rób nic
  • Jeśli fnie ma „pod” żadną inną czynnością, wydrukujf
  • Jeśli fjest „pod” linią g, wypisz f + " under " + ggdzie +jest konkatenacja.

Wejście

Niepusty ciąg wielowierszowy lub lista ciągów itp., Składająca się ze spacji i małych liter (zamiast tego możesz użyć wielkich liter). Dokładnie jedna linia zaczyna się od „un”; i będzie odwrotnością innej linii. Żadna linia nie będzie pusta.

Wynik

Wyjście w tym samym formacie, w którym wprowadzono dane, lub w sposób dozwolony przez Standard I / O.

Przypadki testowe:

Input:
apply anesthetics
perform surgery
unapply anesthetics

Output:
perform surgery under apply anesthetics


Input:
unite asia
establish the silk road
ite asia

Output:
establish the silk road under unite asia


Input:
desire a book
walk to store
take the book
pay for the book
unwalk to store
read the book

Output:
desire a book
take the book under walk to store
pay for the book under walk to store
read the book


Input:
drink excessively
undrink excessively

Output:
[empty string]
lirtosiast
źródło
1
Ja też nie mam wydajności, gdy piję nadmiernie
Stan Strum
1
czy nie powinno być „weź książkę i zapłać za książkę na spacer do sklepu”? w przeciwnym razie nie jest jasne, czy transformacja jest równoważna oryginałowi ...
Jonasz
1
@Jonah Ideą jest idealny świat w = „idź do sklepu”, a w ^ -1 = „odejdź do sklepu” to odwrotności, więc matematycznie wfw ^ -1wg ^ -1 = wfgw ^ -1.
lirtosiast
Ach, wystarczy, @lirtosiast.
Jonasz

Odpowiedzi:

3

Brachylog , 90 bajtów

;Ṡ{hhH↰₂gB&hb~c[A,B,C]&tT;C↔↰U∧" under ",H,T;A↔↰,U|tT&hh,TgJ&hb;T↰Q∧J,Q|h}
~↰₃|↰₃
∧"un";?c

Zrobiłem to, mając wrażenie, że może to być rekurencyjne, a wiele spacji można układać w stosy. Prawdopodobnie nie zoptymalizowany. Ponieważ jest to bracylog, instalacja hydrauliczna zajmuje sporo bajtów.

Wypróbuj online!

Kroppeb
źródło
2

Siatkówka , 82 bajty

m{A`^(un)?(.+)¶(?(1)|un)\2$
^((un)?(.+)¶)(.+)¶((.+¶)*(?(2)|un)\3)$
$4 under $1$1$5

Wypróbuj online!Link zawiera przypadki testowe. Wyjaśnienie:

m{

Uruchom cały program w trybie multilinii (tak aby ^i$ dopasować początek i koniec poszczególnych linii) i powtórzyć aż istnieją żadne zmiany.

A`^(un)?(.+)¶(?(1)|un)\2$

Poszukaj linii, które mogą zaczynać się od, una po nich linii, która zaczyna się odun tylko jeśli poprzednia linia nie, podczas gdy reszta linii jest taka sama, i usuń obie linie. (Jest to zmiana zachowania w stosunku do Retina 0.8.2, która dzieli linie przed próbą dopasowania, a zatem nigdy nie może usunąć linii, jeśli dopasowanie musi obejmować więcej niż jedną linię na raz.)

^((un)?(.+)¶)(.+)¶((.+¶)*(?(2)|un)\3)$

Poszukaj linii, które mogą zaczynać się un, po których następuje co najmniej jedna linia, a po niej linia, która zaczyna się odun tylko jeśli linia oryginalna nie, podczas gdy reszta linii jest taka sama.

$4 under $1$1$5

Przenieś oryginalną linię w dół o jedną linię, a także dodaj ją underdo linii, którą właśnie wykonałem. (Dodatkowe wiersze będą obsługiwane przez powtórzenie.)

Neil
źródło
2

Python 2 , 106 bajtów

s=input()
x=''
l=[]
for i in s:
 if'un'==i[:2]or'un'+i in s:x=(' under '+i)*(not x)
 else:l+=[i+x]
print l

Wypróbuj online!

Jeśli dane wejściowe mogą być listami ze STDIN, a dane wyjściowe być oddzielone znakiem nowej linii, mamy 94-bajtowe rozwiązanie:

s=input()
x=''
for i in s:
 if'un'==i[:2]or'un'+i in s:x=(' under '+i)*(not x)
 else:print i+x
Erik the Outgolfer
źródło
1

JavaScript (węzeł Babel) , 91 bajtów

Pobiera dane wejściowe jako tablicę ciągów pisanych małymi literami. Zwraca inną tablicę ciągów.

a=>a.flatMap(s=>s==r|'un'+s==r?(u=u?'':' under '+s,[]):s+u,u='',r=a.find(s=>/^un/.test(s)))

Wypróbuj online!

Skomentował

a =>                     // a[] = input array
  a.flatMap(s =>         // for each string s in a[]:
    s == r |             //   if s matches the reference string
    'un' + s == r ? (    //   or its opposite:
      u =                //     update u:
        u ?              //       if u is not an empty string:
          ''             //         turn it to an empty string
        :                //       else:
          ' under ' + s, //         set it to s with the ' under ' prefix
      []                 //     yield an empty array so that this entry is removed
    ) :                  //   else:
      s + u,             //     yield s followed by u
    u = '',              //   initialize u to an empty string
    r = a.find(s =>      //   initialize r ...
      /^un/.test(s)      //     ... to the string beginning with 'un'
    )                    //
  )                      // end of flatMap()
Arnauld
źródło
@ L4m2 Fail rzeczywiście. Teraz naprawione.
Arnauld,
1

Czysty , 147 bajtów

import StdEnv,Data.List
a=inits;b=tails
$l=hd[w++[e++[' under ':u]\\e<-z]++y\\i<-a l&t<-b l,w<-a i&u<-i,z<-a t&[x:y]<-b t|u==['un':x]||x==['un':u]]

Wypróbuj online!

Obrzydliwe
źródło