มันเป็นภูเขาหรือไม่?


29

ท้าทาย

สำหรับความท้าทายนี้สตริงที่เป็นภูเขาเป็นสิ่งที่สอดคล้องกับกฎไวยากรณ์M: x(Mx)*ที่ทุกการผลิต x ทั้งหมดเป็นอักขระเดียวกัน เมื่อเยื้องสายภูเขาอาจมีลักษณะเช่นนี้:

A
 B
  C
   D
  C
   E
    F
   E
  C
 B
A

อย่างที่คุณเห็นมันดูเหมือนภูเขาจากทางด้านข้าง

นิยามอย่างเป็นทางการ

  • อักขระเดี่ยวใด ๆ ที่aเป็นภูเขา
  • ถ้าSเป็นสตริงภูเขาและaเป็นอักขระแล้วก็aSaเป็นภูเขาซึ่งการวางเคียงกันแสดงถึงการต่อสตริง
  • ถ้าaSaและaTaเป็นสายภูเขาก็aSaTaเป็นสายภูเขา โปรดทราบว่ากฎนี้มีความหมายว่ารูปแบบนี้มีไว้สำหรับการทำซ้ำจำนวนเท่าใดก็ได้ (เช่นaSaTaUa, aSaTaUaVa, aSaTaUaVaWa... มีทั้งหมดภูเขา.)

ตัวอย่าง

palindromes ความยาวคี่ทั้งหมดเป็นภูเขาตัวอย่างเช่น:

t
 a
  c
   o
  c
 a
t

qwertytrasdfdgdsarewqjklkjq เป็นตัวอย่างเล็กน้อย:

q
 w
  e
   r
    t
     y
    t
   r
    a
     s
      d
       f
      d
       g
      d
     s
    a
   r
  e
 w
q
 j
  k
   l
  k
 j
q

ตัวอย่างผลลัพธ์

a                           ==> true
aaa                         ==> true
mom                         ==> true
tacocat                     ==> true
qwertytrasdfdgdsarewqjklkjq ==> true
wasitacaroraratisaw         ==> true
abcbcbcbcba                 ==> true
aaaaabcbbba                 ==> true

<empty string>              ==> false
aa                          ==> false
pie                         ==> false
toohottohoot                ==> false
asdfdghgfdsa                ==> false
myhovercraftisfullofeels    ==> false

กฎระเบียบ

  • นี่เป็นปัญหาในการตัดสินใจดังนั้นการแสดงความจริงหรือเท็จใด ๆ จะเป็นผลลัพธ์ที่ถูกต้องตราบใดที่มันถูกต้องสอดคล้องกันไม่คลุมเครือและโปรแกรมจะยุติในเวลาที่ จำกัด ตรวจสอบให้แน่ใจว่าได้ระบุข้อตกลงการส่งออกด้วยโซลูชันของคุณ
    • มันควรจะเป็นเรื่องเล็กน้อยที่จะตัดสินว่าเอาต์พุตบ่งชี้ว่าจริงหรือเท็จโดยไม่ต้องรู้ว่าสตริงนั้นคืออะไร โปรดทราบว่าสิ่งนี้ไม่ได้หมายความว่าผลลัพธ์ที่เป็นจริงหรือเป็นเท็จต้องมีค่าคงที่อย่างไรก็ตามการประชุมของ "พิมพ์สตริงภูเขาหากสตริงนั้นเป็นภูเขาและไม่ใช่ภูเขาหากไม่ใช่ภูเขา" เป็นช่องโหว่ที่ต้องห้ามด้วยเหตุผลที่ชัดเจน
    • ในทางตรงกันข้ามการประชุมเช่น "โยนข้อยกเว้นสำหรับความผิดพลาดและออกไปอย่างเงียบ ๆ เพื่อความเป็นจริง" จะดีเช่นเดียวกับ "พิมพ์อักขระเดียวสำหรับความจริงและสิ่งอื่นใดที่เป็นเท็จ"
  • นี่คือรหัสกอล์ฟดังนั้นโปรแกรมที่สั้นที่สุดชนะ
  • ช่องโหว่มาตรฐานถูกแบน

4
กรณีทดสอบaaaจะดีโดยที่ต้องใช้อักขระเดียวกันในหลายระดับ
Martin Ender

