Kontamine Kareler


17

Giriş

Sadece rakamlardan oluşan aşağıdaki kareyi gözlemleyelim 0 - 9:

1034
4167
8414
3542

Bu karenin dış kabuğu:

1034
4  7
8  4
3542

Biz gerek, böylece sıfır içeren kabuğu bırakarak dış kabuğun altında:

16
41

Bu karenin dış kabuğu:

16
41

O mu değil herhangi sıfırları içermesi ve bu nedenle olduğunu olmayan Kirlenmiş kare. Yani temelde, tanım zaman kirli olmayan bir kare olan dış kabuk kare içeren hiçbir sıfır.

Görev

Herhangi bir makul formatta (sadece negatif olmayan tamsayıları içeren) bir basamak kare göz önüne alındığında , dış kabuğu sürekli olarak herhangi bir makul formatta soyarak en büyük kontamine olmayan kareyi çıkarın.

Test senaryoları

Test örneği 1:

Input         Output

1234          1234
2345          2345
3456          3456
4567          4567

Test örneği 2:

Input         Output

123           123
204           204
346           346

Test örneği 3:

Input         Output

101           1
010           
101           

Test durumu 4:

Input         Output

000           (none)
000
000

Bu , yani en az bayt ile gönderme kazanır!


Örneği yapamıyorum 416\n841\n354\n(sol alt köşe)?
Sızdıran Rahibe

Eh, " en büyük kontamine olmayan kare " dediniz
Leaky Nun

Hataya izin veriliyor mu?
Sızdıran Rahibe

@KennyLau Son test senaryosunu mu kastediyorsunuz? Evet, vermediği sürece 0veya bunun gibi bir şey.
Adnan

2
"Rakamlar karesi" daha iyi "rakamlar karesi" olarak ifade edilir
Mego

Yanıtlar:


6

Jöle , 19 16 bayt

Fœ^F}P
ḊṖZµ⁺⁸ßç?

Çevrimiçi deneyin! veya tüm test senaryolarını doğrulayın .

Nasıl çalışır

ḊṖZµ⁺⁸ßç?  Main link. Argument: M (2D list)

Ḋ          Dequeue; remove the first row.
 Ṗ         Pop; remove the last row.
  Z        Zip; transpose rows with columns.
   µ       Combine the chain to the left into a link.
    ⁺      Copy the link, executing it twice.
           The copy removes the first and last column and restores the orientation.
       ç?  If the helper link returns a non-zero integer:
     ⁸       Return M unmodified.
      ß      Else, recursively call the main link on the "peeled" M.


Fœ^F}P     Helper link. Arguments: P ("peeled" M), M (unmodified)

F          Flatten P.
   F}      Flatten M.
 œ^        Perform multiset symmetric difference, removing the elements of P from
           the elements of M, respecting multiplicities, leaving precisely the
           elements of the outer shell.
     P     Return the product of the remaining elements.

8

JavaScript, 105 97 bayt

@Patrick Roberts sayesinde 8 bayt kaydedildi!

l=a=>a.slice(1,-1)
p=a=>l(a).map(l)
c=a=>a.join``.replace(/[^0]/g,"")
s=a=>c(p(a))<c(a)?s(p(a)):a

sGirdi olarak bir 2D tamsayı dizisi sağlandığında bir 2D tamsayı dizisi döndüren işlevi tanımlar .

Nasıl çalışır

  • işlevi l: bir dizi verilira , ilk ve son dizinleri olmadan bir kopya döndürür.

  • işlevi p: bir 2D dizi verildiğinde , ilk ve son satırı kaldırmak için açağrılar l, daha sonra kalan her satır çağrısı içinl için yumruk ve son sütunu kaldırma . Bu soğan soyulmasını gerçekleştirir.

  • işlevi c: 2B bir dizi verildiğinde a, yalnızca d dizisi 0biçiminde s içeren bir dize döndürür .a .

  • işlevi s: bir 2D dizi verildiğinde, tarafından verilen dizinin soyulmuş formunu ve dizinin kendisini açağırır . Soyulmuş formun orijinalden daha az s olup olmadığını belirlemek için bu dizeleri sözlükbilimsel olarak karşılaştırır . Eğer öyleyse, orijinal kirlenir, bu nedenle soyulmuş formda tekrar tekrar arayın . Aksi takdirde orijinali iade edin.cp0s


