Bir Döngünün içini bulun


14

Görev

Bir döngünün ASCII diyagramı verildi

Örneğin

....................
......@@@@@.........
......@...@.........
.....@@...@@@@@.....
....@@........@.....
....@........@@.....
....@@@@@@@@@@......
....................
....................

Ve döngüdeki bir konum

Örneğin

(7,1)

Döngünün içini ve dışını bulmalısınız

Örneğin

00000000000000000000
00000011111000000000
00000011111000000000
00000111111111100000
00001111111111100000
00001111111111100000
00001111111111000000
00000000000000000000
00000000000000000000

Özellikler

  • Diyagramın girdisini satırsonu veya açık eşdeğeri ile ayrılmış bir dize olarak alabilirsiniz

  • Girdinizin bir parçası olarak döngüde bir koordinat (0 veya 1 dizinli) alırsınız. Menşeinizi istediğiniz yere koyabilirsiniz. Bu koordinat alabilir (<row>, <column>), (<column>, <row>)veya dize üzerinde doğrusal konum olarak. Bu verileri makul herhangi bir yöntemle alabilirsiniz. Döngüdeki tüm karakterler, dizindeki karakterle aynı olacaktır.

  • Tercih edilen çıktı, 2 boyutlu doğruluk ve falsy değerleri dizisidir, ancak satırsonu dizeleri 1ve 0yeni satırlarla veya sonraki ikisinin bariz bir eşdeğeri ile ayrılır. İç ve dış farklı doğruluk değerlerine sahip olmalı, ama hangisinin olduğu önemli değil.

  • Bir döngü, hepsi aynı karakter olacak şekilde ( örn.@ ) Bir karakter grubu olarak tanımlanır ve böylece döngüdeki her karakterin yalnızca aynı karakterden geçen orijinal karaktere (giriş koordinatındaki karakter) bir yolu olur. karakter (Taxicab geometrisi Köşegen yok ).

  • İçi tüm ilmeğin kendisi ve ilmeği geçmeden diyagramın kenarına ulaşamayan yerlerdir.

  • Dış her yerde

  • Bu

Test Durumları

Pastebin


Koordinatları dizede doğrusal koordinat olarak da alabilir miyiz?
Kusur

@flawr Yapabilirsiniz.
Post Rock Garf Hunter

Diyagramı bir karakter matrisi olarak almamıza izin veriliyor mu, sth. gibi [['.', '.'],['.', '@']]yerine satırsonu ile bir dize?
hbaderts

@hbaderts Bu bariz bir eşdeğer
Post Rock Garf Hunter

1
@WheatWizard Ek test durumu için teşekkürler! Ancak, meydan okumayı biraz daha
yerinden çıkarmak için onları bir pasaja veya bir gist

Yanıtlar:


6

MATLAB, 163159146 78 bayt

function m=f(m,y,x);[~,i]=bwfill(m~=m(y,x),x,y,8);m=m*0;m(i)=1;m=bwfill(m,'h')

-66 bayt için @ rahnema1 teşekkürler !!!

Şimdi üzerinde çalışın Çevrimiçi deneyin! AMA MATLAB ve Octave tamamen uyumlu olmadığı için birkaç ayar gerekiyordu.

açıklama

İlk önce, ilk karaktere eşit olan tüm karakterleri maskeleyen bir ikili görüntü oluştururuz. Ardından, ilk karakterin bağlı olduğu bileşeni belirleriz.

% determine the connected component that is contains initial character

[~,i]=bwfill(m~=m(y,x),x,y,8);     % i contains the indices of the connected component
m=m*0;m(i)=1;                      % create an image of the connected component

Bundan sonra, bu bağlı bileşenin bir görüntüsünü oluştururuz ve görüntüdeki tüm "delikleri" doldururuz.

m=bwfill(m,'h')

Ben Octave golf için daha iyi olduğunu düşünüyorum, böylece en az 72 bayt azaltabilirsiniz
rahnema1

@ rahnema1 MATLAB'da zaten başladım, bu yüzden şimdi bu gönderimi değiştirmeyeceğim, ancak öneri için teşekkürler =)
flawr

5

MATLAB: 67 bayt

function A=f(A,r,c),A=bwlabel(A==A(r,c),4);A=imfill(A==A(r,c),'h');

Birkaç uyarı:

  • A bir karakter dizisi olduğu varsayılır.
  • MATLAB içindeki indeksler 1 tabanlıdır ve satırlar önce indekslenir. Bu değişikliklerin fonksiyon girişinde yapılacağı varsayılmaktadır (yani soru örneği olarak adlandırılacaktır output = f(A,2,8)).
  • bwlabelve imfillGörüntü İşleme Araç Kutusu'nun bir parçasıdır.

1
codegolf'a hoş geldiniz!
rahnema1

@ rahnema1: Bu site doğmadan önce SO'da golf oynadığım için daha önce ziyaret etmedim.
gnovice
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.