Prelude Sözdizimi-Denetleyici


10

Prelude , geçerli bir programı neyin oluşturduğuna dair çok az, ancak olağandışı kısıtlamaları olan ezoterik bir programlama dilidir. Yazdırılabilir ASCII metninin herhangi bir bloğu ("blok", yazdırılabilir ASCII satırlarının satırsonu - 0x0A ile ayrıldığı anlamına gelir) şu durumlarda geçerlidir:

  • Metnin her (dikey) sütunu en fazla birini ihtiva (ve ).
  • Dikey konumlarını göz ardı ederek, (ve )dengelidir, yani her (biri tam olarak )sağında biriyle eşleştirilir ve bunun tersi de geçerlidir.

Yazdırılabilir ASCII ve yeni satırlar içeren bir dize verildiğinde, geçerli bir Prelude programı oluşturup oluşturmadığını belirleyen bir program veya işlev yazın. STDIN (veya en yakın alternatif), komut satırı bağımsız değişkeni veya işlev bağımsız değişkeni aracılığıyla girdi alabilirsiniz. Sonuç, seçtiğiniz herhangi iki sabit doğruluk / tahrif değeri kullanılarak STDOUT'a iade edilebilir veya yazdırılabilir .

Sen gerekir değil girişi dikdörtgen olduğunu varsayalım.

Bu kod golf, yani en kısa gönderme (bayt cinsinden) kazanır.

Örnekler

Aşağıdakiler geçerli Prelude programlarıdır (aslında, gerçek Prelude programlarıdır):