2
Sen kaldırabilirsiniz a.lengthgelen endbir argüman array.sliceiçinde lve 8 bayt kaydedin. end, negatif bir dizin olmasına izin verilir.
Patrick Roberts

7

Retina , 60 57 bayt

Bayt sayımı ISO 8859-1 kodlamasını varsayar. Sondaki satır besleme önemlidir.

+`(?<=(?=.*0|[^_]+(¶0|0¶|0.*$))^[^_]*)(^.+¶|¶.+$|.?\b.?)

Çevrimiçi deneyin!

açıklama

Sondaki satır `beslemesi nedeniyle bu, normal ifadeden sonraki tüm eşleşmeleri bulur ve bunları girişten kaldırır. Liderlik nedeniyle +bu, çıkış değişmeyi durdurana kadar tekrar tekrar yapılır (bunun nedeni normal ifadenin eşleşmeyi durdurmasıdır).

Normal ifadenin kendisine gelince, iki bölümden oluşur:

(?<=(?=.*0|[^_]+(¶0|0¶|0.*$))^[^_]*)

Bu bölüm 0dış kabukta herhangi bir yer olup olmadığını kontrol eder . Bunu, normal ifade motorunun "imlecini" bir gözetleme ile dizenin başına taşıyarak yapar ( [^_]hem basamakları hem de satır beslemelerini eşleştirmek için kullanırız ):

(?<=...^[^_]*)

Ve sonra bu pozisyondan 0, ilk satırda, satır beslemesine bitişik olarak veya son satırda birini bulmak için bir ileriye bakıyoruz :

(?=.*0|[^_]+(¶0|0¶|0.*$))

Ardından, gerçek eşleme, ilk satırdan (sondaki satır beslemesi dahil), son satırdan (önde gelen satır beslemesi dahil) veya satırın \bbaşlangıcı / sonu olarak kelime sınırını kötüye kullandığımız bir satırın ilk veya son karakterinden oluşur. Çapa:

(^.+¶|¶.+$|.?\b.?)

6

MATL , 26 21 bayt

t"t5LY)y5LZ)h?}6Lt3$)

Girdi şu biçimde

[1 0 3 4; 4 1 6 7; 8 4 1 4; 3 5 4 2]

Diğer dört test örneği

[1 2 3 4; 2 3 4 5; 3 4 5 6; 4 5 6 7]
[1 0 1; 0 1 0; 1 0 1]
[1 2 3; 2 0 4; 3 4 6]
[0 0 0; 0 0 0; 0 0 0]

Program son test durumunda hata verir, ancak doğru çıktıyı üretir (ki bu hiçbir şey değildir). @Dennis'e dikkat ettiğiniz için teşekkürler!

Çevrimiçi deneyin! . Veya tüm test senaryolarını doğrulayın (buna sarma kodu da dahildir).

açıklama

Bu, giriş matrisindeki sütun sayısının kat kat fazladır ve bu da fazlasıyla yeterlidir. Her yinelemede, kabuk değerlerine bağlı olarak çıkarılır veya tutulur.

t            % Take a matrix as input. Duplicate
"            % For each column (i.e. repeat that many times)
  t5LY)      %   Duplicate top of the stack. Extract first and last rows
  y5LZ)      %   Duplicate the element below the top. Extract first and last columns
  h          %   Concatenate the two arrays into a row vector
  ?          %   If all its entries are non-zero: do nothing
  }          %   Else
    6Lt3$)   %     Get the central part
             % End if, end for. Implicitly display

5

Pyth, 19 bayt

.W}\0.-`H`JutCPG2HJ

Test odası

