จำนวน“ a” s และ“ b” s ต้องเท่ากัน คุณได้คอมพิวเตอร์มาใช่ไหม


75

ในหนังสือวิทยาศาสตร์คอมพิวเตอร์ที่เป็นที่นิยม (และจำเป็น), คำนำของภาษาทางการและออโตมาตะโดยปีเตอร์ลินซ์, ภาษาทางการดังต่อไปนี้มักถูกกล่าวถึง:

คำนิยาม

ส่วนใหญ่เป็นเพราะภาษานี้ไม่สามารถประมวลผลด้วยออโต้ จำกัด ขอบเขต การแสดงออกนี้หมายถึง "ภาษา L ประกอบด้วยสตริงทั้งหมดของ 'a's ตามด้วย' b's ซึ่งจำนวนของ 'a's และ' b's เท่ากันและไม่เป็นศูนย์"

ท้าทาย

เขียนโปรแกรม / ฟังก์ชั่นการทำงานที่รับค่าสตริงซึ่งบรรจุ "a" s และ "b" s เท่านั้นเป็นค่าป้อนเข้าและส่งคืน / ส่งออกค่าความจริงโดยบอกว่าสตริงนี้ถูกต้องหรือไม่

  • โปรแกรมของคุณไม่สามารถใช้เครื่องมือการคำนวณภายนอกใด ๆ รวมถึงเครือข่ายโปรแกรมภายนอก ฯลฯ เชลล์เป็นข้อยกเว้นสำหรับกฎนี้ Bash เช่นสามารถใช้อรรถประโยชน์บรรทัดคำสั่ง

  • โปรแกรมของคุณจะต้องส่งคืน / ส่งออกผลลัพธ์ด้วยวิธี "ตรรกะ" ตัวอย่างเช่น: คืนค่า 10 แทน 0, เสียง "บี๊บ" ส่งออกไปยัง stdout เป็นต้นข้อมูลเพิ่มเติมที่นี่

  • บังคับใช้กฎกอล์ฟมาตรฐาน

นี่คือรหัสกอล์ฟรหัสที่สั้นที่สุดในหน่วยไบต์ชนะ โชคดี!

กรณีทดสอบความจริง

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

กรณีทดสอบเท็จ

""
"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
สามารถป้อนข้อมูลจะว่างเปล่า? (คุณกำลังบอกว่ามันไม่ได้เป็นส่วนหนึ่งของภาษา แต่ไม่ว่าจะเป็นข้อมูลป้อนเข้าที่เราต้องพิจารณา)
Martin Ender

1
เกิดอะไรขึ้นถ้าภาษาของเราไม่มีความจริงหรือเป็นเท็จ? จะempty string == truthyและnon-empty string == falsyเป็นที่ยอมรับ?
DJMcMayhem

5
เป็นการท้าทายที่ดี แต่ฉันคิดว่าชื่ออาจมีความคลุมเครือน้อยกว่าเล็กน้อย (เช่นการกล่าวถึงa^n b^nหรือคล้ายกันแทนที่จะเป็นเพียงจำนวนaที่เท่ากับจำนวนของb)
Sp3000

1
@ Sp3000 ฉันเลือกชื่อนี้เพราะมันดูสนุก ผมอาจมีการเปลี่ยนแปลงได้ในภายหลังเพื่อ sth อื่น ...

1
ฉันแปลกใจนิดหน่อยที่มีมากกว่า 50 คำตอบฉันเป็นคนเดียวที่ใช้เครื่องมือสร้าง paser เพื่อให้แน่ใจว่ามันไม่ได้แข่งขันอย่างเข้มงวดกับความยาว แต่ปัญหาที่เกิดขึ้นเป็นหนึ่งในการแยกวิเคราะห์ภาษาที่เรียบง่าย แต่ไม่สำคัญ ฉันอยากเห็นคำตอบในไวยากรณ์คอมไพเลอร์อื่น ๆ เพราะฉันไม่ค่อยคุ้นเคยกับตัวเลือก
dmckee

คำตอบ:


34

MATL , 5 4 ไบต์

tSP-

พิมพ์อาร์เรย์ที่ไม่ว่างเปล่าเป็น1วินาทีหากสตริงเป็นของLและอาร์เรย์ว่างหรืออาร์เรย์ที่มี0วินาที (เป็นเท็จทั้งคู่) เป็นอย่างอื่น

ขอบคุณ @LuisMendo สำหรับการลงเล่น 1 ไบต์!

ลองออนไลน์!

มันทำงานอย่างไร

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
คำตอบ MATL ที่สอง (ทำงาน) ของฉัน :)
เดนนิส

2
คำจำกัดความที่แปลกประหลาดของความจริงและเท็จ: 'aabb' ให้ -1 -1 1 1 เป็นความจริง 'aaabb' ให้ -1 -1 0 1 1 และเป็นเท็จ
Etoplay

