ทดสอบว่าสตริงนั้นมีความสมดุลหรือไม่


15

เราเรียกกลุ่ม paren (ว่าparen แบบเปิดกลุ่ม paren ที่ใกล้เคียงกัน)และทุกอย่างในนั้น

กลุ่ม parens หรือสตริงเรียกว่าวงเล็บสมดุลถ้ามันมีอะไรหรือเพียง 2 กลุ่ม parens สมดุลวงเล็บ

ตัวอย่างเช่น:

The string   "(()())()"      is parenthesly balanced
              (    )()       Because it contains exactly 2 parenthesly balanced parens groups
               ()()          The left one is parenthesly balanced because it contains 2 parenthesly balanced parens groups (balanced because they are empty). The right one is parenthesly balanced because it contains nothing.

ในทำนองเดียวกัน:

The string   "(()(()))()"    is not parenthesly balanced
              (      )()     Because it contains a parens group that is not parenthesly balanced: the left one
               ()(  )        The left one is not balanced because it contains a parens group that is not balanced: the right one
                  ()         The right one is not balanced because it only contains one balanced group.

ดังนั้นสตริงที่สมดุลหรือวงเล็บกลุ่มวงเล็บควร:

  • ไม่มีอะไรเลย
  • หรือมีกลุ่มวงเล็บที่สมดุลเท่านั้น มันควรมีอะไรอย่างอื่น

งาน:

งานของคุณคือการเขียนฟังก์ชั่นหรือโปรแกรมที่ตรวจสอบว่าสตริงที่กำหนดมีความสมดุลในวงเล็บหรือไม่

การป้อนข้อมูล:

อินพุตจะเป็นสตริงหรือรายการของตัวละครหรือสิ่งที่คล้ายกัน คุณสามารถสมมติว่าสตริงจะประกอบด้วยตัวอักษรและ'(' ')'นอกจากนี้คุณยังสามารถสันนิษฐานได้ว่าแต่ละวงเล็บเปิด(จะมีการจับคู่วงเล็บใกล้ชิด)จึงไม่ต้องกังวลเกี่ยวกับสตริงเหมือน"((("หรือ")("หรือ"(())("...

หมายเหตุ:ในฐานะที่เป็นที่กล่าวถึงโดย @DigitalTrauma ในความคิดเห็นร้องของเขาก็ตกลงที่จะ subtitute ()คำสั่งผสมโดยตัวละครอื่น ๆ (เช่น<>, [], ... ) ถ้ามันก่อให้เกิดการทำงานเพิ่มเติมเช่นการหลบหนีในบางภาษา

เอาท์พุท:

สิ่งใดที่ส่งสัญญาณว่าสตริงมีความสมดุลในวงเล็บหรือไม่ (จริงหรือเท็จ, 1 หรือ 0, ... ) โปรดระบุคำตอบของคุณในสิ่งที่ฟังก์ชั่น / โปรแกรมของคุณคาดว่าจะได้รับ

ตัวอย่าง:

""                                        => True
"()()"                                    => True
"()(()())"                                => True
"(()(()(()())))(()())"                    => True
"(((((((()())())())())())())())()"        => True
"()"                                      => False
"()()()"                                  => False
"(())()"                                  => False
"()(()(())())"                            => False
"(()())(((((()())()))())())"              => False
"()(()()()())"                            => False
"()(()(()())()())"                        => False

สองตัวอย่างสุดท้ายสร้างความแตกต่างอย่างแท้จริง!

ขอให้โชคดี!


อะไรที่ส่งสัญญาณว่าสตริงมีความสมดุลในวงเล็บหรือไม่จำเป็นต้องมีเอาต์พุตที่สอดคล้องกันนั่นคือมีเพียงสองค่าหรือไม่
Luis Mendo

@LuisMendo อาจเป็นหมวดหมู่ เช่นค่าความจริงเพื่อส่งสัญญาณความจริงและค่าเท็จเพื่อส่งสัญญาณเป็นอย่างอื่น ดังนั้นอาจมีมากขึ้น แต่ควรจะสอดคล้องกัน
อิบราฮิม mahrir

1
ไม่เป็นไรถ้าฉันใช้รายการเลขฐานสองเป็นอินพุต ยกตัวอย่างเช่นจะแสดงเป็น"(()())()" [0, 0, 1, 0, 1, 1, 0, 1]สิ่งนี้จะลบความจำเป็นในการแปลงอินพุตเป็นโค้ดอักขระแล้วลบออก
JungHwan Min

คำถามที่เกี่ยวข้อง: codegolf.stackexchange.com/questions/166457/…
คุกกี้ Windmill