.W}\0.-`H`JutCPG2HJ
.W                     While the first function returns true, apply the second
                       function, starting with the input.
           u    2H     Apply the following twice to the input:
              PG       Remove the last row
             C         Transpose
            t          Remove the first row
                       This removes the outermost shell.
          J            Save it to J
         `             Stringify the matrix
       `H              Stringify the input
     .-                Multiset difference
  }\0                  Check if there is a '0' in the resulting string.
                  J    If that succeeds, update the current value to J.
                       When it fails, return the current value.

4

JavaScript (ES6), 74 bayt

f=s=>/^.*0|0\n|\n0|0.*$/.test(s)?f(s.replace(/^.*\n?|.(.*).|\n.*$/g,"$1")):s

Girdileri, her satırı ayıran yeni satırlar içeren (ancak baştaki veya sondaki satırsonu olmayan) bir dize biçiminde alır. Açıklama: /^.*0|0\n|\n0|0.*$/kontamine karelerle eşleşen bir regexp iken /^.*\n?|.(.*).|\n.*$/, karenin silinmesi gereken kısımları ile korunması gereken kısımlarla eşleşir (.*). (Bu yeni satır karakteri için ileriye veya geriye bakmaktan daha kısadır.)


4

Perl 5, 63 + 3 = 66 bayt

$_=<>;s/\A.*\n?|^.|.$|\n.*\Z//mg while/\A.*0|0$|^0|0.*\Z/;print

-0Bayrağı gerektirir . Giriş olmalıdır olmayan bir arka satır karakteri içerir.


3

Pyke, 29 bayt

"D3lt%sBR,"2*ER3*I
/)tOmtmOr;

Burada deneyin!

Ayrıca 29 bayt

QeQhQmhQme]4sBI
/)QtOmtmO=Qr;

Burada deneyin!


2
Her iki bağlantıda da hatalar alıyorum. "Run" tuşuna basmadan önce bir şey yapmamız gerekiyor mu?
Luis Mendo

Muhtemelen koştuğunda her zaman bir hata olacağını söylemeliydim. Çıktı bir yerde ikinci satırda (Aslında yazdırıldı ve hata mesajının bir parçası değil)
Mavi

2

Pyth , 31 30 bayt

L+hbeb.W!*F+1iRTs+yHyMHPtmPtdZ

Test odası.(Son testcase hataları)

İyileştirme: dış döngü çıkarıcısını bir işlev haline getirdi (L+hbeb ) haline getirilmesi

Önceki 31 baytlık sürüm:

.W!*F+1iRTs++hHm+hdedHeHPtmPtdZ

Nasıl çalışır:

Kod temel olarak: dış kabuğun ürünü sıfırken, soyun.

Ana kodu analiz edelim (Q burada üstü kapalı):

.W<lambda:H><lambda:Z>Q

Başlangıç Q(giriş),while ilk lambda'dan ikinci lambda yapın.

İlk kısım olacaktır lambda içinde H:

!*F+1iRTs++hHm+hdedHeH

İkinci bölüm olacaktır lambda olarak Z:

PtmPtdZ

İlk bölüm

!*F+1iRTs++hHm+hdedHeH

Bunu analiz edelim:

s++hHm+hdedHeH

s++             Concatenate:
   hH              1. the first row
     m+hdedH       2. the first and last item of each row
            eH     3. the last row

Pyth önek gösterimini kullandığından , bu değerlendirilir:

!*F+1iRT

     iRT  Convert each to integer
 *F+1     Product
!         Negate. If any element of the outer shell is zero, this would return 1.

İkinci kısım

PtmPtdZ
  mPtdZ   the inner of each row
Pt        the inner rows

2

Mathematica, 78 bayt

NestWhile[#[[a=2;;-2,a]]&,#,Count[{#[[b={1,-1}]],#[[;;,b]]},0,3]>0&]~Check~{}&

Anonim işlev, girdiyi matris olarak alır. Yürütme sırasında oluşabilecek hataları yok sayın.

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.