3
@Etoplay อาร์เรย์ที่ไม่ว่างพร้อมค่าทั้งหมดที่ไม่ใช่ศูนย์เป็นจริง มันเป็นคำจำกัดความที่ใช้ใน Matlab และ Octave
Luis Mendo

145

Python 3, 32 ไบต์

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

เอาต์พุตผ่านรหัสออก : ข้อผิดพลาดสำหรับเท็จไม่มีข้อผิดพลาดสำหรับ True

สตริงจะถูกประเมินว่าเป็นงูหลามรหัสแทน parens (สำหรับaและสำหรับ) bเพียง แต่การแสดงออกของรูปแบบa^n b^nกลายเป็นสำนวนที่ดีขึ้นของวงเล็บเช่น((()))การประเมินผลการ ()tuple

parens ที่ไม่ตรงกันใด ๆ ให้ข้อผิดพลาดเช่นเดียวกับหลายกลุ่มเช่น(()())เนื่องจากไม่มีตัวคั่น สตริงว่างยังล้มเหลว (มันจะประสบความสำเร็จในexec)

การแปลง( -> a, ) -> bจะทำโดยใช้str.translateซึ่งแทนที่ตัวอักษรตามที่ระบุโดยสตริงที่ทำหน้าที่เป็นตารางการแปลงเป็น กำหนดสตริงที่มีความยาว 100 ") (" * 50 ตารางจะจับคู่ค่า 100 ASCII แรกเป็น

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

ซึ่งจะใช้เวลา,( -> a ) -> bใน Python 2 คุณต้องระบุการแปลงสำหรับ 256 ASCII ทั้งหมดต้องการ"ab"*128หนึ่งไบต์อีกต่อไป ขอบคุณ isaacg ที่ชี้เรื่องนี้ออกมา


58
ตกลงนั่นฉลาด
TLW

อะไร*128ทำอย่างไร
Erik the Outgolfer

5
128สามารถถูกแทนที่ด้วย50(หรือ99สำหรับเรื่องนั้น) เพื่อบันทึกไบต์
isaacg

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ: ฉันคิดว่ามันเป็นตัวบอกปริมาณ แต่ฉันไม่รู้จัก Python จริงๆและยังไม่พบเอกสารใด ๆ เกี่ยวกับเรื่องนั้น
ติตัส

4
@isaacg ขอบคุณฉันไม่ทราบว่าเปลี่ยนไปเป็น Python 3
xnor

28

เรติน่า 12 ไบต์

ให้เครดิตแก่ FryAmTheEggman ที่พบวิธีแก้ปัญหานี้อย่างอิสระ

+`a;?b
;
^;$

พิมพ์1สำหรับอินพุตที่ถูกต้องและ0อย่างอื่น

ลองออนไลน์! (บรรทัดแรกเปิดใช้งานชุดทดสอบที่แยกบรรทัดด้วยฟีด)

คำอธิบาย

กลุ่มที่สมดุลต้องใช้ไวยากรณ์ที่มีราคาแพงดังนั้นฉันพยายามลดอินพุตที่ถูกต้องให้เป็นรูปแบบที่เรียบง่าย

ด่าน 1

+`a;?b
;

ตัว+บอกให้ Retina ทำซ้ำขั้นตอนนี้ในลูปจนกว่าเอาต์พุตจะหยุดการเปลี่ยนแปลง มันตรงกับอย่างใดอย่างหนึ่งabหรือและแทนที่มันด้วยa;b ;ลองพิจารณาบางกรณี:

  • หากas และbในสตริงจะไม่สมดุลในลักษณะเดียวกับที่(และ)ตามปกติจะต้องมีบางส่วนaหรือbจะยังคงอยู่ในสตริงตั้งแต่baหรือb;aไม่สามารถแก้ไขได้และเป็นหนึ่งเดียวaหรือbในตัวเองไม่ได้ ทั้ง. เพื่อกำจัดของทุกas และbs จะต้องมีหนึ่งที่สอดคล้องไปทางขวาของแต่ละคนba
  • ถ้าaและbจะไม่ซ้อนกันทั้งหมด (เช่นถ้าเรามีสิ่งที่ต้องการababหรือaabaabbb) แล้วเราจะจบลงด้วยหลาย;(และอาจบางaและbs) เพราะซ้ำแรกจะได้พบกับหลาย ๆabที่จะใส่พวกเขาและการทำซ้ำต่อไปจะรักษา จำนวนของ;ในสตริง

ดังนั้นถ้าหากว่าการป้อนข้อมูลเป็นรูปแบบเราจะจบลงด้วยการเดี่ยวในสตริงanbn;

ด่าน 2:

^;$

