Çiftçiye Yardım


10

Çiftçi Jack çok fakir. Tüm çiftliğini en az maliyetle aydınlatmak istiyor. Bir lamba kendi hücresini ve sekiz komşusunu aydınlatabilir. Kendi alanında lambaları ayarladı, ancak ekstra lamba tutup tutmadığını bulmak için yardımınıza ihtiyacı var.

Ekstra lambalar: Çiftlikten çıkarıldığında yanan hücrelerin sayısında fark yaratmayacak olan lambalar. Ayrıca, işaret edeceğiniz lambalar tek tek kaldırılmayacak, ancak aynı anda çıkarılacaktır.

Not: Yapabileceğiniz tek işlem bazı lambaları çıkarmaktır. Lambaları yeniden düzenleyemez veya yerleştiremezsiniz. Nihai hedefiniz, daha önce yanan her hücre hala yanacak şekilde maksimum sayıda lambayı çıkarmaktır.

Çiftçi Jack'e, başka yerlerde kullanabilmesi için maksimum sayıda işe yaramayan lambayı tespit etmesine yardımcı olun.

Giriş

Size M ve N alanının ilk satır boyutlarında verilecektir. M alanı takip eden N karakteri içeren sonraki M satırları .

'1' lambanın tutulduğu hücreyi temsil eder.

'0' boş bir hücreyi temsil eder.

Çıktı

Kullanılmayan lamba sayısını içeren bir tamsayı çıkarmanız gerekir.

Örnek Giriş:

3 3
100
010
001

Örnek Çıktı:

2

Kazanan:

Kod golf olduğu için, kazanan görevi en az karakterle başarıyla tamamlayacak olan kazanan olacak


@PeterTaylor Yazımı düzenledim. Hala bir karışıklık var mı?
user2369284

Çok daha iyi. Teşekkürler.
Peter Taylor

girdinin yeni satırla biteceğini varsayabilir miyiz?
John Dvorak

1
Ödev gibi görünüyor.
Johannes

1
Giriş lambalarının tüm çiftliği aydınlatacağından emin miyiz? Sanırım hayır ...
Keith Randall

Yanıtlar:


5

Mathematica 186 (açgözlü) ve 224 (tüm kombinasyonlar)

Açgözlü Çözüm

