นิพจน์ทั่วไปเป็นภาษาการเขียนโปรแกรมหรือไม่


27

ในแง่วิชาการการแสดงออกปกติมีคุณสมบัติเป็นภาษาโปรแกรมหรือไม่

แรงจูงใจในการอยากรู้อยากเห็นของฉันเป็นคำถาม SO ที่ฉันเพิ่งดูที่ถามว่า "สามารถ regex ทำ X?" และทำให้ฉันสงสัยว่าสิ่งใดที่สามารถพูดได้ในแง่สามัญเกี่ยวกับวิธีแก้ปัญหาที่เป็นไปได้โดยใช้พวกเขา

ฉันมักจะถามว่า "นิพจน์ธรรมดาทัวริงสมบูรณ์" หรือไม่?


9
ดังนั้นโดยพื้นฐานแล้วคุณกำลังถามว่า
FrustratedWithFormsDesigner

มันจะเจ๋งถ้ามีคนอธิบายเพิ่มเติม แต่ใช่
Aaron Anodide

4
"เป็นนิพจน์ทั่วไปที่ทำให้สมบูรณ์" ต้องมีความเข้าใจในประเภทของภาษาและลำดับชั้นของแชมสกี

5
(1 นาทีต่อมากว่าแก้ไข) และถ้าคุณต้องการที่จะมุ่งหน้าไปตามเส้นทางของคำถามและคำอธิบายที่คุณอาจต้องการที่จะมองไปที่การแลกเปลี่ยนทฤษฎี cs การแทรกบทแทรกนั้นง่ายที่สุดสำหรับ "สามารถใช้ภาษาปกติกับ ^ nb ^ n" ได้ (ซึ่งสามารถจับคู่ได้โดยเครื่องทัวริง)

1
ฉันคิดว่าเขาถามว่าเขาสามารถใส่ประวัติย่อของเขาไว้ในส่วน "ภาษาโปรแกรม" ของเขาได้หรือไม่ คำตอบในกรณีนั้นคือไม่ ที่อยู่ภายใต้ส่วน "เทคโนโลยี"
Neil

คำตอบ:


46

นิพจน์ทั่วไปเป็นไวยากรณ์ที่เป็นทางการชนิดหนึ่งที่ใช้ในการแยกสตริงและข้อมูลที่เป็นข้อความอื่น ๆ ที่รู้จักกันในชื่อ "ภาษาปกติ" ในทฤษฎีภาษาที่เป็นทางการ ภาษาเหล่านี้ไม่ใช่ภาษาโปรแกรม พวกเขาเป็นมากกว่าการจดชวเลขสำหรับการเข้ารหัสที่น่าเบื่ออย่างยิ่งที่จะติดตั้งและทำให้สับสนมากกว่า Regex ที่ดูลึกลับบางครั้ง

การเขียนโปรแกรมภาษามีการกำหนดมักจะเป็นภาษาที่มีทัวริงสมบูรณ์ ภาษาดังกล่าวต้องสามารถที่จะดำเนินการใด ๆฟังก์ชันคำนวณ Regex ไม่เหมาะกับหมวดหมู่นี้

หากคุณต้องการภาษาที่ดูเหมือน Regex ลอง J


1
+1 ฉันมอง แต่ไม่สามารถหาการสนทนาที่ดี / ไม่ปลอดภัยของทัวริงสมบูรณ์ของการแสดงออกปกติ
FrustratedWithFormsDesigner

1
@ davidk01 - เซลลูล่าร์ออโตสามารถสมบูรณ์ได้ (แม้ว่าคอมไพเลอร์ที่ดีหายาก) แต่นิพจน์ทั่วไปไม่ใช่ คุณสามารถทำการคำนวณที่ไม่ใช่เรื่องไร้สาระใช่ แต่มีสิ่งเล็กน้อยที่คุณไม่สามารถทำได้เช่นกัน ทัวริงเซลลูล่าร์ออโตมาต้าสมบูรณ์อาจถือเป็นภาษาการเขียนโปรแกรมเนื่องจากโดยหลักการแล้วคุณสามารถเขียนโปรแกรมใด ๆ กับพวกเขาที่คุณสามารถใช้ภาษาอื่นได้
psr

