Sự kết hợp trong cuộc sống thực


14

Trong Dyalog APL Extended của @ Adám , toán tử (dưới) có nghĩa là liên hợp: áp dụng một hàm, sau đó là hàm thứ hai, sau đó nghịch đảo hàm thứ nhất. Thật thú vị khi nghĩ về các hành động thực tế theo cách chia động từ:

Một vấn đề được chuyển đổi bởi g thành một miền khác, nơi nó được giải quyết dễ dàng hơn bởi f, và sau đó chuyển đổi trở lại miền ban đầu. Một ví dụ từ đời thực là người Do Thái bị gây mê:

apply anesthetics
    perform surgery
wake up from anesthetics

Thử thách

Nghịch đảo của một dòng glà "un" được đặt trước gvà ngược lại. Xác định bất kỳ dòng nào giữa svà nghịch đảo của nó, theo thứ tự đó, là "dưới" s. Đối với mỗi dòng ftrong đầu vào theo thứ tự:

  • Nếu fvà nghịch đảo cả hai xảy ra, không làm gì cả
  • Nếu fkhông "dưới" bất kỳ hành động nào khác, hãy inf
  • Nếu flà "dưới" một dòng g, in f + " under " + gnơi +ghép.

Đầu vào

Một chuỗi nhiều dòng không trống, hoặc danh sách các chuỗi, v.v., bao gồm khoảng trắng và chữ thường (thay vào đó bạn có thể sử dụng chữ hoa). Chính xác một dòng sẽ bắt đầu bằng "un"; và nó sẽ là nghịch đảo của một số dòng khác. Không có dòng nào sẽ trống.

Đầu ra

Đầu ra ở cùng định dạng mà bạn đã nhập, hoặc được cho phép theo I / O tiêu chuẩn.

Các trường hợp thử nghiệm:

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
Tôi cũng vậy, không có đầu ra khi tôi uống quá mức
Stan Strum

1
không phải là "lấy cuốn sách và trả tiền cho cuốn sách đang đi bộ để lưu trữ"? mặt khác, không rõ ràng rằng biến đổi tương đương với bản gốc ...
Jonah

1
@Jonah Ý tưởng là trong một thế giới lý tưởng w = "walk to store" và w ^ -1 = "unsalk to store" là các nghịch đảo, vì vậy về mặt toán học wfw ^ -1wg ^ -1 = wfgw ^ -1.
lirtosiast

Ah đủ công bằng, @lirtosiast.
Giô-na

Câu trả lời:


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

Tôi đã thực hiện điều này trong khi có ấn tượng rằng điều này có thể được đệ quy và nhiều dấu gạch dưới có thể được xếp chồng lên nhau. Có lẽ không được tối ưu hóa. Ngoài ra, đây là bracylog, hệ thống ống nước mất khá nhiều byte.

Hãy thử trực tuyến!


2

Võng mạc , 82 byte

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

Hãy thử trực tuyến! Liên kết bao gồm các trường hợp thử nghiệm. Giải trình:

m{

Chạy toàn bộ chương trình trong chế độ nhiều dòng (để ^$phù hợp với sự khởi đầu và kết thúc của dòng cá nhân) và lặp lại cho đến khi không có thay đổi.

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

Tìm kiếm các dòng có thể bắt đầu bằng unvà được theo sau bởi một dòng chỉ bắt đầu unnếu dòng trước đó không trong khi phần còn lại của dòng giống nhau và xóa cả hai dòng. (Đây là thay đổi hành vi từ Retina 0.8.2, phân tách các dòng trước khi thử khớp và do đó không bao giờ có thể xóa các dòng nếu khớp cần kéo dài hơn một dòng cùng một lúc.)

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

Tìm kiếm các dòng có thể bắt đầu bằng un, theo sau là ít nhất một dòng, theo sau là một dòng bắt đầu unchỉ khi dòng ban đầu không trong khi phần còn lại của dòng là như nhau.

$4 under $1$1$5

Di chuyển dòng ban đầu xuống một dòng và cũng nối nó với underdòng vừa đi qua. (Các dòng bổ sung sẽ được xử lý bằng cách lặp lại.)


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

Hãy thử trực tuyến!

Nếu đầu vào có thể là một danh sách từ STDIN và đầu ra được phân tách bằng dòng mới, thì chúng ta có giải pháp 94 byte này:

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 (Nút Babel) , 91 byte

Lấy đầu vào là một chuỗi các chuỗi chữ thường. Trả về một mảng khác của chuỗi.

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

Hãy thử trực tuyến!

Đã bình luận

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 Thất bại thật. Bây giờ đã sửa.
Arnauld

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.