คุณแน่ใจเกี่ยวกับwasitacaroraratisaw? ดูเหมือนว่าเป็นเรื่องน่าขันสำหรับฉัน
Ton Hospel

wasitacaroraratisawAFAICT เป็นภูเขาแน่นอน
ETHproductions

ดังนั้นมันจึงเป็น ฉันคิดว่าฉันแค่พยายามหา 'เกือบ palindrome' แต่ฉันพบสายภูเขาโดยไม่ได้ตั้งใจ
Beefster

2
ฉันคิดว่ามันจะง่ายต่อการแก้ไขโดยการแยกสตริงของตัวละครตัวแรก แต่กรณีเช่นนี้aaaทำให้มันไม่ทำงาน
xnor

คำตอบ:





5

Brain-Flakขนาด 78 ไบต์

({()<<>(([{}]({}))([{}]({}))<>[({}<>)])>{[()()]((<()>))}<{}{}{}<>>}(())){{}}{}

ลองออนไลน์!

พิมพ์ 1 สำหรับจริงไม่มีอะไรที่เป็นเท็จ

ในการตรวจสอบคำที่เป็นภูเขามันก็เพียงพอที่จะสันนิษฐานได้ว่าคำว่า "ลง" บนภูเขาเมื่อใดก็ตามที่เป็นไปได้



3

Prolog (SWI) 29 ไบต์

a-->[X],+X.
+X-->[];a,[X],+X.

ลองออนไลน์!

โปรแกรมนี้กำหนดกฎ DCG a//0ที่ตรงกับสตริงใด ๆ (รายการของตัวละคร) ที่เป็นสตริงที่เป็นภูเขา

คำอธิบาย

สำหรับโปรแกรมนี้ฉันใช้คำจำกัดความที่แตกต่างกันเล็กน้อย แต่เทียบเท่ากับสตริงที่เป็นภูเขามากกว่าที่อธิบายไว้ในการท้าทาย: สตริงภูเขาเป็นตัวละครcตามด้วยหมายเลข (อาจเป็นศูนย์) ของสตริงภูเขาที่มีการcตรึงไว้ที่ปลายสุด ในสัญกรณ์ regex ที่ได้มาสั้น ๆ สตริงที่เป็นภูเขาจะต้องตรงกับรูปแบบc(Mc)*ที่Mเป็นสตริงที่เป็นภูเขาและ*หมายความว่าการแสดงออกในวงเล็บจะถูกทำซ้ำเป็นศูนย์หรือมากกว่านั้น โปรดทราบว่าในขณะที่แต่ละคนcจะต้องเป็นตัวละครเดียวกันแต่ละคนMไม่จำเป็นต้องเป็นสายภูเขาที่เหมือนกัน

พิสูจน์ความเท่าเทียมกัน

เป็นที่ชัดเจนว่ากฎข้อที่ 1 และ 2 จากการท้าทายนั้นเทียบเท่ากับกฎของฉันซึ่งMcเกิดขึ้นที่ศูนย์และหนึ่งครั้งตามลำดับ

ในกรณีที่สตริงภูเขาMcเกิดขึ้นในnเวลาn > 1นั้นสตริงสามารถเขียนใหม่ได้cMcScซึ่งSเป็นn - 1ครั้งหลังที่Mcเกิดขึ้นซึ่งไม่รวมสตริงสุดท้ายc(หมายเหตุที่Mเป็นสตริงภูเขาใด ๆ และไม่จำเป็นต้องเหมือนกันM) เนื่องจากMเป็นสตริงภูเขาตามกฎ 2 cMcจะต้องเป็นสตริงภูเขา ไม่ว่าจะSเป็นสตริงภูเขาซึ่งในกรณีที่cScเป็นสตริงที่เป็นภูเขาหรือSสามารถเขียนใหม่เป็นcMcTcที่Tเป็นหลังn - 2ครั้งที่เกิดขึ้นไม่รวมสุดท้ายMc cบรรทัดการให้เหตุผลนี้สามารถใช้งานต่อไปได้จนกว่าสตริงจะไม่รับประกันว่าจะประกอบด้วยภูเขาMcครั้งหนึ่งซึ่งหมายความว่ามันจะต้องเป็นภูเขาเช่นกัน ดังนั้นเนื่องจากcMcเป็นภูเขาและหากcMcและcM'cเป็นภูเขาดังนั้นcMcM'cจะต้องเป็นภูเขาสตริงทั้งหมดจะต้องเป็นภูเขา