1
สิ่งสำคัญคือให้สังเกตว่า regex ที่ทำการทดสอบแบบดั้งเดิม ( montreal.pm.org/tech/neil_kandalgaonkar.shtml#primality_regex ) ใช้คุณสมบัติของ perex regexes ที่มีประสิทธิภาพมากกว่า "นิพจน์ทั่วไป" ในแง่วิชาการ - กล่าวคือกลุ่มที่เก็บไว้ . ภาษาปกติไม่สามารถใช้หน่วยความจำที่ต้องการได้
Eric W.

5
@WorldEngineer: มีภาษาการเขียนโปรแกรมที่น่าสนใจและมีประโยชน์ที่ไม่ได้ทัวริงสมบูรณ์ Datalog, SQL และ ACL2 เป็นตัวอย่างเล็ก ๆ น้อย ๆ ที่นึกขึ้นมาได้เช่นเดียวกับจำนวนแลมบ์ดาแลปดาที่ใช้ในสิ่งต่าง ๆ อย่างเช่นทฤษฏีตามทฤษฎีประเภททฤษฎี
Ryan Culpepper

1
ภาษาการเขียนโปรแกรมบางภาษานั้นไม่สมบูรณ์ ตัวอย่างเช่นภาษาที่ประกาศโดยไม่มีบริบทเช่น XML ที่ไม่ได้รับการทำให้สมบูรณ์โดยไม่ได้จับคู่กับล่ามอาจถือว่าเป็นภาษาโปรแกรม ทุกอย่างขึ้นอยู่กับคำจำกัดความของ 'ภาษาการเขียนโปรแกรม' ของคุณ สิ่งที่คุณต้องแปลงเป็นภาษา 'ปกติ' เป็นภาษา 'ที่ไม่มีบริบท' คือสแต็กแบบกดลง จากนั้นก็เต่าลงไปจนสุด
Evan Plaice

14

มันเป็นเรื่องยากที่จะตอบคำถามประเภท "คือX Y " หากผู้เข้าร่วมในการใช้งานการอภิปรายคำนิยามที่แตกต่างกันของXและY อาจเป็นได้ว่าสำหรับคำจำกัดความบางคำตอบคือ "ใช่" และสำหรับคำจำกัดความบางคำตอบคือ "ไม่" โดยเฉพาะอย่างยิ่งถ้าคำตอบนั้นขึ้นอยู่กับรายละเอียดทางเทคนิคที่คำจำกัดความต่างกัน นอกจากนี้การสนทนานี้มีข้อมูลที่ผิดดังนั้นโปรดอดทนด้วยคำตอบที่ยาวกว่า

" ภาษาโปรแกรม " หมายถึงอะไร

คำตอบง่ายๆอาจเป็น "ภาษาที่ใช้ในการสร้างโปรแกรม" แน่นอน แต่: โปรแกรมประเภทใด ภาษาใดบ้างที่สามารถใช้สร้างโปรแกรมบางประเภท แต่ไม่ใช่โปรแกรมประเภทอื่น ต่อไปนี้เป็นตัวอย่างเฉพาะสองตัวอย่างเพื่อแสดงกรณีและปัญหาที่รุนแรง:

1) ภาษาจินตภาพที่ชื่อว่า M ทำงานดังนี้: หากโปรแกรมมีตัวอักษร "m" ตัวเดียวมันจะสร้างเกม Minesweeper ทุกอย่างอื่นเป็นข้อผิดพลาดทางไวยากรณ์

