Umutsuzca arayan Santa


13

Noel Baba ve onun ren geyiği kalabalık bir sahnede bulun.

Giriş

Girdi STDIN'de olacak ve eşit, ancak değişken uzunluktaki karakterlerin değişken sayıda satırı olacaktır. Noel Baba (karakterin temsil ettiği S) sahnede ise, onun karakteri (karakterin temsil ettiği P) ona bitişik konumlardan birinde (yatay, dikey veya çapraz) olacaktır. Ren geyiği (her biri karakterin temsil ettiği R), onu çevreleyen 5x5 kare içinde olacak. SSahnede bir hediye torbası olmayan veya en az 4 ren geyiği eşlik etmeyen bir görünüm ortaya çıkarsa , o zaman Noel Baba değildir.

Çıktı

Sahne, Noel'i, hediye çuvalını ve ren geyiğini gösteren tüm şaşkınlıktan (Noel Baba olmayan, hediye olmayan, ren geyiği olmayan karakterlerin yerini aldı) temizledi - diğer tüm karakterler boşluklarla değiştirilmelidir. Noel Baba ve ren geyiği sahnede değilse, değiştirmeden çıktı. Sadece bir çözüm olacağı garanti edilir, bu yüzden asla birden fazla geçerli Noel Baba olmayacak ve asla birden fazla hediye torbası taşımayacaktır.

Örnekler

