Bổ sung hay chuẩn bị? Phụ thuộc


23

Brain-flak tròn một tuổi vào ngày mai! Để tôn vinh sinh nhật của nó, chúng tôi sẽ có một bữa tiệc sinh nhật theo phong cách PPCG, nơi một số người dùng đăng các câu hỏi liên quan đến não bộ! Hãy giúp chúng tôi ăn mừng! :)


Brain-flak là một ngôn ngữ bí truyền mà tôi đã viết trong đó tất cả các lệnh là dấu ngoặc và tất cả các dấu ngoặc phải được khớp hoàn toàn. Mượn định nghĩa của riêng tôi :

  • Đối với mục đích của thử thách này, "khung" là bất kỳ ký tự nào trong số này : ()[]{}<>.

  • Một cặp ngoặc được coi là "khớp" nếu dấu ngoặc mở và đóng theo đúng thứ tự và không có ký tự bên trong chúng, chẳng hạn như

    ()
    []{}
    

    Hoặc nếu mọi phân lớp bên trong của nó cũng được khớp.

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

    Subelements cũng có thể được lồng nhiều lớp sâu.

    [(){<><>[()]}<>()]
    <[{((()))}]>
    
  • Một chuỗi được coi là "Hoàn toàn khớp" khi và chỉ khi:

    1. Mỗi ký tự là một dấu ngoặc,

    2. Mỗi cặp ngoặc có khung mở và đóng đúng và theo đúng thứ tự

