Số lượng của một người khác và người khác phải bằng nhau. Bạn đã có được nó máy tính?


75

Trong cuốn sách khoa học máy tính phổ biến (và thiết yếu), Giới thiệu về Ngôn ngữ chính thức và Automata của Peter Linz, ngôn ngữ chính thức sau đây thường được nêu:

Định nghĩa

chủ yếu là vì ngôn ngữ này không thể được xử lý với automata trạng thái hữu hạn. Biểu thức này có nghĩa là "Ngôn ngữ L bao gồm tất cả các chuỗi 'a theo sau là' b ', trong đó số' a 'và' b 'bằng nhau và khác không".

Thử thách

Viết chương trình / hàm làm việc có một chuỗi, chỉ chứa "a" s và "b" , làm đầu vào và trả về / xuất giá trị thật , cho biết nếu chuỗi này hợp lệ là ngôn ngữ chính thức L.

  • Chương trình của bạn không thể sử dụng bất kỳ công cụ tính toán bên ngoài nào, bao gồm mạng, chương trình bên ngoài, v.v ... Shell là một ngoại lệ đối với quy tắc này; Bash, ví dụ, có thể sử dụng các tiện ích dòng lệnh.

  • Chương trình của bạn phải trả về / xuất kết quả theo cách "hợp lý", ví dụ: trả về 10 thay vì 0, âm thanh "bíp", xuất ra thiết bị xuất chuẩn, v.v. Thông tin thêm ở đây.

  • Quy tắc golf tiêu chuẩn áp dụng.

Đây là một . Mã ngắn nhất trong byte thắng. Chúc may mắn!

Trường hợp thử nghiệm thật

"ab"
"aabb"
"aaabbb"
"aaaabbbb"
"aaaaabbbbb"
"aaaaaabbbbbb"

Trường hợp thử nghiệm giả

""
"a"
"b"
"aa"
"ba"
"bb"
"aaa"
"aab"
"aba"
"abb"
"baa"
"bab"
"bba"
"bbb"
"aaaa"
"aaab"
"aaba"
"abaa"
"abab"
"abba"
"abbb"
"baaa"
"baab"
"baba"
"babb"
"bbaa"
"bbab"
"bbba"
"bbbb"

24
Có thể đầu vào được sản phẩm nào? (Bạn đang nói nó không phải là một phần của ngôn ngữ, nhưng không phải đó là đầu vào mà chúng ta cần xem xét.)
Martin Ender

1
Điều gì xảy ra nếu ngôn ngữ của chúng ta không có sự thật hoặc giả? Sẽ empty string == truthynon-empty string == falsyđược chấp nhận?
DJMcMayhem

5
Thử thách thú vị, nhưng tôi nghĩ rằng tiêu đề có thể ít mơ hồ hơn (nghĩa là đề cập đến a^n b^nhoặc tương tự, thay vì chỉ số as bằng số bs)
Sp3000

1
@ Sp3000 Tôi chọn tiêu đề này vì nó trông vui nhộn. Tôi có thể thay đổi nó sau này thành sth khác ...

1
Tôi hơi ngạc nhiên khi trong hơn 50 câu trả lời Tôi là người duy nhất sử dụng máy tạo paser. Để chắc chắn rằng nó không cạnh tranh nghiêm ngặt về độ dài, nhưng vấn đề được đặt ra là một trong những phân tích ngôn ngữ đơn giản nhưng không tầm thường. Tôi rất muốn xem câu trả lời trong các cú pháp trình biên dịch khác vì tôi không quen với các lựa chọn này.
dmckee

Câu trả lời:


34

MATL , 5 4 byte

tSP-

In một mảng không trống 1 s nếu chuỗi thuộc về L và một mảng trống hoặc một mảng có 0 s (cả hai đều sai).

Cảm ơn @LuisMendo vì đã chơi golf 1 byte!

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

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

t      Push a copy of the implicitly read input.
 S     Sort the copy.
  P    Reverse the sorted copy.
   -   Take the difference of the code point of the corresponding characters
       of the sorted string and the original.

6
Câu trả lời MATL thứ hai (đang hoạt động) của tôi. :)
Dennis

2
Định nghĩa kỳ lạ về sự thật và giả dối: 'aabb' cho -1 -1 1 1 là sự thật. 'aaabb' cho -1 -1 0 1 1 và bị
giả mạo

3
@Etoplay Một mảng không trống với tất cả các giá trị khác không phải là sự thật. Đó là định nghĩa được sử dụng trong Matlab và Octave
Luis Mendo

145

Python 3, 32 byte

eval(input().translate(")("*50))

Đầu ra thông qua mã thoát : Lỗi sai, không có lỗi cho True.

Chuỗi được đánh giá là mã Python, thay thế parens (cho a)cho b. Chỉ các biểu thức của biểu mẫu a^n b^ntrở thành biểu thức được định dạng tốt của dấu ngoặc đơn ((())), đánh giá cho bộ dữ liệu ().

