Xác minh chương trình Brainfuck


17

Một vấn đề phân tích cú pháp Brainfuck khác, nhưng lần này ... khác.

Bạn đang làm việc trong Infinite Monkeys Incorporated, công ty sản xuất các chương trình Brainfuck, để giải quyết các vấn đề thú vị khác nhau (tình cờ, không kém - sau tất cả, công ty thực hiện các chương trình ngẫu nhiên). Tuy nhiên, có vẻ như các máy Turing nhanh của bạn chỉ thực hiện Brainfuck có một vấn đề nhỏ và tốn kém với lỗi cú pháp - tạo một và máy tính phát nổ. Đây có thể là một lỗ hổng thiết kế, nhưng không ai bận tâm để tìm hiểu lý do tại sao nó xảy ra.

Vì các máy Turing (đặc biệt là máy nhanh) rất đắt tiền (xét cho cùng, chúng có RAM vô hạn có giá), sẽ tốt hơn để đảm bảo rằng chương trình không có bất kỳ lỗi cú pháp nào trước khi thực thi mã. Công ty của bạn sẽ chạy rất nhiều mã, vì vậy xác minh thủ công sẽ không hoạt động. Viết chương trình đọc mã STDIN cho mã Brainfuck và thoát với trạng thái thoát được đặt thành bất kỳ giá trị nào khác 0 (lỗi) nếu chương trình có bất kỳ lỗi cú pháp nào (ví dụ: ]là lỗi cú pháp, vì không khớp [). Thoát với trạng thái thoát được đặt thành 0 nếu chương trình hoàn toàn tốt.

Hãy chắc chắn rằng chương trình của bạn thông báo chính xác các lỗi liên quan []. Bạn sẽ không muốn một máy tính khác phát nổ, phải không? Ồ, và đảm bảo rằng nó càng ngắn càng tốt - sếp của bạn trả tiền cho các chương trình ngắn (vì anh ta nghĩ rằng chúng nhanh, hoặc một cái gì đó). Ồ, và bạn không phải mã hóa trong Brainfuck (thực tế, bạn không thể, vì Brainfuck không hỗ trợ mã thoát) - mã của bạn sẽ được chạy trên máy tính bình thường.

Vì vậy, như bạn có thể thấy, công việc của bạn là kiểm tra xem chương trình Brainfuck có "hợp lệ" không (có []các biểu tượng được ghép nối ). Xin lưu ý rằng các chương trình Brainfuck có thể có các nhân vật khác hơn [], vì vậy đừng từ chối chương trình chỉ vì nó có các lệnh khác. Mã nhỏ nhất sẽ thắng, nhưng có lẽ bạn sẽ quan tâm nhiều hơn về upvote.


1
Còn những ngôn ngữ không cho phép thiết lập mã thoát quy trình thì sao?
Kendall Frey

1
@KendallFrey: Đơn giản, sử dụng cái gì khác. Hoặc trong GolfScript, nhúng mã Ruby. Có lẽ điều này chặn một số ngôn ngữ lập trình bí truyền, nhưng ...
Konrad Borowski

1
Bạn có thể đặt mã lỗi thành một cái gì đó không phải là 1 (miễn là nó không phải là 0) không?
bến tàu

@marinus: Tôi không biết tại sao bạn lại muốn điều đó, nhưng tôi nghĩ nó ổn.
Konrad Borowski

@GlitchMr: vì sau đó tôi có thể sử dụng GCD(a,b)thay vì 0 != a || b.
bến tàu

Câu trả lời:


6

GolfScript, 18 ký tự

