Tìm hiểu xem đây có phải là một chương trình Stack Mèo hợp lệ, theo phong cách Stack Mèo!


16

Lý lịch

Stack Mèo là một ngôn ngữ bí truyền đảo ngược được thực hiện bởi Martin Ender. Mỗi lệnh trong Stack Mèo là nghịch đảo của chính nó (được biểu diễn dưới dạng một ký tự đối xứng, chẳng hạn như -_:T|) hoặc có lệnh nghịch đảo của nó (được biểu thị dưới dạng hình ảnh phản chiếu, chẳng hạn như () {} [] <>). Mèo Stack có một yêu cầu cú pháp mạnh mẽ rằng toàn bộ chương trình phải là hình ảnh phản chiếu của chính nó. Lưu ý rằng điều này có nghĩa là bất kỳ chương trình Stack Mèo hợp lệ nào cũng là một ambigram hình ảnh phản chiếu tự nhiên .

Dưới đây là toàn bộ bộ lệnh của Stack Mèo:

  • Tự đối xứng: !*+-:=ITX^_|
  • Các cặp đối xứng: () {} [] <> \/

Bất kỳ ký tự nào khác đều không hợp lệ; bất kỳ đầu vào nào có ký tự không nằm trong bộ ký tự ở trên sẽ xuất sai.

Ngôn ngữ có hạn chế bổ sung (){}cặp phải luôn cân bằng, nhưng vì lợi ích của sự đơn giản, bạn không cần phải kiểm tra các điều kiện này.

Sau đây là một số ví dụ về chương trình Stack Mèo hợp lệ (một lần nữa, lưu ý rằng bạn không kiểm tra các parens cân bằng):

{[+]==[+]}
[)>^<(]
({T)}|{(T})
<(*]{[:!-_:>}<[<)*(>]>{<:_-!:]}[*)>

Đây không phải là:

b<+>d
())(
({[<++<]})

Thử thách

Viết chương trình hoặc hàm xác định xem chuỗi đã cho có phải là chương trình Stack Mèo hợp lệ không. Mã của bạn cũng phải là một ambigram hình ảnh phản chiếu tự nhiên , có nghĩa là:

  • Mã của bạn phải là một hình ảnh phản chiếu của chính nó.
    • Mã của bạn có thể có một hoặc nhiều dòng mới, miễn là toàn bộ mã, được hiển thị một cách tự nhiên, là hình ảnh phản chiếu của chính nó.
    • Bạn có thể bỏ qua hoặc thêm các khoảng trắng ở cuối mỗi dòng vì nó không thay đổi hiển thị.
    • Các ký tự tab không được phép vì chúng có một chút mơ hồ trên màn hình.

Lưu ý: mã của bạn không phải là chương trình Stack Mèo hợp lệ; nó có thể chứa một số ký tự phụ không được phép trong Stack Mèo. (Xem bên dưới để biết danh sách đầy đủ.)

Ví dụ: hai chương trình sau đây là đối xứng (và do đó, đệ trình hợp lệ ), trong khi chương trình thứ ba thì không:

({bTd})
[<q|p>]
({bTd})
  IXI
({bTd})
IXI
  • Về "tính đối xứng gương", chỉ xem xét tính đối xứng kiểu Stack Cat (ví dụ: ({IH})không phải là một đệ trình hợp lệ, mặc dù nó có tính đối xứng gương).
  • Mã của bạn chỉ có thể chứa các bộ ký tự này, cộng với dòng mới:
    • Tự đối xứng: dấu cách ( 0x20) +!"'*+-.8:=AHIMOTUVWXY^_ovwx|
    • Các cặp đối xứng: () /\ <> [] bd pq {}

Bộ ký tự được chọn là đối xứng nghiêm ngặt hoặc tự đối xứng khi được hiển thị dưới dạng mã trên SE.

Đầu vào và đầu ra

Phạm vi đầu vào là bất kỳ chuỗi ký tự ASCII có thể in một dòng nào .

Bạn có thể chọn lấy đầu vào dưới dạng chuỗi, danh sách ký tự hoặc danh sách các giá trị ASCII.

Bạn có thể chọn đầu ra:

  • Bất kỳ giá trị trung thực / giả nào như được xác định bởi ngôn ngữ bạn chọn
    • Các giá trị kết quả thực tế có thể khác nhau giữa các đầu vào (ví dụ: đầu ra 1 cho đầu vào trung thực và 2 cho đầu vào trung thực khác).
    • Trao đổi giá trị trung thực và giả mạo không được phép.
  • Bất kỳ hai giá trị không đổi cho đúng / sai tương ứng
    • Trong trường hợp này, các giá trị kết quả phải chính xác là một trong hai giá trị không đổi.

Bạn nên chỉ định phương thức nhập và giá trị đầu ra trong bài gửi của mình.

Điều kiện chiến thắng

Đây là , do đó, byte thấp nhất trong mỗi ngôn ngữ sẽ thắng.

Ghi chú

  • Sơ hở tiêu chuẩn bị cấm như bình thường.
  • Tất nhiên bạn có thể giải quyết điều này trong Stack Mèo, nhưng cơ hội là bạn không thể sử dụng một lá cờ cho phép giảm một nửa kích thước mã của bạn. Và đó là ngôn ngữ rất khó để chọn: P

1
Tại sao sắc nhọn #không được phép?
tsh

1
@tsh Nó hơi bị sai lệch trong nhiều phông chữ, bao gồm cả phông chữ mã trên SE (ít nhất đó là những gì tôi thấy trên Chrome).
Bong bóng

@DLosc Tôi đã cố gắng làm rõ một số điểm xung quanh nó. Nhưng nếu bạn nghĩ rằng mô tả vẫn chưa rõ ràng, xin vui lòng chỉnh sửa.
Bong bóng

Câu trả lời:


16

JavaScript (ES6), 487 467 378 298 292 280 266 264 byte

Đã lưu 14 byte nhờ @Bubbler

I=>(V=v=>!I[v]||((T=o=>[[]][+!!A[o]]||[(I[v]!=A[o]||A)[o^o<88/8]]+T(++o))(8-8)==I.pop())*V(++v))(V|(A='(){}[]<>\\/ !*+-:=ITX^_|'))//\\(('|_^XTI=:-+*! \//<>[]{}()'=A)|V)((v++)V*(()qoq.I==(8-8)((o++)T+[[8\88>o^o](A||[o]A=![v]I)]||[[o]A!!+][[]]<=o=T))||[v]I!<=v=V)<=I

Xác định một hàm ẩn danh lấy một mảng ký tự và trả về đầu ra mong muốn. Đầu ra là trung thực / giả mạo; thường 1/ 0, nhưng chuỗi rỗng cho true.

Làm sao?

Thủ thuật rõ ràng nhất là sử dụng //\\như một điểm trung tâm để nhận xét phiên bản được nhân đôi của mã. Sau đó, nó trở thành một trò chơi tìm ra cách ngắn nhất để giải quyết vấn đề chỉ bằng cách sử dụng bộ ký tự được đưa ra.

Vấn đề đầu tiên chúng tôi gặp phải là thiếu từ khóa và tích hợp. Chúng tôi vẫn có phép lạ .pop(), nhưng mọi thứ khác sẽ phải được thực hiện thông qua các toán tử được phép (bao gồm a[b]f(c)), với đệ quy để mô phỏng các vòng lặp.

Vấn đề thứ hai là thiếu các toán tử logic. Không &?được cho phép, có nghĩa là toán tử ra quyết định duy nhất chúng ta có thể sử dụng là ||. Do đó, chúng tôi phải cẩn thận cấu trúc logic của chúng tôi để giải thích cho điều này.

Điều đầu tiên tôi làm là xác định một chức năng Tphản chiếu một nhân vật riêng lẻ. Ý tưởng cơ bản là lặp qua từng ký tự trong một chuỗi các ký tự có thể nhân bản, kiểm tra từng ký tự cho bằng với char đã cho. Nếu đó là bình đẳng, chúng tôi trở lại gương-the của char tại index^1cho (){}[]<>\/, hoặc char tự cho phần còn lại.

Vấn đề đầu tiên tôi gặp phải ở đây là nhận được char nhân đôi hoặc giá trị giả trên mỗi lần lặp. Giải pháp cuối cùng tôi đã đưa ra là (x!=A[o]||A)[o^o<88/8], xký tự đầu vào ở đâu, Alà bảng chữ cái phản chiếu và olà chỉ mục hiện tại. Nếu xkhông giống như A[o], điều này cho truevà biểu thức chỉ số ước tính undefined; mặt khác, ||Akích hoạt và cuối cùng chúng ta sẽ nhận được A[o^(o<11)].

Vấn đề thứ hai là làm thế nào để chấm dứt đệ quy. Tôi thấy rằng cách tốt nhất để làm điều này là chỉ cần nối các kết quả của mỗi lần lặp, trả về chuỗi trống khi kết thúc Ađạt được. Điều này cho chúng ta hai vấn đề nữa: chuyển đổi undefineds thành chuỗi rỗng và trả lại chuỗi trống ||một cái gì đó. Chúng có thể được giải quyết bằng lạm dụng mảng: [a]+""đưa ra biểu diễn chuỗi ahoặc chuỗi trống nếu akhông được xác định. Như một phần thưởng, []là sự thật nhưng được xâu chuỗi thành chuỗi trống, vì vậy chúng ta có thể thuận tiện sử dụng chuỗi này như một "chuỗi rỗng trung thực".

Bây giờ chúng ta có thể sử dụng Thàm để phản chiếu bất kỳ ký tự đơn nào. Chúng tôi làm điều này một cách đệ quy, so sánh gương của I[v++]để I.pop()đến cuối mảng ký tự được đạt tới. Chúng tôi không thể sử dụng &&hoặc &kiểm tra xem tất cả các so sánh có đúng không, nhưng *thay vào đó hãy sử dụng . Nhân tất cả các kết quả này với nhau sẽ cho 1nếu mỗi nhân vật là tấm gương của người đối diện hoặc 0nếu có sự so sánh thất bại.

Và đó là cách cơ bản câu trả lời này hoạt động. Tôi có lẽ đã không giải thích nó rất rõ ràng, vì vậy xin vui lòng hỏi bất kỳ câu hỏi nào bạn có thể có và chỉ ra bất kỳ sai lầm nào tôi đã làm.


U=([A,...H])=>!(V=H.pop())||!(W=([x,...X]=(T="!*+-:=ITX^_|")+"(){}[]<>\\/",[o,...O]=T+")(}{][></\\")=>!x||((o!=A)+(x!=V))*(W(X,O)))()*U(H)//...280 byte
tsh

Dấu phẩy @tsh không được phép trong mã nguồn, vì chúng không đối xứng (trong phông chữ mã SE) và không có gương (trong ASCII, dù sao)
ETHproductions 26/03/18

xin lỗi, tôi đã bỏ lỡ phần đó
tsh

@tsh Lúc đầu tôi cũng đã bỏ lỡ nó và chỉ dành 20 phút cho một giải pháp để nhận ra nó không thể hợp lệ: P
ETHproductions 26/03/18

Dù sao, vì bạn đã đăng một giải pháp JavaScript. Chúng tôi không cần một giải pháp JSF * k khác ngay bây giờ ... // Nếu tôi là bạn, tôi sẽ sửa lỗi này bằng cách biên dịch nó thành JSF * k ...
tsh 26/03/18

1

Stax , 76 70 byte

:Wx^^MH_=_"{([</!*+-:=ITX^_|":W-!*pq*!-W:"|_^XTI=:-+*!\>])}"_=_HM^^xW:

Chạy và gỡ lỗi nó

Stax là bạn của Stack Mèo và có các phần bên trong để tạo ra nửa sau của chương trình Stack Mèo từ nửa đầu. Nếu chúng tôi không quan tâm đến các hạn chế về nguồn và không cần kiểm tra bộ ký tự, thì đây là giải pháp 4 byte:

4 byte

:R_=

Chạy và gỡ lỗi nó

Giải trình

:Wx^^MH_=_"{([</!*+-:=ITX^_|":W-!*pq...
:W                                         "Mirror" the string
                                           Equivalent to appending the reverse of the string to itself
                                           And map `{([</\>])}` to its mirror in the appended string
  x^^                                      2, but we can't just use `2` here ...
     MH                                    Partition the "mirror"ed string to two parts, take the later part.
       _=                                  The string is the same as the original one (*)
                                           `:Wx^^MH_=` is just `:R_=`, but we can't use `R` here ...
         _                                 Input string
          "{([</!*+-:=ITX^_|":W-           Remove valid characters from input
                                !          The final string is empty (**)
                                 *         (*) and (**)
                                  p        Pop and print result
                                   q       Peek stack and print
                                           Since the stack is now empty, this causes the program to terminate
                                    ...    Not executed

Sự tồn tại của RWthực sự thú vị. Kết thúc chương trình bằng cách pqkết hợp cũng là ấn tượng với tôi.
Bong bóng

Cảm ơn bạn. Các hướng dẫn thực sự là hai byte: :R:W. Tôi cảm thấy rằng tôi không thể giúp nói với tất cả mọi người rằng có những người bên trong Stax làm điều này.
Weijun Zhou
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.