Elimizde ne var?


17

Sevgili dahimizden esinlenerek ve anısına,

John Scholes, 1948-2019

HUZUR İÇİNDE YATSIN

O icat ve uygulanan dfns - onun şaheserinizi ve meydan konusunu.

İlgilenenler için: John ile en son tam dfns belgeleri ve videoları .

Görev

Bir ASCII kaynak kodu verildiğinde, aşağıdaki dört kategoriden hangisine ait olduğunu yanıtlayın:

  1. Çift dop

  2. Monadik dop

  3. dfn

  4. Diğer

Dört tutarlı değer döndürebilirsiniz, ancak açık değilse lütfen eşlemenizi belirtin.

ayrıntılar

Kaynak kodun her zaman bir açılış süslü ayraçla başladığını {ve bir kapanış süslü ayraçla sona erdiğini varsayabilirsiniz.} .

Yinelemeli olarak iç içe geçmiş ayraçlar oluşabilir (örn. {{{}}}), Ancak 1-3 kategorilerinde hiçbir zaman küme iç içe geçme derinliği 1'in altına düşemez (bu {}{}nedenle "Diğer" dir) ve tüm ayraçlar dengelenmelidir (yani{{} "Diğer" de).

Bir satırda aşağıdaki bağlamlardaki karakterler yok sayılır:

  1. Sağında #(yorum):significant#ignored

  2. Tek tırnak içine alınmış ''(yani bir dizede): significant'ignored'significant(Bu durum aşağıdakiler için #de geçerlidir :'#'significant )

  3. Eşleştirilmemiş bir teklifin sağında ( 'soldan tırnak işaretleri eşleme):significant'ignored

Kıvırcık ayraç birinci düzeyde (yani iç içe parantezler hariç):

  • Çift dops kesintisiz ifadeyi içerir ww

  • Monadik doplar içermez ww, ancak içeriraa

  • Dfns içerirler ne wwdeaa

Test senaryoları

Çift dops

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

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

Monadik dops

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

Dfns

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

Diğer

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

@LuisfelipeDejesusMunoz Dfn. Aksini düşünmek için bir neden görürseniz, lütfen bana bildirin.
ADAM

1
Dize tırnak işaretleri kaçabilir ve eğer öyleyse bunları ele almamız gerekiyor mu? (örneğin: {'#\'ww?aa'}-> diğer?)
Οurous

1
@ Οurous Hayır, spesifikasyon belirtildiği gibidir: Tırnak içindeki her şey önemsizdir. (Gerçekten de, APL dizelerinin kaçış mekanizması yoktur.) Bir vaka ekleyeceğim.
Adám

Hm, dizelerin içermeyeceğini varsayabilir miyiz ''(dizede kesme işareti, bu zorluk için iki bitişik dizge olarak da ayrıştırılabilir)?
Outgolfer Erik

@EriktheOutgolfer Olabilir. Bir vaka ekleyeceğim, ancak dediğin gibi, 'abc''def'bu meydan okuma için bir veya iki dize olarak ayrıştırılmasının önemi yoktur .
Adám

Yanıtlar:


9

JavaScript (ES6),  145 ... 138  bayt

0123 için diğer .

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

Çevrimiçi deneyin!

Alternatif versiyonlar

  • 131 baytBir dizi karakteri girdi olarak alarak
  • 132 bayt kullanarakBuffer () (Node.js)

Nasıl?

Giriş dizesi karakter karakter ayrıştırılır.

Karakterlerin kodlara çevrilmesi

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'

*ben0 .

Ayrıştırıcı durumunu tanımlayan değişkenler

Ayrıştırma sırasında aşağıdaki değişkenler kullanılır:

  • Ö

    • bit 0: geçerli bir cümleyle aakarşılaşıldı
    • bit 1: geçerli bir ifadeyle wwkarşılaşıldı
  • ben

    • bit 0: şu anda bir yorumun içinde bulunuyoruz
    • bit 1: şu anda bir dizenin içinde bulunuyoruz (bu bit bir yorumda hala güncellenmektedir, ancak bu zararsızdır)
  • s : önceki yinelemenin sonucu

  • d-1
  • x0-1 , eksi gitme sayısı1

Son sonuç

3x0d-1012Ö .


6

Jöle ,  50 48 46  45 bayt

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

Aşağıdaki karakterlerin bir listesini kabul eden monadik bir Bağlantı:

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

Çevrimiçi deneyin! Veya bir test takımına bakın .
girişi bir Python kümesi veya sözlük olarak değerlendirme olasılığını önlemek için Python alıntısını kullanır

Nasıl?

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

Temiz , 309 293 284 bayt

Biz onları arayacağım yani sadece bir seferde 3 değişken adları kullanarak kurtulabiliriz a, pve 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]

Çevrimiçi deneyin!

Eşlemeyi vererek işlevi $ :: [Char] -> Intve bazı yardımcıları tanımlar :

  • 0: Diğer
  • 1: Çift dop
  • 2: Monadik dop
  • 3: Dfn

Genişletilmiş (ilk sürüm) ve 3'ten fazla değişken adıyla:

$ 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

Retina 0.8.2 , 91 bayt

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

Çevrimiçi deneyin!Bağlantı test paketini içerir. Açıklama:

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

Dizeleri ve yorumları kaldırın.

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

Eşleşen braketleri en içten çalışarak çıkarın, ancak ilk ve son braketleri bırakın.

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

Eşleşen parantezlerimiz yoksa bu Diğer'tir.

^.+ww.+
2

Aksi takdirde, ww bu Dyadic Dop'tur.

^.+aa.+
1

Aksi takdirde, aa bu Monadic Dop.

..+
0

Aksi takdirde, bu yukarıda ele alınmayan bir şeyse bu Dfn'dir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.