.{[]`?)},~](`91?./

Mã này chạy thành công với mã thoát 0 (và in một số rác thành thiết bị xuất chuẩn) nếu dấu ngoặc vuông trong đầu vào được cân bằng. Nếu không, nó sẽ thất bại với mã thoát khác không và in thông báo lỗi sang thiết bị lỗi chuẩn, ví dụ:

(eval):2:in `/': divided by 0 (ZeroDivisionError)

hoặc là

(eval):1:in `initialize': undefined method `ginspect' for nil:NilClass (NoMethodError)

Vì thách thức không nói gì về đầu ra cho thiết bị xuất chuẩn / thiết bị xuất chuẩn, tôi cho rằng điều này đủ điều kiện. Trong mọi trường hợp, bạn luôn có thể chuyển hướng những người đến /dev/null.

Giải trình:

{[]`?)},loại bỏ mọi thứ trừ dấu ngoặc vuông từ đầu vào và ~đánh giá kết quả dưới dạng mã GolfScript. Phần khó khăn là các dấu ngoặc không cân bằng là hoàn toàn hợp pháp trong GolfScript (và thực tế, mã của tôi bao gồm một!), Vì vậy chúng tôi cần một số cách khác để làm cho mã bị sập.

Thủ thuật tôi đang sử dụng là để lại một bản sao của đầu vào ở dưới cùng của ngăn xếp, thu thập toàn bộ ngăn xếp thành một mảng (sử dụng không cân bằng ]) và tắt phần tử đầu tiên. Tại thời điểm này, ba điều có thể xảy ra:

  • Nếu đầu vào kết thúc trong một không được tiết lộ [, cố gắng dịch chuyển một phần tử khỏi một mảng trống sẽ làm hỏng trình thông dịch (trong trường hợp này, chính xác là những gì chúng ta muốn!)
  • Nếu các dấu ngoặc trong đầu vào được cân bằng, phần tử được dịch chuyển sẽ là chuỗi đầu vào ban đầu.
  • Mặt khác (nếu đầu vào có một chưa mở ]hoặc chưa được tiết lộ [) thì đó sẽ là một mảng.

Mục nhập 14 ký tự ban đầu của tôi sau đó so sánh giá trị đã dịch chuyển với một chuỗi, nó sẽ bị sập nếu đó là một mảng lồng nhau. Thật không may, hóa ra việc so sánh một mảng phẳng (hoặc cụ thể là trống) với một chuỗi cũng là hợp pháp trong GolfScript, vì vậy tôi đã phải chuyển đổi.

Thay vào đó, bài nộp hiện tại của tôi sử dụng một phương pháp rất mạnh mẽ để nói với các mảng từ các chuỗi: nó hủy bỏ chúng và cố gắng tìm sự xuất hiện đầu tiên của [(mã ASCII 91), sẽ bằng 0 nếu và chỉ khi không bị loại bỏ biến là một mảng. Nếu vậy, việc chia số 0 với chính nó sẽ kích hoạt sự cố mong muốn.

Thi thiên Hai giải pháp 18 char khác là:

.{[]`?)},{.}%~](n<

.{[]`?)},~]([n]+n<

Than ôi, tôi chưa tìm thấy một cách ngắn hơn để giải quyết "vấn đề mảng trống".


cái này có cân bằng không?: ][(tức là nó có bị lỗi trong chương trình của bạn không?)
Justin

@Quincunx: Nó thất bại, vì nó nên.
Ilmari Karonen

Tuy nhiên, nó đã được chấp nhận [[]; Tôi đã sửa nó ngay bây giờ, với chi phí là 4 ký tự, và nó vượt qua tất cả các thử nghiệm của tôi bây giờ.
Ilmari Karonen

Nếu tôi hiểu bạn một cách chính xác, bạn đã có một giải pháp 14 char không phân biệt được một chuỗi và một mảng chỉ trong trường hợp mảng đó trống. 1+sẽ biến một mảng trống thành một mảng không trống, một mảng không trống thành một mảng không trống và một chuỗi thành một chuỗi.
Peter Taylor

@PeterTaylor: Vâng, đúng vậy .{[]`?)},~](n<. Tôi đã thử 1+, nhưng có vẻ như mảng cần chứa thứ gì đó không phải là số (có lẽ là do trình thông dịch sẽ bị sập khi nó cố gắng so sánh đệ quy một ký tự với một mảng / chuỗi). Việc sử dụng n+cũng không hoạt động, vì nó ép mảng thành một chuỗi; [n]+ không hoạt động, nhưng vẫn đặt tôi ở mức 18 ký tự.
Ilmari Karonen

17

Brainfuck 76 byte

>>+[<+++++++++[->---------<]+>-[--[[-]<->]<[<[->-]>[<+]<]>]<[-<+>]+>,]<<[<+]

Điều này vượt ra khỏi các liên kết của nó nếu dấu ngoặc vuông không cân bằng biến trình thông dịch / trình biên dịch bf thành lỗi thời gian chạy và một số trong số chúng có mã thoát để phản ánh điều đó.

yêu cầu eof = 0, gói giá trị và số lượng ô chính xác

Trong Ubuntu, bạn có thể sử dụng trình thông dịch bf( sudo apt-get install bf)

% echo '[[[]' | bf -n bf_matching.bf
Error: Out of range! Youwanted to '<' below the first cell.
To solve, add some '>'s at the beginning, for example.
an error occured
% echo $? 
5
% bf -n bf_matching.bf < bf_matching.bf
% echo $?
0

5
Tôi thích cách bạn sử dụng Brainfuck mặc dù câu hỏi nói rằng điều đó là không thể.
Đạp xe

Tuyệt vời. Tôi thực sự ngạc nhiên. Tôi cho rằng điều đó là không thể, nhưng thực tế không phải vậy.
Konrad Borowski

1
@xfix: Brainfuck là Turing hoàn tất để nó có thể làm bất cứ điều gì (cho những hạn chế I / O.)
marinus

2
@marinus Hoàn thành Turing chỉ có nghĩa là nó có thể thực hiện tất cả các tính toán. Brainfucklà Turing hoàn tất mà không có I / O vì bạn có thể chạy một chương trình tính toán bất kỳ phép tính nào và xem kết quả bằng cách kiểm tra bộ nhớ của nó sau khi chạy. BF mà không có I / O sẽ khiến mọi người ít quan tâm hơn vì sẽ khó tạo ra các tiện ích. ví dụ tôi không bao giờ có thể làm phiên dịch lisp của tôi .
Sylwester

14

Befunge 98 - 26 31 20 19 ký tự

~:']-!\'[-!-+:0`j#q

Đã thoát khỏi một số điều kiện lớn. Bây giờ chương trình hoạt động như sau:

~:   read an input char and duplicate it

']-! push a 1 if the char is the ] char, 0 otherwise

\    swap the comparison value for the duplicated input char

'[-! push a 1 if the char is the [ char, 0 otherwise

-    subtract the two comparison values. If the second one is 1, the first is 0, 
     so the result is -1. Else if the second one is 0, the first is 1 and the result is
     1. Else, the first and the second are both 0 and the result is 0

+    Add the number to the counter (which is 0 if there is none already)

:0`  test if the counter is positive (that'd mean an invalid program). Pushes a 1 if 
     positive, 0 otherwise.

j#q  if the counter is positive, then this jumps to the q. Otherwise, it skips the q 
     and continues to the ~ at the beginning of the line. If there are no more chars in
     the input, then the IP will be sent back to the q. 

qthoát khỏi chương trình và bật giá trị hàng đầu dưới dạng giá trị lỗi. Giá trị lỗi sẽ là -1 1 nếu có quá nhiều ]'s, 0 nếu chúng cân bằng và âm dương nếu có quá nhiều ['. Nếu số là tích cực tiêu cực, sau đó là nhiều giá trị tuyệt đối của con số ]'s là cần thiết để cân bằng chương trình.

Chỉnh sửa: Chuyển đổi tăng và giảm. [được sử dụng để tăng bộ đếm và ]được sử dụng để giảm nó. Bằng cách chuyển đổi nó, tôi lưu 1 char, vì đối với điều kiện thoát, tôi chỉ phải kiểm tra xem bộ đếm có dương không, thay vì âm.


Phiên bản cũ

~:'[-!j;\1+\#;']-!j;1-#;:0\`j#q

Mã này hoạt động như sau:

~    read one char of input
:    duplicate it
'[-! push 1 if the character is [, 0 otherwise
j    jump that number of characters
;    skip until next ;
\1+\ increment counter

similarily for ].

#q when end of input is reached, ~ reflects the IP back. q ends the program with the error value on the stack.

Chỉnh sửa: nhận ra rằng đầu vào được chấp nhận này như thế ][, bây giờ nó kết thúc bất cứ khi nào số đếm bị âm, sử dụng

:0\`j


@JoKing khá đẹp, sử dụng khoảng cách giữa []để so sánh với cả hai.
Justin

6

J ( 38 35)

exit({:+.<./)+/\+/1 _1*'[]'=/1!:1[3

Giải trình:

  • 1!:1[3: đọc stdin
  • '[]'=/: tạo một ma trận trong đó hàng đầu tiên là bitmask của [s trong đầu vào và hàng thứ hai là ]s.
  • 1 _1*: nhân hàng thứ nhất với 1 và hàng thứ hai với -1.
  • +/: tổng các cột của ma trận lại với nhau, tạo ra thụt lề delta cho mỗi ký tự
  • +/\: tạo tổng cộng các hoạt động này, đưa ra mức thụt ở mỗi ký tự
  • ({:+.<./): trả về GCD của phần tử cuối cùng ( {:) và phần tử nhỏ nhất ( <./). Nếu tất cả các niềng răng phù hợp, cả hai nên được 0như vậy điều này sẽ trở lại 0. Nếu niềng răng không khớp, nó sẽ trả về giá trị khác không.
  • exit: đặt giá trị thoát cho đó và thoát.

Sự cố tốt đẹp ...
Chris Cashwell

6

hồng ngọc (64)

exit $<.read.tr('^[]','').tap{|x|0while x.gsub!('[]','')}.empty?

trước đây (68) đó là:

exit ARGF.read.tr('^[]','').tap{|x| 0 while x.gsub!('[]','')}.empty?

Một giải pháp tương đương khác sử dụng

exit $<.read.tr('^[]','').tap{|x|0while x.gsub!('[]','')}.size>0

không thể sử dụng sizemột mình vì nó sẽ cho âm tính giả (!!!) khi tổng số dấu ngoặc không cân bằng là bội số của 256


Đây là cá tuyết. Tôi chắc rằng bạn có thể loại bỏ một số khoảng trắng ở đây. Ruby có phần nhạy cảm với khoảng trắng, nhưng nó bỏ qua nó trong nhiều trường hợp. Để bắt đầu, bạn không cần khoảng trắng gần =toán tử.
Konrad Borowski

phiên bản tốt hơn (phần nào lấy cảm hứng từ giải pháp sed + tr). Tôi không chắc mình có thể tốt hơn thế này nhiều. Ít nhất nó có thấp đến 4 khoảng trắng!
viết lại

1
Tuy nhiên, tôi có thể loại bỏ hai trong số họ.
Konrad Borowski

2
Tôi nghĩ rằng không gian xung quanh 0có thể đi.
bến tàu

lừa không gian tuyệt vời, cảm ơn!
viết lại

5

Perl, 30 ký tự

Regl đệ quy Perl cơ bản của bạn để giải cứu:

perl -0ne 'exit!/^(([^][]|\[(?1)\])*)$/'

Đối với những người không quen thuộc với các đối số dòng lệnh được sử dụng ở đây: -0cho phép một người đặt ký tự kết thúc dòng cho mục đích nhập tệp; sử dụng -0không có đối số sẽ đặt ký tự kết thúc dòng thành EOF. -ntự động đọc đầu vào (trong trường hợp này là toàn bộ tệp) vào $_trước.

Nếu regex khớp, nó trả về giá trị thực, được phủ định thành 0 cho mã thoát. Mặt khác, giá trị trả về sai mang lại mã thoát là 1.


Đoán tôi sẽ phải đánh golf câu trả lời của tôi tốt hơn để đánh bại giải pháp 30 char này.
Justin

Đó Giải pháp của tôi bây giờ ngắn hơn nhiều so với trước đây. Giải pháp tốt đẹp. +1
Justin

4

bash (tr + sed) - 42

[ -z `tr -Cd []|sed ":a;s/\[\]//g;t a"` ]

Nếu bạn không nhớ các thông báo lỗi thì bạn có thể xóa khoảng trắng cuối cùng giữa `]để có chiều dài 41.


