Apa yang kita punya?

17

Terinspirasi oleh, dan untuk mengenang, kejeniusan kita yang terkasih,

John Scholes, 1948-2019

MENINGGAL DUNIA

Dia menemukan dan mengimplementasikan dfns - magnum opus dan subjek tantangannya.

Untuk yang berminat: dokumentasi dan video dfns lengkap terbaru bersama John .

Tugas

Diberikan kode sumber ASCII, jawab di mana dari empat kategori berikut miliknya:

  1. Dyadic dop

  2. Monadic dop

  3. Dfn

  4. Lain

Anda dapat mengembalikan empat nilai yang konsisten, tetapi harap sebutkan pemetaan Anda jika tidak jelas.

Detail

Anda dapat mengasumsikan bahwa kode sumber selalu diawali dengan penjepit keriting pembuka {dan berakhir dengan penjepit keriting penutup }.

Kawat gigi bersarang secara rekursif dapat terjadi (misalnya {{{}}}), tetapi kategori 1-3 tidak pernah memiliki kedalaman penyangga kurung di bawah 1 (begitu {}{}juga "Lainnya") dan semua kawat gigi harus seimbang (demikian {{}juga "Lainnya").

Karakter dalam konteks berikut pada baris diabaikan:

  1. Di sebelah kanan #(komentar):significant#ignored

  2. Diapit tanda kutip tunggal '... '(yaitu dalam string): significant'ignored'significant(ini berlaku untuk #juga: '#'significant)

  3. Di sebelah kanan kutipan yang tidak berpasangan '(pairing quotes dari kiri):significant'ignored

Dalam kurung kurawal level satu (yaitu tidak termasuk kurung bersarang):

  • Dyadic dops berisi frasa yang tidak terputus ww

  • Dops monadik tidak mengandung ww, tetapi mengandungaa

  • Dfns tidak mengandung juga wwtidakaa

Uji kasus

Dyadic dops

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

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

Dops monadik

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

Dfns

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

Lain

{}{}
{{}
{}}
{ww}}
{}
{}
{ww}{}
{#}
{'
'}
Adm
sumber
@LuisfelipeDejesusMunoz Dfn. Jika Anda melihat alasan untuk berpikir sebaliknya, beri tahu saya.
Adám
1
Bisakah kutipan string diloloskan, dan jika demikian kita perlu menanganinya? (mis .: {'#\'ww?aa'}-> lainnya?)
Οurous
1
@ Οurous Tidak, speknya seperti yang dinyatakan: Apa pun dalam tanda kutip tidak signifikan. (Memang, string APL tidak memiliki mekanisme melarikan diri.) Saya akan menambahkan kasing.
Adám
Hm, dapatkah kita berasumsi bahwa string tidak akan berisi ''(apostrof dalam string, dapat juga diuraikan sebagai dua string yang berdekatan untuk tantangan ini)?
Erik the Outgolfer
@EriktheOutgolfer Mungkin terjadi. Saya akan menambahkan kasus, tetapi seperti yang Anda katakan, tidak masalah apakah 'abc''def'diurai sebagai satu atau dua string untuk tantangan ini.
Adám

Jawaban:

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

Cobalah online!

Versi alternatif

  • 131 byte dengan mengambil array karakter sebagai input
  • 132 byte dengan menggunakan Buffer () (Node.js)

Bagaimana?

String input adalah karakter yang diuraikan berdasarkan karakter.

Terjemahan karakter ke dalam kode

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'

saya0

Variabel yang menggambarkan status parser

Variabel berikut digunakan selama penguraian:

  • Hai

    • bit 0: frase yang valid aatelah ditemukan
    • bit 1: frase yang valid wwtelah ditemukan
  • saya

    • bit 0: saat ini kami berada di dalam komentar
    • bit 1: kami saat ini berada di dalam string (bit ini masih diperbarui dalam komentar, tetapi ini tidak berbahaya)
  • s

  • d-1
  • x0-11

Hasil akhir

3x0d-1012Hai

Arnauld
sumber
6

Jelly ,  50 48 46  45 byte

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

Tautan monadik yang menerima daftar karakter yang menghasilkan:

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

Cobalah online! Atau lihat test-suite .
menggunakan kutipan Python untuk menghindari kemungkinan mengevaluasi input sebagai kumpulan atau kamus Python

Bagaimana?

Ỵµṣ”'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
Jonathan Allan
sumber
3

Bersih , 309 293 284 byte

Kami bisa lolos dengan hanya menggunakan 3 nama variabel pada satu waktu, jadi kami akan memanggil mereka a, pdan l.

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]

Cobalah online!

Menentukan fungsi $ :: [Char] -> Intdan beberapa pembantu, memberikan pemetaan:

  • 0: Lainnya
  • 1: Dyadic dop
  • 2: Monadic dop
  • 3: Dfn

Diperluas (versi pertama), dan dengan lebih dari 3 nama variabel:

$ 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
Suram
sumber
0

Retina 0.8.2 , 91 byte

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

Cobalah online! Tautan termasuk test suite. Penjelasan:

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

Hapus string dan komentar.

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

Hapus tanda kurung yang cocok, berusahalah dari bagian terdalam, tetapi tinggalkan tanda kurung pertama dan terakhir.

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

Jika kami tidak mencocokkan tanda kurung maka ini adalah Lainnya.

^.+ww.+
2

Kalau tidak, jika kita miliki wwmaka ini adalah Dyadic Dop.

^.+aa.+
1

Kalau tidak, jika kita miliki aamaka ini adalah Monadic Dop.

..+
0

Kalau tidak, jika ini adalah sesuatu yang tidak tercakup di atas maka ini adalah Dfn.

Neil
sumber