Kod Golf: Adalar Say


31

Bu stackoverflow sorusundan ilham alan basit bir yarışma :

Size uydu tarafından fotoğraflanan bir yüzeyin görüntüsü verilir. Görüntü, suyun ' .' ile işaretlendiği ve arazinin ' ' ile işaretlendiği bir bitmap'tir *. Komşu gruplar *bir ada oluşturur. (İki ' *' yatay, dikey veya çapraz komşularsa bitişiktir). Göreviniz bitmapteki ada sayısını yazdırmak.

Bir tek *de bir ada olarak sayılır.

Örnek Giriş:

.........**
**......***
...........
...*.......
*........*.
*.........*

Örnek çıktı:

5

Kazanan, koddaki en küçük bayt sayısına sahip bir giriştir.


Mantığı anlamıyorum. Sağ üst köşede 5 yıldız bir ada sayılmaz mı? Öyleyse, örneğinizde 4 ada var.
deflt

ekran kaydırılmıyor. köşelerin her birinde bir ada + yalnız *ada
Claudiu

2
Ancak tanımınıza göre, bir ada birden fazla anlamına gelen '*' karakter grubudur.
acolyte

oh adil nokta. tek başına *s de adalar.
Claudiu

Yanıtlar:


30

Mathematica 188 185 170 115 130 46 48 karakter

açıklama

Daha önceki sürümlerde, birbirlerinden 1'er satranç tahtası olan bir pozisyon grafiği çizdim. GraphComponentsdaha sonra, her bileşen için bir tane olan ada sayısını ortaya çıkardı.

Bu sürüm , fiziksel olarak bitişik MorphologicalComponentsolan dizi bölgelerindeki kümeleri bulmak ve numaralandırmak için kullanılır 1. Grafikleme gereksiz olduğundan, bu büyük bir kod ekonomisi ile sonuçlanır.


kod