Trừ khi tôi bỏ lỡ bất cứ điều gì, bạn có sử dụng vô dụng cat$()(cũng "[]"có thể được viết là []). Tôi đã chấp nhận câu trả lời này, nhưng cho đến khi tôi sẽ thấy những cải thiện về chiều dài, tôi sẽ không nêu lên điều này, vì trong khi ngắn, nó có thể ngắn hơn cho bash.
Konrad Borowski

Chà, thực ra tôi không biết kịch bản shell tốt lắm. Tôi không thể làm cho hầu hết những công việc đó. Tôi đã thay thế $()bằng backticks và đã làm "[]"-> []bạn đề xuất.
shiona


1
Tôi có thể có thanh kiếm tôi đã thử và thất bại điều này, nhưng tôi đã sai.
shiona

3

Perl (56 ký tự)

$/=0;$r=qr/[^][]*(\[(??{$r})\])*[^][]*/;<>=~m/^$r$/||die

Giải pháp Perl rõ ràng: một regex đệ quy. Thật không may, nó là một cấu trúc khá dài dòng.


3

Haskell (143)

import System.Exit
f=exitFailure
v c []|c==0=exitSuccess|True=f
v c (s:t)|c<0=f|s=='['=v(c+1)t|s==']'=v(c-1)t|True=v c t
main=getContents>>=v 0