1
@WindmillCookies ฉันไม่เห็นว่าเกี่ยวข้องกับเรื่องนี้อย่างไร สิ่งที่แตกต่างกันโดยสิ้นเชิง แม้แต่แนวคิดก็แตกต่างกัน
อิบราฮิม mahrir

คำตอบ:


8

Japt v2, 20 ไบต์

V="()"V¥iU1 eViV²1 V

ทดสอบออนไลน์!

ทุกคนเข้าใจผิดความท้าทายในตอนแรกและว่าที่คู่ของวงเล็บแต่ละคนก็จะประกอบด้วยแม้จำนวนย่อยคู่ในเมื่อความจริงความท้าทายจริงขอ0 หรือ 2ย่อยคู่ ดังนั้นนี่คือคำตอบที่แก้ไขของฉันโดยใช้เทคนิคเดียวกับก่อน

เรายังคงสามารถแก้ปัญหาด้วยการทดแทนแบบเรียกซ้ำ สิ่งคือแทนที่จะเอาสิ่งที่เกิดขึ้นทั้งหมดออกไป()()เราต้องตรวจสอบให้แน่ใจว่าไม่มีสิ่งใดในเสื้อคลุมเดียวกันนอกเหนือจาก()()(ในคำอื่น ๆ ไม่มี()()()()หรืออะไรแบบนั้น) เราสามารถทำได้โดยแทนที่(()())ด้วยซ้ำ()ซ้ำ

ปัญหาใหม่คืออินพุตนั้นไม่มีวงเล็บด้านนอกหนึ่งคู่ (ซึ่งจะทำให้มันไม่ใช่สตริงที่สมดุลในวงเล็บ) บังคับให้เราห่อในคู่พิเศษเพื่อลดให้เต็มที่ ในที่สุดผลลัพธ์สุดท้ายสำหรับสตริงที่สมดุลตอนนี้()แทนที่จะเป็นสตริงว่างเปล่าดังนั้นเราจึงตรวจสอบความเท่าเทียมกันมากกว่าแค่รับตรรกะไม่ใช่ผลลัพธ์


7

sed 4.2.2, 30

:
s/(()())/()/
t
/^()()$\|^$/q1

ลองออนไลน์ลองมันออนไลน์

สิ่งนี้จะส่งคืนรหัสการออกจากเชลล์ 1 สำหรับ True และ 0 สำหรับเท็จ

:               # label
s/(()())/()/    # replace "(()())" with "()"
t               # jump back to label if above replacement matched
/^()()$\|^$/q1  # exit code 1 if remaining buffer is exactly "()()" or empty
                # otherwise exit with code 0

7

Perl 5 -lp, 24 22 ไบต์

$_=/^((<(?1)?>){2})?$/

ลองออนไลน์! ลิงก์มีกรณีทดสอบ แก้ไข: บันทึก 2 ไบต์ด้วย @JoKing คำอธิบาย: เป็นเพียง regex ซ้ำ กลุ่มการจับภาพด้านนอกแสดงถึงสตริงที่สมดุลว่าเป็น<แล้วตามด้วยสตริงที่เป็นตัวเลือกเสริมตามด้วย a >, สองครั้ง โปรดทราบว่าคำตอบอื่น ๆ ส่วนใหญ่สามารถใช้()s ได้ แต่ต้องเสียค่าใช้จ่ายเพิ่มอีกสองไบต์:

$_=/^((\((?1)?\)){2})?$/

ลองออนไลน์! ลิงก์มีกรณีทดสอบ


3
เนื่องจากคุณสามารถใช้วงเล็บคู่อื่นคุณสามารถบันทึกสองไบต์โดยใช้<>
Jo King

1
@JoKing คำตอบอื่น ๆ เกือบทั้งหมดสามารถใช้งาน()ได้ดังนั้นฉันไม่คิดว่ามันเป็นการเปรียบเทียบที่ยุติธรรม แต่ฉันเห็นคำตอบของ APL @ ngn ก็ใช้<>เช่นกันดังนั้นฉันจึงได้อัปเดตนี้
Neil

6

รหัสประจำเครื่อง 6502 , 48 ไบต์

A0 00 84 FD A2 00 B1 FB F0 0E C8 C9 29 18 F0 06 8A 48 E6 FD 90 EE B0 0A E0 01
90 06 E0 02 38 D0 01 18 A5 FD F0 09 C6 FD 68 AA E8 B0 F5 90 D7 60