Bu örneklerde sadece kullanıyorum *kolay görmeye yapmak karakteri S, Pve Rkarakterler, ancak programınız herhangi ASCII karakter işlemek gerekir !için `(96 33). Karışıklığı önlemek için küçük harfleri ve üstünü bıraktım.

Giriş:

***********
***********
***********
*****R*****
******P****
*****S*****
*****R*****
****R**R***
***********
***********
***********
***********

Çıktı: (noktaları yoksay, sayfayı boş satırları göstermeye zorlarlar)

.           
.          
.           
     R     
      P    
     S     
     R     
    R  R   
.           
.           
.           
.           

Girdi: (yeterli ren geyiği)

***********
***********
***********
***********
******P****
*****S*****
*****R*****
****R**R***
***********
***********
***********
***********

Çıktı:

***********
***********
***********
***********
******P****
*****S*****
*****R*****
****R**R***
***********
***********
***********
***********

Girdi: (hediye torbası yok)

***********
***********
***********
*****R*****
***********
*****S*****
*****R*****
****R**R***
***********
***********
***********
***********

Çıktı:

***********
***********
***********
*****R*****
***********
*****S*****
*****R*****
****R**R***
***********
***********
***********
***********

Girdi: (yeterince yakın değil sunar)

***********
***********
***********
*****R*****
***********
*****S*P***
*****R*****
****R**R***
***********
***********
***********
***********

Çıktı:

***********
***********
***********
*****R*****
***********
*****S*P***
*****R*****
****R**R***
***********
***********
***********
***********

Girdi: (Noel Baba'nın etrafında 5x5 kare içinde olmayan ren geyiğinden biri)

***********
***********
***********
*****R*****
******P****
*****S*****
*****R*****
****R******
*******R***
***********
***********
***********

Çıktı:

***********
***********
***********
*****R*****
******P****
*****S*****
*****R*****
****R******
*******R***
***********
***********
***********

Test Scriptleri

Geçmişteki bazı sorularımda olduğu gibi, bu soru için bazı test senaryoları sağlamak için bir kez daha Joey ve Ventero tarafından oluşturulan bazı test senaryolarını tekrar kullandım :

Kullanımı: ./test [your program and its arguments]

Referans için testlerin düz metin versiyonu: Düz metin

Ödüller

Spesifikasyonu karşıladığını doğrulayabildiğim, testleri geçtiğini ve golfte bazı girişimlerde bulunduğunu doğrulayabildiğim her giriş benden bir upvote alacak (bu yüzden lütfen cevabınızla birlikte kullanım talimatlarını sağlayın). 31/12/2013 sonuna kadar en kısa çözüm kazanan olarak kabul edilecektir.


Bunun önceki soruma benzer Yüz tanıma ile benzer olduğunu fark ettim , ancak o zamandan bu yana birkaç yıl geçti. Ayrıca, Soru Sandbox'ı atladığınız için özür dilerim, ancak Noel ile ilgili olduğu için hızlı bir şekilde gönderilmesi gerekiyordu veya alakalı olmayacaktı.
Gareth

İlk örnek çıktısı düzgün görüntülenmiyor (daha küçük boyutta görünüyor).
Dennis Jaheruddin

@DennisJaheruddin Markdown tüm boş satırları kaldırıyor gibi görünüyor. Orada olduklarını göstermek için bu çizgilerin başına noktalar ekledim. Karışıklık için üzgünüm.
Gareth

Yanıtlar:


2

MATLAB: 110 , 95 karakter

f=@(x,y) filter2(ones(x),y);a=M==83;b=M==82;c=M==80;d=f(5,a&f(5,b)>3&f(3,c))&(a|b|c);if ~d,M,else,M(~d)=32,end

Girişin işlenme şeklinden emin değilim, ancak geri kalanı oldukça basit.

Normal olarak biçimlendirilmiş sürüm:

f=@(x,y) filter2(ones(x),y);
a=M==83;
b=M==82;
c=M==80;
d=f(5,a&f(5,b)>3&f(3,c))&(a|b|c);
if ~d
  M
else
  M(~d)=32
end

Örnek girdi:

M=['***********'
'***********'
'***********'
'*****R*****'
'******P****'
'*****SQL_2*'
'*****R*****'
'****R**R***'
'***********'
'***********'
'***********'
'***********'];

Hmmm, üzerinde test komut dosyaları çalıştırmak garip olacak. Kod üzerinde hızlı bir bakış bu bilgileri yalnızca Yukarıda verilen örnekleri kullandığınız kullanımı düşündürmektedir *kalabalık olarak karakterler daha kolay görmeye yapmak S, Pve Rbuna testleri test script kullanımda tüm ASCII karakterleri 33'ten (- karakterleri !) yukarı ila 96 (``)) arasındadır. Bunu soruda netleştireceğim. Sorulara da ekleyeceğim, geçmeniz gereken testlerin düz metin versiyonunu yaptım.
Gareth

@Gareth Güncellendi, testleri şimdi geçiyor gibi görünüyor. QNoel Baba'nın uilt giymemesi çok kötü, beni en az 2 karakter kurtaracaktı.
Dennis Jaheruddin

Tamam. Matlab'ım yok, bu yüzden sadece Octave'ı indiriyorum (internets Matlab kodunu çalıştırmanın en iyi ücretsiz yolu olduğunu söylüyor) ve kontrol etmek için sabah testlerden geçecek.
Gareth

Tamam, bunu kontrol ettim ve spesifikasyonu karşılıyor gibi görünüyor. Haksız bir avantaja sahip olduğu tek yer girdi gereksinimidir. Ben oy verdim, ancak girdiyi okumadığı sürece kazanan olarak kabul edemeyeceğim (Matlab'ın STDIN'den okumadığı göründüğü için bir dosyadan).
Gareth

Sen kaymış SQL_2:) örnek girdi ... Nice içine
Timtech

1

Piton 2 ( 353 381)

import re,sys
a=sys.stdin.readlines()
h=len(a)
w=len(a[0])
a=''.join(a)+' '*99
print a
b=[''.join(q) for x in range(0,w) for y in range(0,h) for q in [[a[(y+z)*w+x:(y+z)*w+x+5] for z in range(0,5)]]]
for c in b:
 if c[12]=='S' and 'P' in ''.join([c[1+5*z:4+5*z] for z in range(1,4)]) and c.count('R')>3:
  a=re.sub('[^RPS]','.',c)
  w=h=5
for y in range(0,h):
 print a[y*w:(y+1)*w]

İlk olarak mümkün olduğunca kompakt kod yazmaya çalışın. Python bunun için bir dil değildir, çünkü girinti ve yeni satırlar basitçe tasarım için gereklidir. Listeleri ve dizeleri liste olarak çalma şekliniz nedeniyle bu dili kullanmayı tercih ederim. Kolay matris manipülasyonu olan bir dil bu görev için ideal olurdu, ama ne yazık ki hiçbirini bilmiyorum.

Bir şeyi test etmek için, a.

a=['1**********','*2*********','**3********','***4*******','****5*P****','*****S*****','*****,*****','****R**R***','***********','***********','****R******','**RPSRRR***']

Bu koddaki ana ilginç şey muhtemelen:

b=[''.join(q) for x in range(0,w) for y in range(0,h) for q in [[a[(y+z)*w+x:(y+z)*w+x+5] for z in range(0,5)]]]

"b, orijinal göstergedeki her 5x5 karenin bir gösteriminin (25 karakterlik bir dize) listesi olur".


Matlab, STDIN'den okumakta zorluk çekebilirken, Python korkmuyorum. STDIN'den girdinin okunması, gereksinimlerden biridir (test komut dosyasının çalıştırılmasını, insanların kendi giriş formatlarıyla gelmesini önlemek kadar mümkün kılmak için).
Gareth

ayy, tamamen özledim.
Sumurai8

Kod değiştirildi, ancak burada gerçekten çalışıp çalışmadığını test edemez. Onu
eskisi gibi okumalı

Tamam, şimdi testleri bunun üzerinde yapma şansım oldu ve birkaç sorun var. 1) Noel Baba'nın bulunduğu durumlarda, giriş çözümünüzden önceki gibi çıkar. 2) Çözümünüz girişten farklı bir boyuttadır. Soruyu bu noktada daha açık hale getirmeye çalıştım - tüm olmayan (santa, hediyeler, ren geyiği) karakterler boşluklarla değiştirilmelidir. İlk örnekte böyleydi, ancak soruda açıkça belirtilmedi. 3) Santa bulunamadığında, çıkışın çift satır aralığı vardır.
Gareth

0

Dosyada sadece bir Noel Baba olmalıdır (2'den fazla "S" ise, kodu güncellemem gerekir).

Awk kullanma

cat santa.awk

BEGIN{FS=""}
{ for (i=1;i<=NF;i++)
         { a[NR FS i]=$i
           if ($i=="S") {l=NR;c=i}
         }
     }
END{ if (l=="") {print "No Santa";exit}
     for (i=l-1;i<=l+1;i++)
        for (j=c-1;j<=c+1;j++)
          if (a[i FS j]=="P") p++
     if (p<1) {print "Santa has no presents";exit}
     for (i=l-2;i<=l+2;i++)
        for (j=c-2;j<=c+2;j++)
          if (a[i FS j]=="R") r++
     if (r<4) {print "Santa has no enough reindeers";exit}
     else {  print "found Santa "
             for (i=1;i<=NR;i++)
               { for (j=1;j<=NF;j++)
                   if (a[i FS j]~/[R|S|P]/) {printf a[i FS j]} else {printf " "}
                 printf RS
                }
           }
    }

Awk komutunu aşağıdaki gibi çalıştırın

awk -f santa.awk file

Sonuç

found Santa



     R
    R R
    PS
    RR
    R  R

Bu er geç gözden geçirme için özür dilerim (tatildeyim ve wifi kolay erişim yok). Ne yazık ki, Ssadece bir 'geçerli' Noel Baba olduğu sürece 2'ye izin verilir. Testler (soruda verilmiştir) bu nedenle başarısız olacak birkaç vakaya sahiptir.
Gareth
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.