?1-(v  #1)-             
1   0v ^(#    0)(1+0)#)!
    (#)  ^#1-(0 #       
1(#  1) v #  - 1+)
    vv (##^v^+
? v-(0 # ^   #)
?
  1+              1-!

Ve hepsi geçersiz olan bir dizi girdi :

#(#(##)##)##(
)##(##(##)#)#
#(#)
)###
#(##
(##)
(##)
(#)#
(##)
(###
#(#)
(##)
#(#)
###)
#()#
()##
#(#)##
###
###(#)

Prelude'un yakın bir paren'i engelleyebilecek yorumları var mı?
Alex

@Alex Hayır. Yukarıdaki kurallar, bir programın geçerli olup olmadığına karar vermek için gerçekten vardır.
Martin Ender

Harika, açıkladığın için teşekkürler. Sadece emin olmak istedim.
Alex

Kural 1 - "Her metin sütunu (ve) öğelerinden en fazlasını içeriyor"; Örnek 1, satır 2: "1 0v ^ (# 0) (1 + 0) #)!" -> 3 )ve 2'yi görüyorum (. Her satıra sadece 1 değil mi?
Ismael Miguel

1
@IsmaelMiguel "sütunu" genellikle dikey çizgilere (özellikle ızgaralar bağlamında) atıfta bulunur. Yine de açıklığa kavuştum.
Martin Ender

Yanıtlar:


3

CJam, 57 56 bayt

qN/z_{_"()"--W<},,\s:Q,{)Q/({_')/,\'(/,-}:T~\sT0e>+z+}/!

Çok uzun, çok golf olabilir. Ben golf kez eklenecek açıklama.

Kısa açıklama

Kodda iki kontrol vardır:

  • İlk filtre, her sütunun en fazla 1 köşeli olduğunu kontrol eder. Filtrenin son çıktısı, 1'den fazla köşeli parantez içeren sütun sayısıdır.
  • İkinci olarak, girdiyi sütun ana biçimine dönüştürüyoruz ve daha sonra her bir dizinde iki bölüme ayırıyoruz.
    • Bu iki Number of "(" - Number of ")"bölümün her birinde , ( ) birbirini tamamlayıcı nitelikte olmalıdır. Bu yüzden onları eklediğinizde, 0 ile sonuçlanmalıdır. Bu özelliği başarısız olan herhangi bir bölüm, girdinin tamamının eşleşmeyen köşeli parantez olmasını sağlar.
    • Ayrıca "(" ")" nin solunda olduğundan emin olmalıyım. Bu Number of "(" - Number of ")", sağ yan blok için değerinin negatif olamayacağı anlamına gelir .

Buradan çevrimiçi deneyin


6

Python 2, 128 119 105 bayt

def F(p):
 v=n=1
 for r in map(None,*p.split("\n")):A,B=map(r.count,"()");n+=B-A;v*=n<2>A+B
 return n*v>0

Hiçbirini Python 2'de eşleyebileceğinizi biliyor muydunuz ?

açıklama

Sütunları satır haline gelmek için Prelude'u aktararak başlamak istiyoruz. Genellikle bunu yaparız zip, ancak zipen kısa satır uzunluğuna kısaldığından ve itertools.zip_longestkod golfü için çok uzun olduğundan, istediğimizi yapmanın kısa bir yolu yok gibi görünüyor ...

Eşleme hariç None:

>>> print map(None,*[[1,2,3],[4],[5,6]])
[(1, 4, 5), (2, None, 6), (3, None, None)]

Ne yazık ki (ya da daha doğrusu, golf dışındaki tüm amaçlar için), bu sadece Python 2'de çalışır.

Gelince nve v:

  • nsayma, yığın gibi davranır 1 - <number of unmatched '(' remaining>. (Gördüğümüz her şey için 1 çıkarırız ve )gördüğümüz her şey için 1 ekleriz. Bu nedenle n >= 2, herhangi bir noktada, çok fazla )s gördük ve program geçersiz. Eğer non 1 bitmez, o zaman en az bir eşsiz var (kalan.
  • vgeçerliliği kontrol eder ve 1'den başlar. Program geçersizse ( n >= 2veya A+B >= 2) geçersizse , vgeçersizliği işaretlemek için 0 olur.

Dolayısıyla, program geçerliyse, sonuna kadar sahip olmalıyız n = 1, v = 1. Program geçersiz ise, o sonuna kadar biz ya sahip olmalıdır v = 0, ya da v = 1, n <= 0. Bu nedenle geçerlilik kısa ve öz olarak ifade edilebilir n*v>0.

(14 bayt alan çok sayıda iyi öneri için @feersum'a teşekkürler!)

Önceki, daha okunabilir gönderim:

def F(p):
 p=map(None,*p.split("\n"));v=n=0
 for r in p:R=r.count;A=R("(");B=R(")");n+=A-B;v|=A+B>1or n<0
 return n<1>v

Bu çılgınca bir kullanım map...
xnor

1
119 -> 106def F(p): v=n=3 for r in map(None,*p.split("\n")):A,B=map(R.count,"()");n+=A-B;v*=n>2>A+B return n*v==9
feersum

@feersum Teşekkürler! Değişmeye çalışıyorum etmişti orkarşılaştırma zincirleme içine, ama değişen düşünmedim |=içine *=. Yine de işleri daha da geriye çekerek başka bir bayt çıkardı :)
Sp3000

2

J, 64 bayt

Girdi, son satırsonu olan bir dizedir. Çıktı 0 veya 1'dir.

(0=(1<|s)s+[:(|@{:+(0>])s)[:+/\]s=.+/@:)@(1 _1 0{~[:'()'&i.];.2)

Örnek kullanım

   ]in=.'#(#)##',LF,'###',LF,'###(#)',LF
#(#)##
###
###(#)

   ((0=(1<|s)s+[:(|@{:+(0>])s)[:+/\]s=.+/@:)@(1 _1 0{~[:'()'&i.];.2)) in
0

Yöntem şu şekildedir

  • satırsonlarında girişi kes ve bir matrise koy ];.2
  • harita (/ )/ anything elseiçine 1/ -1/0 1 _1 0{~[:'()'&i.]
  • s=.+/@:bir fiile eklenen bir fiili tanımlamak fiiller dizi çıktısını toplar
  • sütunlara değer ekle ]s

    • ()her önekte pozitif bakiyeyi kontrol et[:(0>])s)[:+/\]
    • ()tüm listede eşit bakiyeyi kontrol et (yani son önekte) |@{:@]
  • sütunlara abs (değerler) ekleyin ve her öğeyi maks. 1 için kontrol edin (1<|s)s

  • önceki tüm kontroller başarısızlıkla sonuçlandığı için bunları ekleriz ve girdinin geçerliliğini elde etmek için 0 ile karşılaştırırız 0=]


2

J, 56 bayt

3 :'*/0<: ::0:(+/\*:b),-.|b=.+/+.^:_1]0|:''()''=/];.2 y'

Bu, sondaki yeni satır içeren bir dizeyi kabul eden ve 0 veya 1 döndüren anonim bir işlevdir. Sağdan sola okuma:

  • ];.2 ydiğer J gönderimlerinde olduğu gibi, dizgeyi yson karakterinin tüm oluşumlarında keser (bu nedenle girdinin izleyen bir yeni satıra ihtiyacı vardır) ve satırları parça olan dikdörtgen bir matris yapar ve gerekirse boşluklarla doldurulur.

  • '()'=/o matristeki her karakteri önce iki 0-1 matrisinin bir listesiyle (ve sonra )döndürerek karşılaştırır.

  • +.^:_1]0|:bu iki matris listesini karmaşık sayıların tek bir matrisine dönüştürür. Şimdiye kadar program (girişteki her bir değeri 1'e, her biri )i'ye ve diğer her karakter 0'a çeviriyor .

  • b=.+/bu karmaşık matrisin satırlarının toplamını atar b.

  • -.|b1- | z | nin bir listesini yapar her z için b. Her sütunun en fazla tek bir parantez içermesi koşulu, tüm bu sayılara çevrilir 1- | z | negatif olmak.

  • +/\*:biçindeki sayıların karelerinin toplamlarının vektörüdür b. Her sütun en fazla bir parantez içeriyorsa, içindeki sayıların kareleri b0, 1 veya -1'dir. ,Bitiştirir 1- vektörü ile bu vektör | z | 's.

  • şimdi tüm bizim birleştirilmiş vektör girişleri olduğu testtir yapmanız gereken vnegatif olmayan reals numaraları bu neredeyse vardır */0<:vbazı kayıtlar varsa bir hata neden olan dışında vbiz yerine nedenle, gerçek değil <:ile <: ::0:sadece hata durumunda 0 döndürür .


Karmaşık sayılarla harika fikirler, ancak 0={:+/\*:börneğin (geçerli olmadığından da kontrol etmeniz gerekir .
Mart'ta randomra

Oh, haklısın, @randomra, unuttum!
Omar

1
0=(-|)vnegatif olmayan gerçekleri kontrol etmek için 2 bayt daha kısadır. (CJam'ı yenelim!: P)
randomra

1
Oh, ve invyerine ^:_1 başka bir bayt kaydeder.
Mart'ta randomra

1
(Denge kontrolü ile) 56 Geri: 3 :'*/0=({:,]-|)(-.@|,+/\@:*:)+/+.inv]0|:''()''=/];.2 y'.
Mart'ta randomra
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.