การผันคำกริยาในชีวิตจริง


14

ในส่วนขยาย Dyalog APL ของ @ Adámตัวดำเนินการ(ใต้) หมายถึงการรวมกัน: ใช้หนึ่งฟังก์ชันจากนั้นเป็นฟังก์ชันที่สองจากนั้นจึงกลับด้านแรก มันสนุกที่จะคิดเกี่ยวกับการกระทำในชีวิตจริงในแง่ของการผันคำกริยา:

ปัญหาถูกเปลี่ยนโดย g เป็นโดเมนอื่นที่แก้ไขได้อย่างง่ายดายโดย f แล้วเปลี่ยนกลับเป็นโดเมนดั้งเดิม ตัวอย่างจากชีวิตจริงคือ“ ภายใต้ยาชา”

apply anesthetics
    perform surgery
wake up from anesthetics

ท้าทาย

ค่าผกผันของบรรทัดgคือ "un" ที่เติมไว้gและในทางกลับกัน กำหนดเส้นใด ๆ ระหว่างsและผกผันของตนในการสั่งซื้อที่เป็น s"ภายใต้" สำหรับแต่ละบรรทัดfในอินพุตตามลำดับ:

  • หากfและการผกผันของทั้งสองเกิดขึ้นไม่ทำอะไร
  • หากfไม่ใช่ "ภายใต้" การดำเนินการอื่นให้พิมพ์f
  • หากfเป็น "ใต้" ให้gพิมพ์บรรทัดf + " under " + gที่+ต่อกัน

อินพุต

สตริงหลายบรรทัดที่ไม่ว่างเปล่าหรือรายการสตริง ฯลฯ ประกอบด้วยช่องว่างและตัวอักษรตัวพิมพ์เล็ก (แทนการใช้ตัวพิมพ์ใหญ่) หนึ่งบรรทัดจะขึ้นต้นด้วย "un" อย่างแน่นอน และมันจะเป็นสิ่งที่ตรงกันข้ามกับเส้นอื่น จะไม่มีบรรทัดว่างเปล่า

เอาท์พุต

เอาต์พุตในรูปแบบเดียวกับที่คุณรับอินพุตหรือตามที่อนุญาตโดย I / O มาตรฐาน

กรณีทดสอบ:

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
ฉันก็ไม่มีผลเช่นกันเมื่อฉันดื่มมากเกินไป
Stan Strum

1
ไม่ควร "นำหนังสือและชำระค่าหนังสือที่เดินไปเก็บ" หรือไม่? มิฉะนั้นจะไม่ชัดเจนว่าการแปลงจะเทียบเท่ากับต้นฉบับ ...
Jonah

1
@Jonah ความคิดอยู่ในโลกอุดมคติ w = "walk to store" และ w ^ -1 = "unwalk to store" นั้นเป็น inverses ดังนั้นคณิตศาสตร์ wfw ^ -1wg ^ -1 = wfgw ^ -1
lirtosiast

อายุติธรรมพอ @lirtosiast
โยนาห์

คำตอบ:


3

Brachylogขนาด 90 ไบต์

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

ฉันทำสิ่งนี้ในขณะที่อยู่ภายใต้การแสดงผลที่สามารถเรียกซ้ำและอันเดอร์หลายอันสามารถซ้อนกันได้ อาจไม่ได้รับการปรับให้เหมาะสม นอกจากนี้เนื่องจากนี่คือ bracylog การประปาใช้เวลาค่อนข้างน้อย

ลองออนไลน์!


2

เรติน่า , 82 ไบต์

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

ลองออนไลน์! ลิงก์มีกรณีทดสอบ คำอธิบาย:

m{

เรียกใช้โปรแกรมทั้งในโหมดหลาย (เพื่อให้^และ$ตรงกับจุดเริ่มต้นและจุดสิ้นสุดของแต่ละบรรทัด) และทำซ้ำจนกว่าจะไม่มีการเปลี่ยนแปลง

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

ค้นหาบรรทัดที่อาจขึ้นต้นด้วยunและตามด้วยบรรทัดที่ขึ้นต้นด้วยunหากบรรทัดก่อนหน้าไม่ได้ขณะที่ส่วนที่เหลือของบรรทัดนั้นเหมือนกันและลบทั้งสองบรรทัด (นี่เป็นการเปลี่ยนแปลงพฤติกรรมจาก Retina 0.8.2 ซึ่งแยกบรรทัดก่อนพยายามจับคู่และดังนั้นจึงไม่สามารถลบบรรทัดได้หากการจับคู่ต้องขยายมากกว่าหนึ่งบรรทัดในครั้งเดียว)

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

ค้นหาบรรทัดที่อาจขึ้นต้นด้วยunอย่างน้อยหนึ่งบรรทัดแล้วตามด้วยบรรทัดที่ขึ้นต้นด้วยunหากบรรทัดต้นฉบับไม่ได้ขณะที่ส่วนที่เหลือของบรรทัดนั้นเหมือนกัน

$4 under $1$1$5

ย้ายบรรทัดต้นฉบับลงหนึ่งบรรทัดและต่อท้ายunderบรรทัดนั้นด้วย (การทำซ้ำบรรทัดเพิ่มเติมจะถูกจัดการโดยการทำซ้ำ)


2

Python 2 , 106 ไบต์

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

ลองออนไลน์!

หากอินพุตสามารถเป็นรายการจาก STDIN และเอาท์พุทแยกเป็นบรรทัดใหม่ได้เรามีวิธี 94- ไบต์:

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 (โหนดบาเบล) , 91 ไบต์

รับอินพุตเป็นอาร์เรย์ของสตริงเป็นตัวพิมพ์เล็ก ส่งคืนอาร์เรย์ของสตริงอื่น

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

ลองออนไลน์!

แสดงความคิดเห็น

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 ล้มเหลวแน่นอน แก้ไขแล้ว
Arnauld

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.