สำหรับการสนทนาสำหรับสตริงcScTcที่cScและcTcเป็นภูเขาแล้วอาจcScเป็นสตริงภูเขาตามกฎ 2 หรือตามกฎ 3 หากเป็นสตริงสตริงภูเขาตามกฎ 2 จากนั้นSจะต้องเป็นสตริงภูเขา ถ้ามันเป็นสายภูเขาตามกฎ 3 แล้วcScจะต้องอยู่ในรูปแบบcUcVcที่cUcและcVcเป็นสายภูเขา เนื่องจากความยาวของcUcและcVcจะต้องสั้นกว่าอย่างน้อยสองตัวอักษรcScและกฎ 3 ต้องใช้อย่างน้อย 5 ตัวอักษรหลังจากใช้งานจำนวน จำกัด ของกฎ 3 แต่ละสตริงระหว่างcs ที่เลือกโดยแอปพลิเคชันของกฎ 3 ต้องเป็นภูเขา เชือก สามารถใช้บรรทัดการคิดเหตุผลเดียวกันได้cTc ดังนั้นคำจำกัดความของฉันจึงเป็นภูเขา

เนื่องจากสตริงใด ๆ ที่ตรงกับคำจำกัดความของฉันคือภูเขาและคำจำกัดความของฉันตรงกับสตริงที่มีภูเขาทั้งหมดจึงเท่ากับสตริงที่กำหนดไว้ในคำถาม

คำอธิบายของรหัส

โดยรวมa//0กฎ DCG ที่กำหนดไว้ในบรรทัดแรกตรงกับสตริงที่เป็นภูเขาใด ๆ +//1กฎ DCG (เช่นภาค, กฎ DCG สามารถให้ชื่อผู้ประกอบการ ) ที่กำหนดไว้ในบรรทัดที่สองตรงกับสายใด ๆ ที่ถูกสร้างขึ้นจากลำดับของศูนย์หรือภูเขาเพิ่มเติมสตริงด้วยตัวอักษรที่ผ่านมาเป็นข้อโต้แย้งของมันXติดอยู่บนปลายของพวกเขา . หรือจะยืม regex เหมือนสัญกรณ์ผมใช้ข้างต้นa//0การแข่งขันc(Mc)*แต่ outsources งานของจริงที่ตรงกับที่(Mc)*ไป+//1ซึ่งจะใช้เวลาเป็นอาร์กิวเมนต์ของมันcX

ทีละบรรทัดรหัสทำงานดังต่อไปนี้:

a-->[X],+X.

aบรรทัดนี้กำหนดกฎ DCG ระบุว่าตัวอักษรตัวแรกจะต้องเท่ากับตัวแปรไม่ได้กำหนดในขณะนี้[X] Xซึ่งส่งผลในXการตั้งค่าเท่ากับตัวอักษรตัวแรก +Xแล้วกล่าวว่าส่วนที่เหลือของสตริงจะต้องตรงกับกฎ DCG +//1กับตัวอักษรที่Xถูกตั้งค่าให้เป็นอาร์กิวเมนต์ของมัน

+X-->[];a,[X],+X.

บรรทัดนี้กำหนด+//1กฎ DCG ;หมายถึงหรือในการเปิดฉากซึ่งหมายความว่าสตริงสามารถตรงกับอย่างใดอย่างหนึ่งหรือ[] หมายถึงสตริงที่ว่างเปล่าเพื่อให้อยู่เสมอมีความสามารถในการจับคู่สตริงที่ว่างเปล่า หากสตริงไม่ว่างเปล่าจุดเริ่มต้นของสตริงต้องตรงกันและต้องเป็นสตริงที่เป็นภูเขา สิ่งนี้จะต้องตามด้วยตัวละครอะไรก็ตามที่ตั้งค่าไว้ สุดท้ายที่เหลือของสตริงจะต้องตรงกับa,[X],+X[]+//1a//0X+X


2

Huskขนาด 15 ไบต์