Trong lễ kỷ niệm sinh nhật đầu tiên của bộ não, thử thách ngày nay là về việc lấy một bộ dấu ngoặc không cân bằng và xác định loại hoạt động nào là cần thiết để làm cho bộ não hợp lệ.

  • Ví dụ, ((không phải là mã flak não hợp lệ, nhưng nếu chúng ta thêm ))vào nó, nó sẽ trở thành (()), nó hoàn toàn cân bằng, và do đó flak não hợp lệ. Điều đó làm cho đầu vào này appendable .

  • Tương tự, >}không hợp lệ, nhưng chúng ta có thể trả trước {<để thực hiện {<>}, điều này là hợp lệ. Điều đó làm cho đầu vào này prependable .

  • Một số đầu vào phức tạp hơn một chút. Ví dụ, )][({không thể được thực hiện hợp lệ hoàn toàn bằng cách nối thêm hoặc trả trước. Nhưng nó có thể được thực hiện hợp lệ bằng cách thêm [(và bổ sung })]. Do đó, nhập vào đây là cả prependableappendable .

  • Cuối cùng, một số đầu vào không bao giờ có thể được tạo thành mã não hợp lệ bằng bất kỳ sự kết hợp nào của việc nối thêm hoặc trả trước. Ví dụ, (>không bao giờ có thể được thực hiện hợp lệ. (Chuẩn bị <tạo <(>và nối thêm )tạo (>), cả hai đều không hợp lệ) Do đó, đầu vào này không phải là phụ lục hoặc có thể bổ sung.

Đối với thử thách ngày hôm nay, bạn phải viết một chương trình hoặc hàm lấy một chuỗi dấu ngoặc và xác định xem chuỗi đó có phải là

appendable
prependable
both
neither

Bạn có thể chọn những giá trị bạn sử dụng để đại diện cho từng trường hợp. Ví dụ, xuất ra 1, 2, 3, 4, hay 'a', 'p', 'b', 'n', hoặc 1, 'foo', 3.1415, -17, hoặc bất cứ điều gì là tốt. Miễn là mỗi đầu ra là khác biệtnhất quán , điều đó là tốt. Tuy nhiên, bạn phải xác định rõ đầu ra tương ứng với trường hợp nào.

Bạn có thể trả về giá trị này ở bất kỳ định dạng nào thuận tiện nhất (ví dụ: trả về từ một hàm, in sang STDOUT, sửa đổi đối số, ghi vào tệp, v.v.).

Bạn có thể giả định rằng đầu vào sẽ không bao giờ là hợp lệ hoặc trống rỗng.

Ví dụ

Các đầu vào sau đều prependable :

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

Đây là tất cả appendable :

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

Đây là tất cả cả hai :

))((
>()[(()){
>{

Và đây là tất cả không phải :

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

Như thường lệ, đây là , do đó, sơ hở tiêu chuẩn được áp dụng và câu trả lời ngắn nhất bằng byte sẽ thắng!


Thử thách này đặc biệt khó khăn trong trò chơi trí não, vì vậy, tối đa chỉ ra bất kỳ và mọi câu trả lời được viết bằng trò chơi trí tuệ. :)


1
maximum brownie pointsTôi nghĩ rằng việc cung cấp điểm brownie và cookie tối đa thay vào đó sẽ khuyến khích Brain-Flakes thách thức này hơn là chỉ điểm brownie, vì tôi không nghĩ nó tầm thường ở bất kỳ ngôn ngữ nào , chứ đừng nói đến Brain-Flak. : P
Erik the Outgolfer

FYI: Tất cả các thử nghiệm đều kết thúc bằng dấu ngoặc mở, tất cả các thử nghiệm đều không kết thúc bằng dấu ngoặc đóng.
Jonathan Allan

2
Tôi cho rằng 'cả hai' là thuật ngữ sai. Một chuỗi như ][không appendable, như không có gì bạn có thể thêm có thể làm cho nó có hiệu lực. Tương tự, nó không phải là điều khoản trước. Đó là ... 'có thể chèn'! Bạn có thể chèn nó vào một chuỗi để tạo ra toàn bộ Brainflak hợp lệ.
orlp

Các chuỗi đã cân bằng cả hai hay không?
Thuật sĩ lúa mì

@wheatwizard Chuỗi cân bằng sẽ không được cung cấp làm đầu vào. You can assume that the input will never be valid brain-flak or empty.
DJMcMayhem

Câu trả lời:


6

Thạch , 33 32 37 35 34 byte

tìm thấy lỗi, sửa lỗi khủng khiếp +5 byte, sửa lỗi tốt hơn - 2 byte, bằng cách sử dụng một thủ thuật của Adnan tôi đã thấy ở đây để có thêm -1.

“({[<“)}]>”Z;@WœṣF¥/µÐLO‘&2µIṀ>0ȯQ

Trả về giá trị:

prepends [2]
 appends [0]
    both [2,0]
 neither 1

(Đầu vào không hợp lệ trả về kết quả giả, mặc dù Brain-flack hợp lệ, trả về [].)

Hãy thử trực tuyến! - một bộ kiểm tra (in mushed cơ quan đại diện, vì vậy20cho[2,0], và bỏ qua các dòng có chứa bất kỳ-).


5

Võng mạc , 41 40 41 byte

Lưu 1 byte nhờ @MartinEnder

+`\(\)|\[]|{}|<>

[]})>]+
1
\W+
0
...+
01

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

  • Chuẩn bị là 1
  • Bổ sung là 0
  • Cả hai là 10
  • Không có gì 01

Chỉnh sửa

  • Đạt được 1 byte để sửa lỗi được chú ý bởi @Neil

[]})>]tiết kiệm một byte.
Martin Ender

@MartinEnder Ah, đó là vì bộ ký tự không thể để trống, cảm ơn!
Kritixi Lithos

Điều này không hoạt động cho tất cả các đầu vào không thể nối thêm, ví dụ (][). Tôi nghĩ rằng nó có thể được sửa chữa với chi phí một byte bằng cách thay đổi 101thành ...+.
Neil

@Neil Cảm ơn bạn đã chú ý đến lỗi này, tôi tự hỏi liệu có trường hợp nào Bothnhư vậy không
Kritixi Lithos

Không, tôi nghĩ 10là sự kết hợp hợp lệ duy nhất cho Both.
Neil

3

Batch, 337 byte

@echo off
set/ps=
:g
set "t=%s:<>=%
set "t=%t:()=%
set "t=%t:[]=%
set "t=%t:{}=%
if not "%t%"=="%s%" set "s=%t%"&goto g
set "s=%s:<=[%
set s=%s:>=]%
set s=%s:(=[%
set s=%s:)=]%
set s=%s:{=[%
set s=%s:}=]%
:l
if %s:~,2%==]] set s=%s:~1%&goto l
:r
if %s:~-2%==[[ set s=%s:~,-1%&goto l
if not _%s:~2%==_ set s=[]
echo %s%

Đầu ra ]cho trả trước, [để nối thêm, ][cho cả hai, []cho cả hai.


3

Haskell , 115 108 byte

CHỈNH SỬA:

  • -7 byte: Sử dụng nhiều vệ sĩ hơn.
(""#)
s#""=[s>"",1>0]
s#(c:d)|Just a<-lookup c$zip"([{<"")]}>"=(a:s)#d|(a:b)<-s=[1|a==c]>>b#d|0<1=take 1$s#d

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

Sử dụng như thế nào (""#) "))". Kết quả được đưa ra là:

[False,True]: needs nothing
[False]: prependable
[True,True]: appendable
[True]: both
[]: neither

Làm thế nào nó hoạt động

  • Mã hóa đầu ra được chọn sao cho nhu cầu trả trước được báo hiệu bằng cách bỏ phần tử thứ hai của kết quả cho phần còn lại, nếu có, trong khi không khớp hoàn toàn được báo hiệu bằng cách bỏ tất cả chúng.
  • s#dphân tích một chuỗi còn lại d, đưa ra một chuỗi / chồng scác dấu ngoặc đóng dự kiến.
    • Các s#""kiểm tra dòng nếu tất cả các dấu ngoặc đóng đã được tìm thấy vào cuối của chuỗi, nếu không phụ thêm là cần thiết.
    • Nhánh đầu tiên s#(c:d)kiểm tra xem ký tự tiếp theo ccó phải là dấu ngoặc mở không và nếu có thì hãy để khung đóng tương ứng trên ngăn xếp cho đệ quy.
    • Mặt khác, nếu ngăn xếp chứa dấu ngoặc đóng, nhánh thứ hai sẽ kiểm tra xem phần trên cùng có khớp với ký tự tiếp theo không và nếu không, sẽ trả về một danh sách trống thay vì đệ quy.
    • Cuối cùng, trong nhánh cuối cùng, ngăn xếp trống và chúng ta có một khung đóng chưa từng có có thể được sửa bằng cách trả trước, trước khi đệ quy.

2

Japt , 44 byte

=Ue"%(%)|%[]|\{}|<>" ®c -1&2|1})f31 |UfD |Ug

Đầu ra 1cho trước, 3cho thêm, 13cho cả hai và 31cho cả hai.

Kiểm tra nó trực tuyến! hoặc Xác minh tất cả các trường hợp thử nghiệm cùng một lúc.

Làm thế nào nó hoạt động

 =Ue"%(%)|%[]|\{}|<>" ®   c -1&2|1})f31 |UfD |Ug
U=Ue"%(%)|%[]|\{}|<>" mZ{Zc -1&2|1})f31 |UfD |Ug

                    // "(((()()())))}"  "([({}{})"    ">()[(()){"  "((((<>()]"
Ue"%(%)|%[]|\{}|<>" // Recursively remove all instances of "()", "[]", "{}", and "<>" from U.
                    // "}"              "(["          ">[{"        "((((]"
mZ{Zc -1&2|1}       // Replace each char Z with (Z.charCodeAt() - 1) & 2 | 1.
                    // "1"              "33"          "133"        "33331"
U=                  // Save the result in U.
f31 |UfD |Ug        // Match all instances of "31" and "13" (D = 13) and bitwise-OR the results with the first char.
                    // null|null|1      null|null|3   null|13|1    31|null|3
                    // 1                3             13           31
                    // Implicit: output result of last expression

2

PHP, 137 byte

for($c=1;$c;)$a=preg_replace("#<>|\(\)|\[\]|\{\}#","",$a=&$argn,-1,$c);echo($a=preg_replace(["#[]})>]+#","#[[{(<]+#"],[1,2],$a))<13?$a:0;

1 => bổ sung,

2 => có thể cho phép

12 => cả hai,

0 => không

Tủ thử


"Miễn là mỗi đầu ra là khác biệt và nhất quán, điều đó tốt". Điều này dường như không có một giá trị phù hợp cho cả.
Cyoce

@Cyoce Hiện đã được sửa
Jörg Hülsermann
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.