ตรวจสอบว่าสตริงผลลัพธ์มีอะไร แต่อัฒภาคเดียว (เมื่อฉันพูดว่า "ตรวจสอบ" ฉันหมายถึงจริง ๆ "นับจำนวนการแข่งขันของ regex ที่กำหนด แต่เนื่องจาก regex สามารถจับคู่ได้มากที่สุดเนื่องจากการยึดสิ่งนี้ให้อย่างใดอย่างหนึ่ง0หรือ1.)


25

Haskell, 31 ไบต์

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

ความเข้าใจรายการ[c|c<-"ab",'a'<-s]ทำให้สตริงหนึ่ง'a'สำหรับแต่ละ'a'ในsตามด้วยหนึ่ง'b'สำหรับแต่ละใน'a' sหลีกเลี่ยงการนับโดยการจับคู่ค่าคงที่และสร้างเอาต์พุตสำหรับการแข่งขันแต่ละครั้ง

สายนี้จะถูกตรวจสอบให้เท่ากับสายเดิมและสายเดิมจะถูกตรวจสอบว่าไม่ว่างเปล่า


นี่มันช่างน่ารัก ฉันมักจะลืมว่ามันมีประโยชน์แค่ไหนที่ Haskell สั่งให้องค์ประกอบของรายการเข้าใจในวิธีที่สอดคล้องและเฉพาะเจาะจงมาก
Vectornaut

ดีกว่าความพยายามของฉัน ( f=g.span id.map(=='a');g(a,b)=or a&&b==(not<$>a)) ทำได้ดี.
จูลส์

ว้าวฉันไม่รู้ว่าจะมีใครเทียบได้กับค่าคงที่ในรายการความเข้าใจ!
rubik

16

สิ่งสกปรก 12 ไบต์

A=\aA?\b
e`A

ลองออนไลน์!

คำอธิบาย

บรรทัดแรกกำหนด nonterminal Aซึ่งตรงกับจดหมายฉบับหนึ่งaอาจจะเป็น nonterminal แล้วหนึ่งตัวอักษรA bบรรทัดที่สองตรงกับทั้งการป้อนข้อมูล ( e) กับ Anonterminal

เวอร์ชันที่ไม่ใช่การเข้ารหัส 8 ไบต์

e`\a_?\b

หลังจากเขียนเวอร์ชันแรกของคำตอบนี้ฉันได้อัปเดต Grime เพื่อพิจารณา_เป็นชื่อของนิพจน์ระดับบนสุด วิธีการแก้ปัญหานี้จะเทียบเท่ากับข้างต้น Aแต่หลีกเลี่ยงการทำซ้ำฉลาก


ทำไมคุณไม่ทำใน J?
Leun Nun

@LeakyNun ฉันแค่อยากจะโชว์ Grime : P
Zgarb

คุณสร้างภาษานี้หรือไม่?
Leun Nun

@LeakyNun ใช่ การพัฒนาช้า แต่ต่อเนื่อง
Zgarb

11

Brachylog , 23 19 ไบต์

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

ลองออนไลน์!

คำอธิบาย

@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
ขอแสดงความยินดีที่คุณได้ลองใช้ tryitonline.net!
Leun Nun

10

05AB1E , 9 ไบต์

รหัส:

.M{J¹ÔQ0r

คำอธิบาย:

.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).

สองไบต์สุดท้ายสามารถยกเลิกได้หากอินพุตมีการรับประกันว่าไม่ว่างเปล่า

ใช้การเข้ารหัสCP-1252 ลองออนไลน์! .


เกิดอะไรขึ้นกับอินพุตว่างเปล่า
AdmBorkBork

2
ค้นหาไม่ใช่ศูนย์ในการโพสต์; มันอยู่ในนั้น :)
ลินน์

@Lynn สเป็คไม่ได้พูดเพียงว่าไม่มีค่าศูนย์สำหรับภาษาที่ถูกต้องใช่ไหม ไม่เกี่ยวกับอินพุต
Emigna