คาดหวังว่าตัวชี้ไปยังสายอักขระใน$fb/ $fcซึ่งคาดว่าจะประกอบด้วย(และ)และล้างธง C (พกพา) หากสตริงเป็น "สมดุล paranthesely" ตั้งค่าเป็นอย่างอื่น (ซึ่งเป็นสำนวนทั่วไปใน 6502 ตั้งค่าพก "ผิดพลาด") ไม่รู้สึกอะไรกับการป้อนข้อมูลที่ไม่ถูกต้อง

แม้ว่าอัลกอริทึมจะเรียกซ้ำ แต่มันก็ไม่ได้เรียกตัวเองว่า (ซึ่งต้องใช้จำนวนไบต์มากกว่า และทำให้ตำแหน่งโค้ดขึ้นอยู่กับมัน) แต่จะรักษาความลึกของการเรียกซ้ำตัวเองและใช้การแยกย่อยแบบ "ง่าย"

ความคิดเห็นถอดแยกชิ้นส่วน

; function to determine a string is "paranthesly balanced"
;
; input:
;   $fb/$fc: address of the string
; output:
;   C flag set if not balanced
; clobbers:
;   $fd:     recursion depth
;   A,X,Y

 .isparbal:
A0 00       LDY #$00            ; string index
84 FD       STY $FD             ; and recursion depth
 .isparbal_r:
A2 00       LDX #$00            ; set counter for parantheses pairs
 .next:
B1 FB       LDA ($FB),Y         ; load next character
F0 0E       BEQ .done           ; end of string -> to final checks
C8          INY                 ; increment string index
C9 29       CMP #$29            ; compare with ')'
18          CLC                 ; and reset carry
F0 06       BEQ .cont           ; if ')' do checks and unwind stack
8A          TXA                 ; save counter ...
48          PHA                 ; ... on stack
E6 FD       INC $FD             ; increment recursion depth
90 EE       BCC .isparbal_r     ; and recurse
 .cont:
B0 0A       BCS .unwind         ; on previous error, unwind directly
 .done:
E0 01       CPX #$01            ; less than one parantheses pair
90 06       BCC .unwind         ; -> ok and unwind
E0 02       CPX #$02            ; test for 2 parantheses pairs
38          SEC                 ; set error flag
D0 01       BNE .unwind         ; if not 2 -> is error and unwind
18          CLC                 ; clear error flag
 .unwind:
A5 FD       LDA $FD             ; check recursion depth
F0 09       BEQ .exit           ; 0 -> we're done
C6 FD       DEC $FD             ; otherwise decrement
68          PLA                 ; get "pair counter" ...
AA          TAX                 ; ... from stack
E8          INX                 ; and increment
B0 F5       BCS .unwind         ; continue unwinding on error
90 D7       BCC .next           ; otherwise continue reading string
 .exit:
60          RTS

ตัวอย่างโปรแกรมประกอบ C64 โดยใช้รูทีน:

การสาธิตออนไลน์

screenshot

รหัสในรูปแบบca65 :

.import isparbal   ; link with routine above

.segment "BHDR" ; BASIC header
                .word   $0801           ; load address
                .word   $080b           ; pointer next BASIC line
                .word   2018            ; line number
                .byte   $9e             ; BASIC token "SYS"
                .byte   "2061",$0,$0,$0 ; 2061 ($080d) and terminating 0 bytes

.bss
linebuf:        .res    256

.data
prompt:         .byte   "> ", $0
truestr:        .byte   "true", $0
falsestr:       .byte   "false", $0

.code
inputloop:
                lda     #<prompt        ; display prompt
                ldy     #>prompt
                jsr     $ab1e

                lda     #<linebuf       ; read string into buffer
                ldy     #>linebuf
                ldx     #0              ; effectively 256
                jsr     readline

                lda     #<linebuf       ; address of string to $fb/fc
                sta     $fb
                lda     #>linebuf
                sta     $fc
                jsr     isparbal        ; call function

                bcs     isfalse
                lda     #<truestr
                ldy     #>truestr
                bne     printresult
isfalse:        lda     #<falsestr
                ldy     #>falsestr
printresult:    jmp     $ab1e           ; output true/false and exit

; read a line of input from keyboard, terminate it with 0
; expects pointer to input buffer in A/Y, buffer length in X
.proc readline
                dex
                stx     $fb
                sta     $fc
                sty     $fd
                ldy     #$0
                sty     $cc             ; enable cursor blinking
                sty     $fe             ; temporary for loop variable
getkey:         jsr     $f142           ; get character from keyboard
                beq     getkey
                sta     $2              ; save to temporary
                and     #$7f
                cmp     #$20            ; check for control character
                bcs     checkout        ; no -> check buffer size
                cmp     #$d             ; was it enter/return?
                beq     prepout         ; -> normal flow
                cmp     #$14            ; was it backspace/delete?
                bne     getkey          ; if not, get next char
                lda     $fe             ; check current index
                beq     getkey          ; zero -> backspace not possible
                bne     prepout         ; skip checking buffer size for bs
