เราได้อะไร


17

แรงบันดาลใจจากและในความทรงจำของอัจฉริยะที่รักของเรา

John Scholes, 1948-2019

ฉีก

เขาคิดค้นและนำไปใช้dfns - บทประพันธ์ของเขาและเรื่องของความท้าทาย

สำหรับความสนใจ: ล่าสุดเอกสาร dfns เต็มรูปแบบและวิดีโอที่มีจอห์น

งาน

ให้รหัสต้นฉบับของ ASCII ให้ตอบคำถามสี่ข้อต่อไปนี้

  1. Dyadic dop

  2. Monadic Dop

  3. DFN

  4. อื่น ๆ

คุณอาจส่งคืนค่าที่สอดคล้องกันสี่ค่า แต่โปรดระบุการจับคู่ของคุณหากไม่ชัดเจน

รายละเอียด

คุณอาจจะคิดว่ารหัสที่มามักจะเริ่มต้นด้วยการเปิดวงเล็บปีกกาและลงท้ายด้วยวงเล็บปีกกาปิด{}

วงเล็บปีกกาแบบวนซ้ำสามารถเกิดขึ้นได้ (เช่น{{{}}}) แต่หมวดที่ 1-3 ไม่สามารถมีความลึกของการซ้อนรั้งต่ำกว่า 1 (เช่น{}{}"อื่น ๆ ") และวงเล็บปีกกาทั้งหมดต้องมีความสมดุล (เช่น{{}"อื่น ๆ ")

อักขระในบริบทต่อไปนี้บนบรรทัดจะถูกละเว้น:

  1. ทางด้านขวาของ#(ความคิดเห็น):significant#ignored

  2. ล้อมรอบในราคาเดียว'... '(เช่นในสตริง): significant'ignored'significant(นี้นำไปใช้#มากเกินไป: '#'significant)

  3. ทางด้านขวาของ'เครื่องหมายคำพูดที่ไม่ได้จับคู่ (เครื่องหมายคำพูดจับคู่จากด้านซ้าย):significant'ignored

ในระดับปีกกาหนึ่ง (เช่นไม่รวมวงเล็บปีกกา):

  • Dyadic dops มีวลีที่ไม่หยุดชะงัก ww

  • Monadic dops ไม่มีwwแต่มีอยู่aa

  • Dfns ประกอบด้วยค่าwwมิได้aa

กรณีทดสอบ

Dyadic dops

{ww}
{
    www
}
{
''ww'
}
{aa

ww}
{'#''#'ww?aa}

Monadic dops

{aa}
{aaaa}
{aa{ww}'ww'}
{w#w'
aa'
}
{aaw*w}
{w'\'aa\''}

Dfns

{}
{a a}
{aA}
{
{aa}
}
{w
w''w#
w}
{{
}}
{w\'aa\'}

อื่น ๆ

{}{}
{{}
{}}
{ww}}
{}
{}
{ww}{}
{#}
{'
'}

@LuisfelipeDejesusMunoz Dfn หากคุณเห็นเหตุผลที่จะคิดอย่างอื่นโปรดแจ้งให้เราทราบ
Adám

1
สตริงอัญประกาศจะหนีไปได้หรือไม่และถ้าเป็นเช่นนั้นเราจำเป็นต้องจัดการกับมันหรือไม่? (เช่น: {'#\'ww?aa'}? -> อื่น ๆ )
Οurous

1
@ Οurousไม่ข้อมูลจำเพาะเป็นไปตามที่ระบุ: สิ่งใดก็ตามในเครื่องหมายคำพูดไม่มีนัยสำคัญ (อันที่จริงแล้วสตริง APL ไม่มีกลไกการหลบหนี) ฉันจะเพิ่มเคส
อดัม

อืมเราอาจสมมติว่าสตริงจะไม่มี''(เครื่องหมายอัญประกาศเดี่ยวในสตริงสามารถแยกวิเคราะห์เป็นสองสายที่อยู่ติดกันสำหรับความท้าทายนี้ได้)
Erik the Outgolfer

@EriktheOutgolfer มันอาจเกิดขึ้นได้ ฉันจะเพิ่มเคส แต่อย่างที่คุณพูดมันไม่สำคัญว่า'abc''def'จะแยกวิเคราะห์เป็นหนึ่งหรือสองสายสำหรับความท้าทายนี้
อดัม

คำตอบ:


9

JavaScript (ES6),  145 ... 138  136 ไบต์

0123

s=>[...s].map(c=>s=(n=`
aw}{#'`.indexOf(c))?n>5?i^=2:i?0:n>4?i=1:n>3?d++:n>2?x+=!d--:(o|=n<0|d|s!=c?0:n,c):i=0,o=i=0,x=d=-1)|x|~d?3:2>>o

ลองออนไลน์!

รุ่นอื่น

  • 131 ไบต์โดยใช้อาร์เรย์ของอักขระเป็นอินพุต
  • 132 ไบต์โดยใช้ Buffer () (Node.js)

อย่างไร?

สตริงการป้อนข้อมูลเป็นตัวแยกวิเคราะห์โดยตัวละคร

การแปลอักขระเป็นรหัส

n

 character | code | triggered operation
-----------+------+---------------------------------------------------------
    \n     |   0  | i = 0
     a     |   1* | o |= n < 0 | d | s != c ? 0 : n
     w     |   2* | o |= n < 0 | d | s != c ? 0 : n
     }     |   3* | x += !d--
     {     |   4* | d++
     #     |   5* | i = 1
     '     |   6  | i ^= 2
   other   |  -1* | same as 'a' or 'w', but always fails because of 'n < 0'

* * * *ผม0

ตัวแปรที่อธิบายสถานะตัวแยกวิเคราะห์

ตัวแปรต่อไปนี้ถูกใช้ระหว่างการวิเคราะห์คำ:

  • โอ

    • บิต 0: aaพบวลีที่ถูกต้อง
    • บิต 1: wwพบวลีที่ถูกต้อง
  • ผม

    • บิต 0: ขณะนี้เราอยู่ในความคิดเห็น
    • บิตที่ 1: ขณะนี้เราอยู่ในสตริง (บิตนี้ยังคงอัปเดตภายในความคิดเห็น แต่ไม่เป็นอันตราย)
  • s

  • d-1
  • x0-11

ผลสุดท้าย

3x0d-1012โอ


6

เยลลี่ ,  50 48 46  45 ไบต์

Ỵµṣ”'m2Kṣ”#Ḣ)KµċⱮƤØ{IF©<-oµ⁾waż¤ẇ€‘Ḅ«5×®¬Ḅ⁼1¤

Monadic Link ยอมรับรายการของอักขระที่ให้ผลลัพธ์:

5 - Dyadic dop
4 - Monadic dop
3 - Dfn
0 - Other

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

อย่างไร?

Ỵµṣ”'m2Kṣ”#Ḣ)KµċⱮƤØ{IF©<-oµ⁾waż¤ẇ€‘Ḅ«5×®¬Ḅ⁼1¤ - Link: list of characters
                                              - breaking long Link up...
Ỵµṣ”'m2Kṣ”#Ḣ)K      - Replace any strings or comments with (single) spaces
Ỵ                   - split at newline characters
 µ          )       - monadic chain for each:
  ṣ”'               -   split at apostrophe characters
     m2             -   modulo 2 slice (i.e. every other part starting with the first
                    -   - that is, non-string code. Will remove strings from within comments)
       K            -   join with spaces
        ṣ”#         -   split at octothorp characters
           Ḣ        -   head (i.e. non-comment code)
             K      - join with spaces

µċⱮƤØ{IF©<-oµ       - Replace characters of code at depth > 1 with the integer 1
µ           µ       - monadic chain, call previous result A:
    Ø{              -   literal ['{','}']
   Ƥ                -   for prefixes of A:
  Ɱ                 -     map across right argument with:
 ċ                  -       count
      I             -   deltas (i.e. [count('}') - count('{')] for each prefix)
       F            -   flatten (i.e. count('}') - count('{') for each prefix)
                    -   -- i.e -1*depth of each character of A; closing braces at depth+1
        ©           -   (copy this list of depths to the register for later use)
         <-         -   less than -1? (vectorises)
           o        -   logical OR with A (vectorises, replacing deep code with 1s)

⁾waż¤ẇ€‘Ḅ«5×®¬Ḅ⁼1¤ - Categorise the result, R
    ¤              - nilad followed by link(s) as a nilad:
⁾wa                -   literal ['w', 'a']
   ż               -   zip with itself = [['w','w'],['a','a']]
     ẇ€            - for €ach: is a sublist of R?  i.e. one of: [0,0] [1,0] [0,1] [1,1]
       ‘           - increment (vectorises)                     [1,1] [2,1] [1,2] [2,2]
        Ḅ          - unbinary                                     3     5     4     6
         «5        - minimum with five                            3     5     4     5
                 ¤ - nilad followed by link(s) as a nilad:
            ®      -   recall depths from the register
             ¬     -   logical NOT (vectorises) (0->1, other depths->0)
              Ḅ    -   unbinary
               ⁼1  -   equal one -- i.e. depths ends with a 0 and contains no other zero 
           ×       - multiply

3

ทำความสะอาด , 309 293 284 ไบต์

เราสามารถรับไปกับการใช้เพียง 3 ชื่อตัวแปรในเวลานี้เราจึงจะเรียกพวกเขาa, และpl

import StdEnv,Text,Data.List
a=isInfixOf o zip2[2,2]
@ =['\'']
$p#p=join@[foldl((\[a:p]_|p>[]=a++[';':join@(tl p)]=split['#']a!!0)o split@)l l\\l<-mklines p]
#l=[(?a- ?l,p)\\a<-inits p&[p:l]<-tails p]
|{p\\(a,p)<-l|a<2}<>"{}"=0|a['ww']l=1|a['aa']l=2=3
?l=sum[1\\'{'<-l]-sum[1\\'}'<-l]

ลองออนไลน์!

กำหนดฟังก์ชั่น$ :: [Char] -> Intและผู้ช่วยบางส่วนให้การทำแผนที่:

  • 0: อื่น ๆ
  • 1: Dyadic dop
  • 2: Monadic dop
  • 3: Dfn

ขยาย (รุ่นแรก) และมีชื่อตัวแปรมากกว่า 3 ชื่อ:

$ s
    # s // remove strings and comments
        = join [';'] [ // join the second argument with semicolons
            limit ( // take the first repeated element of
                iterate // an infinite list of applications of the first argument
                    (
                        (
                            \(p, q) = p ++ case q of // join the first half with a modified second half
                                ['\'\'': q] = [';': q] // replace two quotes with a semicolon
                                [c, _: q] = [c: q] // drop the character after a quote or hash
                                _ = [] // leave unmatched strings unchanged
                        ) o span // split the string on the first occurrence of
                            \c = c <> '\'' && c <> '#' // a quote or hash
                    ) l // applied to l
                )
            \\ l <- mklines s // for line l in s split at newlines
        ]
    # b // generate a map of nesting levels
        = [
            ( // the pair of
                ?i - ?t, // the nesting level
                c // the character c
            ) 
            \\ i <- inits s // for init i of s
            & // synchronously iterated with 
                [c: t] <- tails s // character c at the start of tail [c:t] of s
        ]
    // determine what the code is
    | {c \\(n, c) <- b | n < 2} // if the string made of characters with nesting level of less than 2
        <> "{}" // is not the same as the paired braces at the beginning and end
        = 0 // return zero
    | m ['ww'] b // if there are two consecutive 'w's at nesting level 2
        = 1 // return 1
    | m ['aa'] b // if there are two consecutive 'a's at nesting level 2
        = 2 // return 2
    = 3 // otherwise return 3

0

เรติน่า 0.8.2 , 91 ไบต์

m`'.*?('|$)|#.*
¶
s(+`(?!^)\{[^{}]*\}(?!$)
¶
^(?!\{[^{}]*\}$).+
3
^.+ww.+
2
^.+aa.+
1
..+
0

ลองออนไลน์! การเชื่อมโยงรวมถึงชุดทดสอบ คำอธิบาย:

m`'.*?('|$)|#.*
¶

ลบสตริงและความคิดเห็น

s(+`(?!^)\{[^{}]*\}(?!$)
¶

ลบวงเล็บที่จับคู่กันออกจากด้านในสุด แต่ให้ออกจากวงเล็บแรกและวงเล็บสุดท้าย

^(?!\{[^{}]*\}$).+
3

หากเราไม่ได้จับคู่วงเล็บเหลี่ยมนี่คืออื่น ๆ

^.+ww.+
2

ไม่อย่างนั้นถ้าเรามีwwนี่คือ Dyadic Dop

^.+aa.+
1

มิฉะนั้นถ้าเรามีaaแล้วนี่คือ Monadic Dop

..+
0

มิฉะนั้นถ้านี่คือสิ่งที่ไม่ได้กล่าวถึงข้างต้นนี่คือ Dfn

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