จริง คิดผิดที่นั่น แต่คุณยังสามารถทำ.M{J¹ÔQ0rเพื่อคุณได้
Emigna

@Emigna ขอบคุณฉันได้แก้ไขโพสต์
Adnan

9

เยลลี่ 6 ไบต์

Ṣ=Ṛ¬Pȧ

พิมพ์สตริงตัวเองถ้ามันเป็นของLหรือว่างเปล่าและเป็นอย่างอื่น0

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

มันทำงานอย่างไร

Ṣ=Ṛ¬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 == "".

รุ่นสำรอง 4 ไบต์ (ไม่แข่งขัน)

ṢnṚȦ

พิมพ์1หรือ0 ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

มันทำงานอย่างไร

Ṣ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 ไบต์

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

สิ่งนี้ทำงานได้อย่างถูกต้องสำหรับการให้ falsey สำหรับสตริงว่าง ข้อผิดพลาดเป็นเท็จ

รุ่นเก่า:

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

หลักฐานและคำอธิบาย

กริยาหลักคือทางแยกที่ประกอบด้วยกริยาทั้งสามนี้:

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

ซึ่งหมายความว่า "จำนวนที่น้อยกว่า ( <.) ความยาว ( #) และผลลัพธ์ของการตีสองหน้าที่ถูกต้อง ( (-:'ab'#~-:@#))"

ซี่ที่ถูกต้องคือรถไฟ 4 ขบวนประกอบด้วย:

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

ให้kเป็นตัวแทนการป้อนข้อมูลของเรา จากนั้นสิ่งนี้เทียบเท่ากับ:

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

-:เป็นผู้ประกอบการจับคู่เพื่อให้ชั้นนำสำหรับการทดสอบความไม่แปรเปลี่ยนภายใต้ส้อมเอก-:'ab' #~ -:@#

เนื่องจากซ้ายของส้อมเป็นกริยามันจะกลายเป็นฟังก์ชันคงที่ ดังนั้นทางแยกจึงเท่ากับ:

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

ขวากหนามทางขวาของครึ่งส้อม ( -:) ความยาว ( #) kของ สังเกต#:

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

ตอนนี้นี่เป็นkเพียงอินพุตที่ถูกต้องเท่านั้นเราจึงเสร็จแล้วที่นี่ #ข้อผิดพลาดสำหรับสตริงที่มีความยาวคี่ซึ่งไม่ตรงกับภาษาดังนั้นเราก็ทำเช่นนั้น

รวมกับความยาวน้อยลงและนี่คือสตริงว่างเปล่าซึ่งไม่ได้เป็นส่วนหนึ่งของภาษาของเราผลผลิตความยาวของมัน0และเราจะทำกับมันทั้งหมด


ฉันแก้ไขมันลงใน2&#-:'ab'#~#ที่ควรให้คุณหลีกเลี่ยงข้อผิดพลาดและเพิ่งออก0แทนในขณะที่ยังใช้ 12 ไบต์
ไมล์

@miles ที่น่าสนใจ! ฉันไม่เคยคิดเกี่ยวกับมันอย่างนั้น
Conor O'Brien

สิ่งนี้จัดการกับสตริงว่างหรือไม่?
Zgarb

@Zgarb แก้ไขมัน!
Conor O'Brien

9

Bison / YACC 60 (หรือ 29) ไบต์

(การรวบรวมสำหรับโปรแกรม YACC นั้นเป็นสองขั้นตอนดังนั้นอาจต้องการรวมบางอย่างไว้ดูรายละเอียดด้านล่าง)

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

ฟังก์ชั่นควรจะค่อนข้างชัดเจนหากคุณรู้ว่าจะตีความในแง่ของไวยากรณ์ที่เป็นทางการ ตัวแยกวิเคราะห์ยอมรับอย่างใดอย่างหนึ่งabหรือaตามลำดับที่ยอมรับใด ๆ bตามมาด้วย

การนำไปใช้นี้อาศัยคอมไพเลอร์ที่ยอมรับ K&R ซีแมนทิกส์ในการสูญเสียอักขระบางตัว

มัน wordier กว่าที่ฉันอยากมีความจำเป็นในการกำหนดและเพื่อเรียกร้องyylexgetchar

รวบรวมกับ

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

(ตัวเลือกส่วนใหญ่สำหรับ gcc นั้นเฉพาะกับระบบของฉันและไม่ควรนับรวมกับจำนวนไบต์คุณอาจต้องการนับ-std=c89ว่าเพิ่ม 8 ในค่าที่แสดงรายการ)

ทำงานด้วย

$ echo "aabb" | ./equal

หรือเทียบเท่า.

ค่าความจริงจะถูกส่งคืนไปยังระบบปฏิบัติการและข้อผิดพลาดsyntax errorจะรายงานไปยังบรรทัดคำสั่งด้วย ถ้าฉันสามารถนับเฉพาะส่วนของรหัสที่กำหนดฟังก์ชั่นการแยก (นั่นคือการละเลยที่สอง%%และทั้งหมดที่ตามมา) ฉันได้รับนับ 29 ไบต์


7

Perl 5.10, 35 17 ไบต์ (พร้อมแฟล็ก -n )

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

ตรวจสอบให้แน่ใจว่าสตริงเริ่มต้นด้วยas แล้วเรียกbซ้ำบนs มันตรงกันเฉพาะในกรณีที่ความยาวทั้งสองเท่ากัน

ขอบคุณMartin Ender ที่ลดจำนวนไบต์ลงและสอนฉันเล็กน้อยเกี่ยวกับการเรียกซ้ำใน regexes: D

มันจะส่งกลับสตริงทั้งหมดถ้ามันตรงและไม่มีอะไรถ้าไม่

ลองที่นี่!


ที่ใกล้เคียงที่สุดฉันสามารถจัดการรวมถึงกรณีทดสอบที่ไม่ว่างเปล่าคือ 18 ไบต์: $_&&=y/a//==y/b//(ต้องใช้-p) โดยที่ไม่มีค่าว่างคุณสามารถปล่อยค่า&&16 ได้! ใกล้แล้ว ...
Dom Hastings

1
ดังนั้นฉันสามารถทำอีก 17 ไบต์: echo -n 'aaabbb'|perl -pe '$_+=y/a//==y/b//'แต่ฉันไม่สามารถเลื่อนอีกไบต์ ... อาจต้องยอมแพ้กับสิ่งนี้!
Dom Hastings

7

JavaScript, 54 55 44

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

สร้าง regex อย่างง่ายตามความยาวของสตริงและทดสอบ สำหรับความยาว 4 สตริง ( aabb) regex ดูเหมือนว่า:^a{2}b{2}$

ส่งคืนค่าความจริงหรือเท็จ

บันทึก 11 ไบต์ด้วย 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=สามารถละเว้น
Leun Nun

การแสดงออกของฟังก์ชั่นเป็นการส่งที่ถูกต้องหรือจริง ๆ แล้วมันต้องเป็นฟังก์ชัน
Scimonster

ฟังก์ชั่นคือการส่งที่ถูกต้อง
Leun Nun

@TimmyD มันเคยเป็นจริง แต่ตอนนี้มันกลับเท็จ
Scimonster

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

5

C, 57 53 ไบต์

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

วิธีแก้ปัญหาแบบยาวขนาด 57 ไบต์เก่า:

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

คอมไพล์ด้วย gcc v. 4.8.2 @Ubuntu

ขอบคุณ ugoren สำหรับเคล็ดลับ!

ลองใช้กับ Ideone!


เนื่องจากฉันใหม่ที่นี่และไม่สามารถออกความเห็นคำตอบอื่น ๆ ได้ฉันแค่ต้องการชี้ให้เห็นว่าโซลูชั่น 62b จาก @Josh ให้ผลบวกที่ผิดพลาดกับสตริงเช่น "aaabab"
Jasmes

เปลี่ยน(t+=2)เป็นt++++-1 ไบต์
owacoder

@owacoder t++++ไม่ใช่รหัส C ที่ถูกต้อง
Jasmes

บันทึกบางอย่างด้วยt+=*s%2*2และ:*s*!1[s]
ugoren

คำตอบที่ฉลาดมาก! โชคไม่ดีที่อินพุท "ba": ideone.com/yxixG2
Josh

4

เรติน่า 22 ไบต์

อีกคำตอบที่สั้นกว่าในภาษาเดียวกันเพิ่งมา ...

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

ลองออนไลน์!

นี่คือการจัดแสดงกลุ่มสมดุลใน regex ซึ่งอธิบายโดย Martin Enderอย่างสมบูรณ์

เนื่องจากคำอธิบายของฉันไม่ใกล้เคียงกับครึ่งหนึ่งของมันฉันจะแค่ลิงก์ไปยังมันและไม่พยายามอธิบายเพราะนั่นจะเป็นอันตรายต่อความรุ่งโรจน์ของคำอธิบายของเขา


4

Befunge-93, 67 bytes

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

ลองที่นี่! อาจอธิบายได้ว่ามันทำงานอย่างไรในภายหลัง อาจลองเล่นกอล์ฟอีกสักหน่อยเพื่อเตะ


3

MATL , 9 ไบต์

vHI$e!d1=

ลองออนไลน์!

อาร์เรย์เอาต์พุตเป็นจริงถ้าไม่ว่างเปล่าและรายการทั้งหมดเป็นค่าที่ไม่ใช่ศูนย์ มิฉะนั้นมันจะผิดพลาด นี่คือตัวอย่างบางส่วน

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
นั่นเป็นคำนิยามที่สะดวกสบายสำหรับความจริง (ฉันรู้เกี่ยวกับข้อกำหนดที่ไม่เป็นศูนย์ แต่ไม่เกี่ยวกับข้อกำหนดที่ไม่ว่างเปล่า)
Dennis

3

รหัสเครื่อง x86, 29 27 ไบต์

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

รหัสการประกอบ:

    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;

วนซ้ำaไบต์ในตอนต้นจากนั้นตามด้วย 'b' ไบต์ต่อไปนี้ ลูปแรกเพิ่มตัวนับและลูปที่สองจะลดลง หลังจากนั้นทำ bitwise OR ระหว่างเงื่อนไขต่อไปนี้:

  1. ถ้าตัวนับไม่เป็น 0 ท้ายสตริงจะไม่ตรงกัน
  2. หากไบต์ที่ตามลำดับbs ไม่ใช่ 0 สตริงจะไม่ตรงกัน

จากนั้นจะต้อง "สลับ" ค่าความจริงเป็นeax- ตั้งค่าเป็น 0 หากไม่ใช่ 0 และในทางกลับกัน ปรากฎว่ารหัสที่สั้นที่สุดที่จะทำคือรหัส 5 ไบต์ต่อไปนี้ซึ่งฉันขโมยมาจากผลลัพธ์ของคอมไพเลอร์ C ++ ของฉันสำหรับ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
ฉันคิดว่าคุณสามารถปรับปรุงการปฏิเสธของคุณ ลอง: neg eaxเพื่อตั้งค่าสถานะพกพาเหมือนก่อนcmcเพื่อกลับค่าสถานะนำส่งและsalcตั้งค่า AL เป็น FFh หรือ 0 ขึ้นอยู่กับว่าตั้งค่าสถานะนำไปปฏิบัติหรือไม่ บันทึก 2 ไบต์แม้ว่าจะจบลงด้วยผลลัพธ์แบบ 8 บิตแทนที่จะเป็น 32 บิต
จูลส์

สิ่งเดียวกันโดยใช้ string ops โดย ESI ชี้ไปที่สตริงอินพุตและส่งคืนผลลัพธ์ใน AL (ใช้ SETcc ต้อง 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 คุณควรโพสต์นั้นด้วยคำตอบ - มันต่างจากของฉันพอสมควรและฉันคิดว่ามันสั้นกว่ามาก!
Anatolyg

3

ทับทิมขนาด 24 ไบต์

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

(นี่เป็นเพียงความคิดที่ยอดเยี่ยมของ xnorในรูปแบบ Ruby คำตอบอื่น ๆ ของฉันคือวิธีแก้ปัญหาที่ฉันคิดขึ้นเอง)

โปรแกรมรับอินพุตแปลงaและbไปยัง[และ]ตามลำดับและประเมินผล

อินพุตที่ถูกต้องจะสร้างอาร์เรย์ที่ซ้อนกันและไม่มีอะไรเกิดขึ้น นิพจน์ที่ไม่สมดุลจะทำให้โปรแกรมขัดข้อง ในอินพุตที่ว่างของ Ruby ถูกประเมินว่าnilจะเกิดปัญหาเนื่องจากnilยังไม่ได้กำหนด*วิธีการ


3

Sed, 38 + 2 = 40 ไบต์

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

เอาต์พุตสตริงที่ไม่ว่างเปล่าเป็นจริง

ออโตมาต้าสถานะอัน จำกัด ไม่สามารถทำสิ่งนี้คุณพูด? สิ่งที่เกี่ยวกับออสถานะ จำกัด กับลูป : P

ทำงานด้วยrและตั้งnค่าสถานะ

คำอธิบาย

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

วิธีการที่ดี ขอบคุณสำหรับความล้มเหลว
joeytwiddle

3

JavaScript, 44 42

ข้ามไป 44 ยังคงเป็นปกติ 44; (

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

ทำงานโดยการซ้ำลอกออกด้านนอกaและbและใช้ค่าซ้ำภายในที่เลือก .+แต่ เมื่อไม่มีการจับคู่^a.+b$ทางซ้ายผลลัพธ์สุดท้ายคือสตริงที่เหลือนั้นเป็นค่าที่แน่นอนabหรือไม่

กรณีทดสอบ:

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 ไบต์

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

ใช้แนวคิดเดียวกันกับคำตอบ YACCของ @ dmckeeซึ่งเพิ่มขึ้นเพียงเล็กน้อย

ในการทดสอบตามขั้นตอนใน ANTLR ของการเดินทางเริ่มต้นกวดวิชา จากนั้นใส่รหัสข้างต้นลงในไฟล์ชื่อA.g4และเรียกใช้คำสั่งเหล่านี้:

$ antlr A.g4
$ javac A*.java

จากนั้นทดสอบโดยให้อินพุตกับ STDIN เป็นgrun A rดังนี้:

$ echo "aaabbb" | grun A r

หากอินพุตถูกต้องจะไม่มีการส่งออก ถ้ามันไม่ถูกต้องgrunจะทำให้เกิดข้อผิดพลาด (อย่างใดอย่างหนึ่งtoken recognition error, extraneous input, mismatched inputหรือno viable alternative)

ตัวอย่างการใช้งาน:

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

เคล็ดลับที่ชาญฉลาดเพิ่มบรรทัดใหม่เป็นทางเลือกในกฎเดียว ฉันคิดว่าฉันสามารถประหยัดได้ด้วยวิธีนี้ใน yacc เช่นกัน grammerคำหลักคือกลิ่นเหม็นสำหรับการเล่นกอล์ฟกับ antlr แม้ว่า ค่อนข้างชอบใช้ฟอร์แทรน
dmckee

3

C, 69 ไบต์

69 ไบต์:

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

สำหรับผู้ที่ไม่คุ้นเคย:

  • strlen กำหนดความยาวของสตริง
  • strcspn ส่งคืนดัชนีแรกในสตริงที่พบสตริงอื่น
  • strchr ส่งกลับตัวชี้ไปที่การเกิดขึ้นครั้งแรกของตัวละคร
  • strrchr ส่งกลับตัวชี้ไปยังการเกิดขึ้นครั้งสุดท้ายของตัวละคร

ขอบคุณมากที่ติตัส!


1
บันทึกหนึ่งไบต์ด้วย>97แทน==98
Titus

2
วิธีแก้ปัญหา 61 ไบต์ให้ผลบวกเป็นเท็จกับสตริงเช่น "aaabab" ดูideone.com/nmT8rm
Jasmes

อาคุณเป็น Jasmes ที่ถูกต้องแล้วขอบคุณ ฉันจะต้องคิดใหม่นี้เล็กน้อย
Josh

ย้อนกลับไปใช้โซลูชัน 69 ไบต์ไม่แน่ใจว่าฉันจะสั้นลงได้อย่างไรโดยใช้วิธีการนี้
Josh

3

R, 64 61 55 ไบต์, 73 67 ไบต์ (แข็งแรง) หรือ 46 ไบต์ (หากอนุญาตให้ใช้สตริงว่าง)

  1. อีกครั้งคำตอบของ xnorทำใหม่ ถ้ามันถูกบอกเป็นนัยโดยกฎที่อินพุตจะประกอบด้วยสตริงของas และbs มันควรจะใช้งานได้: คืนค่า NULL ถ้านิพจน์นั้นถูกต้องโยนและผิดพลาดหรือไม่มีอะไรเป็นอย่างอื่น

    if((y<-scan(,''))>'')eval(parse(t=chartr('ab','{}',y)))
    
  2. หากอินพุตไม่แข็งแรงและอาจมีขยะบางส่วนเช่นaa3bbนั้นควรพิจารณาเวอร์ชันต่อไปนี้ (ต้องส่งคืนTRUEสำหรับกรณีทดสอบจริงไม่ใช่ NULL):

    if(length(y<-scan(,'')))is.null(eval(parse(t=chartr("ab","{}",y))))
    
  3. ในที่สุดหากอนุญาตให้ใช้สตริงว่างเราสามารถละเว้นเงื่อนไขสำหรับอินพุตที่ไม่ว่าง:

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

    อีกครั้ง NULL ถ้าสำเร็จไม่มีอะไรเป็นอย่างอื่น


ฉันไม่ทราบว่า R ผลลัพธ์ของคุณสำหรับอินพุตว่างคืออะไร (ควรเป็นเท็จ)
ติตัส

ไม่มีวิธีที่สั้นกว่าในการทดสอบอินพุตว่างหรือไม่
ติตัส

รุ่นที่ 1: เพียงแค่ไม่มีอะไร (อินพุตที่ถูกต้องส่งกลับเฉพาะNULL) รุ่นที่ 2: เพียงแค่ไม่มีอะไร (ที่ถูกต้องป้อนข้อมูลส่งกลับเฉพาะTRUE), รุ่นที่ 3 NULL(สมมติว่าสตริงว่างเปล่าตกลงเป็นของรัฐ): R เป็นภาษาเชิงวัตถุเชิงสถิติที่พิมพ์ทุกอย่างเพียงแค่ตกลงโดยไม่มีการเตือนใด ๆ
Andreï Kostyrka

(คำตอบ 1) นี้สามารถปรับปรุงเพิ่มเติมเป็น 55 ไบต์:if((y<-scan(,''))>'')eval(parse(t=chartr('ab','{}',y)))
Giuseppe

3

Japt , 11 ไบต์

©¬n eȦUg~Y

ลองออนไลน์!

ให้อย่างใดอย่างหนึ่งtrueหรือfalseยกเว้นที่""ให้""ซึ่งเป็นเท็จใน JS

เอาออกแล้วมันทำงานอย่างไร

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

บุญธรรมจากเดนนิสแก้ปัญหา MATL


2

C (Ansi), 65 75 ไบต์

แข็งแรงเล่นกอล์ฟ:

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;}

คำอธิบาย:

ตั้งค่า j และเพิ่มค่า j ในแต่ละ b และลดค่า j ในสิ่งอื่นใด ตรวจสอบว่าตัวอักษรก่อนหน้านั้นน้อยกว่าหรือเท่ากับตัวอักษรตัวถัดไปเพื่อป้องกันไม่ให้ abab ทำงาน

การแก้ไข

เพิ่มการตรวจสอบกรณี abab


สิ่งนี้จะไม่ให้ผลบวกปลอมในสตริงเช่นbaหรือabab?
Zgarb

อ่าใช่ฉันอ่านข้อความผิดเพราะฉันไม่เห็นภาพตั้งแต่มันถูกบล็อก แก้ไขมัน!
dj0wns

2

แบตช์ 133 ไบต์

@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

ส่งคืนค่าเป็นERRORLEVEL0 จากความสำเร็จและ 1 เมื่อล้มเหลว แบทช์ไม่ชอบเปลี่ยนซับสตริงในสตริงว่างดังนั้นเราต้องตรวจสอบก่อน หากพารามิเตอร์ว่างเปล่าถูกกฎหมายบรรทัด 6 จะไม่จำเป็น


2

PowerShell v2 +, 61 52 ไบต์

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

จะเข้า$nเป็นสตริงสร้างเป็น$x half the lengthการสร้างการ-andเปรียบเทียบบูลีนระหว่าง$nและ-matchโอเปอเรเตอร์ regex เทียบกับ regex ของa's และb' s จำนวนเท่ากัน เอาท์พุทบูลีนหรือ$TRUE $FALSEนี่$n-andคือการบัญชีสำหรับ""= $FALSE.

ทางเลือก 35 ไบต์

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

สิ่งนี้ใช้ regex จากคำตอบของ Leakyโดยอิงตามกลุ่มการดุล. NET เพียงห่อหุ้มใน-matchโอเปอเรเตอร์PowerShell ส่งคืนสตริงสำหรับสัจจะหรือสตริงว่างสำหรับเท็จ


ในรุ่นอื่นคุณควรประเมินผล-matchไม่$args[0]เช่น-matchนั้นจะทำงานเป็นตัวกรอง
Mathias R. Jessen

@ MathiasR.Jessen ในรหัสการผลิตใช่ แต่เราสามารถเล่นกอล์ฟที่[0]นี่เพราะเราได้รับเพียงหนึ่งอินพุตและเราต้องการเพียงค่าความจริง / เท็จเป็นค่าผลลัพธ์ เนื่องจากสตริงที่ว่างเปล่านั้นเป็นเท็จและสตริงที่ไม่ว่างนั้นเป็นความจริงเราจึงสามารถกรองกับอาร์เรย์และรับสตริงอินพุตกลับหรือไม่มีอะไรกลับซึ่งตรงตามข้อกำหนดของความท้าทาย
AdmBorkBork

2

Pyth - 13 ไบต์

&zqzS*/lz2"ab

อธิบาย:

  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

คุณสามารถใช้สตริงเป็นอินพุตและสร้างมันได้&qS*/lQ2"ab
Leun Nun

@LeakyNun ขอบคุณสำหรับเคล็ดลับ! คุณช่วยอธิบายได้ว่าทำไมถึงเป็นเช่นนั้น นี่เป็นครั้งแรกที่ฉันใช้ Pyth
Cowabunghole

ตัวอย่างเช่น+4จะขยายเป็น+4Q(การกรอกโดยนัยของการขัดแย้ง)
Lean Nun

2

Haskell, 39 ไบต์

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

ตัวอย่างการใช้งาน: ->p "aabb"True

scanl(\s _->'a':s++"b")"ab"xสร้างรายการทั้งหมด["ab", "aabb", "aaabbb", ...]ด้วย(length x)องค์ประกอบทั้งหมด elemตรวจสอบว่าxอยู่ในรายการนี้


2

Python 43 43 Bytes

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

แสดงวิธีการแก้ปัญหาที่ชัดเจนด้วยLeaky Nun

ความคิดอื่น ๆ 45 ไบต์:

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

-4 ไบต์โดยใช้ len / 2 (ฉันได้รับข้อผิดพลาดเมื่อครึ่งมาสุดท้าย)

ตอนนี้ให้เท็จสำหรับสตริงที่ว่างเปล่า

-3 ไบต์ขอบคุณ xnor


ใช่แลมบ์ดาไม่จำเป็นต้องตั้งชื่อ
Leun Nun

lambda s:list(s)==sorted("ab"*len(s)//2)(Python 3)
Leun Nun

lambda s:s=="a"*len(s)//2+"b"*len(s)//2(Python 3)
Leun Nun

ใช่ฉันรู้ว่าขณะโพสต์ lol โซลูชันที่ชัดเจนนั้นสั้นกว่าใน Python 2:
KarlKastor

1
คุณสามารถทำ''<แทนs andการออกกฎกรณีที่ว่างเปล่า
xnor
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.