ความท้าทายที่เชื่อมโยงกัน


40

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

ลิงค์แรก

หรือฉันอาจเขียนabbcac

ลิงค์ที่สอง

เมื่อฉันวาดเส้นเหล่านี้ฉันพยายามที่จะวาดลูปแบบปิดล้อมรอบชิ้นเพื่อให้วงของฉันไม่ได้ตัดเส้นใด ๆ ที่ฉันเพิ่งวาด ยกตัวอย่างเช่นในวงแรกวงเดียวที่เราวาดได้นั้นอยู่รอบตัวทั้งหมด แต่ในวงที่สองเราสามารถวาดวงรอบ ๆ แค่b s (หรือทุกอย่างอื่น)

วนซ้ำ

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

โปรดทราบว่าบางสายสามารถวาดได้หลายวิธี ตัวอย่างเช่นbbbbสามารถวาดได้ทั้งสองวิธีต่อไปนี้ (และไม่รวมอยู่ในรายการที่สาม):

วิธีที่ 1 หรือ วิธีที่ 2

หากหนึ่งในวิธีเหล่านี้สามารถวาดได้ว่าวงรอบปิดสามารถสร้างขึ้นเพื่อให้มีอักขระบางตัวได้โดยไม่ต้องตัดเส้นใด ๆ จากนั้นสตริงจะไม่ถูกเชื่อมโยงกัน (ดังนั้นbbbbไม่ได้เชื่อมโยงกัน)

งาน

งานของคุณคือการเขียนโปรแกรมเพื่อระบุสตริงที่เชื่อมโยงกัน การป้อนข้อมูลของคุณจะประกอบด้วยสตริงที่อักขระทุกตัวปรากฏเป็นจำนวนครั้งและผลลัพธ์ของคุณควรเป็นหนึ่งในสองค่าที่สอดคล้องกันอย่างใดอย่างหนึ่งหนึ่งถ้าสตริงมีการเชื่อมโยงดีและอื่น ๆ

นอกจากนี้โปรแกรมของคุณจะต้องมีความหมายของสตริงที่เชื่อมโยงกัน

  • ตัวละครทุกตัวปรากฏเป็นจำนวนครั้งในโปรแกรมของคุณ

  • มันควรส่งออกค่าความจริงเมื่อผ่านตัวเอง

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

คำตอบจะได้คะแนนตามความยาวเป็นไบต์โดยมีจำนวนไบต์น้อยกว่าซึ่งเป็นคะแนนที่ดีกว่า

เปรย

สตริงจะไม่ได้รับการเชื่อมโยงอย่างดีถ้ามีสตริงย่อยแบบ จำกัด ที่ไม่ต่อเนื่องที่ไม่ต่อเนื่องกันอยู่ซึ่งอักขระแต่ละตัวจะปรากฏเป็นจำนวนครั้งในสตริงย่อยนั้น

กรณีทดสอบ

abcbac -> True
abbcac -> False
bbbb -> False
abacbc -> True
abcbabcb -> True
abcbca -> False

1
กรณีทดสอบ: abcbca -> False.
Orjan ฮันเซน

thereผมคิดว่าคำแนะนำของคุณมีฟุ่มเฟือย
Jonathan Frech

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

อักขระชนิดใดที่สามารถอยู่ในอินพุต
xnor

@xnor ฉันเพิ่มลงในความท้าทาย หวังว่ามันจะหมดไป
ข้าวสาลีตัวช่วยสร้าง

คำตอบ:


19

Regex (ECMAScript 2018 หรือ. NET), 140 126 118 100 98 82 ไบต์

^(?!(^.*)(.+)(.*$)(?<!^\2|^\1(?=(|(<?(|(?!\8).)*(\8|\3$){1}){2})*$).*(.)+\3$)!?=*)

นี่ช้ากว่ารุ่น 98 ไบต์มากเพราะ^\1อยู่ทางซ้ายของ lookahead และประเมินผลหลังจากนั้น ดูด้านล่างสำหรับ switcheroo แบบง่ายที่ได้ความเร็ว แต่ด้วยเหตุนี้ TIO สองตัวด้านล่างจะถูก จำกัด ให้ทำชุดทดสอบที่เล็กกว่าที่กำหนดไว้ก่อนหน้านี้และหนึ่งใน. NET นั้นช้าเกินไปที่จะตรวจสอบ regex ของตัวเอง