checkout:       lda     $fe             ; buffer index
                cmp     $fb             ; check against buffer size
                beq     getkey          ; if it would overflow, loop again
prepout:        sei                     ; no interrupts
                ldy     $d3             ; get current screen column
                lda     ($d1),y         ; and clear 
                and     #$7f            ;   cursor in
                sta     ($d1),y         ;   current row
output:         lda     $2              ; load character
                jsr     $e716           ;   and output
                ldx     $cf             ; check cursor phase
                beq     store           ; invisible -> to store
                ldy     $d3             ; get current screen column
                lda     ($d1),y         ; and show
                ora     #$80            ;   cursor in
                sta     ($d1),y         ;   current row
                lda     $2              ; load character
store:          cli                     ; enable interrupts
                cmp     #$14            ; was it backspace/delete?
                beq     backspace       ; to backspace handling code
                cmp     #$d             ; was it enter/return?
                beq     done            ; then we're done.
                ldy     $fe             ; load buffer index
                sta     ($fc),y         ; store character in buffer
                iny                     ; advance buffer index
                sty     $fe
                bne     getkey          ; not zero -> ok
done:           lda     #$0             ; terminate string in buffer with zero
                ldy     $fe             ; get buffer index
                sta     ($fc),y         ; store terminator in buffer
                sei                     ; no interrupts
                ldy     $d3             ; get current screen column
                lda     ($d1),y         ; and clear 
                and     #$7f            ;   cursor in
                sta     ($d1),y         ;   current row
                inc     $cc             ; disable cursor blinking
                cli                     ; enable interrupts
                rts                     ; return
backspace:      dec     $fe             ; decrement buffer index
                bcs     getkey          ; and get next key
.endproc

5

V , 21 , 20 ไบต์

é(Á)òÓ(“()()…)òø^()$

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

é(                      " Insert '(' at the beginning of the line
  Á)                    " Append ')' at the end
    ò         ò         " Recursively...
     Ó                  "   Remove...
      (                 "     '('
       “    …           "     (Limit the part that is removed to this section of the match)
        ()()            "     '()()'
             )          "     ')'
                        " (effectively, this replaces '(()())' with '()', but it's one byte shorter than the straightforward approach
               ø        " Count...
                ^()$    "   Lines containing exactly '()' and nothing more

hexdump:

00000000: e928 c129 f2d3 2893 2829 2829 8529 f2f8  .(.)..(.()().)..
00000010: 5e28 2924                                ^()$

คุณสามารถอธิบายรหัสของคุณดังนั้นฉันสามารถ (หวังว่า) พบ testcase ที่ไม่ได้ทำงานเหมือนที่ผมทำกับ @ คำตอบของอดัม
อิบราฮิม mahrir

@ibrahimmahrir เรียบร้อยแล้ว
DJMcMayhem

5

Brachylogขนาด 28 ไบต์

Ẹ|~c["(",A,")(",B,")"]∧A;B↰ᵐ

ลองออนไลน์!

คำอธิบาย

                                    --  The string perfectly balanced iff
Ẹ                                   --      the string is empty
 |                                  --  or
  ~c["(",A,")(",B,")"]              --      the string can be written id the format of "($A)($B)"
                      ∧             --          where
                       A;B ᵐ        --          both A and B
                          ↰         --          are perfectly balanced

4

C (gcc) , 113 ไบต์

p(a,r,e,n)char*a;{if(*a-40)return 1;for(r=1,e=0;e<2;r&=e++||*a==40)for(r*=n=p(++a);n+=*a++-40?~0:1;);r=r&&*a-40;}

ลองออนไลน์!

คำอธิบาย

p(a,r,e,n)char*a;{   // function and variable declaration
 if(*a-40)return 1;  // string does not start with '(', thus is empty
 for(r=1,e=0;e<2;    // r: return value, e: group id (look for exactly two groups)
 r&=e++||*a==40)     // after the first group, a second shall follow
  for(r*=n=p(++a);   // check that the group is itself balanced
  n+=*a++-40?~0:1;); // skip group
 r=r&&*a-40;}        // additionally, after those two groups there shall follow none

ลองออนไลน์!


3

MATL , 26 25 ไบต์