to jgon: Sử dụng 2 vệ sĩ dường như dày đặc hơn if-then-other. Ngoài ra, tôi không nghĩ rằng kiểm tra của bạn rằng dấu ngoặc theo đúng thứ tự ("] [" đạt)


oh wow, chỉ thấy bình luận này khi nó được chỉ ra ngày hôm nay. Đã sửa mã của tôi, nhưng vâng, các vệ sĩ dường như dày đặc hơn (+1).
jgon

3

C, 73 64 ký tự

Nhờ các đề xuất từ ​​Breadbox (mặc dù điều này có thể yêu cầu ít người làm việc cuối cùng):

i;main(c){while(read(0,&c,1)*(i+1))i+=(c==91)-(c==93);return i;}

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

  • ngầm định int toàn cầu iđược khởi tạo thành 0
  • ctrở thành một int ẩn được argc(khởi tạo thành 1 nhưng chúng tôi không quan tâm, miễn là các bit cao hơn không được đặt)
  • read(0,&c,1)đọc một ký tự đơn vào byte thấp của c (trên các kiến ​​trúc endian nhỏ) và trả về 0 tại EOF; i+1 != 0trừ khi trích dẫn khung cân bằng đi đến -1; nhân chúng lại với nhau hoạt động như một boolean (an toàn) VÀ mất ít char hơn&&
  • c==91ước tính thành 1 cho '['c==93đánh giá thành 1 cho']' . (Có thể có một số mẹo nhỏ khó hiểu sẽ nhỏ hơn nhưng tôi không thể nghĩ ra bất cứ điều gì.)
  • return ithoát với mã trạng thái 0 nếu nó cân bằng, khác không nếu không. Trở về -1 về mặt kỹ thuật vi phạm POSIX nhưng thực tế không ai quan tâm đến điều đó.