Max@MorphologicalComponents[#/.{"."->0,"*"->1}]&

Örnek

Max@MorphologicalComponents[#/.{"."->0,"*"->1}]&[{{".", ".", ".", ".", ".", ".", ".", ".", ".", "*", "*"}, {"*", "*", ".", ".", ".", ".", ".", ".", "*", "*", "*"}, {".", ".", ".", ".", ".", ".", ".", ".", ".", ".", "."}, {".", ".", ".", "*", ".", ".", ".", ".", ".", ".", "."}, {"*", ".", ".", ".", ".", ".", ".", ".", ".", "*", "."}, {"*", ".", ".", ".", ".", ".", ".", ".", ".", ".", "*"}}]

5


Nasıl çalışır

Veri dizi olarak girildi; Mathematica'da, bu listelerin bir listesidir.

Giriş dizisinde, veriler değiştirme ile 1've 0' lere dönüştürülür.

/.{"."->0,"*"->1}

burada /.bir çatı ve çatı formudur ReplaceAlldeğiştirme kuralları takip eder. Bu esas olarak diziyi siyah beyaz bir resme dönüştürür. Yapmamız gereken tek şey fonksiyonu uygulamak Image.

Image[{{".", ".", ".", ".", ".", ".", ".", ".", ".", "*", "*"}, {"*", "*", ".", ".", ".", ".", ".", ".", "*", "*", "*"}, {".", ".", ".", ".", ".", ".", ".", ".", ".", ".", "."}, {".", ".", ".", "*", ".", ".", ".", ".", ".", ".", "."}, {"*", ".", ".", ".", ".", ".", ".", ".", ".", "*", "."}, {"*", ".", ".", ".", ".", ".", ".", ".", ".", ".", "*"}} /. {"." -> 0, "*" -> 1}]

adaları

Beyaz kareler 1 değerine sahip hücrelere karşılık gelir.

Aşağıdaki resimde, yaklaşımın kullandığı bazı adımlar gösterilmektedir. Giriş matrisi sadece 1's ve 0' ler içerir. Çıktı matrisi, her morfolojik kümeyi bir sayı ile etiketler. (Hem girdi hem de çıktı matrislerini MatrixFormiki boyutlu yapılarını vurgulamak için içine sardım.)

MorphologicalComponents1s'yi, her hücrenin küme numarasına karşılık gelen bir tamsayı ile değiştirir .

işleme

Max en büyük küme numarasını döndürür.


Adaların görüntülenmesi

Colorize Her adayı benzersiz şekilde renklendirir.

Colorize


Bu v7'de yazıldığı gibi çalışmıyor, çünkü MorphologicalComponentsistiyor Image, ama v9'da bile böyle olmamalı Max@MorphologicalComponents[d/.{"."->0,"*"->1}]mı? Yani, ilk önce değişiklik mi yapıldı? Maxdeğişim yapılmadan önce kaybolur, değil mi?
Bay Sihirbazı

Ben V9'um var, @ Mr.Wizard haklı. 46 karakter doğru sayıdır.
Murta

@ Mr.Wizard Değiştirme, MorphologicalComponents uygulanmadan önce gerçekleştirilir. Bir öncelik olayı olmalı.
DavidC

Merhaba @DavidCarraher, benim açımdan "->" ile ilgili değil, ifadenin Max@MorphologicalComponents@d/.{"."->0,"*"->1}işe yaramadığı, mantıklı olan Max@MorphologicalComponents[d /. {"." -> 0, "*" -> 1}]şey olduğu için bir karakter daha var.
Murta

9

Yakut 1.9 (134 121 113 110)

İlk komut satırı argümanı olarak haritayı stdin'e veya haritanın dosya adına götürür ve ada sayısını stdout'a yazdırır. Temel bir özyinelemeli sel doldurma kullanarak. İyileştirmeler her zaman olduğu gibi kabul edilir!

c=0
gets$!
c+=1while(f=->i{9.times{|o|$_[i]=?.;f[o]if$_[o=i+(o/3-1)*(~/$/+1)+o%3-1]==?*&&o>0}if i})[~/\*/]
p c

David'in colorize benzer şekilde, aynı zamanda değiştirerek farklı adaları gösterilecek alabilirsiniz $_[i]=?.etmek $_[i]=c.to_sve p ckarşı puts$_size böyle bir şey verecekti:

.........00
11......000
...........
...2.......
3........4.
3.........4

(en azından rakamlar tükenene kadar!)

Bazı test durumları:

.........**
**......***
...........
...*.......
*........*.
*.........*

5

......*..**....*
**...*..***....*
....*..........*
...*.*.........*
*........***....
*.....*...***...
*.....*...*....*
****..........**
*.........*.....

9

*

1

****
****
....
****

2

**********
*........*
*.******.*
*.*....*.*
*.*.**.*.*
*.*.**.*.*
*.*....*.*
*.******.*
*........*
**********

3


8
Son testi sevdim. Kutunun içinde düşün!
Bay Lister,

1

C, 169 karakter

Stdin'den harita okur. Özyinelemeli sel doldurma işlevini iyileştirme konusunda hiçbir şansımız r(j)olmamasına rağmen.

c,g,x,w;char m[9999];r(j){if(m[j]==42)m[j]=c,r(j+1),r(j+w-1),r(j+w),r(j+w+1),c+=j==g;}main(){while((m[x++]=g=getchar())+1)w=g<11*!w?x:w;for(;g++<x;)r(g);printf("%i",c);}

1

Python 2, 223 203 Bayt

20 karakterlik boşluğu ve gereksiz parantezi traş ettiğiniz için Step Hen ve Arnold Palmer'a teşekkür ederiz !

s=input()
c=[(s.index(l),i)for l in s for i,v in enumerate(l)if'*'==v]
n=[set([d for d in c if-2<d[0]-v[0]<2and-2<d[1]-v[1]<2])for v in c]
f=lambda x,p=0:p if x&n[p]else f(x,p+1)
print len(set(map(f,n)))

Liste anlamaların kullanılmasının bayt sayısını azaltacağını düşündüm, ancak önemli bir gelişme sağlamadığını düşündüm.

Burada dene.

N (komşular) listesinde dolaşmaya devam ediyorum ama başarılı olamadım. Belki başka birinin bu bölüm için bazı fikirleri olacaktır.


PPCG'ye Hoşgeldiniz! İşte bazı boşlukları kaldırarak 217 bayt . Python ayrıştırıcı gerçekten çok hoşgörülü: P
Stephen

Gerekenden daha fazla beyaz alanın var. Arasında boşluk çıkarın (s.index(l),i)ve for, enumerate(l)ve if, -v[0])<2ve and, p=0:ve p, ve bool(x&n[p])ve else. Ayrıca, çevreleyen 2 grubunuz olduğundan, print cümlenizde gereğinden fazla parantez var set. Düzenleme: StepHen tarafından yendi çünkü cep telefonunda şeyler yapmak ideal değildir.
Arnold Palmer

@ StepHen's ve önerilerimi birleştiren 203 bayt , ayrıca durumları biraz değiştiriyor.
Arnold Palmer

Yardımın için ikinize de teşekkürler! Python'un yumuşaklığı beni şaşırtmaya devam ediyor
:)