โดยสังเขปนี่ไม่ใช่สิ่งที่เราหมายถึงโดยการพูดว่า "ภาษาการเขียนโปรแกรม" แต่ฝ่ายการตลาดของ M สามารถโต้แย้งว่าในทางเทคนิคนั้นเป็นไปตามคำนิยามเพราะสามารถใช้ในการสร้างโปรแกรมได้ แน่นอนว่าคอมไพเลอร์ทำบางส่วนที่สำคัญสำหรับคุณ แต่นั่นคือสิ่งที่คอมไพเลอร์ทำใช่มั้ย คอมไพเลอร์ของภาษา C ยังแปลคำศัพท์ง่าย ๆ เป็นคำสั่งต่าง ๆ ของโปรเซสเซอร์ คอมไพเลอร์ M ก้าวไปอีกขั้นและทำให้งานของคุณง่ายขึ้น

2) ถ้าคุณติดตั้ง Turbo Pascal เวอร์ชั่นดั้งเดิมคุณสามารถเขียนโปรแกรมได้หลายแบบ แต่คุณไม่สามารถเขียนเกมที่ทำงานในเว็บเบราว์เซอร์ได้เพราะ API ที่จำเป็นนั้นไม่มีอยู่ในนั้น

แล้วอะไรคือสิ่งที่ทำให้ Turbo Pascal เป็นภาษาโปรแกรม แต่ M ไม่มีหรือ? เพียงแค่พูดคุณสามารถทำอะไรได้มากกว่าในปาสกาลกว่าในเอ็ม แต่คิดว่าเรามี M.NET ซึ่งสร้างเกมเรือกวาดทุ่นระเบิดทำงานในเว็บเบราว์เซอร์ ดังนั้นตอนนี้เรามีสิ่งที่ Pascal สามารถทำได้และ M.NET ไม่สามารถทำได้ แต่เราก็มีบางอย่างที่ M.NET สามารถทำได้และ Pascal ไม่สามารถทำได้ ทำไมเราต้องพิจารณาข้อดีของ Pascal สำคัญและข้อดีของ M.NET ที่ไม่เกี่ยวข้อง?

คำตอบคือคุณสามารถเขียนอัลกอริทึมทุกชนิดใน Pascal แต่คุณไม่สามารถเขียนอัลกอริทึมใน M หรือ M.NET แน่นอนว่า M รวบรวมคำสั่งของคุณ "m" และ C รวบรวมคำสั่งของคุณ "strcmp" แต่คุณสามารถใส่ "strcmp" ในบริบทที่มีขนาดใหญ่กว่าตัวอย่างเช่นเปรียบเทียบไฟล์สองไฟล์ต่อบรรทัดหรืออ่านพันสตริงและจัดเรียงตามลำดับตัวอักษรหรือ ... ดีมีอีกหลายล้านรายการ และมันก็เป็นอย่างแม่นยำความสามารถในการใช้คำสั่งที่กำหนดไว้ในขั้นตอนวิธีการใด ๆซึ่งจะทำให้สาระสำคัญของภาษาการเขียนโปรแกรม