t=MorphologicalTransform;n@w_:=Flatten@w~Count~1
p_~w~q_:=n[p~t~Max]==n[q~t~Max]
g@m_:=Module[{l=m~Position~1,r,d=m},While[l!={},If[w[m,r=ReplacePart[d,#-> 0]&    
[l[[1]]]],d=r];l=Rest@l];n@m-n@d]

Bu gereksiz ışıkları tek tek kapatır. Işık söndüğünde ışık kapsamı azalmazsa, bu ışık ortadan kaldırılabilir. Açgözlü yaklaşım çok hızlıdır ve 15x15 ve daha büyük matrisleri kolayca işleyebilir (aşağıya bakın). Tek bir çözüm döndürür, ancak bunun optimal olup olmadığı bilinmemektedir. Her iki yaklaşım da golf versiyonlarında kullanılmayan ışıkların sayısını döndürür. Golfsiz yaklaşımlar da aşağıdaki gibi ızgaraları gösterir.

Önce:

önce

Sonra:

sonra

Tüm ışık kombinasyonlarını kullanan Optimal Çözümler (224 karakter)

@ Clément sayesinde.

Tüm ışık kombinasyonlarını kullanan hareketsiz versiyon

fHerhangi bir morfolojik dönüşüm fonksiyonu sameCoverageQ, her ışığın içinde bulunduğu 3 x3 kareyi aydınlatılmış (sıfır yerine değer = 1) olarak davranır. bir ışık çiftliğin kenarına yakın olduğunda, çiftlik sayılır. Fazla sayma yok; Birden fazla lamba ile aydınlatılan bir kare basit bir şekilde yanar.Program her ışığı kapatır ve çiftlikte toplam aydınlatma kapsamının azaltılıp azaltılmadığını kontrol eder.

nOnes[w_]:=Count[Flatten@w,1]
sameCoverageQ[m1_,m2_]:=nOnes[MorphologicalTransform[m1,Max]]==
  nOnes[MorphologicalTransform[m2,Max]]

(*draws a grid with light bulbs *)
h[m_]:=Grid[m/.{1-> Style[\[LightBulb],24],0-> ""},Frame-> All,ItemSize->{1,1.5}]

c[m1_]:=GatherBy[Cases[{nOnes[MorphologicalTransform[ReplacePart[Array[0&,Dimensions[m1]],
#/.{{j_Integer,k_}:> {j,k}-> 1}],Max]],#,Length@#}&/@(Rest@Subsets[Position[m1,1]]),
{nOnes[MorphologicalTransform[m1,Max]],_,_}],Last][[1,All,2]]

nOnes[matrix]bayraklı hücre sayısını sayar. Işıkları saymak ve ayrıca yanan hücreleri saymak için kullanılır

sameCoverageQ[mat1, mat2] mat1'deki yanan hücrelerin mat2'deki yanan hücrelerin sayısına eşit olup olmadığını test eder. MortolojikTransform [[mat] bir ışık matrisi alır ve aydınladıkları hücrelerin bir matrisini döndürür.

c[m1]m1'den gelen tüm ışık kombinasyonlarını alır ve kapsama alanı için test eder. Maksimum kapsama sahip olanlar arasında, en az ampule sahip olanları seçer. Bunların her biri en uygun çözümdür.


Örnek 1:

6x6 kurulumu

(*all the lights *)
m=Array[RandomInteger[4]&,{6,6}]/.{2-> 0,3->0,4->0}
h[m]

orijinal

Tüm optimum çözümler.

(*subsets of lights that provide full coverage *)
h/@(ReplacePart[Array[0&,Dimensions[m]],#/.{{j_Integer,k_}:> {j,k}-> 1}]&/@(c[m]))

Yanıtlar


Tüm ışık kombinasyonlarını kullanarak golf versiyonu.

Bu sürüm kullanılmayan ışıkların sayısını hesaplar. Izgaraları göstermez.

c kullanılmayan ışıkların sayısını döndürür.

n@w_:=Flatten@w~Count~1;t=MorphologicalTransform;
c@r_:=n@m-GatherBy[Cases[{n@t[ReplacePart[Array[0 &,Dimensions[r]],#
/.{{j_Integer,k_}:> {j,k}-> 1}],Max],#,Length@#}&/@(Rest@Subsets[r~Position~1]),
{n[r~t~Max],_,_}],Last][[1,1,3]]

n[matrix]bayraklı hücre sayısını sayar. Işıkları saymak ve ayrıca yanan hücreleri saymak için kullanılır

s[mat1, mat2] mat1'deki yanan hücrelerin mat2'deki yanan hücrelerin sayısına eşit olup olmadığını test eder. [[mat] bir ışık matrisi alır ve aydınladıkları hücrelerin bir matrisini döndürür.

c[j]j'den tüm ışık kombinasyonlarını alır ve kapsama alanı için test eder. Maksimum kapsama sahip olanlar arasında, en az ampule sahip olanları seçer. Bunların her biri en uygun çözümdür.

ÖRNEK 2

m=Array[RandomInteger[4]&,{6,6}]/.{2-> 0,3->0,4->0};
m//Grid

Kafes

Aynı aydınlatma kapsamına sahipken iki ışık kaydedilebilir. santimetre]

2


Mathematica elimde değil, bu yüzden bu kodu test edemem, ancak açıklamalarınızı yanlış anlamadım, algoritmanızın yanlış olduğunu düşünüyorum. Anlayışım doğruysa, ışığın işlenme sırasına bağlı olan açgözlü bir stratejiye dayanır: örneğin, 3 * 3 test kasanızdaki orta lambadan başlamak onu kaldıracak ve iki yan lambayı bırakacaktır. Uygulamada kullandığınız özel siparişin doğru olmasını beklemiyorum, ancak şu anda karşı bir örneğim yok.
Clément

Fikriniz, orijinal kurulumda, biri diğerinden daha gereksiz olan 2 gereksiz ışığın, a, b, mümkün olabileceği gibi görünüyor. Dolayısıyla, eğer biri kaldırılırsa daha iyi ekonomi elde edilebilir (ilk olarak). Bunun toplamda 3 ışıkla gerçekleşemeyeceğini düşünüyorum, ancak daha fazla sayıda ışıkla gerçekten mümkün olabilir. Sorunu başlangıçta tüm ışık kombinasyonlarını test ederek çözdüm. Bu kesinlikle en uygun ve bu nedenle idealdir, ancak büyük bir ışık kümesi ile pratik olmadığını gördüm.
DavidC

@ Clément Tüm olası kombinasyonları test edecek bir çözüm üzerinde çalışıyorum. Biraz zaman alacak ...
DavidC

Kesin olacak;) Ama bu beklenen bir şeydir: Bu sorun, durduğu gibi, minimum ayarlanmış kapağın bir örneğidir - NP. Ek varsayımların (yanal olanlar hariç hemen hemen tüm kaplama setlerinin aynı kardinaliteye sahip olup olmadığı) verimli bir uygulamaya izin verip vermediği ilginç bir sorundur.
Clément

Sıralı olarak satır ve sütunlarla giderseniz açgözlü çözümün doğru olduğundan şüpheleniyorum, ancak henüz kanıtlamadım.
aditsu bıraktı çünkü SE EVIL

3

Python, 309 karakter

import sys
I=sys.stdin.readlines()[1:]
X=len(I[0])
L=[]
m=p=1
for c in''.join(I):m|=('\n'!=c)*p;L+=('1'==c)*[p<<X+1|p<<X|p<<X-1|p*2|p|p/2|p>>X-1|p>>X|p>>X+1];p*=2
O=lambda a:m&reduce(lambda x,y:x|y,a,0)
print len(L)-min(bin(i).count('1')for i in range(1<<len(L))if O(L)==O(x for j,x in enumerate(L)if i>>j&1))

Bitmasks kullanarak çalışır. Lher ışığın kendi ışık modeli için ayarlanmış (en fazla) 9 bitlik bir tamsayı ile temsil edildiği ışıkların bir listesidir. Ardından, bu listenin bitseli veya bitseliyle aynı olan veya tüm listenin alt kümelerini kapsamlı bir şekilde ararız. En kısa alt küme kazanır.

m kaydırırken bitlerin sarılmasını önleyen bir maskedir.


Lütfen düzgün çalışan bir program sağlamaya çalışın.Java/C++ herhangi bir girinti veya aralık için güvenlidir, ancak Python değildir.
user2369284

3
@ user2369284 Sen neden bahsediyorsun ?! Mükemmel çalışıyor (python 2 ile)
aditsu çıkıldı çünkü SE EVIL 9

@aditsu Python 3'üm var.
user2369284

1
@ user2369284 iyi, yazdırma sözdizimi farklıdır, bu nedenle python 3'te başarısız olur
aditsu çıkın çünkü SE EVIL

3

Java 6 - 509 bayt

Limitler hakkında bazı varsayımlar yaptım ve şu anda belirtildiği gibi sorunu çözdüm.

import java.util.*;enum F{X;{Scanner s=new Scanner(System.in);int m=s.nextInt(),n=s.nextInt(),i=m,j,k=0,l=0,r=0,o,c,x[]=new int[30],y[]=x.clone();int[][]a=new
int[99][99],b;while(i-->0){String t=s.next();for(j=n;j-->0;)if(t.charAt(j)>48){x[l]=i;y[l++]=j;}}for(;k<l;++k)for(i=9;i-->0;)a[x[k]+i/3][y[k]+i%3]=1;for(k=1<<l;k-->0;){b=new
int[99][99];for(j=c=l;j-->0;)if((k&1<<j)>0)for(c--,i=9;i-->0;)b[x[j]+i/3][y[j]+i%3]=1;for(o=i=0;i++<m;)for(j=0;j++<n;)o|=a[i][j]^b[i][j];r=c-o*c>r?c:r;}System.out.println(r);}}

Şu şekilde çalıştırın: java F <inputfile 2>/dev/null


Tam olarak kısa değil, bir disk sektörüne uyar: p Daha sonra farklı bir dil deneyebilirim.
aditsu bıraktı çünkü SE EVIL

@aditsu Bunu pencerelerde nasıl çalıştırabilirim?
user2369284

1
@ user2369284: 0011111100'ü sadece 2 lambayla nasıl yapabileceğinizi göremiyorum. 8 hücreyi ışıkla
Keith Randall

@ user2369284 belki java F <inputfile 2>nul, bu başarısız olursa java F <inputfileve istisna göz ardı. Ayrıca java 7 ile çalışmaz.
aditsu çıkmak SE çünkü EVIL

@aditsu Gerçekten üzgünüm. Yazım hatasıydı. Programınız düzgün çalışıyor.
user2369284

1

c ++ - 477 bayt

#include <iostream>
using namespace std;int main(){
int c,i,j,m,n,p,q=0;cin>>m>>n;
int f[m*n],g[m*n],h[9]={0,-1,1,-m-1,-m,-m+1,m-1,m,m+1};
for(i=0;i<m*n;i++){f[i]=0;g[i]=0;do{c=getchar();f[i]=c-48;}while(c!='0'&&c!='1');}
for(i=0;i<m*n;i++)if(f[i])for(j=0;j<9;j++)if(i+h[j]>=0&&i+h[j]<m*n)g[i+h[j]]++;
for(i=0;i<m*n;i++)if(f[i]){p=0;for(j=0;j<9;j++)if(i+h[j]>=0&&i+h[j]<m*n)if(g[i+h[j]]<2)p++;if(p==0){for(j=0;j<9;j++)if(i+h[j]>=0&&i+h[j]<m*n)g[i+h[j]]--;q++;}}cout<<q<<endl;}

1

Yakut, 303

[bu sorunun önceki bir versiyonuna cevap verecek şekilde kodlanmıştır; aşağıdaki notu okuyun]

def b(f,m,n,r)b=[!1]*1e6;(n..n+m*n+m).each{|i|b[i-n-2,3]=b[i-1,3]=b[i+n,3]=[1]*3if f[i]};b[r*n+r+n+1,n];end
m,n=gets.split.map(&:to_i)
f=[!1]*n
m.times{(?0+gets).chars{|c|f<<(c==?1)if c>?*}}
f+=[!u=0]*n*n
f.size.times{|i|g=f.dup;g[i]?(g[i]=!1;u+=1if m.times{|r|break !1if b(f,m,n,r)!=b(g,m,n,r)}):0}
p u

Boolean dizilerine dönüştürme ve mahalleleri değişiklikler için karşılaştırma.

Sınırlama (?): Maksimum çiftlik alanı boyutu 1.000 x 1.000'dir. Sorun "Çiftçi Jack çok kötü" diyor, bu yüzden çiftliğinin daha büyük olmadığını varsayıyorum. ;-) Sınır 2 karakter eklenerek kaldırılabilir.

NOT: Bunu kodlamaya başladığımdan beri, soru gereksinimleri değişmiş gibi görünüyor. Aşağıdaki açıklama eklendi: "işaret edeceğiniz lambalar tek tek kaldırılmayacak, ancak aynı anda çıkarılacaktır" . Orijinal sorunun belirsizliği, lambaların ayrı ayrı çıkarılmasını test ederek bazı kodları kaydetmeme izin verdi . Bu nedenle, çözümüm yeni şartlar altında birçok test vakasında çalışmayacaktır. Eğer zamanım varsa, bunu düzeltirim. Olmayabilirim. Buradaki diğer cevaplar tamamen uyumlu olabileceğinden lütfen bu yanıtı oylamayın .


1

APL, 97 karakter / bayt *

A ⎕IO←1ve ⎕ML←3APL ortamını varsayar .

m←{s↑⊃∨/,v∘.⊖(v←⍳3)⌽¨⊂0⍪0⍪0,0,s⍴⍵}⋄n-⌊/+/¨t/⍨(⊂m f)≡¨m¨(⊂,f)\¨t←⊂[1](n⍴2)⊤⍳2*n←+/,f←⍎¨⊃{⍞}¨⍳↑s←⍎⍞

Ungolfed sürümü:

s ← ⍎⍞                                         ⍝ read shape of field
f ← ⍎¨ ⊃ {⍞}¨ ⍳↑s                              ⍝ read original field (lamp layout)
n ← +/,f                                       ⍝ original number of lamps
c ← ⊂[1] (n⍴2) ⊤ ⍳2*n                          ⍝ all possible shutdown combinations
m ← {s↑ ⊃ ∨/ ,v ∘.⊖ (v←⍳3) ⌽¨ ⊂ 0⍪0⍪0,0, s⍴⍵}  ⍝ get lighted cells given a ravelled field
l ← m¨ (⊂,f) \¨ c                              ⍝ map of lighted cells for every combination
k ← c /⍨ (⊂ m f) ≡¨ l                          ⍝ list of successful combinations
u ← ⌊/ +/¨ k                                   ⍝ min lamps used by a successful comb.
⎕ ← n-u                                        ⍝ output number of useless lamps

⎕ ← s⍴ ⊃ (⊂,f) \¨ (u= +/¨ k) / k               ⍝ additional: print the layout with min lamps

Daha fazla test vakasının daha iyi olacağına katılıyorum. İşte rastgele bir tane:

Giriş:

5 5
10001
01100
00001
11001
00010

Çıkış (yararsız lambalar):

5

Min lambalı düzen (golf versiyonuna dahil değildir):

0 0 0 0 1
0 1 0 0 0
0 0 0 0 0
0 1 0 0 1
0 0 0 0 0

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ *: APL, APL sembollerini üst 128 bayt değerleriyle eşleştiren kendi (eski) tek baytlık karakter kümesiyle
yazılabilir. Bu nedenle, puanlama amacıyla, yalnızca ASCII karakterleri ve APL sembolleri kullanan bir N karakterleri programı N bayt uzunluğunda kabul edilebilir.


0

C ++ 5.806 Bayt

Bu henüz boyut için optimize edilmemiştir. Ancak az sayıda yarışmacı olduğu için şimdilik bunu bırakacağım.

Depo Başlığı:

#pragma once

namespace FarmersLand
{

class FarmersField
{
private:
    unsigned _m_size, _n_size;
    int * _lamp, * _lumination;
    char * _buffer;
    void _illuminate(unsigned m, unsigned n);
    void _deluminate(unsigned m, unsigned n);
    void _removeLamp(unsigned m, unsigned n);
    void _setLamp(unsigned m, unsigned n);
    int _canRemoveLamp(unsigned m, unsigned n);
    int _coordsAreValid(unsigned m, unsigned n);
    int _getLuminationLevel(unsigned m, unsigned n);
    int * _allocIntArray(unsigned m, unsigned n);
    int _coordHelper(unsigned m, unsigned n);
public:
    FarmersField(char * input[]);
    FarmersField(const FarmersField & field);
    ~FarmersField(void);
    int RemoveLamps(void);
    char * Cstr(void);
};

}

Çiftçi Koruma CPP'si:

#include "FarmersField.h"
#include <stdio.h>


namespace FarmersLand
{

void FarmersField::_illuminate(unsigned m, unsigned n)
{
    if(this -> _coordsAreValid(m,n))
    {
        ++this -> _lumination[this -> _coordHelper(m,n)];
    }
}

void FarmersField::_deluminate(unsigned m, unsigned n)
{
    if(this -> _coordsAreValid(m,n))
    {
        --this -> _lumination[this -> _coordHelper(m,n)];
    }
}

void FarmersField::_removeLamp(unsigned m, unsigned n)
{
    if(this -> _coordsAreValid(m,n))
    {
        unsigned mi_start = (m == 0) ? 0 : m - 1;
        unsigned mi_end = m + 1;
        unsigned ni_start = (n == 0) ? 0 : n - 1;
        unsigned ni_end = n + 1;

        for(unsigned mi = mi_start; mi <= mi_end; ++mi)
        {
            for(unsigned ni = ni_start; ni <= ni_end; ++ni)
            {
                this -> _deluminate(mi, ni);
            }
        }
        --this -> _lamp[this -> _coordHelper(m,n)];
    }
}

void FarmersField::_setLamp(unsigned m, unsigned n)
{
    if(this -> _coordsAreValid(m,n))
    {
        unsigned mi_start = (m == 0) ? 0 : m - 1;
        unsigned mi_end = m + 1;
        unsigned ni_start = (n == 0) ? 0 : n - 1;
        unsigned ni_end = n + 1;

        for(unsigned mi = mi_start; mi <= mi_end; ++mi)
        {
            for(unsigned ni = ni_start; ni <= ni_end; ++ni)
            {
                this -> _illuminate(mi, ni);
            }
        }
        ++this -> _lamp[this -> _coordHelper(m,n)];
    }
}

int FarmersField::_canRemoveLamp(unsigned m, unsigned n)
{
    unsigned can = 1;
    unsigned mi_start = (m == 0) ? 0 : m - 1;
    unsigned mi_end =   (m == (this->_m_size - 1)) ? m : m + 1;
    unsigned ni_start = (n == 0) ? 0 : n - 1;
    unsigned ni_end =   (n == (this->_n_size - 1)) ? n : n + 1;

    for(unsigned mi = mi_start; mi <= mi_end; ++mi)
    {
        for(unsigned ni = ni_start; ni <= ni_end; ++ni)
        {
            if( 1 >= this -> _getLuminationLevel(mi, ni) )
            {
                can = 0;
            }
        }
    }
    return can;
}

int FarmersField::_coordsAreValid(unsigned m, unsigned n)
{
    return m < this -> _m_size && n < this -> _n_size;
}

int FarmersField::_getLuminationLevel(unsigned m, unsigned n)
{
    if(this -> _coordsAreValid(m,n))
    {
        return this -> _lumination[this -> _coordHelper(m,n)];
    }
    else
    {
        return 0;
    }
}

int * FarmersField::_allocIntArray(unsigned m, unsigned n)
{
    int * a = new int[m * n];
    for(unsigned i = 0; i < m*n; ++i)
    {
        a[i] = 0;
    }
    return a;
}

int FarmersField::_coordHelper(unsigned m, unsigned n)
{
    return m * this -> _n_size + n;
}

int FarmersField::RemoveLamps(void)
{
    int r = 0;
    for(unsigned m = 0 ; m < this -> _m_size; ++m)
    {
        for(unsigned n = 0 ; n < this -> _n_size; ++n)
        {
            if(this -> _canRemoveLamp(m,n))
            {
                ++r;
                this -> _removeLamp(m,n);
            }
        }
    }
    return r;
}

char * FarmersField::Cstr(void)
{
    unsigned size = this -> _m_size * this -> _n_size + _m_size ;
    unsigned target = 0;
    delete(this -> _buffer);
    this -> _buffer = new char[ size ];
    for(unsigned m = 0 ; m < this -> _m_size; ++m)
    {
        for(unsigned n = 0 ; n < this -> _n_size; ++n)
        {
            this -> _buffer[target++] =  (0 == this -> _lamp[this -> _coordHelper(m,n)])? '0' : '1';
        }
        this -> _buffer[target++] = '-'; 
    }
    this -> _buffer[size - 1 ] = 0;
    return this -> _buffer;
}

FarmersField::FarmersField(char * input[])
{
    sscanf_s(input[0], "%u %u", &this -> _m_size, &this -> _n_size);

    this -> _lamp = this -> _allocIntArray(this -> _m_size, this -> _n_size);
    this -> _lumination = this -> _allocIntArray(this -> _m_size, this -> _n_size);
    this -> _buffer = new char[1];

    for(unsigned m = 0 ; m < this -> _m_size; ++m)
    {
        for(unsigned n = 0 ; n < this -> _n_size; ++n)
        {
            if('0' != input[m+1][n])
            {
                this -> _setLamp(m,n);
            }
        }
    }
}

FarmersField::FarmersField(const FarmersField & field)
{
    this -> _m_size = field._m_size;
    this -> _n_size = field._n_size;

    this -> _lamp = this -> _allocIntArray(this -> _m_size, this -> _n_size);
    this -> _lumination = this -> _allocIntArray(this -> _m_size, this -> _n_size);
    this -> _buffer = new char[1];

    for(unsigned m = 0 ; m < this -> _m_size; ++m)
    {
        for(unsigned n = 0 ; n < this -> _n_size; ++n)
        {
            if(0 != field._lamp[this -> _coordHelper(m,n)])
            {
                this -> _setLamp(m,n);
            }
        }
    }

}

FarmersField::~FarmersField(void)
{
    delete(this -> _lamp);
    delete(this -> _lumination);
    delete(this -> _buffer);
}

}

Ve kodun yapıldığını yapmak için yapıldığını gösteren bir dizi test:

#include "../../Utility/GTest/gtest.h"

#include "FarmersField.h"

TEST(FarmersField, Example1) 
{
    using namespace FarmersLand;
    char * input[] = {"3 3", "100", "010", "001"};
    FarmersField f(input);
    EXPECT_STREQ("100-010-001", f.Cstr());
    EXPECT_EQ(2, f.RemoveLamps());
    EXPECT_STREQ("000-010-000", f.Cstr());
}

TEST(FarmersField, Example2) 
{
    using namespace FarmersLand;
    char * input[] = {"3 6", "100000", "010000", "001000"};
    FarmersField f(input);
    EXPECT_STREQ("100000-010000-001000", f.Cstr());
    EXPECT_EQ(1, f.RemoveLamps());
    EXPECT_STREQ("000000-010000-001000", f.Cstr());
 }

TEST(FarmersField, Example3) 
{
    using namespace FarmersLand;
    char * input[] = {"6 3", "100", "010", "001", "000", "000", "000",};
    FarmersField f(input);
    EXPECT_STREQ("100-010-001-000-000-000", f.Cstr());
    EXPECT_EQ(1, f.RemoveLamps());
    EXPECT_STREQ("000-010-001-000-000-000", f.Cstr());
 }

TEST(FarmersField, Example4) 
{
    using namespace FarmersLand;
    char * input[] = {"3 3", "000", "000", "000",};
    FarmersField f(input);
    EXPECT_STREQ("000-000-000", f.Cstr());
    EXPECT_EQ(0, f.RemoveLamps());
    EXPECT_STREQ("000-000-000", f.Cstr());
 }

TEST(FarmersField, Example5) 
{
    using namespace FarmersLand;
    char * input[] = {"3 3", "111", "111", "111",};
    FarmersField f(input);
    EXPECT_STREQ("111-111-111", f.Cstr());
    EXPECT_EQ(8, f.RemoveLamps());
    EXPECT_STREQ("000-010-000", f.Cstr());
 }

TEST(FarmersField, Example6) 
{
    using namespace FarmersLand;
    char * input[] = {"6 6", "100001", "001010", "001001", "001010", "110000", "100001",};
    FarmersField f(input);
    EXPECT_STREQ("100001-001010-001001-001010-110000-100001", f.Cstr());
    EXPECT_EQ(6, f.RemoveLamps());
    EXPECT_STREQ("100011-001010-000000-000010-010000-000001", f.Cstr());
 }

Lütfen harici kitaplıklar kullanan bir test yardımcı programı sağlayın.
user2369284


0

Perl 3420 bayt

Bir golf çözümü değil, ama bu sorunu ilginç buldum:

#!/usr/bin/perl
use strict;
use warnings; 

{
   package Farm; 
   use Data::Dumper; 

   # models 8 nearest neighbors to position i,j forall i,j
   my $neighbors = [ [-1, -1],
                     [-1,  0],
                     [-1, +1], 
                     [ 0, -1], 
                     # current pos 
                     [ 0,  1], 
                     [+1, -1], 
                     [+1,  0], 
                     [+1, +1] ];

   sub new { 
      my ($class, %attrs) = @_; 
      bless \%attrs, $class;
   }  

   sub field { 
      my $self = shift;
      return $self->{field};
   }

   sub rows {
      my $self = shift;
      return $self->{rows};
   }

   sub cols {
      my $self = shift;
      return $self->{cols};
   }
   sub adjacents {
      my ($self, $i, $j) = @_;

      my @adjs; 
   NEIGHBORS:
      for my $neighbor ( @$neighbors ) {
         my ($imod, $jmod) = ($neighbor->[0] + $i, $neighbor->[1] + $j); 
         next NEIGHBORS 
            if $imod >= $self->rows || $jmod >= $self->cols;

         # push neighbors
         push @adjs, 
            $self->field->[$imod]->[$jmod];

      }

      return @adjs;
   }

   sub islit { 
      my ($lamp) = @_;

      return defined $lamp && $lamp == 1;
   }

   sub can_remove_lamp { 
      my ($self, $i, $j) = @_; 

      return scalar grep { islit($_) } $self->adjacents($i, $j);
   }

   sub remove_lamp { 
      my ($self, $i, $j) = @_;

      $self->field->[$i]->[$j] = 0;
   }

   sub remove_lamps {
      my ($self) = @_; 

      my $removed = 0;
      for my $i ( 0 .. @{ $self->field } - 1) {
         for my $j ( 0 .. @{ $self->field->[$i] } - 1 ) { 
            next unless islit( $self->field->[$i]->[$j] ); 

            if( $self->can_remove_lamp($i, $j) ) {
               $removed++; 
               $self->remove_lamp($i, $j);
            }
         }
      }

      return $removed;
   }

   1;
}

{ # Tests
   use Data::Dumper;
   use Test::Deep;
   use Test::More; 

   { # 3x3 field
      my $farm = Farm->new( rows  => 3,
                            cols  => 3,
                            field => [ [1,0,0],
                                       [0,1,0],
                                       [0,0,1]
                                     ]
      );

      is( 2, 
          $farm->remove_lamps,
          'Removed 2 overlapping correctly'
      );

      is_deeply( $farm->field, 
                 [ [0,0,0],
                   [0,0,0],
                   [0,0,1],
                 ],
                 'Field after removing lamps matches expected'
      );

   }

   { # 5x5 field
      my $farm = Farm->new( rows  => 5,
                            cols  => 5,
                            field => [ [0,0,0,0,0],
                                       [0,1,0,0,0],
                                       [0,0,1,0,0],
                                       [0,0,0,0,0],
                                       [0,0,0,0,0]
                                     ]
      );

      is( 1, 
          $farm->remove_lamps,
          'Removed 1 overlapping lamp correctly'
      );

      is_deeply( $farm->field,
                 [ [0,0,0,0,0],
                   [0,0,0,0,0],
                   [0,0,1,0,0],
                   [0,0,0,0,0],
                   [0,0,0,0,0],
                 ],
                 'Field after removing lamps matches expected'
      );
   }
}

(Somut testler yapabilmek için I / O çıkarıldı)


0

Python - 305 bayt

import sys,itertools
w,h=map(int,input().split());w+=1
l=[i for i,c in enumerate(sys.stdin.read())if c=="1"]
f=lambda l:{i+j for i in l for j in(0,1,-1,w-1,w,w+1,1-w,-w,-w-1)if(i+j+1)%w}&set(range(w*h))
for n in range(1,len(l)):
 for c in itertools.combinations(l,n):
  if f(c)^f(l):print(len(l)-n);exit()
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.