0

Perl 5 , 100 bayt

-p0Bayraklar için 98 bayt kod + 2 bayt .

/.*/;$@="@+"-1;$~="(.?.?.{$@})?";(s/X$~\*/X$1X/s||s/\*$~X/X$1X/s)&&redo;s/\*/X/&&++$\&&redo}{$\|=0

Çevrimiçi deneyin!

Benim bir adaptasyon (ya da daha doğrusu bir basitleştirme) cevap meydan Kaç Delikler? . Bu kodun diğer cevap üzerinde nasıl çalıştığına dair açıklamalar bulabilirsiniz (açıklamak biraz uzun, bu yüzden tüm açıklamaları tekrar yazmamayı tercih ediyorum).


0

Python 2,233 bayt

Diğer cevaplarla karşılaştırıldığında çok uzun. Bu soruya cevabımın limanı .
Çevrimiçi deneyin

A=input()
c=0
X=len(A[0])-1
Y=len(A)-1
def C(T):
 x,y=T
 if A[y][x]<'.':A[y][x]='.';map(C,zip([x]*3+[min(x+1,X)]*3+[max(x-1,0)]*3,[y,min(y+1,Y),max(y-1,0)]*3))
while'*'in sum(A,[]):i=sum(A,[]).index('*');c+=1;C((i%-~X,i/-~X))
print c

0

JavaScript, 158 bayt

function f(s){w=s.search('\n');t=s.replace(RegExp('([*@])([^]{'+w+','+(w+2)+'})?(?!\\1)[*@]'),'@$2@');return t!=s?f(t):/\*/.test(s)?f(s.replace('*','@'))+1:0}

132 bayt için rekabetçi olmayan ES6 yanıtı (dil sonlandırma tarihi meydan okuması):

f=s=>s!=(s=s.replace(RegExp(`([*@])([^]{${w=s.search`
`},${w+2}})?(?!\\1)[*@]`),`@$2@`))?f(s):/\*/.test(s)?f(s.replace(`*`,`@`))+1:0

Kaç Delikli Cevabımın Limanı ? (evet, ben çoğunluğa atlıyorum, şimdi iki kişinin cevaplarını verdiğini gördüm).


0

Python 2 , 225 bayt

g=map(list,input())
q,w,t,r=len(g),len(g[0]),0,range
def l(i,j):
 if 0<=i<q and 0<=j<w and g[i][j]=='1':g[i][j]=0;l(i+1,j);l(i-1,j);l(i,j+1);l(i,j-1)
 return 1
print sum(l(i,j)if g[i][j]=='1'else 0 for j in r(w)for i in r(q))

Çevrimiçi deneyin!

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.