อัลกอริทึมคืออะไรและที่สำคัญกว่านั้นคืออะไร "อัลกอริทึมใด ๆ "? ในสาขาวิทยาศาสตร์คอมพิวเตอร์ที่เราใช้คำว่าทัวริงสมบูรณ์ แนวคิดคือมีชุดภาษาคอมพิวเตอร์ซึ่งแต่ละภาษาสามารถจำลองได้ทั้งหมด หนึ่งในภาษาเหล่านั้นคือเครื่องจักรทัวริงซึ่งเป็นเหตุผลว่าทำไมพวกเขาถึงถูกเรียกเช่นนั้น ปาสคาลอยู่ที่นั่น, C อยู่ตรงนั้น, จาวาอยู่ที่นั่น, Python อยู่ที่นั่น, Lisp อยู่ที่นั่น, Smalltalk อยู่ที่นั่น, แม้แต่ XSLT ก็อยู่ที่นั่น สมมติฐาน M และ M.NET ของเราไม่อยู่ที่นั่น คุณสามารถเรียนรู้เพิ่มเติมเกี่ยวกับเรื่องนี้ได้ที่มหาวิทยาลัยใดก็ตามที่เปิดสอนหลักสูตรวิทยาการคอมพิวเตอร์ที่เหมาะสม แต่แนวคิดคือภาษาทัวริงที่สมบูรณ์สามารถทำอะไรก็ได้ภาษาทัวริงที่สมบูรณ์แบบอื่นสามารถทำได้หากคุณให้ API ขั้นต่ำที่จำเป็นแก่พวกเขา (ถ้าคุณมอบ API ของเว็บเบราว์เซอร์ให้กับ Pascal คุณสามารถสร้างเกมได้ทุกประเภทในเว็บเบราว์เซอร์ถ้าคุณมอบ API ของเว็บเบราว์เซอร์ให้กับ M คุณจะสามารถสร้าง Minesweeper ได้เท่านั้น) เราสามารถพูดเชิงเปรียบเทียบได้ว่า คุณลบ API ทั้งหมดออกจากภาษาการเขียนโปรแกรมสิ่งสำคัญคือสิ่งที่เหลืออยู่

เราหมายถึงอะไรโดย " การแสดงออกปกติ "?

ภาษาการเขียนโปรแกรมที่แตกต่างกันนำไปใช้แตกต่างกันเล็กน้อย แต่ความคิดเดิมคือการที่แสดงออกปกติแสดงที่เรียกว่าภาษาปกติ โปรดทราบว่าเราไม่ได้พูดเกี่ยวกับภาษาการเขียนโปรแกรมที่นี่ แต่เกี่ยวกับ (หลอก) ภาษามนุษย์ ลองนึกภาพว่าคุณพบชนเผ่าแปลกใหม่บางคนกำลังพูดภาษาที่ประกอบด้วยคำว่า "ba", "baba", "bababa" เป็นต้น คุณสามารถอธิบายภาษานี้ด้วยวาจาว่า "พยางค์ 'ba' ซ้ำหนึ่งครั้งขึ้นไป" หรือใช้นิพจน์ทั่วไปเป็น "(ba) +"

นิพจน์ทั่วไปควรแสดง: "ไม่มีอะไร", "จดหมายนี้", "สิ่งนี้, ตามด้วย", "นี่หรืออย่างนั้น", "นี่, ทำซ้ำหนึ่งครั้งหรือมากกว่า" และ "ไม่ใช่สิ่งนี้" - นั่นคือนิยามทางคณิตศาสตร์ สิ่งอื่นเป็นเพียงทางลัดที่สะดวกสบายที่สร้างขึ้นจากส่วนประกอบก่อนหน้า ตัวอย่างเช่น "นี่ทำซ้ำสองหรือสามครั้ง" สามารถแปลว่า "นี่ตามด้วยสิ่งนี้ตามด้วย (นี่หรือไม่มีอะไร)" แต่มันจะสะดวกกว่าถ้าเขียน "ba {2,3}" มากกว่า "baba (BA)?"

ในชีวิตจริงการดำเนินงานตามแบบฉบับของ "การแสดงออกปกติ" การดำเนินการมากขึ้นกว่านี้ ตัวอย่างเช่นการใช้คำจำกัดความทางคณิตศาสตร์ภาษา "aba", "aabaa", "aaabaaa" และอื่น ๆ - จำนวน "a" s ใด ๆ ตามด้วย "b" ตามด้วยหมายเลขเดียวกันของ "a "s - ไม่ใช่ภาษาปกติ อย่างไรก็ตาม "นิพจน์ทั่วไป" ที่ใช้กันทุกวันนี้สามารถตรวจจับได้โดยใช้แนวคิดเพิ่มเติมของ "สิ่งเดียวกับที่เราพบมาก่อน" เขียนเป็น "(a +) b \ 1" ใช้แนวคิดเพิ่มเติมนี้เราสามารถทำสิ่งดีๆบางอย่างเช่นการตรวจสอบคำประกอบด้วยนายกจำนวนตัวอักษร ถึงกระนั้นเราไม่สามารถทำอัลกอริทึมใด ๆ ... สำหรับคำอธิบายว่าทำไม

