Konjugasi dalam Kehidupan Nyata

14

Dalam Dyalog APL Extended @ Adám , operator (bawah) berarti konjugasi: menerapkan satu fungsi, lalu fungsi kedua, lalu kebalikan dari yang pertama. Sangat menyenangkan untuk memikirkan tindakan kehidupan nyata dalam hal konjugasi:

Masalah ditransformasikan oleh g ke domain lain yang lebih mudah diselesaikan oleh f, dan kemudian ditransformasikan kembali ke domain asli. Contoh dari kehidupan nyata adalah "di bawah anestesi":

apply anesthetics
    perform surgery
wake up from anesthetics

Tantangan

Kebalikan dari suatu baris gadalah "un" yang diawali dengan g, dan sebaliknya. Tentukan setiap garis antara sdan kebalikannya, dalam urutan itu, sebagai "bawah" s. Untuk setiap baris fdalam input secara berurutan:

  • Jika fdan kebalikannya terjadi, jangan lakukan apa pun
  • Jika ftidak "di bawah" tindakan lain, cetakf
  • Jika fberada "di bawah" sebuah garis g, cetak di f + " under " + gmana +rangkaian.

Memasukkan

String multiline nonempty, atau daftar string, dll., Yang terdiri dari spasi dan huruf kecil (Anda bisa menggunakan huruf besar). Tepat satu baris akan dimulai dengan "un"; dan itu akan menjadi kebalikan dari beberapa baris lainnya. Tidak ada baris yang kosong.

Keluaran

Keluaran dalam format yang sama dengan yang Anda masukkan, atau sebagaimana diizinkan oleh I / O Standar.

Kasus uji:

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
sumber
1
Saya juga tidak memiliki hasil ketika saya minum berlebihan
Stan Strum
1
bukankah seharusnya "mengambil buku dan membayar buku yang sedang berjalan untuk disimpan"? kalau tidak, tidak jelas apakah transformasinya sama dengan aslinya ...
Jonah
1
@Jonah Idenya adalah di dunia yang ideal w = "walk to store" dan w ^ -1 = "unwalk to store" adalah invers, jadi secara matematis wfw ^ -1wg ^ -1 = wfgw ^ -1.
lirtosiast
Ah cukup adil, @ lirtosiast.
Jonah

Jawaban:

3

Brachylog , 90 byte

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

Saya membuat ini sementara berada di bawah kesan bahwa ini bisa menjadi rekursif dan beberapa unders dapat ditumpuk. Mungkin tidak dioptimalkan. Juga karena ini adalah bracylog, pipa ledeng membutuhkan beberapa byte.

Cobalah online!

Kroppeb
sumber
2

Retina , 82 byte

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

Cobalah online! Tautan termasuk kasus uji. Penjelasan:

m{

Menjalankan seluruh program modus multiline (sehingga ^dan $cocok dengan awal dan akhir garis individu) dan ulangi sampai tidak ada perubahan.

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

Cari baris yang mungkin dimulai dengan undan diikuti oleh baris yang dimulai unhanya jika baris sebelumnya tidak sedangkan baris lainnya sama, dan hapus kedua baris. (Ini adalah perubahan perilaku dari Retina 0.8.2, yang memisahkan garis sebelum mencoba untuk mencocokkan dan karenanya tidak pernah dapat menghapus garis jika pertandingan perlu menjangkau lebih dari satu baris sekaligus.)

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

Cari garis yang mungkin dimulai dengan un, diikuti oleh setidaknya satu garis, diikuti oleh garis yang dimulai unhanya jika garis aslinya tidak sementara sisa garisnya sama.

$4 under $1$1$5

Pindahkan garis asli ke bawah satu baris, dan tambahkan juga dengan undergaris yang baru saja dilalui. (Jalur tambahan akan ditangani oleh pengulangan.)

Neil
sumber
2

Python 2 , 106 byte

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

Cobalah online!

Jika input dapat berupa daftar dari STDIN dan output dipisahkan oleh baris baru, maka kita memiliki solusi 94-byte ini:

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
sumber
1

JavaScript (Babel Node) , 91 byte

Mengambil input sebagai array string dalam huruf kecil. Mengembalikan array string lainnya.

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

Cobalah online!

Berkomentar

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
sumber
Gagal?
14m2
@ l4m2 Gagal memang. Sekarang sudah diperbaiki.
Arnauld
1

Bersih , 147 byte

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

Cobalah online!

Suram
sumber