Bất kỳ dấu ngoặc không khớp nào cũng có lỗi, cũng như nhiều nhóm sẽ thích (()()), vì không có dấu phân cách. Chuỗi rỗng cũng thất bại (nó sẽ thành công trên exec).

Việc chuyển đổi ( -> a, ) -> bđược thực hiện bằng cách sử dụng str.translate, thay thế các ký tự như được chỉ định bởi một chuỗi đóng vai trò là bảng chuyển đổi. Với chuỗi 100 độ dài ") (" * 50, các bảng ánh xạ 100 giá trị ASCII đầu tiên là

... Z[\]^_`abc
... )()()()()(

mà mất ( -> a, ) -> b. Trong Python 2, các chuyển đổi cho tất cả 256 giá trị ASCII phải được cung cấp, yêu cầu "ab"*128, dài hơn một byte; cảm ơn isaacg đã chỉ ra điều này


58
Ok, thật thông minh.
TLW

Làm gì *128?
Erik các Outgolfer

5
128có thể được thay thế bằng 50(hoặc 99cho vấn đề đó) để lưu một byte.
isaacg

@ Eʀɪᴋ Gᴏʟғᴇʀ: Tôi nghĩ đó là định lượng lượng tử. Nhưng tôi không thực sự biết Python và chưa tìm thấy tài liệu nào về điều đó.
Tít

4
@isaacg Cảm ơn, tôi không biết rằng đã thay đổi cho Python 3.
xnor

28

Võng mạc , 12 byte

Tín dụng cho FryAmTheEggman, người đã tìm thấy giải pháp này một cách độc lập.

+`a;?b
;
^;$

In 1cho đầu vào hợp lệ và 0cách khác.

Hãy thử trực tuyến! (Dòng đầu tiên cho phép bộ kiểm tra được phân tách bằng nguồn cấp.)

Giải trình

Các nhóm cân bằng đòi hỏi cú pháp đắt tiền, vì vậy thay vào đó tôi đang cố gắng giảm đầu vào hợp lệ thành một hình thức đơn giản.

Giai đoạn 1

+`a;?b
;

Việc báo +cho Retina lặp lại giai đoạn này trong một vòng lặp cho đến khi đầu ra ngừng thay đổi. Nó phù hợp với hoặc abhoặc a;bthay thế nó bằng ;. Hãy xem xét một vài trường hợp:

  • Nếu as và bs trong chuỗi không cân bằng theo cùng một cách ()thông thường cần phải có, một số ahoặc bsẽ vẫn ở trong chuỗi, vì ba, hoặc b;akhông thể được giải quyết và một ahoặc bkhông thể tự mình hoặc. Để thoát khỏi tất cả các as và bs phải có một tương ứng bvới bên phải của mỗi a.
  • Nếu abđang không phải tất cả lồng nhau (ví dụ như nếu chúng ta có một cái gì đó giống như ababhoặc aabaabbb) sau đó chúng tôi sẽ kết thúc với nhiều ;(và có thể một số as và bs) bởi vì phiên đầu tiên sẽ tìm thấy nhiều abs để chèn chúng và lặp đi lặp lại sẽ tiếp tục duy trì số lượng ;trong chuỗi.

Do đó, nếu và chỉ khi đầu vào có dạng , chúng ta sẽ kết thúc bằng một chuỗi trong chuỗi.anbn;

Giai đoạn 2:

^;$

Kiểm tra xem chuỗi kết quả có chứa gì ngoài một dấu chấm phẩy không. (Khi tôi nói "kiểm tra" ý tôi thực sự là ", hãy đếm số lượng trận đấu của regex đã cho, nhưng vì regex đó có thể khớp nhiều nhất một lần do các neo, điều này mang lại 0hoặc 1.)


25

Haskell, 31 byte

f s=s==[c|c<-"ab",'a'<-s]&&s>""

Việc hiểu danh sách [c|c<-"ab",'a'<-s]tạo ra một chuỗi một 'a'cho mỗi 'a'trong s, theo sau là một 'b'cho mỗi 'a'trong s. Nó tránh đếm bằng cách khớp trên hằng số và tạo đầu ra cho mỗi trận đấu.

Chuỗi này được kiểm tra bằng với chuỗi gốc và chuỗi gốc được kiểm tra là không trống.


Cái này thật đáng yêu. Tôi thường quên rằng Haskell sắp xếp các yếu tố của việc hiểu danh sách theo cách nhất quán và rất cụ thể hữu ích như thế nào.
Vectornaut

Đẹp hơn nhiều so với nỗ lực tốt nhất của tôi ( f=g.span id.map(=='a');g(a,b)=or a&&b==(not<$>a)). Làm tốt.
Jules

Ồ, tôi không biết người ta có thể khớp với hằng số trong việc hiểu danh sách!
rubik

16

Vết bẩn , 12 byte

A=\aA?\b
e`A

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

Giải trình