ดังนั้นกลับไปที่หัวข้อดั้งเดิม: เป็นนิพจน์ทั่วไป (กำหนดเป็น: นิพจน์ที่อธิบายภาษาปกติในลำดับชั้น Chomsky หรือเป็น: อดีตรวมกับการดำเนินงาน \ 1) ภาษาโปรแกรม (กำหนดเป็น: ทัวริงสมบูรณ์)? คำตอบคือไม่มี ไม่คุณไม่สามารถใช้อัลกอริทึมใด ๆโดยใช้นิพจน์ทั่วไปและความสามารถในการใช้อัลกอริทึมใด ๆคือสิ่งที่ผู้คนเรียนวิทยาศาสตร์คอมพิวเตอร์มักเข้าใจว่าเป็นสาระสำคัญของภาษาโปรแกรม

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

และถ้าคุณไม่สนใจรายละเอียดทางเทคนิคคำตอบก็คือคุณสามารถใช้นิพจน์ทั่วไป (และไม่มีอะไรอื่น) ในการสร้างโปรแกรมได้หรือไม่? ไม่งั้นทำไมเรียกมันว่าภาษาโปรแกรม? (อย่างไรก็ตามคำตอบเช่นนี้ถูกดาวน์โหลดและลบที่นี่ซึ่งเป็นสาเหตุที่ฉันเขียนรุ่นที่ยาวกว่านี้)

แก้ไข: นอกจากนี้ทุกคนสามารถสร้างห้องสมุดที่ใช้ชุดตัวเลือกใหม่ของ "นิพจน์ทั่วไป" พร้อมกับคุณสมบัติใหม่ที่เพิ่มเข้ามา ในขณะที่คุณสมบัติใหม่อาจจะเพียงพอสำหรับทั้งระบบที่จะกลายเป็นทัวริงที่สมบูรณ์ ตัวอย่างเล็กน้อยจะฝังภาษาทัวริงที่สมบูรณ์โดยใช้ไวยากรณ์ใหม่บางอย่าง; แต่มันก็สามารถเกิดขึ้นได้อย่างชัดเจนน้อยลง บางทีมันอาจจะเกิดขึ้นแล้ว


0

ใน. Net ไม่เพียง แต่สามารถจัดการ Regex ได้หลายรูปแบบโดยใช้การรวมกันของการสลับและการค้นหา แต่ยังสามารถจัดการสแต็กของตัวเองได้

(?xm)
    (?>
        <(?<Tagname>table)[^>]*>
    )
(?(Tagname)
    (
        </(?(?!\k'Tagname')(?<-Tagname>))*\k'Tagname'>(?<-Tagname>)
    |
        (?>
            <(?<Tagname>[a-z][^\s>]*)[^>]*>
        )
    |
        [^<]+
    )+?
    (?(Tagname)(?!))
)

ตัวอย่างเช่นนี่เป็นตัวอย่างเล็ก ๆ ที่ฉันเขียนเพื่อดึงตาราง HTML ซึ่งแตกต่างจากเอนจิ้น regex อื่น ๆ สิ่งนี้จะควบคุมสแต็คของการรวบรวมคอลเลกชัน (push, peek และ pop) และสามารถจัดการกับวัตถุที่ซ้อนกัน ฉันมีสิ่งที่ซับซ้อนกว่านี้ แต่มันเป็นกรรมสิทธิ์ของ sorta