Phiên bản trước:

main(i){char c;i=0;while(read(0,&c,1)*(i+1))i+=(c==91)-(c==93);return i;}

Sử dụng getchar()thay vì đọc sẽ rút ngắn mã và cho phép bạn sử dụng (ẩn) intthay vì charcho biến của bạn. Cũng nên nhớ rằng toàn cầu được tự động khởi tạo về không.
hộp bánh mì

Cảm ơn, tôi đã quên về getchar (). Tuy nhiên, không chắc chắn cách init toàn cầu giúp - xác định int int toàn cầu có nhiều ký tự hơn là sử dụng argc ẩn.
lông mịn

1
Quả cầu cũng có thể được ẩn. Bên ngoài của một chức năng c;xác định một int toàn cầu.
hộp bánh mì

Trong khi đó, getchar (c) cuối cùng không làm cho nó ngắn hơn, ít nhất là sử dụng phương pháp này, bởi vì nó cần phải được kiểm tra> = 0 theo một cách nào đó và một int ẩn cho c được truyền vào read () không được đảm bảo làm việc do endianness.
lông mịn

Thế còn ][? Tôi chắc chắn rằng nó không cân bằng. Bạn không phải theo dõi liệu nó có bị âm ít nhất một lần không?
vsz

2

Lua, 56

os.exit(("["..io.read"*a".."]"):match"^%b[]$"and 0 or 1)

"^%b[]$"Cái này là cái gì? Bạn có thể giải thích? Chắc chắn, đây không phải là regex?
Cruncher

@Cruncher: Không phải. Đó là mẫu Lua, không phải regex (Các mẫu Lua tương tự như mẫu regex, nhưng chúng không có). Trong trường hợp này, nó khớp với phần đầu của chuỗi ( ^), tập hợp cân bằng []với bất kỳ thứ gì nằm giữa ( %b[]) và cuối chuỗi ($ ).
Konrad Borowski

1

GTB , 55

0→O:0→X[`I@I="[":X+1→X@I="]":X-1→X@X<0:1→O@!!Ig;e]l;e~O

Hoa hậu []

Sử dụng 0để dừng lại.


1

MATHEMATICA, 88 ký tự

s = "[ [ my crazy code ] [ don't explode please! [] [ :)Ahh) ]  [] []]]";

r=StringReplace;
StringLength@FixedPoint[r[#,"[]"-> ""]&,r[s,Except@Characters["[]"]-> ""]]

Với chức năng s name like RoutExpression` và StringLengthtôi không bao giờ có thể giành được bối cảnh golf mã văn bản với Mathematica! :)
Murta

Tôi hiểu ý của bạn :) ToCharacterCodecũng lâu hơn ordnhiều ... PS: Còn về việc đặt mã thoát thì sao?
Ajasja

