Retina , 293 + 15 = 308 314 385 bayt
;`\s
_
;`\\
/
;`.+
o$0iio
;+`(o(?=/.*(i)|L.*(ii)|V.*(io)|_)|i(?=/.*(io)|L.*(o)|_.*(ii)|V.*(i))).
$1$2$3$4$5$6$7$8
;`o
<empty>
;`ii$
#:0123456789
;+`^(?=i)(i*)\1{9}(?=#.*(0)|i#.*(1)|ii#.*(2)|iii#.*(3)|iiii#.*(4)|iiiii#.*(5)|iiiiii#.*(6)|iiiiiii#.*(7)|iiiiiiii#.*(8)|iiiiiiiii#.*(9))
$1#$2$3$4$5$6$7$8$9$10$11
:.*|\D
<empty>
Her satır ayrı bir dosyaya gider, bu yüzden bayt sayısına 13 ekledim. Alternatif olarak, hepsini olduğu gibi tek bir dosyaya koyabilir ve -s
bayrağı kullanabilirsiniz . <empty>
Aslında boş dosyaları veya hatlar için standı.
Maalesef, sonucu unary'den ondalık basamağa dönüştürmek için 187 bayta ihtiyacım var. Sanırım bunu bir süre sonra uygulamaya geçirmeliyim .
açıklama
Retina, regex tabanlı bir dildir (tam olarak regex ile böyle şeyler yapabilmek için yazdığım). Her dosya / çizgi çifti, bir değiştirme aşamasını tanımlar; ilk satır, desen ve ikinci satır, değiştirme dizesidir. Desenler `
, normal regex değiştiricilerin yanı sıra bazı Retinaya özgü seçenekler içerebilen sınırlandırılmış bir yapılandırma dizesi ile gelebilir. Yukarıdaki program için, ;
o aşamadaki çıktısını bastıran +
ve sonuç değişmeyi durdurana kadar değiştirme işlemini bir döngü halinde uygulayan ilgili seçenekler vardır .
Çözümün fikri, her bir çizgiyi ayrı ayrı saymaktır, çünkü çokgen içinde veya dışında olup olmadığımızla her zaman karşılaştığımız karakterlere karar verebiliriz. Bu aynı zamanda her şeyi tek bir çizgide birleştirebileceğim anlamına geliyor, çünkü çizginin başına ve sonuna gitmek her zaman çokgenin dışındadır. Ayrıca not edebilirsiniz _
ve uzay bir çizgi süpürme algoritması için tamamen aynıdır, hem de \
ve /
. Tarafından Yani ilk adım olarak tüm yeni satır ve boşlukların yerine _
ve tüm \
tarafından /
daha sonra bazı kodlar basitleştirmek için.
Şu andaki iç / dış durumu karakterlerle takip ediyorum i
ve o
aynı zamanda i
bölgeyi taklit etmek için s'yi kullanıyorum . Bunun o
için poligonun dışında olduğumuzu işaretlemek için bir birleştirilmiş çizgiye hazırlanarak başlıyorum. Ayrıca iio
yeni karakterler oluşturmak için bir arama olarak kullanacağım girişin sonuna bir ekleme yapıyorum.
Ardından, ilk büyük değişim bir i
veya daha o
sonra bir /V_L
sonraki karakter grubundan birinin yerine geçer , böylece her şeyi siler ve konuşur. Değiştirme tablosu, sütunların bu satırdaki son karaktere karşılık geldiği ve satırların bir sonraki karaktere karşılık geldiği ( S
boşluk ve <>
boş bir dize için) olduğu gibi görünür . Kullandığım eşdeğerleri göstermek için girişin tüm karakterlerini dahil ettim:
i o
/ io i
\ io i
L o ii
V i io
_ ii <>
S ii <>
Not nihai karakter sonra hep gösterir olsun sonra karakterin Bizler içinde veya çokgen dışında iken sayısı i
ihtiyaçları poligon eklenecek o bölgeye ler tekabül. Bir örnek olarak, son örnek girişindeki ilk dört yinelemenin sonuçları (bu, her bir satırı ayrı ayrı su basan eski bir sürüm tarafından oluşturuldu, ancak ilke hala aynı):
o /V\
o / \___
o L _/
o/\/ /V
oL__ _/
o V
o /V\
o / \___
o L _/
oi\/ /V
oii__ _/
o V
o /V\
o/ \___
oL _/
oiio/ /V
oiiii_ _/
o V
o/V\
oi \___
oii _/
oiioi /V
oiiiiii _/
oV
oiV\
oiii \___
oiiii _/
oiioiii /V
oiiiiiiii_/
oio
Son olarak, o
eşleşen her şeyi kaldırarak tüm s ve satır kesmelerinden kurtuldum [^i]
ve geri kalanı, oldukça sıkıcı olan ondalık birime dönüşüm.