ฉันคิดว่าในตัวอย่างนี้ Regex สามารถมองว่ามีข้อกำหนดพื้นฐานทั้งหมดของภาษาโปรแกรม มันมีตัวแปรหน่วยความจำแบบอินไลน์เงื่อนไขอินพุตและเอาท์พุตมันรวบรวมโดยใช้หนึ่งในหลาย ๆ คอมไพล์เอ็นจินคอมไพล์ (. Net ในกรณีนี้)

ในการตอบสนองต่อการ squawking ที่ใช้เกินไป (ไม่เคย) แยกวิเคราะห์ HTML ด้วย Regex ฉันไปข้างหน้าและโพสต์คำตอบที่พิมพ์ล่วงหน้าที่ฉันสามารถโพสต์ได้: การแยก HTML

ตัวอย่าง Anoter (เพียงแค่การสาธิต) มีดังต่อไปนี้:

Function Regex("<(td>)((?:[^<]*(?(?!</\1)<))*)</\1")
    Group(0) = "<"
    Group(1) = "td>"
    Group(0) += Group(1)
    Group(2) = LoopMethod()
    Group(0) += Group(2)
    Group(0) += "</" & Group(1)
    Return Group()
End Function

Function LoopMethod()
    retGroup = ""
    Do
        tmpGroup = Everything that is NOT an Opening HTML Delimeter
        If the Text following tmpGroup Does NOT Equal "</" & Group(1) Then
            tmpGroup += "<"
            retGroup += tmpGroup
        Else
            Exit Do
        End If
    Loop
    Return retGroup
End Function

อีกครั้งสำหรับ HTML parrots: การแยก HTML

สิ่งนี้แสดงลูปและเงื่อนไข regex ที่ง่ายขึ้น (อัลกอริทึม?) สิ่งเดียวที่ขาดหายไปคือการคำนวณทางคณิตศาสตร์ที่เกิดขึ้นจริง นี่เป็นนิพจน์ทั่วไปที่มีรายละเอียดมากขึ้นซึ่งเพิ่งดึงเซลล์ TD อย่างมีประสิทธิภาพมากกว่าวิธี "(* *)" ทั่วไป

แต่ในฐานะที่เป็นผู้ที่ชื่นชอบ Regex และปรมาจารย์ด้านการประกาศตนเองฉันจะไม่บอกใครว่า Regex เป็นภาษาโปรแกรม ข้อถกเถียงของฉันกับตัวเองคือมันไม่สามารถยืนอยู่คนเดียวมันจะต้องวิ่งผ่านเอ็นจิ้นของตัวเองในขณะที่ได้รับการสนับสนุนโดยเอ็นจินภาษาโปรแกรมอื่น


หากคุณ "ทดสอบ" สิ่งนี้และมันใช้งานไม่ได้คุณต้องตระหนักว่า "เครื่องมือทดสอบ" regex ส่วนใหญ่ไม่ได้จัดการ. Net Regex (Balancing Groups) คุณต้องใช้สิ่งนี้ในโปรแกรม. Net
Suamere

3
โอ้พุทโธ่นี้เป็นพยานหลักฐานที่ป้ายหน้าร้านว่าทำไมคุณไม่ควรใช้ regexes ที่จะแยก HTML เคย
Tacroy

@Tacroy ยินดีที่ได้เห็นบางคนถูกหลอกเพื่อแนะนำนกแก้วเกี่ยวกับการแยกวิเคราะห์ HTML ด้วย regex ในขณะที่ไม่ใช่สำหรับคนที่ใจอ่อนการรวม regexes อย่างที่กล่าวไว้ข้างต้นกับสแต็คเป็นสูตรพื้นฐาน (และมีประสิทธิภาพ) สำหรับการสร้างตัวแยกวิเคราะห์ที่ไม่มีบริบท
Evan Plaice

1
เพื่อตอบสนองต่อการ Parraw Squawking ฉันได้สร้างสิ่งนี้: การแยก HTML
Suamere

ไม่ใช่นิพจน์ปกติหากยอมรับภาษาที่มีบริบท เป็น DSL อื่น ๆ ที่เป็นชุดของ Regex ชื่อผู้ขายจะไม่เปลี่ยนแปลง
Caleth