Length[StringCases[s,"["|"]"]//.{x___,"[","]",y___}:>{x,y}]
alephalpha

1

Hồng ngọc 59 58

Quét để mở và đóng khung, đếm [là 1 và ]-1, và thoát nếu số đếm giảm xuống dưới 0.

b=0
$<.read.scan(/\]|\[/){exit 1if(b+=92-$&.ord)<0}
exit b

1
Được nâng cấp và rút ngắn bởi một ký tự (Tôi đã xóa khoảng trắng sau exit 1trong trường hợp bạn yêu cầu).
Konrad Borowski

1

Kali , 104 byte

func main(){l=0;r=0;b=input();foreach (c in b){if(c=="[")l++;if(c=="]")r++;}if(!(r==l))exit(1);exit(0);}

Mở rộng hoàn toàn (lưu ý không hoạt động trong trình thông dịch trực tuyến vì đầu vào () bị tắt) tại đây


1

Mã máy Turing, 286 276 byte

Một lần nữa, tôi đang sử dụng cú pháp bảng quy tắc được xác định ở đây.

0 * * l 1
1 _ ! r Q
5 _ _ r 5
5 * * * W
W [ ! l E
W ] ! l T
W _ _ l I
W * ! r *
E ! ! l *
E * * * R
R _ [ r O
R * * l *
T ! ! l *
T * * * Y
Y _ _ r U
Y * * l *
U [ _ r O
U ! ! * halt-err
I ! ! l *
I _ _ r halt
I * * l halt-err
O ! ! r Q
O _ _ l I
O * * r *
Q ! ! r *
Q * * * W

Chấm dứt ở trạng thái haltchấp nhận đầu vào và halt-errtừ chối nó.


halt-errcó thể ngắn hơn, chẳng hạn như halt*.
Erik the Outgolfer

1

Bình thường, 25 byte

Ilzv::z"[^[\]]"k"]\[""],[

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

Dịch thuật Python 3:
import re
z=input()
if len(z):
 print(eval(re.sub("]\[","],[",re.sub("[^[\]]","",z))))

1

Haskell ( 167 , 159)

Có phải điều này chủ yếu là để giải trí, nếu có ai có bất kỳ đề xuất nào về cách làm cho nó ngắn hơn, tôi rất vui khi nghe họ tho :)

import System.Exit
p x y b|b=x|True=y
main=getContents>>=(return.all (>=0).scanl (\v->p (v-1) (v+1).(==']')) 0.filter (`elem`"[]"))>>=p exitSuccess exitFailure

Chỉnh sửa: Đã sửa lỗi cho tôi trong phần bình luận (đã thêm 11 byte).

Chỉnh sửa 2: Đã tạo chức năng phụ trợ để kiểm tra các vị từ bằng cách sử dụng các bộ bảo vệ được lấy cảm hứng từ user13350, loại bỏ 8 byte.



@ user202729 Đó là một điểm tuyệt vời, đó là siêu bất cẩn. Khá chắc chắn rằng nó đã được sửa bây giờ.
jgon

1

Stax , 14 11 ký tự

╬Äτ↔EªÉs «Ü

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

Tín dụng cho @recursive cho -3 byte.

Tương đương ASCII:

.[]Y|&{yz|egp!

Xóa tất cả các ký tự ngoại trừ [], sau đó xóa []cho đến khi chuỗi không còn thay đổi. Trả về 1nếu chuỗi cuối cùng trống.


1
Đẹp. Bạn có thể sử dụng .[]|&để lọc các ký tự và sau đó sử dụng lại nghĩa đen cho 11
đệ quy
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.