Dòng đầu tiên định nghĩa một nonterminal A, khớp với một chữ cái a, có thể là nonterminal A, và sau đó là một chữ cái b. Dòng thứ hai khớp với toàn bộ đầu vào ( e) so với nonterminal A.

Phiên bản không biên dịch 8 byte

e`\a_?\b

Sau khi viết phiên bản đầu tiên của câu trả lời này, tôi đã cập nhật Grime để xem _là tên của biểu thức cấp cao nhất. Giải pháp này tương đương với ở trên, nhưng tránh lặp lại nhãn A.


Tại sao bạn không làm điều đó trong J?
Nữ tu rò rỉ

@LeakyNun Tôi chỉ muốn thể hiện Grime. : P
Zgarb

Bạn xây dựng ngôn ngữ này?
Nữ tu rò rỉ

@LeakyNun Vâng. Phát triển chậm, nhưng đang diễn ra.
Zgarb

11

Brachylog , 23 19 byte

@2L,?lye:"ab"rz:jaL

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

Giải trình

@2L,                  Split the input in two, the list containing the two halves is L
    ?lye              Take a number I between 0 and the length of the input              
        :"ab"rz       Zip the string "ab" with that number, resulting in [["a":I]:["b":I]]
               :jaL   Apply juxtapose with that zip as input and L as output
                        i.e. "a" concatenated I times to itself makes the first string of L
                        and "b" concatenated I times to itself makes the second string of L

8
Chúc mừng bạn đã nhận được trên tryitonline.net!
Nữ tu rò rỉ

10

05AB1E , 9 byte

Mã số:

.M{J¹ÔQ0r

Giải trình:

.M         # Get the most frequent element from the input. If the count is equal, this
           results into ['a', 'b'] or ['b', 'a'].
  {        # Sort this list, which should result into ['a', 'b'].
   J       # Join this list.
    Ô      # Connected uniquified. E.g. "aaabbb" -> "ab" and "aabbaa" -> "aba".
     Q     # Check if both strings are equal.
      0r   # (Print 0 if the input is empty).

Hai byte cuối cùng có thể bị loại bỏ nếu đầu vào được đảm bảo không trống.

Sử dụng mã hóa CP-1252 . Hãy thử trực tuyến! .


Điều gì xảy ra với đầu vào trống?
admBorkBork

2
Tìm kiếm khác không trong bài viết; nó ở đó :)
Lynn

@Lynn Không phải thông số kỹ thuật chỉ nói không cho ngôn ngữ hợp lệ chứ? Không phải về đầu vào.
Emigna

Thật. Nghĩ sai ở đó. Nhưng bạn vẫn có thể làm .M{J¹ÔQ0rcho bạn.
Emigna

@Emigna Cảm ơn, tôi đã chỉnh sửa bài viết.
Ad Nam

9

Thạch , 6 byte

Ṣ=Ṛ¬Pȧ

Tự in chuỗi nếu nó thuộc L hoặc trống và 0 khác.

Hãy thử trực tuyến! hoặc xác minh tất cả các trường hợp thử nghiệm .

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

Ṣ=Ṛ¬Pȧ  Main link. Argument: s (string)

Ṣ       Yield s, sorted.
  Ṛ     Yield s, reversed.
 =      Compare each character of sorted s with each character of reversed s.
   ¬    Take the logical NOT of each resulting Boolean.
    P   Take the product of the resulting Booleans.
        This will yield 1 if s ∊ L or s == "", and 0 otherwise.
     ȧ  Take the logical AND with s.
       This will replace 1 with s. Since an empty string is falsy in Jelly,
       the result is still correct if s == "".

Phiên bản thay thế, 4 byte (không cạnh tranh)

ṢnṚȦ

In 1 hoặc 0 . Hãy thử trực tuyến! hoặc xác minh tất cả các trường hợp thử nghiệm .

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

ṢnṚȦ  Main link. Argument: s (string)

Ṣ     Yield s, sorted.
  Ṛ   Yield s, reversed.
 n    Compare each character of the results, returning 1 iff they're not equal.
   Ȧ  All (Octave-style truthy); return 1 if the list is non-empty and all numbers
      are non-zero, 0 in all other cases.

9

J, 17 byte

#<.(-:'ab'#~-:@#)

Điều này hoạt động chính xác để đưa falsey cho chuỗi trống. Lỗi là chim ưng.

Phiên bản cũ:

-:'ab'#~-:@#
2&#-:'ab'#~#   NB. thanks to miles

Bằng chứng và giải thích

Động từ chính là một ngã ba bao gồm ba động từ sau:

# <. (-:'ab'#~-:@#)

Điều này có nghĩa là, "Nhỏ hơn ( <.) độ dài ( #) và kết quả của tine phải ( (-:'ab'#~-:@#))".

Tine bên phải là 4 tàu , bao gồm:

(-:) ('ab') (#~) (-:@#)

Hãy kđại diện cho đầu vào của chúng tôi. Sau đó, điều này tương đương với:

k -: ('ab' #~ -:@#) k

-:là toán tử khớp, do đó, các -:thử nghiệm hàng đầu cho bất biến dưới ngã ba đơn âm 'ab' #~ -:@#.

Vì tine trái của ngã ba là một động từ, nó trở thành một hàm không đổi. Vì vậy, ngã ba tương đương với:

'ab' #~ (-:@# k)

Tine phải của nửa ngã ba ( -:) chiều dài ( #) của k. Quan sát #:

   1 # 'ab'
'ab'
   2 # 'ab'
'aabb'
   3 # 'ab'
'aaabbb'
   'ab' #~ 3
'aaabbb'

Bây giờ, đây kchỉ là trên đầu vào hợp lệ, vì vậy chúng tôi được thực hiện ở đây. #lỗi cho chuỗi có độ dài lẻ, không bao giờ thỏa mãn ngôn ngữ, do đó chúng tôi cũng đã thực hiện.

Kết hợp với độ dài nhỏ hơn và chuỗi này, chuỗi rỗng, không phải là một phần của ngôn ngữ của chúng tôi, mang lại độ dài của nó 0và chúng tôi đã hoàn thành tất cả.


Tôi đã sửa đổi nó 2&#-:'ab'#~#để cho phép bạn tránh lỗi và chỉ xuất ra 0trong khi vẫn sử dụng 12 byte.
dặm

@miles Hấp dẫn! Tôi chưa bao giờ nghĩ về nó như thế.
Conor O'Brien

Điều này có xử lý chuỗi trống?
Zgarb

@Zgarb đã sửa nó!
Conor O'Brien

9

Bison / YACC 60 (hoặc 29) byte

(Chà, việc biên dịch cho chương trình YACC là một vài bước nên có thể muốn bao gồm một số cho điều đó. Xem bên dưới để biết chi tiết.)

%%
l:c'\n';
c:'a''b'|'a'c'b';
%%
yylex(){return getchar();}

Hàm này khá rõ ràng nếu bạn biết diễn giải nó theo ngữ pháp chính thức. Trình phân tích cú pháp chấp nhận một abhoặc atheo sau bởi bất kỳ chuỗi nào được chấp nhận theo sau bởi mộtb .

Việc triển khai này dựa trên một trình biên dịch chấp nhận ngữ nghĩa K & R để mất một vài ký tự.

Đó là nhiều hơn tôi muốn với nhu cầu xác định yylexvà gọi getchar.

Biên dịch với

$ yacc equal.yacc
$ gcc -m64 --std=c89 y.tab.c -o equal -L/usr/local/opt/bison/lib/ -ly

(hầu hết các tùy chọn cho gcc là dành riêng cho hệ thống của tôi và không nên tính theo số byte; bạn có thể muốn tính -std=c89thêm 8 vào giá trị được liệt kê).

Chạy với

$ echo "aabb" | ./equal

hoặc tương đương.

Giá trị thật được trả về HĐH và lỗi cũng báo cáo syntax errorvới dòng lệnh. Nếu tôi chỉ có thể đếm phần mã xác định hàm phân tích cú pháp (đó là bỏ qua phần thứ hai %%và tất cả các phần tiếp theo), tôi nhận được số lượng 29 byte.


7

Perl 5.10, 35 17 byte (có cờ -n )

say/^(a(?1)?b)$/

Đảm bảo rằng chuỗi bắt đầu bằng as và sau đó đệ quyb s. Nó chỉ phù hợp nếu cả hai chiều dài bằng nhau.

Cảm ơn Martin Ender giảm một nửa số byte và dạy tôi một chút về đệ quy trong regexes: D

Nó trả về toàn bộ chuỗi nếu nó khớp, và không có gì nếu không.

Hãy thử nó ở đây!


Gần nhất tôi có thể quản lý bao gồm trường hợp kiểm tra không trống là 18 byte: $_&&=y/a//==y/b//(yêu cầu -p), nếu không có khoảng trống, bạn có thể bỏ qua &&16! Rất gần ...
Dom Hastings

1
Vì vậy, tôi có thể thực hiện thêm 17 byte: echo -n 'aaabbb'|perl -pe '$_+=y/a//==y/b//'nhưng tôi không thể thay đổi một byte khác ... Có thể phải từ bỏ việc này!
Dom Hastings

7

JavaScript, 54 55 44

s=>s&&s.match(`^a{${l=s.length/2}}b{${l}}$`)

Xây dựng một regex đơn giản dựa trên độ dài của chuỗi và kiểm tra nó. Đối với một chuỗi dài 4 ( aabb) regex trông giống như:^a{2}b{2}$

Trả về một giá trị trung thực hoặc falsey.

11 byte được lưu nhờ Neil.

f=s=>s&&s.match(`^a{${l=s.length/2}}b{${l}}$`)
// true
console.log(f('ab'), !!f('ab'))
console.log(f('aabb'), !!f('aabb'))
console.log(f('aaaaabbbbb'), !!f('aaaaabbbbb'))
// false
console.log(f('a'), !!f('a'))
console.log(f('b'), !!f('b'))
console.log(f('ba'), !!f('ba'))
console.log(f('aaab'), !!f('aaab'))
console.log(f('ababab'), !!f('ababab'))
console.log(f('c'), !!f('c'))
console.log(f('abc'), !!f('abc'))
console.log(f(''), !!f(''))


f=thể được bỏ qua.
Rò rỉ Nun

Là một biểu thức chức năng là một đệ trình hợp lệ, hoặc nó thực sự phải là, ahem, chức năng?
Scimonster

Một chức năng là một đệ trình hợp lệ.
Rò rỉ Nun

@TimmyD Nó được sử dụng để trả về true, nhưng bây giờ nó trả về false.
Scimonster

1
s=>s.match(`^a{${s.length/2}}b+$`)?
l4m2

5

C, 57 53 byte

t;x(char*s){t+=*s%2*2;return--t?*s&&x(s+1):*s*!1[s];}

Giải pháp dài 57 byte cũ:

t;x(char*s){*s&1&&(t+=2);return--t?*s&&x(s+1):*s&&!1[s];}

Được biên dịch với gcc v. 4.8.2 @Ubfox

Cảm ơn ugoren cho lời khuyên!

Hãy thử nó trên Ideone!


Vì tôi mới ở đây và chưa thể nhận xét về các câu trả lời khác, tôi chỉ muốn chỉ ra rằng giải pháp 62b từ @Josh cho kết quả dương tính giả trên các chuỗi như "aaabab".
Jasmes

Thay đổi (t+=2)thành t++++-1 byte.
owacoder

@owacoder t++++không phải là mã C hợp lệ.
Jasmes

Lưu một số với t+=*s%2*2:*s*!1[s]
ugoren

Câu trả lời rất thông minh! Thật không may, thất bại khi nhập "ba": ideone.com/yxixG2
Josh

4

Võng mạc , 22 byte

Một câu trả lời ngắn hơn trong cùng một ngôn ngữ vừa xuất hiện ...

^(a)+(?<-1>b)+(?(1)c)$

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

Đây là một chương trình giới thiệu về các nhóm cân bằng trong regex, được giải thích đầy đủ bởi Martin Ender .

Vì lời giải thích của tôi sẽ không đến gần một nửa, tôi sẽ chỉ liên kết với nó và không cố gắng giải thích, vì điều đó sẽ gây bất lợi cho vinh quang của lời giải thích của anh ấy.


4

Befunge-93, 67 byte

0v@.<  0<@.!-$<  >0\v
+>~:0`!#^_:"a" -#^_$ 1
~+1_^#!-"b" _ ^#`0: <

