Những gì chúng ta đã có?


17

Lấy cảm hứng và, để tưởng nhớ, thiên tài yêu dấu của chúng ta,

John Scholes, 1948-2019

YÊN NGHỈ

Ông đã phát minh và thực hiện các dfns - kiệt tác của mình và là chủ đề của thử thách.

Đối với người quan tâm: tài liệuvideo đầy đủ dfns mới nhất với John .

Bài tập

Cho một mã nguồn ASCII, hãy trả lời trong bốn loại sau đây:

  1. Dop

  2. Dop đơn

  3. Dfn

  4. Khác

Bạn có thể trả về bất kỳ bốn giá trị nhất quán nào, nhưng vui lòng nêu rõ ánh xạ của bạn nếu nó không rõ ràng.

Chi tiết

Bạn có thể giả định rằng mã nguồn luôn bắt đầu bằng một dấu ngoặc nhọn mở {và kết thúc bằng một dấu ngoặc nhọn đóng }.

Niềng răng lồng nhau có thể xảy ra (ví dụ {{{}}}), nhưng loại 1 không bao giờ có thể có độ sâu lồng niềng dưới 1 (vì vậy {}{}"Khác") và tất cả các dấu ngoặc phải được cân bằng ( {{}"Khác").

Các ký tự trong các ngữ cảnh sau trên một dòng bị bỏ qua:

  1. Ở bên phải của #(một bình luận):significant#ignored

  2. Bằng dấu ngoặc đơn '... '(tức là trong một chuỗi): significant'ignored'significant(Điều này áp dụng đối với #quá: '#'significant)

  3. Ở bên phải của một trích dẫn không 'ghép đôi (ghép các trích dẫn từ bên trái):significant'ignored

Trong niềng răng cấp độ một (nghĩa là không bao gồm niềng răng lồng nhau):

  • Dops Dyadic chứa cụm từ không bị gián đoạn ww

  • Dops monadic không chứa ww, nhưng có chứaaa

  • Dfns không chứa wwcũng khôngaa

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

Dops Dyadic

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

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

Dops monadic

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

Dfns

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

Khác

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

@LuisfelipeDejesusMunoz Dfn. Nếu bạn thấy một lý do để nghĩ khác, xin vui lòng cho tôi biết.
Adám

1
Báo giá chuỗi có thể được thoát, và nếu vậy chúng ta cần xử lý chúng? (ví dụ: {'#\'ww?aa'}-> khác?)
urous

1
@ Οurous Không, thông số kỹ thuật như đã nêu: Bất kỳ điều gì trong dấu ngoặc kép đều không đáng kể. (Thật vậy, chuỗi APL không có cơ chế thoát.) Tôi sẽ thêm một trường hợp.
Adám

Hừm, chúng ta có thể cho rằng các chuỗi sẽ không chứa ''(dấu nháy đơn trong chuỗi, cũng có thể được phân tích thành hai chuỗi liền kề cho thử thách này)?
Erik the Outgolfer

@EriktheOutgolfer Nó có thể xảy ra. Tôi sẽ thêm một trường hợp, nhưng như bạn nói, không có vấn đề gì nếu 'abc''def'được phân tích cú pháp dưới dạng một hoặc hai chuỗi cho thử thách này.
Adám

Câu trả lời:


9

JavaScript (ES6),  145 ... 138  136 byte

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

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

Phiên bản thay thế

  • 131 byte bằng cách lấy một mảng các ký tự làm đầu vào
  • 132 byte bằng cách sử dụng Bộ đệm () (Node.js)

Làm sao?

Chuỗi đầu vào được phân tích cú pháp theo ký tự.

Dịch các ký tự thành mã

cn

 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'

*Tôi0

Các biến mô tả trạng thái của trình phân tích cú pháp

Các biến sau đây được sử dụng trong quá trình phân tích cú pháp:

  • o

    • bit 0: một cụm từ hợp lệ aađã gặp phải
    • bit 1: một cụm từ hợp lệ wwđã gặp phải
  • Tôi

    • bit 0: chúng tôi hiện đang nằm trong một bình luận
    • bit 1: chúng tôi hiện đang nằm trong một chuỗi (bit này vẫn được cập nhật trong một nhận xét, nhưng điều này là vô hại)
  • S

  • d-1
  • x0-11

Kết quả cuối cùng

3x0d-1012o


6

Thạch ,  50 48 46  45 byte

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

Một liên kết đơn âm chấp nhận một danh sách các ký tự mang lại:

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

Hãy thử trực tuyến! Hoặc xem một bộ thử nghiệm .
sử dụng trích dẫn Python để tránh khả năng đánh giá đầu vào dưới dạng bộ hoặc từ điển Python

Làm sao?

Ỵµṣ”'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

Sạch sẽ , 309 293 284 byte

Chúng ta có thể nhận được ngay với chỉ sử dụng 3 tên biến tại một thời điểm, vì vậy chúng tôi sẽ gọi cho họ 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]

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

Xác định hàm $ :: [Char] -> Intvà một số trợ giúp, đưa ra ánh xạ:

  • 0: Khác
  • 1: Dop
  • 2: Dop đơn
  • 3: Dfn

Mở rộng (phiên bản đầu tiên) và có hơn 3 tên biến:

$ 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

Võng mạc 0.8.2 , 91 byte

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

Hãy thử trực tuyến! Liên kết bao gồm bộ kiểm tra. Giải trình:

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

Xóa chuỗi và bình luận.

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

Xóa dấu ngoặc phù hợp, làm việc từ trong cùng, nhưng để lại dấu ngoặc đầu tiên và cuối cùng.

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

Nếu chúng ta không có dấu ngoặc phù hợp thì đây là Khác.

^.+ww.+
2

Nếu không, nếu chúng ta có wwthì đây là Dyadic Dop.

^.+aa.+
1

Nếu không, nếu chúng ta có aathì đây là Monadic Dop.

..+
0

Nếu không, nếu đây là bất cứ điều gì không được đề cập ở trên thì đây là Dfn.

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.