Co mamy?

17

Zainspirowany i na pamiątkę naszego ukochanego geniuszu,

John Scholes, 1948-2019

ROZERWAĆ

On wymyślił i wdrożył dfns - jego opus magnum i przedmiot wyzwanie.

Dla zainteresowanych: najnowsza pełna dokumentacja dfns i filmy z Johnem .

Zadanie

Biorąc pod uwagę kod źródłowy ASCII, odpowiedz, do której z czterech następujących kategorii należy:

  1. Dyadic dop

  2. Monadic dop

  3. Dfn

  4. Inny

Możesz zwrócić dowolne cztery spójne wartości, ale podaj mapowanie, jeśli nie jest to oczywiste.

Detale

Możesz założyć, że kod źródłowy zawsze zaczyna się od otwierającego nawiasu klamrowego, {a kończy na zamykającym nawiasie klamrowym }.

Rekurencyjnie zagnieżdżone nawiasy klamrowe mogą wystąpić (np. {{{}}}), Ale kategorie 1–3 nigdy nie mogą mieć głębokości zagnieżdżenia nawiasów spadających poniżej 1 (tak jak {}{}„Inne”), a wszystkie nawiasy klamrowe muszą być zrównoważone (podobnie jak {{}„Inne”).

Znaki w następujących kontekstach w wierszu są ignorowane:

  1. Po prawej stronie #(komentarz):significant#ignored

  2. Ujęte w pojedyncze cudzysłowy ''(tj. W ciągu): significant'ignored'significant(Dotyczy to #również:'#'significant )

  3. Po prawej stronie niesparowanego cytatu '(parowanie cytatów od lewej):significant'ignored

W nawiasach klamrowych poziom pierwszy (tj. Z wyłączeniem zagnieżdżonych nawiasów klamrowych):

  • Diadadowe leki dopingowe zawierają nieprzerwaną frazę ww

  • Dopady monadyczne nie zawierają ww, ale zawierająaa

  • Dfns nie zawierają wwaniaa

Przypadki testowe

Dydaktyki

{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\'}

Inny

{}{}
{{}
{}}
{ww}}
{}
{}
{ww}{}
{#}
{'
'}
Adám
źródło
@LuisfelipeDejesusMunoz Dfn. Jeśli widzisz powód, by myśleć inaczej, daj mi znać.
Adám
1
Czy można wstawiać cytaty ciągów, a jeśli tak, to musimy je obsługiwać? (np .: {'#\'ww?aa'}-> inne?)
Οurous
1
@ Οurous Nie, specyfikacja jest taka, jak podano: Wszystko w cytatach jest nieznaczne. (Rzeczywiście, łańcuchy APL nie mają mechanizmu zmiany znaczenia.) Dodam skrzynkę.
Adám
Hm, czy możemy założyć, że łańcuchy nie będą zawierały ''(apostrof w łańcuchu, można również parsować jako dwa sąsiednie łańcuchy dla tego wyzwania)?
Erik the Outgolfer
@EriktheOutgolfer Może się zdarzyć. Dodam przypadek, ale jak mówisz, nie ma znaczenia, czy 'abc''def'jest analizowany jako jedno czy dwa ciągi dla tego wyzwania.
Adám

Odpowiedzi:

9

JavaScript (ES6),  145 ... 138  136 bajtów

012)3)

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

Wypróbuj online!

Alternatywne wersje

  • 131 bajtów , przyjmując tablicę znaków jako dane wejściowe
  • 132 bajty za pomocą Buffer () (Node.js)

W jaki sposób?

Łańcuch wejściowy jest analizowany znak po znaku.

Tłumaczenie znaków na kody

don

 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'

ja0

Zmienne opisujące stan analizatora składni

Podczas analizowania używane są następujące zmienne:

  • o

    • bit 0: aanapotkano prawidłową frazę
    • bit 1: wwnapotkano prawidłową frazę
  • ja

    • bit 0: obecnie znajdujemy się w komentarzu
    • bit 1: obecnie znajdujemy się w ciągu (ten bit jest wciąż aktualizowany w komentarzu, ale jest nieszkodliwy)
  • s

  • re-1
  • x0-11

Ostateczny wynik

3)x0re-1012)o

Arnauld
źródło
6

Galaretka ,  50 48 46  45 bajtów

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

Monadyczny link przyjmujący listę znaków, która daje:

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

Wypróbuj online! Lub zobacz zestaw testowy .
używa cytowania w Pythonie, aby uniknąć możliwości oceny danych wejściowych jako zestawu Python lub słownika

W jaki sposób?

Ỵµṣ”'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
źródło
3

Czysty , 309 293 284 bajtów

Możemy uciec tylko za pomocą 3 nazwy zmiennych w czasie, więc będziemy je nazywać a, pi 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]

Wypróbuj online!

Definiuje funkcję $ :: [Char] -> Inti kilka pomocników, podając mapowanie:

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

Rozszerzony (pierwsza wersja) i zawierający więcej niż 3 nazwy zmiennych:

$ 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
Obrzydliwe
źródło
0

Retina 0.8.2 , 91 bajtów

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

Wypróbuj online! Link zawiera pakiet testowy. Wyjaśnienie:

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

Usuń ciągi i komentarze.

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

Usuń dopasowane nawiasy, pracując od środka, ale zostaw pierwszy i ostatni nawias.

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

Jeśli nie mamy pasujących nawiasów, to jest to Inny.

^.+ww.+
2

W przeciwnym razie, jeśli mamy, wwto jest to Dyadic Dop.

^.+aa.+
1

W przeciwnym razie, jeśli mamy, aato jest to Monadic Dop.

..+
0

W przeciwnym razie, jeśli nie jest to uwzględnione powyżej, oznacza to Dfn.

Neil
źródło