εωφΓ§?t·:⁰`(=←t

ลองออนไลน์! การอนุมานประเภทใช้เวลาประมาณ 40 วินาทีดังนั้นโปรดอดทนรอ

คำอธิบาย

εωφΓ§?t·:⁰`(=←t  Implicit input, say s = "abacdca"
 ω               Apply until fixed point is reached
  φ              this self-referential anonymous function (accessed with ⁰):
                  Argument is a string x.
   Γ              Deconstruct x into head h and tail t.
    §?t·:⁰`(=←t   Call this function on h and t. It is interpreted as §(?t)(·:⁰)(`(=←t)).
                  § feeds h to (·:⁰) and (`(=←t)), and calls (?t) on the results.
                  The semantics of ? cause t to be fed to all three functions.
          `(=←t   First, check whether h equals the first element (←) of the tail of t.
     ?t           If it does (e.g. if h='a' and t="bacdca"), return tail of t ("acdca").
                  Otherwise (e.g. if h='b' and t="acdca"),
       · ⁰        call the anonymous function recursively on t: "aca"
        :         and prepend h to the result: "baca".
                 Final result is "a".
ε                Is it a 1-element string? Implicitly print 0 or 1.

ความคิดที่จะซ้ำ ๆ แทนที่ย่อยของแบบฟอร์มabaด้วยaจนกระทั่งนี้จะไม่มีอีกต่อไปได้ อินพุตเป็นภูเขาถ้าหากผลลัพธ์นี้เป็นสตริงอักขระเดี่ยว (ซึ่งเป็นการεทดสอบ) สถานการณ์ที่อันตรายเพียงอย่างเดียวคือเมื่อเรามีสตริงเช่นนี้ซึ่งabaดูเหมือนจะไม่สูงสุด:

a
 b
  a
   c
  a
   d
  a
 b
a

โชคดีที่เราสามารถแปลงให้เป็นหนึ่งเดียว:

a
 b
a
 c
a
 d
a
 b
a

ฉันเชื่อว่าการส่งคืนอักขระเดี่ยวสำหรับtrueกรณีและมิฉะนั้นจะเป็น "สอดคล้อง"
Jonathan Allan

ที่จริงแล้วมันอาจจะผลักมันออกไปเพราะไม่มีเส้นแบ่งที่ชัดเจนระหว่างนั้นกับ no-op ("ส่งคืนสตริงภูเขาเมื่อภูเขาและไม่ใช่อย่างอื่น") ซึ่งจะเห็นได้ชัดว่าเป็นช่องโหว่
Jonathan Allan

@JanathanAllan ตัวละครเดี่ยวเทียบกับสายอื่น ๆ ดูเหมือนจะคลุมเครือเกินไปสำหรับฉันเช่นกันโดยเฉพาะอย่างยิ่งเมื่อมันมีความสัมพันธ์กับความจริงเพียงเล็กน้อย (เฉพาะสตริงที่ว่างเปล่าเท่านั้นที่เป็นเท็จใน Husk)
Zgarb

ใช่ "การเป็นตัวแทนใด ๆ " เห็นได้ชัดว่าเสรีนิยมมากเกินไป - ฉันได้แสดงความคิดเห็นภายใต้ OP :)
Jonathan Allan

ฉันต้องการให้คำจำกัดความเป็นอิสระเพราะมันช่วยแก้ปัญหาที่สร้างสรรค์มากขึ้น ฉันเปลี่ยนข้อความจาก 'สอดคล้อง' เป็น 'ไม่ชัดเจน' แม้ว่าฉันอาจเพิ่มว่าควรไม่ชัดเจนโดยไม่มีบริบท ดังที่ควรจะมีความชัดเจนโดยไม่ทราบว่าสิ่งที่สายป้อนคือว่าผลลัพธ์ที่เป็นจริงหรือเท็จ ดังนั้นตัวละครเดียวสำหรับความจริงและไม่มีอะไรที่เป็นเท็จจะดี
Beefster


1

JavaScript (Node.js) , 53 ไบต์

ฉันคิดว่านี่เป็นวิธีที่ตรงไปตรงมาที่สุดในการทำเช่นนั้น

f=s=>(w=s.replace(/(.).\1/,"$1"))==s?w.length==1:f(w)

ลองออนไลน์!

JavaScript (Node.js)ขนาด 72 ไบต์

เรื่องไม่สำคัญ แต่อีกต่อไป

s=>[...s].reduce((a,x)=>(a[a.length-2]==x?a.pop():a.push(x),a),[])==s[0]

ลองออนไลน์!

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