Có phải là núi không?


29

Thử thách

Đối với thử thách này, một chuỗi núi là một chuỗi tuân theo quy tắc ngữ pháp M: x(Mx)*trong đó tại mỗi sản phẩm, tất cả các x đều là cùng một ký tự. Khi thụt lề, một chuỗi núi có thể trông giống như thế này:

A
 B
  C
   D
  C
   E
    F
   E
  C
 B
A

Như bạn có thể thấy, nó trông hơi giống một ngọn núi từ bên cạnh.

Định nghĩa chính thức

  • Bất kỳ nhân vật duy nhất alà miền núi.
  • Nếu Slà một chuỗi núi và alà một ký tự, thì aSalà một miền núi, trong đó juxtap vị trí đại diện cho nối chuỗi.
  • Nếu aSaaTalà chuỗi núi, thì aSaTalà một chuỗi núi. Lưu ý rằng quy tắc này ngụ ý rằng mẫu này giữ cho bất kỳ số lần lặp lại. (ví dụ aSaTaUa, aSaTaUaVa, aSaTaUaVaWa... đều là miền núi.)

Ví dụ

Tất cả các palindromes chiều dài lẻ là núi, ví dụ:

t
 a
  c
   o
  c
 a
t

qwertytrasdfdgdsarewqjklkjq là một ví dụ ít tầm thường hơn:

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

Kết quả đầu ra

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

Quy tắc

  • Đây là một vấn đề quyết định, do đó, bất kỳ biểu diễn nào đúng hay sai đều là đầu ra hợp lệ miễn là nó đúng, nhất quán, không mơ hồ và chương trình kết thúc trong một khoảng thời gian hữu hạn. Hãy chắc chắn để nêu quy ước đầu ra của bạn với giải pháp của bạn.
    • Sẽ là tầm thường để xác định xem đầu ra chỉ ra đúng hay sai mà không cần phải biết chuỗi đầu vào là gì. Lưu ý rằng điều này không có nghĩa là đầu ra trung thực hoặc sai lệch phải không đổi, tuy nhiên quy ước "in chuỗi núi nếu chuỗi là núi và chuỗi không núi nếu không phải là núi" là một lỗ hổng bị cấm vì những lý do rõ ràng.
    • Mặt khác, một quy ước như "ném một ngoại lệ cho sai và thoát âm thầm cho đúng" sẽ ổn, cũng như "in một ký tự duy nhất thành đúng và bất cứ điều gì khác cho sai"
  • Đây là mã golf, vì vậy chương trình ngắn nhất sẽ thắng.
  • Sơ hở tiêu chuẩn bị cấm.

4
Một trường hợp thử nghiệm như thế aaasẽ tốt, trong đó cùng một nhân vật cần được sử dụng trên nhiều cấp độ.
Martin Ender

Bạn có chắc chắn về wasitacaroraratisaw? Nó có vẻ phù hợp với tôi
TonMedel

wasitacaroraratisawthực sự là miền núi AFAICT
ETHproductions

Nên nó là. Tôi đoán rằng tôi chỉ đang cố gắng tìm một "gần như palindrom", nhưng tôi đã tìm thấy một chuỗi núi một cách tình cờ.
Beefster

2
Tôi nghĩ rằng điều này sẽ dễ giải quyết bằng cách tách chuỗi trên ký tự đầu tiên của nó, nhưng các trường hợp như aaalàm cho nó không hoạt động.
xnor

Câu trả lời:




6

Perl, 22 byte

Bao gồm +chop

perl -pe '$_=/^((.)((?1)\2)*)$/' <<< abcbcbcbcba

In 1 cho đúng, không có gì sai


5

Brain-Flak , 78 byte

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

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

In 1 cho đúng, không có gì sai.

Để xác minh một từ miền núi, việc giả sử từ "xuống" ngọn núi là bất cứ khi nào có thể.



3

Prolog (SWI) , 29 byte

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

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

Chương trình này xác định quy tắc DCG a//0phù hợp với bất kỳ chuỗi nào (danh sách các ký tự) là một chuỗi miền núi.

Giải trình

Đối với chương trình này, tôi sử dụng một định nghĩa hơi khác nhưng tương đương với các chuỗi núi so với những gì được mô tả trong thử thách: Chuỗi núi là một ký tự được ctheo sau bởi một số (có thể bằng 0) của các chuỗi núi được cgắn vào hai đầu của chúng. Trong một ký hiệu regex ngắn gọn hơn, một chuỗi núi phải khớp với mẫu c(Mc)*trong đó Mlà một chuỗi núi và *có nghĩa là biểu thức trong ngoặc đơn được lặp lại từ 0 lần trở lên. Lưu ý rằng trong khi mỗi cái cphải là cùng một ký tự, thì mỗi Mcái không cần phải là một chuỗi miền giống nhau.

Bằng chứng tương đương

Rõ ràng là quy tắc 1 và 2 từ thử thách tương đương với quy tắc của tôi khi Mcxảy ra tương ứng 0 và một lần.

Trong trường hợp đó, chuỗi núi đã Mcxảy ra nlần mà n > 1sau đó các chuỗi có thể được viết lại như cMcScnơi Slà sau n - 1lần đó Mcxảy ra trừ người cuối cùng c(lưu ý rằng Mbất kỳ chuỗi núi và không nhất thiết phải giống như khác M). Vì Mlà một chuỗi núi, theo quy tắc 2, cMcphải là một chuỗi núi. Hoặc Slà một chuỗi núi trong trường hợp này cSclà một chuỗi núi hoặc Scó thể được viết lại như cMcTcnơi Tlà sau n - 2lần đó Mcxảy ra trừ người cuối cùng c. Dòng lý luận này có thể tiếp tục được áp dụng cho đến khi chuỗi không được đảm bảo là miền núi chứaMcmột lần có nghĩa là nó cũng sẽ phải là núi. Như vậy vì cMclà miền núi và nếu cMccM'clà miền núi thì cMcM'cphải là miền núi, toàn bộ chuỗi phải là miền núi.