0

แม้ว่าหนึ่งค้นหา / แทนที่ในการแสดงออกปกติไม่ได้เป็นภาษาการเขียนโปรแกรมทัวริงที่สมบูรณ์ตามที่อธิบายโดยคำตอบก่อนหน้าถ้าคุณอนุญาตให้ใช้การกระทำซ้ำของการแทนที่ด้วยการแสดงออกปกติแล้วใช่คุณสามารถเข้ารหัสเครื่องทัวริง

ค้นหาซ้ำ / แทนที่ด้วยนิพจน์ทั่วไปเป็นภาษาโปรแกรมทัวริงที่สมบูรณ์

ดังนั้นคุณสามารถคำนวณฟังก์ชันใด ๆ ที่คำนวณได้โดยใช้การค้นหาเดียวกันและแทนที่นิพจน์ปกติของ javascript ซ้ำแล้วซ้ำอีก

เพื่อพิสูจน์ความสมบูรณ์ของทัวริงก็เพียงพอที่จะเข้ารหัสเครื่องทัวริงในการค้นหา / แทนที่นิพจน์ปกติ สมมติว่าสถานะของโปรแกรมแก้ไขคือ:

0000#12345:01-5:0#0000000

ซึ่งสามารถอ่านเป็นเทปสัญลักษณ์ที่มีตัวอ่านอยู่:

[left symbols]#[set of states]:[set of symbols]-[current state]:[current symbol]#[right symbols]

สำหรับกฎที่อ่าน 0 ในสถานะ 5 เขียน 1 และเปลี่ยนสถานะเป็น 3 แล้วเลื่อนไปทางซ้ายเราสรุปโดยใช้สัญลักษณ์ต่อไปนี้:

5:0 => 1, 3:[left]

เราเข้ารหัสสัญกรณ์ก่อนหน้าเป็นนิพจน์ทั่วไปของการค้นหา:

(\d)#(1)(2)(3)(4)(5):(0)(1)-5:0#

และการแสดงออกแทน (เหมือนจาวาสคริปต์)

#12345:01-$4:$1#$8

ตกลงตอนนี้วิธีการเข้ารหัสกฎมากมาย? เราใช้การต่อข้อมูลร่วมกับorโอเปอเรเตอร์|สำหรับการค้นหานิพจน์ทั่วไปและเรารวมผลลัพธ์เข้าด้วยกันเพื่อทดแทน ตัวอย่างเช่นให้เราพิจารณาชุดของกฎสี่ข้อ

5:0 => 1, 3:left
3:0 => 1, 5:right
5:1 => 1, 5:right
3:1 => 1: 3:stop

เราเข้ารหัสพวกมันในการค้นหาและแทนที่นิพจน์:

Search:
(\d)#(1)(2)(3)(4)(5):(0)(1)-5:0#|#(1)(2)(3)(4)(5):(0)(1)-3:0#(\d)|#(1)(2)(3)(4)(5):(0)(1)-5:1#(\d)|#(1)(2)(3)(4)(5):(0)(1)-3:1#

Replace by:
$15$23#12345:01-$4$13$21$27:$1$16$24$31#$8

ลองใช้ในเครื่องมือจาวาสคริปต์ที่คุณชื่นชอบ:

function turingstep(s) {
  return s.replace(/(\d)#(1)(2)(3)(4)(5):(0)(1)-5:0#|#(1)(2)(3)(4)(5):(0)(1)-3:0#(\d)|#(1)(2)(3)(4)(5):(0)(1)-5:1#(\d)|#(1)(2)(3)(4)(5):(0)(1)-3:1#/g,"$15$23#12345:01-$4$13$21$27:$1$16$24$31#$8");
}

var tape = "0000#12345:01-5:0#0000000"
for(var i = 0; i < 6; i++) {
  console.log(tape)
  tape = turingstep(tape)
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.