Hãy thử nó ở đây! Có thể giải thích làm thế nào nó hoạt động sau. Cũng có thể cố gắng đánh golf nó một chút nữa, chỉ để đá.


3

MATL , 9 byte

vHI$e!d1=

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

Mảng đầu ra là trung thực nếu nó không trống và tất cả các mục của nó là khác không. Nếu không thì đó là giả. Dưới đây là một số ví dụ .

v     % concatenate the stack. Since it's empty, pushes the empty array, []
H     % push 2
I$    % specify three inputs for next function
e     % reshape(input, [], 2): this takes the input implicitly and reshapes it in 2
      % columns in column major order. If the input has odd length a zero is padded at
      % the end. For input 'aaabbb' this gives the 2D char array ['ab;'ab';'ab']
!     % transpose. This gives ['aaa;'bbb']
d     % difference along each column
1=    % test if all elements are 1. If so, that means the first tow contains 'a' and
      % the second 'b'. Implicitly display

2
Đó là một số định nghĩa thuận tiện về sự thật. (Tôi biết về yêu cầu khác không, nhưng không phải về yêu cầu không trống.)
Dennis

3

mã máy x86, 29 27 byte

Hexdump:

33 c0 40 41 80 79 ff 61 74 f8 48 41 80 79 fe 62
74 f8 0a 41 fe f7 d8 1b c0 40 c3

Mã hội:

    xor eax, eax;
loop1:
    inc eax;
    inc ecx;
    cmp byte ptr [ecx-1], 'a';
    je loop1;

loop2:
    dec eax;
    inc ecx;
    cmp byte ptr [ecx-2], 'b';
    je loop2;

    or al, [ecx-2];
    neg eax;
    sbb eax, eax;
    inc eax;
done:
    ret;

Lặp lại các abyte ở đầu, sau đó qua các byte 'b' sau đây. Vòng lặp thứ nhất tăng bộ đếm và vòng lặp thứ hai giảm nó. Sau đó, thực hiện HOẶC một chút giữa các điều kiện sau:

  1. Nếu bộ đếm không phải là 0 ở cuối, chuỗi không khớp
  2. Nếu byte theo sau chuỗi bs không bằng 0, chuỗi cũng không khớp

Sau đó, nó phải "đảo ngược" giá trị thật trong eax- đặt nó thành 0 nếu không phải là 0 và ngược lại. Hóa ra mã ngắn nhất để làm điều đó là mã 5 byte sau đây, mà tôi đã đánh cắp từ đầu ra của trình biên dịch C ++ của tôi cho result = (result == 0):

    neg eax;      // negate eax; set C flag to 1 if it was nonzero
    sbb eax, eax; // subtract eax and the C flag from eax
    inc eax;      // increase eax

1
Tôi nghĩ bạn có thể cải thiện sự phủ định của bạn. Thử: neg eaxđể đặt cờ mang như trước,cmc đảo ngược cờ mang và salcđặt AL thành FFh hoặc 0 tùy thuộc vào cờ mang có được đặt hay không. Lưu 2 byte, mặc dù kết thúc với kết quả 8 bit thay vì 32 bit.
Jules

Điều tương tự khi sử dụng ops chuỗi, với ESI trỏ đến chuỗi đầu vào và trả về kết quả trong AL (sử dụng SETcc, yêu cầu 386+):xor eax,eax | xor ecx,ecx | l1: inc ecx | lodsb | cmp al, 'a' | jz l1 | dec esi | l2: lodsb | cmp al,'b' | loopz l2 | or eax,ecx | setz al | ret
ninjalj

@ninjalj Bạn nên đăng câu trả lời - nó hoàn toàn khác với tôi và tôi nghi ngờ là ngắn hơn đáng kể!
anatolyg

3

Ruby, 24 byte

eval(gets.tr'ab','[]')*1

(Đây chỉ là ý tưởng tuyệt vời của xnor dưới dạng Ruby. Câu trả lời khác của tôi là một giải pháp tôi thực sự tự nghĩ ra.)

Chương trình diễn đầu vào, biến đổi abđể []tương ứng, và đánh giá nó.

Đầu vào hợp lệ sẽ tạo thành một mảng lồng nhau, và không có gì xảy ra. Một biểu thức không cân bằng sẽ làm cho chương trình sụp đổ. Trong Ruby, đầu vào trống được đánh giá là nil, nó sẽ sụp đổ vì nilchưa xác định *phương thức.


3

Sed, 38 + 2 = 40 byte

s/.*/c&d/;:x;s/ca(.*)bd/c\1d/;tx;/cd/p

Một đầu ra chuỗi không trống là sự thật

Máy chủ trạng thái hữu hạn không thể làm điều này, bạn nói gì? Điều gì về automata trạng thái hữu hạn với các vòng lặp . : P

Chạy với rncờ.

Giải trình

s/.*/c&d/        #Wrap the input in 'c' and 'd' (used as markers)
:x               #Define a label named 'x'
s/ca(.*)bd/c\1d/ #Deletes 'a's preceded by 'c's and equivalently for 'b's and 'd's. This shifts the markers to the center
tx               #If the previous substitution was made, jump to label x
/cd/p            #If the markers are next to one another, print the string

Cách tiếp cận tốt đẹp. Cảm ơn sự cố.
joeytwiddle

3

JavaScript, 44 42

Vượt qua 44 vẫn là 44 thường xuyên (

f=s=>(z=s.match`^a(.+)b$`)?f(z[1]):s=="ab"

Hoạt động bằng cách đệ quy tước bên ngoài abvà đệ quy sử dụng giá trị bên trong chọn nhưng .+. Khi không có kết quả khớp ^a.+b$bên trái, thì kết quả cuối cùng là liệu chuỗi còn lại có phải là giá trị chính xác hay không ab.

Các trường hợp thử nghiệm:

console.log(["ab","aabb","aaabbb","aaaabbbb","aaaaabbbbb","aaaaaabbbbbb"].every(f) == true)
console.log(["","a","b","aa","ba","bb","aaa","aab","aba","abb","baa","bab","bba","bbb","aaaa","aaab","aaba","abaa","abab","abba","abbb","baaa","baab","baba","babb","bbaa","bbab","bbba","bbbb"].some(f) == false)

3

ANTLR, 31 byte

grammar A;r:'ab'|'a'r'b'|r'\n';

Sử dụng khái niệm tương tự như câu trả lời YACC của @ dmckee , chỉ cần chơi gôn hơn một chút.

Để kiểm tra, hãy làm theo các bước trong hướng dẫn Bắt đầu của ANTLR . Sau đó, đặt đoạn mã trên vào một tệp có tên A.g4và chạy các lệnh sau:

$ antlr A.g4
$ javac A*.java

Sau đó kiểm tra bằng cách cho đầu vào trên STDIN grun A rnhư vậy:

$ echo "aaabbb" | grun A r

Nếu đầu vào hợp lệ, sẽ không có gì là đầu ra; nếu nó là không hợp lệ, grunsẽ đưa ra một lỗi (hoặc token recognition error, extraneous input, mismatched input, hoặc no viable alternative).

Ví dụ sử dụng:

$ echo "aabb" | grun A r
$ echo "abbb" | grun A r
line 1:2 mismatched input 'b' expecting {<EOF>, '
'}

Khéo léo thêm dòng mới như là một thay thế trong một quy tắc duy nhất. Tôi nghĩ rằng tôi cũng có thể tiết kiệm một vài cách trong yacc. Các grammertừ khóa là một người có mùi thúi cho chơi golf với ANTLR, mặc dù. Kinda thích sử dụng fortran .
dmckee

3

C, 69 byte

69 byte:

#define f(s)strlen(s)==2*strcspn(s,"b")&strrchr(s,97)+1==strchr(s,98)

Đối với những người không quen thuộc:

  • strlen xác định độ dài của chuỗi
  • strcspn trả về chỉ mục đầu tiên trong chuỗi nơi tìm thấy chuỗi khác
  • strchr trả về một con trỏ đến lần xuất hiện đầu tiên của một ký tự
  • strrchr trả về một con trỏ đến lần xuất hiện cuối cùng của một ký tự

Một lời cảm ơn lớn đến Tít!


1
lưu một byte >97thay vì==98
Titus

2
Giải pháp 61 byte cho kết quả dương tính giả trên các chuỗi như "aaabab". Xem ideone.com/nmT8rm
Jasmes

Ah bạn là Jasmes chính xác, cảm ơn. Tôi sẽ phải suy nghĩ lại về điều này một chút.
Josh

Quay trở lại giải pháp 69 byte, không chắc tôi có thể rút ngắn hơn bằng cách sử dụng phương pháp này không.
Josh

3

R, 64 61 55 byte, 73 67 byte (mạnh mẽ) hoặc 46 byte (nếu chuỗi trống được cho phép)

  1. Một lần nữa, câu trả lời của xnor được làm lại. Nếu nó được ngụ ý bởi các quy tắc rằng đầu vào sẽ bao gồm một chuỗi as và bs, thì nó sẽ hoạt động: trả về NULL nếu biểu thức hợp lệ, ném và lỗi hoặc không có gì khác.

    if((y<-scan(,''))>'')eval(parse(t=chartr('ab','{}',y)))
    
  2. Nếu đầu vào không mạnh mẽ và có thể chứa một số rác, ví dụ: aa3bbthì nên xem xét phiên bản sau (phải trả lại TRUEcho các trường hợp thử nghiệm thực sự, không phải NULL):

    if(length(y<-scan(,'')))is.null(eval(parse(t=chartr("ab","{}",y))))
    
  3. Cuối cùng, nếu chuỗi trống được cho phép, chúng ta có thể bỏ qua điều kiện cho đầu vào không trống:

    eval(parse(text=chartr("ab","{}",scan(,''))))
    

    Một lần nữa, NULL nếu thành công, bất cứ điều gì khác.


Tôi không biết R, R, kết quả của bạn cho đầu vào trống là gì? (nên giả mạo)
Tít

Có thực sự không có cách ngắn hơn để kiểm tra đầu vào trống?
Tít

Phiên bản 1: không có gì (chỉ trả về đầu vào đúng NULL), phiên bản 2: không có gì (chỉ trả về đầu vào đúng TRUE), phiên bản 3 (giả sử các chuỗi trống là OK, dưới dạng trạng thái) : NULL. R là một ngôn ngữ hướng đối tượng thống kê, đánh máy mọi thứ đều ổn, không có bất kỳ cảnh báo nào.
Andreï Kostyrka

Điều này (câu trả lời 1) có thể được cải thiện hơn nữa thành 55 byte:if((y<-scan(,''))>'')eval(parse(t=chartr('ab','{}',y)))
Giuseppe

3

Japt , 11 byte

©¬n eȦUg~Y

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

Cung cấp cho một trong hai truehoặc false, ngoại trừ việc ""cung cấp cho ""đó là falsy trong JS.

Giải nén & Cách thức hoạt động

U&&Uq n eXYZ{X!=Ug~Y

U&&     The input string is not empty, and...
Uq n    Convert to array of chars and sort
eXYZ{   Does every element satisfy...?
X!=       The sorted char does not equal...
Ug~Y      the char at the same position on the original string reversed

Thông qua giải pháp MATL của Dennis .


2

C (Ansi), 65 75 byte

Chơi gôn

l(b,i,j,k)char*b;{for(i=j=0;(k=b[i++])>0&k<=b[i];)j+=2*(k>97)-1;return !j;}

Giải trình:

Đặt giá trị j và tăng j trên mỗi b và giảm j trên bất kỳ thứ gì khác. Đã kiểm tra nếu chữ cái trước nhỏ hơn hoặc bằng chữ cái tiếp theo để ngăn abab hoạt động

Chỉnh sửa

Đã thêm kiểm tra cho các trường hợp abab.


Điều này sẽ không cung cấp dương tính giả trên các chuỗi như bahay abab?
Zgarb

À đúng rồi, tôi đã đọc sai bài đăng vì tôi không thể nhìn thấy bức ảnh vì nó bị chặn đối với tôi. Sửa nó!
dj0wns

2

Mẻ, 133 byte

@if ""=="%1" exit/b1        Fail if the input is empty
@set a=%1                   Grab the input into a variable for processing
@set b=%a:ab=%              Remove all `ab` substrings
@if "%a%"=="%b%" exit/b1    Fail if we didn't remove anything
@if not %a%==a%b%b exit/b1  Fail if we removed more than one `ab`
@if ""=="%b%" exit/b0       Success if there's nothing left to check
@%0 %b%                     Rinse and repeat

Trả về ERRORLEVEL0 khi thành công, 1 khi thất bại. Batch không thích thay thế chuỗi con trên các chuỗi trống, vì vậy chúng tôi phải kiểm tra trước; nếu một tham số trống là hợp pháp, dòng 6 sẽ không cần thiết.


2

PowerShell v2 +, 61 52 byte

param($n)$x=$n.length/2;$n-and$n-match"^a{$x}b{$x}$"

Lấy đầu vào $ndưới dạng một chuỗi, tạo $xnhư half the length. Xây dựng một -andso sánh Boolean giữa $nvà một -matchtoán tử regex so với biểu thức chính của một số lượng bằng nhau của a's và b'. Đầu ra Boolean$TRUE hoặc $FALSE. Có $n-andtài khoản cho ""= $FALSE.

Thay thế, 35 byte

$args-match'^(a)+(?<-1>b)+(?(1)c)$'

Điều này sử dụng regex từ câu trả lời của Leaky , dựa trên các nhóm cân bằng .NET, chỉ được gói gọn trong -matchtoán tử PowerShell . Trả về chuỗi cho sự thật, hoặc chuỗi trống cho falsey.


Trong phiên bản thay thế bạn nên đánh giá -matchlại$args[0] , nếu không -matchsẽ hoạt động như một bộ lọc
Mathias R. Jessen

@ MathiasR.Jessen Trong mã sản xuất, vâng, nhưng chúng tôi có thể đánh gôn [0]ở đây vì chúng tôi chỉ được cung cấp một đầu vào và chúng tôi chỉ cần một giá trị trung thực / falsey là đầu ra. Vì một chuỗi rỗng là falsey và một chuỗi không trống là trung thực, chúng ta có thể lọc theo mảng và lấy lại chuỗi đầu vào hoặc không có gì trở lại, đáp ứng các yêu cầu thách thức.
admBorkBork

2

Pyth - 13 byte

&zqzS*/lz2"ab

Giải thích:

  qz          #is input equal to
          "ab #the string "ab"
     *        #multiplied by
      /lz2    #length of input / 2
    S         #and sorted?
&z            #(implicitly) print if the above is true and z is not empty

Bạn có thể sử dụng một chuỗi làm đầu vào và sau đó thực hiện nó&qS*/lQ2"ab
Leaky Nun

@LeakyNun cảm ơn vì tiền boa! Bạn có thể giải thích làm thế nào / tại sao điều đó làm việc? Đây là lần đầu tiên tôi sử dụng Pyth
Cowabunghole 20/07/2016

Ví dụ: +4sẽ mở rộng sang +4Q(điền vào các đối số)
Leaky Nun

2

Haskell, 39 byte

p x=elem x$scanl(\s _->'a':s++"b")"ab"x

Ví dụ sử dụng: p "aabb"-> True.

scanl(\s _->'a':s++"b")"ab"xxây dựng một danh sách tất cả ["ab", "aabb", "aaabbb", ...]với tổng số các (length x)yếu tố.elemkiểm tra nếu xcó trong danh sách này.


2

Python, 43 40 byte

lambda s:''<s==len(s)/2*"a"+len(s)/2*"b"

bao gồm các giải pháp rõ ràng nhờ Leaky Nun

ý tưởng khác, 45 byte:

lambda s:s and list(s)==sorted(len(s)/2*"ab")

-4 byte bằng cách sử dụng len / 2 (tôi gặp lỗi khi một nửa đến sau)

bây giờ cung cấp sai cho chuỗi trống

-3 byte nhờ xnor


Vâng, lambdas không phải được đặt tên.
Nữ tu rò rỉ

lambda s:list(s)==sorted("ab"*len(s)//2)(Python 3)
Nữ tu bị rò rỉ

lambda s:s=="a"*len(s)//2+"b"*len(s)//2(Python 3)
Nữ tu bị rò rỉ

Vâng, tôi nhận ra rằng trong khi đăng nó. lol, giải pháp rõ ràng là ngắn hơn trong Python 2:
KarlKastor

1
Bạn có thể làm ''<thay vì loại s andtrừ trường hợp trống.
xnor
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.