Đối với converse, đối với một chuỗi cScTcở đâu cSccTclà miền núi thì đó cSclà một chuỗi núi theo quy tắc 2 hoặc theo quy tắc 3. Nếu đó là một chuỗi núi theo quy tắc 2 thì Scũng phải là một chuỗi núi. Nếu đó là một chuỗi núi theo quy tắc 3 thì cScphải có dạng cUcVcở đâu cUccVclà các chuỗi núi. Vì thời gian dài hơn cUccVcvẫn phải có ít nhất hai ký tự ngắn hơn cScvà quy tắc 3 yêu cầu ít nhất 5 ký tự được áp dụng sau đó sau khi số lượng ứng dụng quy tắc 3 hữu hạn, mỗi chuỗi giữa các chuỗi cđược chọn bởi các ứng dụng của quy tắc 3 phải là một miền chuỗi. Cùng một dòng lý luận có thể được áp dụng chocTc do đó, chuỗi là núi theo định nghĩa của tôi.

Vì bất kỳ chuỗi nào phù hợp với định nghĩa của tôi là miền núi và định nghĩa của tôi phù hợp với tất cả các chuỗi miền núi, nên nó tương đương với chuỗi được đưa ra trong câu hỏi.

Giải thích về Mã

Nhìn chung a//0, quy tắc DCG, được xác định trên dòng đầu tiên, khớp với bất kỳ chuỗi miền núi nào. Các +//1quy tắc DCG (như các vị từ, quy tắc DCG có thể được cung cấp cho tên nhà điều hành ), được xác định trên dòng hai, phù hợp với bất kỳ chuỗi mà được tạo thành từ một chuỗi các số không hay núi hơn chuỗi với nhân vật thông qua như là đối số của nó Xtacked vào tận cùng trong số họ . Hoặc mượn regex giống như ký hiệu tôi đã sử dụng ở trên, a//0trận đấu c(Mc)*nhưng outsources công việc thực sự phù hợp với (Mc)*để +//1mà mất cnhư là đối số của nó X.

Từng dòng từng mã hành xử như sau:

a-->[X],+X.

Dòng này xác định quy tắc DCG a. Các [X]trạng thái rằng ký tự đầu tiên phải bằng với biến hiện không được xác định X. Điều này dẫn đến Xviệc được đặt bằng với ký tự đầu tiên. Sau +Xđó tuyên bố rằng phần còn lại của chuỗi phải khớp với quy tắc DCG +//1với ký tự Xđược đặt thành đối số của nó.

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

Dòng này xác định +//1quy tắc DCG. Đại ;diện cho một hoặc trong Prolog có nghĩa là chuỗi có thể khớp với []hoặc a,[X],+X. Đại []diện cho chuỗi trống vì vậy +//1luôn có khả năng khớp với chuỗi trống. Nếu chuỗi không trống thì bắt đầu của chuỗi phải khớp a//0và do đó phải là chuỗi miền. Điều này sau đó phải được theo sau bởi bất kỳ nhân vật nào Xđược đặt thành. Cuối cùng, phần còn lại của chuỗi phải khớp +X.


2

Husk , 15 byte

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

Hãy thử trực tuyến! Kiểu suy luận mất khoảng 40 giây, vì vậy hãy kiên nhẫn.

Giải trình

εωφΓ§?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.

Ý tưởng là để liên tục thay thế một chuỗi có dạng abavới acho đến khi điều này không còn có thể. Đầu vào là miền núi khi và chỉ khi điều này dẫn đến một chuỗi ký tự đơn (đó là những gì εkiểm tra). Tình huống nguy hiểm duy nhất là khi chúng ta có một chuỗi như thế này, nơi abadường như không phải là một đỉnh:

a
 b
  a
   c
  a
   d
  a
 b
a

May mắn thay, chúng ta luôn có thể biến nó thành một:

a
 b
a
 c
a
 d
a
 b
a

Tôi tin rằng việc trả lại một ký tự cho truecác trường hợp và nếu không sẽ là "nhất quán".
Jonathan Allan

Trên thực tế điều đó có thể thúc đẩy nó, vì không có ranh giới rõ ràng giữa điều đó và không-op ("trả lại một chuỗi núi khi miền núi và không phải là khác") rõ ràng sẽ là một lỗ hổng.
Jonathan Allan

@Jonathan ALLan Các ký tự đơn so với các chuỗi khác cũng có vẻ hơi mờ đối với tôi, đặc biệt vì nó không liên quan nhiều đến tính trung thực (chỉ có chuỗi trống là giả mạo trong Husk).
Zgarb

Đúng là "bất kỳ đại diện" nào rõ ràng là quá tự do - Tôi đã nhận xét uner OP :)
Jonathan Allan

Tôi thực sự muốn định nghĩa là tự do bởi vì nó cho phép các giải pháp sáng tạo hơn. Tôi đã thay đổi từ ngữ từ 'nhất quán' thành 'rõ ràng', mặc dù tôi cũng có thể thêm rằng nó nên rõ ràng mà không có ngữ cảnh. Như trong, nó phải rõ ràng mà không cần biết chuỗi đầu vào là kết quả đúng hay sai. Vì vậy, một ký tự duy nhất cho đúng và không có gì sai sẽ tốt.
Beefster


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.