ลองออนไลน์! (ECMAScript 2018)
ลองออนไลน์! (.สุทธิ)

เมื่อต้องการลดขนาด 18 ไบต์ (118 → 100) ฉันขโมยการเพิ่มประสิทธิภาพที่ดีมากจากregex ของ Neilที่หลีกเลี่ยงความต้องการที่จะใส่ lookahead ใน lookbehind เชิงลบ (ให้ regex 80 ไบต์ที่ไม่ จำกัด ) ขอบคุณนีล!

นั่นกลายเป็นล้าสมัยเมื่อมันลดลงอย่างไม่น่าเชื่ออีก 16 ไบต์ (98 → 82) จากความคิดของเจย์เตอาซึ่งนำไปสู่เร็กคอร์ด 69 ไบต์ที่ไม่ จำกัด ! มันช้ากว่ามาก แต่นั่นคือกอล์ฟ!

โปรดทราบว่า(|(no-ops สำหรับการทำ regex well-linked มีผลทำให้การประเมินช้ามากภายใต้. NET พวกเขาไม่ได้มีผลใน ECMAScript เพราะเป็นศูนย์ที่มีความกว้างตรงกับตัวเลือกที่ได้รับการปฏิบัติที่ไม่ตรงกับ-

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

ไม่มีอักขระพิเศษที่จำเป็นเพื่อให้ผ่านการ จำกัด ( 101 69 ไบต์):

^(?!(.*)(.+)(.*$)(?<!^\2|^\1(?=((((?!\8).)*(\8|\3$)){2})*$).*(.)+\3))

มันช้า แต่การแก้ไขง่ายๆนี้ (เพียง 2 ไบต์พิเศษ) จะได้รับความเร็วที่หายไปทั้งหมดและอีกมากมาย:

^(?!(.*)(.+)(.*$)(?<!^\2|(?=\1((((?!\8).)*(\8|\3$)){2})*$)^\1.*(.)+\3))

^
(?!
    (.*)               # cycle through all starting points of substrings;
                       # \1 = part to exclude from the start
    (.+)               # cycle through all ending points of non-empty substrings;
                       # \2 = the substring
    (.*$)              # \3 = part to exclude from the end
    (?<!               # Assert that every character in the substring appears a total
                       # even number of times.
        ^\2            # Assert that our substring is not the whole string. We don't
                       # need a $ anchor because we were already at the end before
                       # entering this lookbehind.
    |                  # Note that the following steps are evaluated right to left,
                       # so please read them from bottom to top.
        ^\1            # Do not look further left than the start of our substring.
        (?=
            # Assert that the number of times the character \8 appears in our
            # substring is odd.
            (
                (
                    ((?!\8).)*
                    (\8|\3$) # This is the best part. Until the very last iteration
                             # of the loop outside the {2} loop, this alternation
                             # can only match \8, and once it reaches the end of the
                             # substring, it can match \3$ only once. This guarantees
                             # that it will match \8 an odd number of times, in matched
                             # pairs until finding one more at the end of the substring,
                             # which is paired with the \3$ instead of another \8.
                ){2}
            )*$
        )
        .*(.)+         # \8 = cycle through all characters in this substring
        # Assert (within this context) that at least one character appears an odd
        # number of times within our substring. (Outside this negative lookbehind,
        # that is equivalent to asserting that no character appears an odd number
        # of times in our substring.)
        \3             # Skip to our substring (do not look further right than its end)
    )
)

ฉันเขียนโดยใช้ lookahead โมเลกุล ( 103 69 bytes) ก่อนที่จะแปลงเป็น lookbehind ความยาวผันแปร:

^(?!.*(?*(.+)(.*$))(?!^\1$|(?*(.)+.*\2$)((((?!\3).)*(\3|\2$)){2})*$))

^
(?!
    .*(?*(.+)(.*$))       # cycle through all non-empty substrings;
                          # \1 = the current substring;
                          # \2 = the part to exclude from the end
    (?!                   # Assert that no character in the substring appears a
                          # total even number of times.
        ^\1$              # Assert that our substring is not the whole string
                          # (i.e. it's a strict substring)
    |
        (?*(.)+.*\2$)    # \3 = Cycle through all characters that appear in this
                          # substring.
        # Assert (within this context) that this character appears an odd number
        # of times within our substring.
        (
            (
                ((?!\3).)*
                (\3|\2$)
            ){2}
        )*$
    )
)

และเพื่อช่วยในการทำให้ regex ของฉันเชื่อมโยงกันฉันได้ใช้รูปแบบของ regex ด้านบน:

(?*(.+)(.*$))(?!^\1$|(?*(.)+.*\2$)((((?!\3).)*(\3|\2$)){2})*$)\1

เมื่อใช้กับregex -xml,rs -oสิ่งนี้จะระบุสตริงย่อยที่เข้มงวดของอินพุตที่มีจำนวนคู่ของทุกอักขระ (ถ้ามี) แน่นอนว่าฉันสามารถเขียนโปรแกรมที่ไม่ใช่ regex เพื่อทำสิ่งนี้ให้ฉันได้ แต่ความสนุกจะอยู่ที่ไหน


8
wtf มันยังคงเล่นกอล์ฟอยู่
ASCII เท่านั้น

@ ASCII เท่านั้นและยังคงเล่นกอล์ฟอยู่ ...
Quintec

11

เยลลี่, 20 ไบต์

ĠẈḂẸẆṖÇ€Ạ
ĠẈḂẸ
ẆṖÇ€Ạ

ลองออนไลน์!

บรรทัดแรกจะถูกละเว้น มีเพียงเพื่อให้เป็นไปตามเงื่อนไขที่ตัวละครทุกตัวปรากฏขึ้นหลายครั้ง

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

ดังนั้นลิงค์ตัวช่วยนี้จะคืนค่าว่าสตริงย่อยไม่สามารถวนได้

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


ดังนั้นใช่นี่จะเป็นทางออกของฉันเช่นกัน แต่น่าเสียดายที่มันน่าเบื่อ ... :(
Erik the Outgolfer

8

J , 34 ไบต์

2:@':.,|~*'>1(#.,)*/@(1>2|#/.~)\.\

ลองออนไลน์!

-8 ไบต์ขอบคุณ FrownyFrog

เป็นต้นฉบับ

J , 42 ไบต์

(*#'.,012&|@~#')=1#.[:,([:*/0=2&|@#/.~)\.\

ลองออนไลน์!

คำอธิบาย

(*#'.,012&|@~#') = 1 #. [: , ([: */ 0 = 2&|@#/.~)\.\

(*#'.,012&|@~#')                                       NB. this evaluates to 1
                                                       NB. while supplying extra
                                                       NB. chars we need.  hence...
                 =                                     NB. does 1 equal...
                   1 #.                                NB. the sum of...
                        [: ,                           NB. the flatten of...
                             (                  )\.\   NB. the verb in parens applied
                                                       NB. to every suffix of every
                                                       NB. prefix, ie, all contiguous 
                                                       NB. substrings
                             ([: */ 0 = 2&|@#/.~)      NB. def of verb in paren:
                                             /.~       NB. when we group by each
                                                       NB. distinct char...
                              [: */                    NB. is it the case that
                                                       NB. every group...
                                           @#          NB. has a length...
                                    0 = 2&|            NB. divisible by 2...

1
@Deadcode เนื่องจากการจัดการที่มีจำนวนการทดสอบที่ตรงกันข้ามสำหรับสตริงทั้งหมดเป็นสตริงย่อยอื่น ๆ ทุกคนดูเหมือนว่าเดิมพันที่ปลอดภัยที่ทางออกส่วนใหญ่จะออกจากที่ การทดสอบด้วยabcเพียงรายการ Perl ไม่ได้ "ล้มเหลว" กับมัน (มันมีปัญหาอื่น ๆ )
Ørjan Johansen

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

1:@':.,02|~*'=1(#.,)*/@(0=2|#/.~)\.\
FrownyFrog

1
2:@':.,|~*'>1(#.,)*/@(1>2|#/.~)\.\ดูเหมือนว่ายังถูกต้อง
FrownyFrog

6

Python 3.8 (เผยแพร่ล่วงหน้า) , 66 ไบต์

lambda l,b={id}:len({str(b:=b^{c})for(c)in l})<len(l)#,<^fmnost{}#

ลองออนไลน์!

การแสดงออกของยุคของการมอบหมายเป็นพวกเรา ด้วยPEP 572 ที่รวมอยู่ใน Python 3.8 การตีกอล์ฟจะไม่เหมือนเดิม คุณสามารถติดตั้งตัวอย่าง 3.8.0a1 นักพัฒนาต้นที่นี่

นิพจน์การมอบหมายให้คุณใช้:=เพื่อกำหนดให้กับตัวแปรอินไลน์ในขณะที่ประเมินค่านั้น ยกตัวอย่างเช่นให้(a:=2, a+1) (2, 3)แน่นอนว่านี่สามารถใช้เก็บตัวแปรเพื่อนำมาใช้ซ้ำได้ แต่ที่นี่เราไปอีกขั้นหนึ่งแล้วใช้เป็นตัวสะสมในความเข้าใจ

ตัวอย่างเช่นรหัสนี้คำนวณผลรวมสะสม [1, 3, 6]

t=0
l=[1,2,3]
print([t:=t+x for x in l])

สังเกตว่าแต่ละครั้งที่ผ่านรายการความเข้าใจtจะมีผลรวมสะสมเพิ่มขึ้นอย่างไรxและค่าใหม่จะถูกเก็บไว้ในรายการที่สร้างโดยความเข้าใจ

ในทำนองเดียวกันb:=b^{c}อัพเดตชุดอักขระbเพื่อสลับว่ามีอักขระcหรือไม่และประเมินค่าใหม่bเป็น ดังนั้นรหัส[b:=b^{c}for c in l]ซ้ำตัวละครcในlและสะสมชุดของตัวละครที่เห็นจำนวนครั้งในแต่ละคำนำหน้าไม่ว่างเปล่า

รายการนี้มีการตรวจสอบซ้ำกันโดยทำให้มันเป็นชุดความเข้าใจแทนและดูว่าความยาวของมันมีขนาดเล็กกว่านั้นsหรือไม่ซึ่งหมายความว่ามีการทำซ้ำบางรายการที่ถูกยุบ ถ้าเป็นเช่นนั้นการทำซ้ำหมายความว่าในส่วนของการsมองเห็นในระหว่างเวลาที่ตัวละครทุกตัวพบจำนวนแม้จำนวนทำให้สายไม่เชื่อมโยงกัน Python ไม่อนุญาตให้มีชุดของชุดที่ unhashable ดังนั้นชุดชั้นในจึงถูกแปลงเป็นสตริงแทน

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

สำหรับการ จำกัด แหล่งที่มาตัวละครที่ไม่ได้จับคู่จะถูกยัดไว้ในคอมเม้นต์ในตอนท้าย เขียนfor(c)in lแทนที่จะfor c in lยกเลิก parens พิเศษฟรี เราใส่idชุดเริ่มต้นbซึ่งไม่เป็นอันตรายเนื่องจากสามารถเริ่มเป็นชุดใดก็ได้ แต่ชุดที่ว่างเปล่าไม่สามารถเขียนได้{}เพราะ Python จะสร้างพจนานุกรมที่ว่างเปล่า เนื่องจากตัวอักษรiและdอยู่ในกลุ่มที่ต้องการการจับคู่เราจึงสามารถใส่ฟังก์ชั่นidนั้นได้

โปรดทราบว่ารหัสที่ส่งออกเป็นลบบูลีนดังนั้นมันจะถูกต้องFalseในตัวเอง



5

Python 2 , 74 ไบต์

bmn0=f=lambda s,P={0},d=[]:s<" "if(P in d)else+f(s[f<s:],P^{s[0^0]},[P]+d)

ลองออนไลน์!

วนซ้ำผ่านสตริงทำให้ติดตามPชุดของตัวละครเห็นเป็นจำนวนคี่ครั้ง รายการจัดdเก็บค่าที่ผ่านมาทั้งหมดของPและหากเห็นกระแสที่Pมีอยู่แล้วdซึ่งหมายความว่าในตัวละครที่เห็นตั้งแต่เวลานั้นตัวละครแต่ละตัวมีจำนวนครั้งที่เท่ากัน ถ้าเป็นเช่นนั้นตรวจสอบว่าเราได้ผ่านการป้อนทั้งหมด: ถ้าเรามียอมรับเพราะสตริงทั้งหมดจะถูกจับคู่ตามที่คาดไว้และอื่น ๆ ปฏิเสธ

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

bmn0=f=lambda s,P={0},d=[]:s<" "if(P in d)else+f(s[f<s:],P^{s[0^0]},[P]+d)
_____              _              _      _    _    ___        ___    

การf<sประเมิน0ในขณะที่จับคู่fกันโดยใช้ประโยชน์จากชื่อฟังก์ชั่นยังเป็นfเพื่อให้มันถูกกำหนด (ตามเวลาที่ฟังก์ชั่นที่เรียกว่า.) การ0^0ดูดซับ^สัญลักษณ์

0ในP={0}เป็นโชคร้าย: ในหลาม{}ประเมินไปยัง Dict ว่างมากกว่าเซตว่างตามที่เราต้องการและที่นี่เราสามารถใส่ในองค์ประกอบที่ไม่ใช่ตัวอักษรและมันจะไม่เป็นอันตราย ฉันไม่เห็นว่ามีอะไรเหลือเฟือที่จะใส่เข้าไปและได้ใส่0และทำซ้ำลงไปbmn0ซึ่งมีราคา 2 ไบต์ โปรดทราบว่าอาร์กิวเมนต์เริ่มต้นจะได้รับการประเมินเมื่อมีการกำหนดฟังก์ชันดังนั้นตัวแปรที่เรากำหนดเองจะไม่สามารถใส่ได้ที่นี่


4

Perl 6 , 76 ไบต์

*.comb[^*X+(^*).map(^*)].grep({$_&[&]($_)}).none.Bag{*}.none%2#*^+XBob2rec%#

ลองออนไลน์!

A แลมบ์ดาใดก็ตามที่ส่งคืนค่า None Junction ของ None Junctions ที่สามารถทำให้เสียค่าได้ตามความจริง / ค่าเท็จ ฉันจะแนะนำไม่ได้เอา?ที่ boolifies ผลกลับมาแม้ว่ามิฉะนั้นการส่งออกที่ได้รับค่อนข้างใหญ่

วิธีการแก้ปัญหานี้เป็นเพียงเล็กน้อยที่ซับซ้อนมากขึ้นกว่าที่จำเป็นเนื่องจากฟังก์ชั่นที่เกี่ยวข้องกับหลายถูกยกเลิกการเชื่อมโยงเช่น.., all, >>, %%ฯลฯ โดยไม่มีข้อ จำกัด ของแหล่งที่มานี้อาจจะมี 43 ไบต์:

*.comb[^*X.. ^*].grep(?*).one.Bag{*}.all%%2

ลองออนไลน์!

คำอธิบาย:

*.comb                     # Split the string to a list of characters
      [^*X+(^*).map(^*)]   # Get all substrings, alongside some garbage
                        .grep({$_&[&]($_)})        # Filter out the garbage (empty lists, lists with Nil values)
                                           .none                 # Are none of
                                                .Bag{*}          # The count of characters in each substring
                                                       .none%2   # All not divisible by 2

                                               #*^+XBob2rec%#    And garbage to even out character counts

3

Perl 5 -p, 94, 86, 78 ไบต์

m-.+(?{$Q|=@q&grp,$\|=$&eq$_^!grep+/^/&(@m=$g=~/\Q$_/g),($g=$&)=~/./g})(?!)-}{

ouput 0 ถ้าเชื่อมโยงกันเป็นอย่างอื่น 1

78 ไบต์

86 ไบต์

94 ไบต์

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

  • -pด้วย}{เคล็ดลับสิ้นสุดการส่งออก$\ในตอนท้าย
  • m-.+(?{.. })(?!)-, เพื่อรันโค้ดบนซับสตริงที่ไม่ว่างทั้งหมด ( .+ตรงกับสตริงทั้งหมดก่อน, และหลังเอ็กซีคิ้วท์โค้ดระหว่าง(?{.. })backtracks เนื่องจากการบังคับล้มเหลว(?!)
  • $Q|=@q&grp, ขยะเนื่องจากข้อ จำกัด ของแหล่งที่มา
  • $\|=จำนวนเต็มบิตหรือการกำหนดถ้ามีเกือบ 1, $\จะเป็น 1 (จริง), โดยค่าเริ่มต้นมันว่างเปล่า (เท็จ)
  • $&eq$_กรณีที่ sbustring เป็นสายอักขระทั้งหมดเป็น bitwise xored ^ด้วย "ไม่มีอักขระแปลก ๆ "
  • ($g=$&)=~/./gเพื่อคัดลอกซับสตริงที่ตรงกันลงใน$g(เพราะจะถูก overwirtten หลังจากการจับคู่ regex ถัดไป) และส่งกลับอาร์เรย์ของอักขระของสตริงย่อย
  • /^/ ขยะที่ประเมินถึง 1
  • grep1 &(@m=$g=~/\Q$_/g),สำหรับอักขระแต่ละตัวในสตริงย่อยจะได้รับอาร์เรย์ของอักขระในการ$gจับคู่ตัวเองอาร์เรย์ในสเกลาร์จะประเมินขนาดและgrepเพื่อกรอง chracters ที่มีคี่ปรากฏขึ้น1&xเทียบเท่ากับx%2==1

ฉันไม่คิดว่านี่เป็นไปตามข้อ จำกัด ของแหล่งที่มา: ฉันนับจำนวนวงเล็บเปิดที่เป็นเลขคี่เช่น
msh210

@ msh210 นั่นไม่ใช่ประเด็นเหรอ? หากมีตัวเลขที่เท่ากันก็ไม่ได้เชื่อมโยงกัน
Quintec

หนึ่ง @Quintec ข้อกำหนดสำหรับการเชื่อมโยงกันก็คือว่ามีอยู่จำนวนแม้แต่ของตัวละครแต่ละตัว
Ørjan Johansen

คำตอบแรกของฉันมีข้อกำหนด แต่หลังจากพยายามเล่นกอล์ฟก็แพ้ อัปเดต แต่สามารถเล่นกอล์ฟได้
Nahuel Fouilleul

1
แหล่งที่มาทั้งหมดที่นี่เป็นไปตามข้อ จำกัด ของแหล่งที่มานอกจากนี้โค้ดจะคืนค่า 0 ถ้าเชื่อมโยงกันอย่างดีและจำนวนตัวอักษรแต่ละตัว
Nahuel Fouilleul

3

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

^(?!(.*)(.+)(.*)$(?<!^\2|^\1(?:(^?(?:(?!\6).)*\6){2})*(|(?!\6).)*(?!.+\6.*\3$)(.){1,}\3)(?!,<)?)

ลองออนไลน์! ลิงก์มีกรณีทดสอบรวมถึงตัวมันเอง แก้ไข: วางบิต regex ดั้งเดิมอย่างยุติธรรมด้วยความช่วยเหลือจาก @Deadcode จากนั้นเพิ่มเบาะสำรองให้น้อยลงเล็กน้อยเพื่อรักษารูปแบบของแหล่งข้อมูล คำอธิบาย:

^(?!(.*)(.+)(.*)$

ยืนยันว่าไม่มีซับสตริง\3ที่ตรงกับข้อ จำกัด ต่อไปนี้

(?<!^\2|

ยืนยันว่าสตริงย่อยไม่ใช่สตริงดั้งเดิมทั้งหมด

^\1(?:(^?(?:(?!\6).)*\6){2})*(|(?!\6).)*(?!.+\6.*\3$)(.){1,}\3)(?!,<)?)

ยืนยันว่าไม่มีตัวอักษร\6ดังกล่าว:

  • มันจะไม่ปรากฏระหว่างตัวละครตัวเอง (พิเศษ) และจุดสิ้นสุดของสตริงย่อย
  • มันจะปรากฏจำนวนครั้งระหว่างการเริ่มต้นของสตริงย่อยและตัวเอง (พิเศษ)

เพื่อที่จะผ่านข้อ จำกัด รูปแบบแหล่งที่มาของฉันแทนที่((((ด้วย(?:(^?(?:(และมี(( (|(ฉันยังคงมีข้อ จำกัด แหล่งหนึ่ง))ไปทางซ้ายและตัวอักษรที่!()1<{}เหลือดังนั้นฉันเปลี่ยนแปลง+เข้า{1,}และแทรกไร้ประโยชน์(?!,<)?ที่จะบริโภคส่วนที่เหลือ


2
ดูเหมือนว่าจะไม่เป็นไปตามข้อกำหนดของแหล่งที่มาที่ จำกัด
Ørjan Johansen

@ ØrjanJohansenในที่สุดฉันก็มาด้วยวิธีที่ถูกต้อง แม้ว่าจะมีขยะจำนวนมากอยู่ในนั้นดังนั้นอาจมีบางสิ่งบางอย่างที่สั้นกว่า ...
Neil

3

C # (Visual C # Interactive คอมไพเลอร์) , 208 206 200 198 ไบต์

x=>!x.GroupBy(c=>c).Any(g=>g.Count()%2>0)&!Enumerable.Repeat(x.Count,x.Count*x.Count).Where(
(l,i)=>i%l>0&!x.Skip(i/l).Take(i%l).GroupBy(c=>c).Any(g=>g.Count()%2>0)
).Any()/*>!oyAnC0EmeablR*WhiS/T*/

ลองออนไลน์!

-2 ไบต์ขอบคุณ @KevinCruijssen!

ในที่สุดก็มีน้อยกว่า 200 ดังนั้นฉันอาจจะเล่นกอล์ฟในตอนนี้ :) ฉันสิ้นสุดการสร้าง TIO ที่สองเพื่อทดสอบสิ่งต่าง ๆ ตามคำตอบก่อนหน้า

ลองออนไลน์!

สิ่งที่ทำให้งานนี้ยุ่งยาก:

  • ==ไม่อนุญาตให้ใช้ตัวดำเนินการที่เท่าเทียมกัน
  • ++ไม่อนุญาตให้ใช้ตัวดำเนินการเพิ่ม / มอบหมาย
  • All()ไม่อนุญาตให้ใช้ฟังก์ชันLinq

รหัสความคิดเห็นด้านล่าง:

// anonymous function that takes an IList as input
x=>
  // the first condition makes sure the string even
  // counts of each character
  !x.GroupBy(c=>c).Any(g=>g.Count()%2>0)&
  // the second condition generates all proper substrings of x
  // and tests for any that contain even character counts
  // the string length `l` is repeated `l*l` times
  !Enumerable.Repeat(x.Count,x.Count*x.Count)
    .Where((l,i)=>
      // check that the substring length is greater than 0
      i%l>0&
      // use skip/take to generate a substring
      // and check for a character count thats odd
      // negate the result meaning we have found
      // a substring that invalidates the input
      !x.Skip(i/l).Take(i%l)
        .GroupBy(c=>c).Any(g=>g.Count()%2>0)
    )
    // if any invalid substrings are found
    // then the result in invalid
    // the comment string at the end is needed
    // to make the program well-linked
    .Any()/*>!oyAnC0EmeablR*WhiS/T*/

คุณสามารถลบช่องว่างทั้งสองในความคิดเห็นต่อท้ายของคุณ
Kevin Cruijssen

@KevinCruijssen - ดีมาก :) ฉันลืมไปแล้วว่าฉันได้เพิ่มพื้นที่แล้ว ฉันต้องโยนอันอื่นลงในแหล่งที่มา
dana


2

Brachylogขนาด 16 ไบต์

sᶠb∋p~j&sᶠb∋p~j&

ลองออนไลน์!

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

คำอธิบาย

    Input is a string: "abcacbaa"
sᶠ  Find all substrings: ["abcacbaa","abcacba","abcacb",..,"a"]
b   Behead (now the proper substrings remain): ["abcacba","abcacb",..,"a"]
∋   Take one of them: "abcacb"
p   Permute it: "abcabc"
~j  It is some string repeated twice: "abc"
&   Get the input again: "abcacbaa"
    Then repeat the above.
    If the constraints can be satisfied, the result is true, otherwise false.

1

05AB1E , 22 20 ไบต์

Œε¢Pà}KŒIKεSIS¢ÈP}àÈ

ส่งออก1ถ้าสตริงมีการเชื่อมโยงที่ดีและ0ถ้าสตริงไม่ได้เชื่อมโยงกัน

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

คำอธิบาย:

โปรแกรมพื้นฐานคือŒsKεsS¢ÈP}à( 11 ไบต์ ) ซึ่งแสดงผล0ถ้าเชื่อมโยงอย่างดีและ1หากเชื่อมโยงไม่ดี Trailing È(is_even) เป็น semi-op ที่แปลงค่าเอาต์พุตดังนั้น1สำหรับสตริงที่ลิงก์อย่างดีและ0สำหรับสตริงที่ลิงก์ไม่ดี ส่วนอื่น ๆ ไม่ได้ปฏิบัติตามกฎการท้าทาย

Œε¢Pà}K         # No-ops: substrings, map, count, product, maximum, close map, remove
                # Due to the last remove, we're back at the (implicit) input again
Œ               # Take the substrings of the input
 IK             # Remove the input itself from that list of substrings
   ε            # Map each substring to:
    S           #  No-op: transform the substring into a list of characters
     IS         #  Get the input-string as a list of characters
       ¢        #  Count the occurrence of each character in the current substring
        È       #  Check which counts are even (1 if truthy; 0 if falsey)
         P      #  Take the product of that
              # After the map: check if any are truthy by taking the maximum
            È   # Semi no-op: check if this maximum is even (0 becomes 1; 1 becomes 0)
                # (and output the result implicitly)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.