oo~`tnw52B5LZttnb<]XB10X-

ลองออนไลน์!

ขอบคุณ @ETHProductions 'คำตอบสำหรับแนวคิด "replace (() ()) กับ ()" และความคิดเห็นคำถามของ @JungHwan Min สำหรับแนวคิดในการมองเห็นวงเล็บเป็นเลขฐานสอง

ผลลัพธ์เป็นอาเรย์ที่ว่างเปล่าสำหรับความจริงจำนวนบวกสำหรับความผิดพลาด - ซึ่งฉันคิดว่าได้รับอนุญาตจากความคิดเห็นของ OP: "อาจเป็นหมวดหมู่เช่นค่าความจริงที่จะส่งสัญญาณความจริงและค่าความเท็จเป็นสัญญาณเป็นอย่างอื่น" หากไม่เป็นเช่นนั้นเราสามารถเพิ่มnที่ส่วนท้ายสำหรับ +1 ไบต์เพื่อให้มี 0 เป็นเอาต์พุตจริงและ 1 เป็นเอาต์พุตเท็จ

ด้วยความคิดเห็น:

o         % Convert the parantheses to their ASCII codes
          %  40 for '(', 41 for ')'
o         % Parity - 1 for odd, 0 for even
~         % Not - change 0 to 1 and vice versa, so '(' is now 1 and ')' 0
          % Input char array is now a binary array B
`         % Do-while loop
  tn          % Get the length of the array 
  w           % Bring the array B back on top
  52B         % Push the binary value of 52 on stack
              %  [1 1 0 1 0 0] (equivalent to '(()())')
  5L          % Push the constant [1 0] for '()'
  Zt          % Replace the sequence [1 1 0 1 0 0] in array B
              %  with [1 0]
  tn          % Get the length of the array after replacement 
  b<          % Has it decreased? If so, continue loop
  ]       % end loop
          % Final value for balanced input will be
          %  either [1 0 1 0] for the remaining outer '()()'
          %  or an empty array [] for empty '' input
XB        % Convert the final binary array back to decimal
10X-      % Set difference, remove 10 from that result 
          % Result is [] empty array for balanced input, otherwise 
          %  some decimal number ≠ 10 for unbalanced input


3

Haskell , 82 59 ไบต์

