Konjugation im wirklichen Leben


14

In @ Adáms Dyalog APL Extended bedeutet der (Unter-) Operator Konjugation: Wende eine Funktion an, dann eine zweite Funktion, dann die Inverse der ersten. Es macht Spaß, an reale Aktionen in Bezug auf Konjugation zu denken:

Ein Problem wird von g in eine andere Domäne transformiert, wo es von f leichter gelöst wird, und dann zurück in die ursprüngliche Domäne transformiert. Ein Beispiel aus dem wirklichen Leben ist "unter Betäubung":

apply anesthetics
    perform surgery
wake up from anesthetics

Herausforderung

Die Umkehrung einer Zeile gwird "un" vorangestellt gund umgekehrt. Definieren Sie eine beliebige Linie zwischen sund ihrer Umkehrung in dieser Reihenfolge als "unter" s. Für jede fEingabezeile in der Reihenfolge:

  • Wenn fund seine Umkehrung beide auftreten, nichts tun
  • Wenn fkeine andere Aktion ausgeführt wird, drucken Sief
  • Wenn f"unter" einer Zeile steht g, wird gedruckt, f + " under " + gwo +sich die Verkettung befindet.

Eingang

Eine nicht leere mehrzeilige Zeichenfolge oder eine Liste von Zeichenfolgen usw., die aus Leerzeichen und Kleinbuchstaben besteht (Sie können stattdessen auch Großbuchstaben verwenden). Genau eine Zeile beginnt mit "un"; und es wird das Gegenteil einer anderen Zeile sein. Keine Zeile wird leer sein.

Ausgabe

Die Ausgabe erfolgt in demselben Format, in dem Sie die Eingabe vorgenommen haben, oder wie von Standard-E / A zugelassen.

Testfälle:

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]

1
Ich habe auch keine Ausgabe, wenn ich übermäßig trinke
Stan Strum

1
sollte es nicht sein "nimm das buch und bezahle für das buch, das zu fuß zu lagern ist"? ansonsten ist es nicht klar, dass die Transformation dem Original entspricht ...
Jonah

1
@Jonah Die Idee ist, dass in einer idealen Welt w = "zum Speichern gehen" und w ^ -1 = "zum Speichern gehen" Inverse sind, also mathematisch wfw ^ -1wg ^ -1 = wfgw ^ -1.
Lirtosiast

Ah fair genug, @lirtosiast.
Jonah

Antworten:


3

Brachylog , 90 Bytes

;Ṡ{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

Ich machte dies, während ich den Eindruck hatte, dass dies rekursiv sein und mehrere Untergründe gestapelt werden könnten. Wahrscheinlich nicht optimiert. Da dies auch bracylog ist, nimmt die Installation einige Bytes in Anspruch.

Probieren Sie es online!


2

Netzhaut , 82 Bytes

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

Probieren Sie es online! Link enthält Testfälle. Erläuterung:

m{

Führen Sie das gesamte Programm in mehrzeiligen Modus (so dass ^und $den Anfang und das Ende der einzelnen Linien entsprechen) und wiederholen , bis es keine Änderungen geben.

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

Suchen Sie nach Zeilen, die möglicherweise mit uneiner Zeile beginnen und auf die eine Zeile folgt, die unnur dann beginnt, wenn die vorherige Zeile nicht übereinstimmt, während der Rest der Zeile identisch ist, und löschen Sie beide Zeilen. (Dies ist eine Verhaltensänderung von Retina 0.8.2, bei der die Linien vor dem Versuch, eine Übereinstimmung zu erzielen, aufgeteilt werden und daher niemals Linien gelöscht werden können, wenn die Übereinstimmung mehr als eine Linie gleichzeitig umfassen muss.)

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

Suchen Sie nach Zeilen, die möglicherweise beginnen un, gefolgt von mindestens einer Zeile, gefolgt von einer Zeile, die unnur beginnt, wenn die ursprüngliche Zeile nicht übereinstimmt, während der Rest der Zeile identisch ist.

$4 under $1$1$5

Verschieben Sie die ursprüngliche Zeile um eine Zeile nach unten und fügen Sie sie underan die gerade durchlaufene Zeile an. (Zusätzliche Zeilen werden von der Wiederholung behandelt.)


2

Python 2 , 106 Bytes

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

Probieren Sie es online!

Wenn die Eingabe eine Liste von STDIN sein kann und die Ausgabe durch Zeilenumbrüche getrennt ist, haben wir diese 94-Byte-Lösung:

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

1

JavaScript (Babel Node) , 91 Byte

Übernimmt die Eingabe als ein Array von Zeichenfolgen in Kleinbuchstaben. Gibt ein weiteres Array von Zeichenfolgen zurück.

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

Probieren Sie es online!

Kommentiert

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


@ l4m2 Tatsächlich scheitern. Jetzt behoben.
Arnauld

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.