all(`elem`[0,2]).foldl(#)[0]
b#'('=0:b
(x:y:z)#_=y+1:z++[x]

ลองออนไลน์!

ฉันคิดว่ามันสามารถตีกอล์ฟได้ไกลกว่านี้เพราะมันเป็นครั้งแรกที่ฉันเล่นกอล์ฟในฮาเซลดังนั้นเทคนิคหรือความคิดเห็นใด ๆ ก็เป็นที่น่ายินดี

แก้ไข -ขอบคุณ @nimi สำหรับการบันทึก23 ไบต์ (มากกว่า 28% ของการส่งต้นฉบับ :)


1
เคล็ดลับ: จำเป็นที่จะต้องไม่มีรอบ() y+1ในฐานะที่เป็นฟังก์ชั่นที่ไม่มีชื่อได้รับอนุญาตให้คุณสามารถวางf=, r[0]เป็นฟังก์ชั่นที่เหมาะสม กรณีวางฐานr b[]ในตอนท้ายและสลับไปยังฟังก์ชั่นมัด (พูด#) b#_=แล้วคุณสามารถใช้ นอกจากนี้คุณยังสามารถเปลี่ยนอัลกอริทึมของคุณเล็กน้อยโดยการสร้างรายการเพื่อตรวจสอบ0และ2s ขั้นตอนโดยขั้นตอนแทนการแบกไปรอบ ๆ สายของrในสะสมกับกรณีฐานr(x:y:z) ... = x : r (...) a จะตรวจสอบหลังจากที่โทรเริ่มต้นr b [] = b r[0]ทั้งหมด 73 ไบต์
nimi


1
... หรือดีกว่า: อยู่กับตัวสะสมและเปลี่ยนเป็นfoldl(59 ไบต์): ลองออนไลน์! .
nimi

@nimi ขอบคุณมากตรงชนิดของเคล็ดลับผมกำลังมองหา :)
วินเซนต์

3

JavaScript (ES6), 63 ไบต์

รับอินพุตเป็นอาร์เรย์ของอักขระ ส่งคืนค่าfalseสำหรับวงเล็บที่มีความสมดุลจริง ๆ แล้วจะไม่ส่งผลต่อความสมดุล

a=>[...a,k=0].some(c=>c<')'?!(a[k]=-~a[k++]):a[k]=~5>>a[k--]&1)

ลองออนไลน์!

แสดงความคิดเห็น

a =>                     // a[] = input array of characters; we are going to reuse it to
  [                      // store the number of parenthesis groups at each depth
    ...a,                // append all characters
    k = 0                // initialize k = current depth to 0 and append a value that will
  ]                      // be treated as a final closing parenthesis for the root level
  .some(c =>             // for each character c in this array:
    c < ')' ?            //   if c is an opening parenthesis:
      !(                 //     increment the number of groups at the current depth
        a[k] = -~a[k++]  //     increment the depth
      )                  //     yield false
    :                    //   else:
      a[k] = ~5          //     make sure that the current depth contains either 0 or 2
             >> a[k--]   //     groups, by shifting the 1-complement of 5 (101 in binary)
             & 1         //     and testing the least significant bit
                         //     it resets the number of groups to 0 if the bit is not set
                         //     otherwise, it forces some() to return true
                         //     decrement the depth
  )                      // end of some()

วนซ้ำ 54 ไบต์

ใช้การแทนที่แบบเรียกซ้ำ (เช่นในคำตอบ Japt ของ ETHproductions ) นั้นสั้นกว่าอย่างมาก

รับอินพุตเป็นสตริง ส่งคืน1สำหรับความสมดุลในวงเล็บและ0ไม่สมดุลในวงเล็บ

f=s=>s==(s=s.split`(()())`.join`()`)?!s|s=='()()':f(s)

ลองออนไลน์!


วนซ้ำ 46 ไบต์

อันนี้โยนข้อผิดพลาดการเรียกซ้ำเพื่อไม่สมดุลวงเล็บ:

f=s=>!s|s=='()()'||f(s.split`(()())`.join`()`)

ลองออนไลน์!


ฉันไม่ดีใน JavaScript แต่สามารถ x [k] = - ~ x [k ++] ถูกแทนที่ด้วย x [k] ++; k ++ หรือแม้กระทั่ง ++ x [k ++]?
АндрейЛомакин

2
@ АндрейЛомакинไม่มีเพราะx[k]ไม่ได้กำหนดในขั้นต้นและx[k]++จะให้NaNในขณะที่ช่วยให้-~undefined 1
Arnauld

@ АндрейЛомакинตอนนี้ฉันกำลังใช้อาร์เรย์อินพุตอีกครั้งดังนั้นa[k]ในตอนแรกจึงมีอักขระ แต่ตรรกะเดียวกันนี้ใช้กับสตริง: การใช้++โอเปอเรเตอร์กับพวกมันให้ผลตอบแทนNaNแต่ตัวดำเนินการระดับบิต (เช่น~) บังคับให้พวกมันถูกบีบบังคับ0ก่อน
Arnauld

ใช้จาวาสคริปต์ในระดับใหม่ทั้งหมด : D
ibrahim mahrir

3

Perl 6 ,  43 41  37 ไบต์

{my rule f{\([<&f>**2]?\)};?/^<&f>**2$|^$/}

ทดสอบมัน

{(my$f)=/\([<$f>**2]?\)/;?/^[<$f>**2]?$/}

ทดสอบมัน

{$!=/\([<$!>**2]?\)/;?/^[<$!>**2]?$/}

ทดสอบมัน

ขยาย:

{  # bare block lambda with implicit parameter $_

  $! = # store regex into $! (no need to declare it)
  /
    \(

      [
        <$!> ** 2 # recurse into regex twice
      ]?          # optionally

    \)
  /;


  ?      # boolify (causes it to be run against $_)

    /
      ^         # beginning of string

      <$!> ** 2 # match using regex twice

      $         # end of string

    |           # or

      ^ $       # empty string
    /
}

3

R , 71 ไบต์

f=function(s,r=sub('(()())','()',s,f=T))'if'(r==s,s==''|s=='()()',f(r))

ลองออนไลน์!

  • พอร์ตของโซลูชัน Japt แบบเรียกซ้ำของ @ETHproductions
  • -2 ไบต์ขอบคุณ @JayCe

อีกต่อไป - โซลูชันยาวขึ้น แต่น่าสนใจสำหรับแนวทางที่แตกต่าง

R , 85 ไบต์

g=gsub;!sum(eval(parse(t=g('\\)\\(',')-(',g('\\)','-1)',g('\\(','(2+',scan(,'')))))))

ลองออนไลน์!

คำอธิบาย:

ใช้สตริงอินพุตและแทนที่:

'('  with '(2+'
')'  with '-1)'
')(' with ')-('

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

เช่น

()(()()) => (2+-1)-(2+(2+-1)-(2+-1)-1) = 0
(()())   => (2+(2+-1)-(2+-1)-1)        = 1

บันทึกสองไบต์:f=function(s,r=sub('(()())','()',s,f=T))'if'(r==s,s==''|s=='()()',f(r))
JayCe

คุณควรวางโซลูชันที่สั้นกว่าไว้ก่อน
เฉพาะ ASCII เท่านั้น

@ ASCII เท่านั้น: คุณพูดถูก แต่เนื่องจากโดยทั่วไปแล้วมันเป็นวิธีการแก้ปัญหาแบบอื่นดูเหมือนว่า "การขโมย": P
digEmAll

3
@digEmAll ดีมากในความท้าทายที่นี่ความท้าทายส่วนใหญ่ทำเพียงแค่แก้ปัญหาพอร์ตอื่น
ASCII- เท่านั้น


2

05AB1E , 18 16 13 ไบต์

…(ÿ)…(()∞„()©:®Q

ท่าเรือ@ETHproductionsคำตอบ Japt 's()(()()(()())(()()))ในการแก้ไขปัญหากรณีทดสอบ
-2 ไบต์ขอบคุณที่@Adnan

จากความคิดเห็นของ OPตอนนี้ฉันใช้()เป็นค่าจริงและสิ่งอื่นใดเป็นเท็จ หากค่าทั้งสองจำเป็นต้องสอดคล้องกันแทนที่จะเป็นหนึ่งเดียวมันจะเป็นคำตอบแบบเก่าขนาด 16 ไบต์แทน ( …(ÿ)…(()∞„()©:®Q) กลับมา0เพื่อความจริงและ1สำหรับกรณีทดสอบที่ผิดพลาด

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

คำอธิบาย

…(ÿ)             # Take the input (implicitly) and surround it with "(" and ")"
            :    # Infinite replacement of:
    …(()∞        #  "(()())"    ("(()" mirrored)
         „()     #  with "()"
                 # After the infinite replacement: return the result
                 # ("()" for truthy; falsey otherwise)

(คำตอบ 18 ไบต์เก่าซึ่งล้มเหลวสำหรับกรณีทดสอบ()(()()(()())(()())).. ):

ΔD„()∞©6∍å_i®õ.:]Ā

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


ฉันคิดว่าคุณสามารถใช้วิธีแทนที่แบบไม่มีที่สิ้นสุด: „()∞õ:g_.
Adnan

ไม่ต้องรอฉันเข้าใจผิดความท้าทาย
Adnan

@Adnan ฉันคิดอย่างนั้นในตอนแรกเช่นกัน แต่มันล้มเหลวสำหรับกรณีทดสอบที่มี(()()()())ซึ่งควรกลับเท็จ ทุกกลุ่มวงเล็บควรมีกลุ่มภายใน 0 หรือ 2 กลุ่ม
Kevin Cruijssen

1
คุณสามารถแทนที่ด้วย'(®')J …(ÿ)
Adnan

@Adnan ขอบคุณ! ฉันรู้ว่าÿมีอยู่แล้ว แต่ไม่เคยใช้มาก่อนเลยลืมมันไปเลย
Kevin Cruijssen


2

Prologขนาด 46 ไบต์

a-->p,p.
a-->[].
p-->[l],a,[r].
f(X):-a(X,[]).

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

รายการการใช้lและrเป็น input เช่นมีการทดสอบเป็น"()()"f([l,r,l,r]).

สามบรรทัดแรกมีไวยากรณ์ของสตริงที่ถูกต้องในอารัมภบทของDefinite ข้อไวยากรณ์ไวยากรณ์ a(A,B).ส่งคืนtrueเมื่อAเป็นรายการที่ตามหลังไวยากรณ์และBว่างเปล่า ดังนั้นฟังก์ชั่นหลักfใช้เวลาบางส่วนXและตรวจสอบว่าa(X,[])มีการถือครอง



1

brainfuck, 50 ไบต์

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

จัดรูปแบบ:

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

คาดว่าจะมีสตริงของ(และ)ไม่มีการขึ้นบรรทัดใหม่และผลลัพธ์\x01เป็นจริงและ\x00เป็นเท็จ (เพื่อความชัดเจนคุณสามารถเพิ่ม 48 +วินาทีก่อนถึงขั้นสุดท้าย.เพื่อพิมพ์1และ0แทน)

ลองออนไลน์

สิ่งนี้รักษาสแต็กที่มีจำนวนกลุ่มที่แต่ละระดับความลึกแยกแยะอักขระตามพาริตี้และตรวจสอบว่าจำนวนกลุ่มอยู่ใน {0, 2} หลังจากวงเล็บปิดแต่ละอันหรือไม่ หากไม่ตรงตามเงื่อนไขให้ใช้อินพุตที่เหลือและตั้งค่าสถานะ จากนั้นตรวจสอบเงื่อนไขอีกครั้งในตอนท้ายของโปรแกรม

หากเราได้รับอนุญาตให้ยุติการสตรีมอินพุตด้วยอักขระคี่เราสามารถละเว้นการตรวจสอบขั้นสุดท้าย<[--[>->]]เพื่อบันทึก 10 ไบต์ (ถ้า\nไม่สะดวกผมอาจเสนอตัวแปรนี้เป็นคำตอบหลัก)

(เราสามารถบันทึกบางไบต์ด้วยการเปลี่ยนรูปแบบผลลัพธ์\x00เป็นจริงและไม่ใช่\x00สำหรับเท็จซึ่งดูเหมือนว่าจะได้รับอนุญาต (อาจบังเอิญ) โดยคำแถลงปัญหาตามที่เขียน แต่อย่างไรก็ตามมันไม่น่าสนใจมากและฉันชอบ ไม่ต้องทำการเปลี่ยนแปลง)


1

Python2, 95 94 ไบต์

f=lambda i:g(eval("(%s)"%i.replace(")","),")))
g=lambda i:len(i)in(0,2)and all(g(j)for j in i)

ลองออนไลน์!

f () แปลงสตริงเป็น tuple ที่ซ้อนกันซึ่งส่งผ่านไปยัง g ()

g () เรียกซ้ำ tuple และส่งกลับค่า False ถ้าองค์ประกอบใด ๆ ไม่มีลูก 0 หรือ 2 คน

บันทึกหนึ่งไบต์โดยใช้การจัดรูปแบบสตริง


1

Stax , 13 11 ไบต์

₧aaS▐îî»Å·╢

เรียกใช้และแก้ไขข้อบกพร่อง

ฉันบันทึกสองไบต์เมื่อฉันตระหนักว่าอินพุตสามารถบังเอิญถูกทำให้เป็นค่าโดยนัยเป็นตัวอักษรของอาร์เรย์ การลบเครื่องหมายคำพูดคู่จะทำให้อินพุตง่ายขึ้น

ความคิดทั่วไปคือการประเมินอินพุตเป็นอาเรย์ตามตัวอักษรและแมปองค์ประกอบซ้ำ ๆ เพื่อตรวจสอบยอดเงินคงเหลือ หากการยืนยันครั้งสุดท้ายล้มเหลวจะมีป๊อปที่ตามมาในสแต็กเปล่า ในสแตกซ์การเปิดด้วยสแต็กเปล่าจะยุติโปรแกรมทันที

คลายกล่อง ungolfed และแสดงความคิดเห็นมันมีลักษณะเช่นนี้

        input is implicitly treated as array literals
L       wrap entire input stack in an array
G       jump to the trailing '}', and come back when done
}       terminate the program, the rest is a recursive call target
{Gm     map array on top of the stack by using the recursive call target
%       get the length of the mapped array
02\#    is the length one of [0, 2]?
|c      assert value is truthy, pop if not

เรียกใช้อันนี้


1

Java 10, 99 96 95 83 ไบต์

s->{s="("+s+")";for(var p="";!p.equals(s);s=s.replace("(()())","()"))p=s;return s;}

พอร์ตของคำตอบ 05AB1Eของฉัน(ดังนั้นจะส่งคืนเช่นกัน()เป็นความจริงและสิ่งอื่นใดเป็นเท็จ)

ลองออนไลน์

คำอธิบาย:

s->{                 // Method with String as both parameter and return-type
  s="("+s+")";       //  Surround the input-String between "(" and ")"
  for(var p="";      //  Previous-String, starting empty
      !p.equals(s)   //  Loop as long as the previous and current Strings differ
      ;              //    After every iteration:
       s=s.replace("(()())","()"))
                     //     Replace all "(()())" with "()"
    p=s;             //   Set the previous String with the current
  return s;}         //  Return the modified input-String
                     //  (if it's now "()" it's truthy; falsey otherwise)

return s;สามารถเป็นได้return"()".equals(s);ถ้าต้องการผลลัพธ์บูลีนจริง


คุณสามารถบันทึกหนึ่งไบต์หากคุณเพิ่งตรวจสอบ!s.contains("()()(")
Charlie

@ Charlie ขอบคุณ แต่รหัสมีข้อบกพร่องอยู่แล้วดังนั้นจึงต้องเปลี่ยนมัน ตอนนี้ได้รับการแก้ไขแล้ว (สำหรับกรณีทดสอบที่เพิ่มขึ้นล่าสุด) และ golfed 4 ไบต์ในเวลาเดียวกัน
Kevin Cruijssen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.