Bir dizi oymak


35

Görev

Bu zorluk çok basittir. Girişiniz, en az 1 × 1 boyutunda dikdörtgen bir 2B tam sayı dizisidir. Herhangi bir makul formatta alınabilir. Çıktınız giriş dizisi olabilir, ama olacaktır tüm girişler ile değil ilk veya son satır veya sütun setinde 0. Girişle aynı formatta olmalıdır.

Örneğin, giriş dizisi

67  4 -8  5 13
 9 13 42  4 -7
 1  1  3 -9 29
16 99  8 77  0

o zaman doğru çıktı

67  4 -8  5 13
 9  0  0  0 -7
 1  0  0  0 29
16 99  8 77  0

Kurallar ve puanlama

Tam bir program veya fonksiyon yazabilirsiniz; fonksiyonların yerine geri dönüş yerine girişi değiştirmesine izin verilir. En düşük bayt sayısı kazanır ve standart boşluklar izin verilmez.

Test durumları

Bunlar kopya yapıştırmayı kolaylaştırmak için yuvalanmış listeler olarak biçimlendirilmiştir.

[[3]] -> [[3]]
[[7,2,8]] -> [[7,2,8]]
[[3],[5],[12],[-6]] -> [[3],[5],[12],[-6]]
[[99,98,97],[88,87,86]] -> [[99,98,97],[88,87,86]]
[[6,7],[8,9],[10,11]] -> [[6,7],[8,9],[10,11]]
[[-1,-2,-3],[1,2,3],[5,5,5]] -> [[-1,-2,-3],[1,0,3],[5,5,5]]
[[67,4,-8,5,13],[9,13,42,4,-7],[1,1,3,-9,29],[16,99,8,77,0]] -> [[67,4,-8,5,13],[9,0,0,0,-7],[1,0,0,0,29],[16,99,8,77,0]]
[[0,1,0,1,0],[1,0,1,0,1],[0,1,0,1,0],[1,0,1,0,1],[0,1,0,1,0]] -> [[0,1,0,1,0],[1,0,0,0,1],[0,0,0,0,0],[1,0,0,0,1],[0,1,0,1,0]]

Liderler Sıralaması

Burada hem düzenli bir lider tablosu hem de kazananların dile göre genel bir bakış oluşturması için bir Stack Snippet'i var. Cevabınızın göründüğünden emin olmak için, lütfen aşağıdaki Markdown şablonunu kullanarak cevabınızı bir başlık ile başlatın:

## Language Name, N bytes

Birden çok numara eklemek istiyorsanız (örneğin, puanınızı artırdığınızdan veya tercüman bayraklarını ayrı ayrı listelemek istediğinizden dolayı), gerçek puanın başlıktaki son sayı olduğundan emin olun :

## Perl, <s>50</s> 43 + 2 (-p flag) = 45 bytes

Dil adını, daha sonra büyük afiş snippet'inde görünecek bir bağlantı da yapabilirsiniz:

## [><>](http://esolangs.org/wiki/Fish), 121 bytes

Yanıtlar:


13

MATL , 9 bayt

0HJ_ht4$(

Giriş biçiminde

[67  4 -8  5 13;  9 13 42  4 -7;  1  1  3 -9 29; 16 99  8 77  0]

EDIT (12 Haziran 2016): Dildeki değişikliklere uyum sağlamak için aşağıdaki bağlantıyı _değiştirinq .

Çevrimiçi deneyin !

0           % Push a 0: value that will be assigned into the array
HJ_h        % Vector [2, -1j]: this corresponds to index 2:end-1 for rows
t           % Duplicate: same index for columns
4$(         % Assignment indexing with 4 inputs: array, new value, row and col indices
            % Since the first input (array) to this function is currently missing, it's
            % implicitly taken at this point from stdin
            % Implicitly display stack contents, which is the modified array

2
Güzel! MATL'in kaçacağını biliyordum. : D
kabı

12

Java 7, tamamen adlandırılmış bir fonksiyon olarak: 85

void f(int[][]a){for(int i=0,j;++i<a.length-1;)for(j=1;j<a[i].length-1;)a[i][j++]=0;}

Birkaç baytı silmek için Java 8’de bunu lambdatabilirsiniz, ama bunu gerçekten yapmam.


Kullanarak yer kazanabilir misiniz Arrays.fill(a[i],1,a[i].length-1,0);? 37 yerine sadece 36 bayt var. =)
corsiKa

@corsiKa Güzel olurdu, ancak ithal etmek ya da tam olarak nitelemek zorunda
kalırdım

Sadece meraktan soruyorum, neden her ikisinde de farklı döngüler var? Neden olmasın for(int i=0,j;++i<a.length-1;)for(j=0;++j<a[i].length-1;)a[i][j]=0;? Herhangi bir baytı kurtarmaz, ancak her iki döngüde aynı olmasıyla daha tutarlıdır. :)
Kevin Cruijssen

12

Jöle, 18 17 15 9 bayt

0W&ṖZ
ÇÇ^

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

Arka fon

Bu yaklaşım @ Sp3000'in Jelly cevabına , özellikle de farklı uzunluklardaki listeler arasında vectorized işlemlerden faydalanma fikrine dayanmaktadır.

Girişin ilk satırında 0 biti AND ve her tamsayı alarak başlıyoruz . Otomatik vektörleştirmeden dolayı, bu, [0] bit yönündeki AND değeri ve girişinin son satırı olmadan alınmasıyla başarılabilir . 0 , ilk satırla eşleştirilir, bu da sıfır satırına neden olur. Kalan satırların [0] 'da karşılığı olmadığından , dokunulmazlar.

Şimdi sonucu transpoze ediyoruz, yukarıdaki dönüşümü bir kez daha uygulayın (son sütunu etkin şekilde çıkarın ve ilkini sıfırlayarak) ve tekrar transpoze edin.

Giriş için

 67   4  -8   5  13
  9  13  42   4  -7
  1   1   3  -9  29
 16  99   8  77   0

bu sonuçlanır

  0   0   0   0
  0  13  42   4
  0   1   3  -9

Şimdi, bu sonucun bit or XOR'unu ve orijinal matrisini alıyoruz. Kendisiyle bir tamsayı XORing 0 verir . 0 ile bir tamsayı XOR (veya hiç XORing) aynı tamsayıyı verir. Bu matrisi boşaltır.

Nasıl çalışır

0W&ṖZ    Helper link. Argument: M (matrix)

0W       Yield [0].
   Ṗ     Yield M, without its last row.
  &      Take the bitwise AND of both.
    Z    Zip the result.

ÇÇ^      Main link. Input: A (matrix)

Ç        Call the helper link on A.
 Ç       Call the helper link on the result.
  ^      Take the bitwise XOR of the result and A.

8

Mathematica, 27 bayt

(a=#;a[[2;;-2,2;;-2]]=0;a)&

2
Etkileyici. Şimdi, lütfen açıklar mısın? Görünüşe göre, iç hücreleri sıfıra yeniden ataıyorsunuz ve -2s ikinci, en son ikinci sütunu veya satırı gösterir.
DavidC

Ne kadar basit!
njpipeorgan

7

R , 33 48 bayt

Biliyorum, R golf oynamak için yapılmadı. Fakat konumsal indeksleme için yapılmıştır ... Bir örnek yüklüyor;

a <- matrix(c(67,4,-8,5,13,9,13,42,4,-7,1,1,3,-9,29,16,99,8,77,0), ncol=5, byrow=TRUE)
a
#      [,1] [,2] [,3] [,4] [,5]
# [1,]   67    4   -8    5   13
# [2,]    9   13   42    4   -7
# [3,]    1    1    3   -9   29
# [4,]   16   99    8   77    0

Değeri, kenar satırında veya sütununda olmayan herhangi bir konumda, 0 ile değiştirin:

x <- function(a){a[-c(1,nrow(a)),-c(1,ncol(a))]<-0;a}

x(a)
#      [,1] [,2] [,3] [,4] [,5]
# [1,]   67    4   -8    5   13
# [2,]    9    0    0    0   -7
# [3,]    1    0    0    0   29
# [4,]   16   99    8   77    0

Ayrıca 2 sütunlu bir testi de kontrol edin:

b <- matrix(c(99,98,97,88,87,86), ncol=2, byrow=TRUE)
b
#     [,1] [,2]
#[1,]   99   98
#[2,]   97   88
#[3,]   87   86

x(b)
#     [,1] [,2]
#[1,]   99   98
#[2,]   97   88
#[3,]   87   86

Posterity: önceki deneme

# a[2:(nrow(a)-1),2:(ncol(a)-1)]<-0 # previous attempt

Tüm örnekleri test etmek:

tests <- read.table(text="[[3]] -> [[3]]
                          [[7,2,8]] -> [[7,2,8]]
                          [[3],[5],[12],[-6]] -> [[3],[5],[12],[-6]]
                          [[99,98,97],[88,87,86]] -> [[99,98,97],[88,87,86]]
                          [[6,7],[8,9],[10,11]] -> [[6,7],[8,9],[10,11]]
                          [[-1,-2,-3],[1,2,3],[5,5,5]] -> [[-1,-2,-3],[1,0,3],[5,5,5]]
                          [[67,4,-8,5,13],[9,13,42,4,-7],[1,1,3,-9,29],[16,99,8,77,0]] -> [[67,4,-8,5,13],[9,0,0,0,-7],[1,0,0,0,29],[16,99,8,77,0]]
                          [[0,1,0,1,0],[1,0,1,0,1],[0,1,0,1,0],[1,0,1,0,1],[0,1,0,1,0]] -> [[0,1,0,1,0],[1,0,0,0,1],[0,0,0,0,0],[1,0,0,0,1],[0,1,0,1,0]]")
tests$cols <- c(1,3,1,3,2,3,5,5)
tests$V1 <- gsub("\\[|\\]","",tests$V1)
tests$V1 <- paste0("c(",tests$V1,")")
tests$V3 <- gsub("\\[|\\]","",tests$V3)
tests$V3 <- paste0("c(",tests$V3,")")

testfn <- function(testno) {
  intest <- matrix(eval(parse(text=tests$V1[testno])), ncol=tests$cols[testno], byrow=TRUE)
  intest <- x(intest)
  outtest <- matrix(eval(parse(text=tests$V3[testno])), ncol=tests$cols[testno], byrow=TRUE)
  return(identical(intest, outtest))
}

sapply(seq_len(nrow(tests)), testfn)
# [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE

1 veya 2 satır veya sütun matrisiyle ne olur?
mnel

İyi nokta, ilk deneme 2 sütun testinde başarısız olur ve orta sırayı siler. Güncelleyeceğim.
Jonathan Carroll,

1
Programlama Bulmacaları ve Kod Golf'üne Hoş Geldiniz! Tüm başvuruların tam program veya fonksiyonlar olmasını istiyoruz. Bu durumda, attığınız kod sadece bir pasajdır, çünkü değişkenin avar olduğunu varsayar . Kurallarımıza uygun olmak için, onu function(a){a[-c(1,nrow(a)),-c(1,ncol(a))]=0;a}47 bayt gibi bir matris alan bir işlev haline getirebilirsiniz .
Alex A.

6

Mathematica 81 76 bayt

(d=Dimensions@m;q=MemberQ;m Boole@Array[{1,d[[1]]}~q~#||{1,d[[2]]}~q~#2&,d])&

Nasıl çalışır

Giriş dizisinin içinde saklandığını varsayın m. Boyutları m{4,5} `

(m={{67,4,-8,5,13}, {9,13,42,4,-7}, {1,1,3,-9,29}, {16,99,8,77,0}})//MatrixForm

m


Aşağıdaki dizideki her hücre a, hücre ilk ||satırda veya ( ) son satırda veya ilk veya son sütundaysa True olur ; Aksi takdirde yanlış.

(d=Dimensions@m;a=Array[MemberQ[{1,d[[1]]},#]||MemberQ[{1,d[[2]]},#2]&,d])&[m]//MatrixForm

doğru


İşlevin Boolediziye uygulanması, True değerini 1'e ve False değerini 0'a dönüştürür.

b = Boole[a]

boole


Matris çarpın mgöre b. Bu, m'deki her bir hücreyi b'deki karşılık gelen hücre ile çarpar.

m b

içi boş matris


Birkaç ||byte'ı kurtarmak için OR'unuz olarak kullanabilirsiniz ve ben de kaydedebileceğiniz birkaç byte'ı görebilirim!
bir Simmons

Bir Simmons, Öneri için teşekkürler.
DavidC

# -Unitize @ ArrayFilter [Det, Dizi [Norm @ * Listesi, Boyutlar @ #], 1] # &
njpipeorgan

@ njpipeorgan, göndermenizi öneririm. (Umarım nasıl çalıştığını da açıklar!)
DavidC

@DavidC Ben gönderdiniz cevabımı
njpipeorgan

6

GNU Sed, 31

  • 4 byte tasarruf için @manatwork teşekkürler.

Sürüm 4.2.2 veya daha önceki, bu taahhütten önce (tartışma) .

Puan -rseçeneği için +1 içerir .

Giriş satırları yeni satır ayrılmış. Her satırdaki öğeler tek satır ayrılmıştır.

1n
$n
:
s/ -?\w+ / : /
t
y/:/0/

açıklama

1n                   # 1st line: print unchanged, then load next line
$n                   # last line: print unchanged, then load next line (i.e. EOF and stop)
:                    # unnamed label
s/ -?\w+ / : /       # substitute a number in spaces with a `:` in spaces
t                    # If the above matched, jump back to the label and try again
y/:/0/;              # transliterate `:` to `0`

Çevrimiçi deneyin.


1
Ah, anladım, etrafta dolaşmanın bir "şık" yolu, ve teşekkürler!
andlrc,

1
Çok fazla parantez: 1n;$n;:;s/ -?\w+ / : /;t;y/:/0/.
Manatwork

1
Cevabınızı teklif bloğunda çalıştıran taahhüt hakkında bilgi
ekleyebilir misiniz

@ manatwork Teşekkürler - 4 bayt kurtardı!
Dijital Travma,

@Ferrybig Bu konuyla ilgili dev tartışmalara başka bir bağlantı eklendi .
Dijital Travma,

5

Oktav, 34 bayt

function h(M) M(2:end-1,2:end-1)=0

Girişin dizi satırlarını ayırmak için noktalı virgül gerektirdiğini unutmayın:

h([[3];[5];[12];[-6]])

Açıklama:

Octave (ve MATLAB) dizi indeksleri 1 tabanlıdır. Bir aralık belirtmeniz Array(1:end)size (bu örnekte tek boyutlu) dizinin tüm öğelerini verir. Array(2:end-1)size ilk ve son hariç tüm unsurları verecektir .

M(2:end-1,2:end-1)=0

0ilk veya son satırda veya sütunda olmayan tüm öğelere ayarlar :

>> A = [[-1,-2,-3];[1,2,3];[5,5,5]]
A =

  -1  -2  -3
   1   2   3
   5   5   5

>> h(A)
M =

  -1  -2  -3
   1   0   3
   5   5   5

Boyutlardan biri daha az olan ya da 2'ye eşit olduğu takdirde, aralık end-1olan daha az aralık, bu nedenle uç, 2'den(2:end-1) az başlangıçta daha azdır. Bu durumda, Octave aralığı yok sayar ve hiçbir şey yapmaz. Bu fordöngü için benzer :

for (int i=2; i < 2; i++) {...}

Durdurma koşulu ilk tekrarlamada geçerlidir, bu yüzden döngüden düşeriz.

>> A = [[6,7];[8,9];[10,11]]
A =

    6    7
    8    9
   10   11

>> h(A)
M =

    6    7
    8    9
   10   11

5

Jöle , 12 bayt

ZṖṖ1;¥€
¬ÇÇ×

Sanırım bu işe yarıyor, hala kafamı Jelly'in etrafına sarıyor. Çevrimiçi deneyin!

(-2 bayt için @Dennis sayesinde)

Girdi dizisini 1s ve 0s dizileriyle çarparak çalışır, her biri bir boyut daha küçüktür. Örneğin, [[67,4,-8,5,13],[9,13,42,4,-7],[1,1,3,-9,29],[16,99,8,77,0]]element-wise ile çarpıyoruz.

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

Tam açıklama

[Helper link - argument is a matrix]
Z           Zip
 ṖṖ         Pop last two elements, or [:-2]
   1;¥€     Append a 1 in front of every row

[Main link]
¬           Not, turning 0s to 1s and everything else to 0s. Even though some zeroes
            turn into 1s, it's fine because we multiply element-wise at the end,
            and 0*1 = 0
 ÇÇ         Perform helper link twice
   ×        Multiply element-wise

5

ES6, 52 48 46 bayt

f=a=>a.map((b,i)=>i&&a[i+1]+.5?b.map?f(b):0:b)

Düzenleme: @ user81655 sayesinde 4 bayt kaydedildi. @ETHproductions sayesinde 2 bayt daha kaydedildi.


Zeki! İşte gbirkaç bayttan tasarruf etmeyen çok benzer bir yaklaşım :f=a=>a.map((b,i)=>i&&a[i+1]!=a.x?b.map?f(b):0:b)
user81655 10:16

İyi iş! 48 bayt sayıyorum (belki saymayı unuttun f=), ama bunu 46'ya f=a=>a.map((b,i)=>i&&a[i+1]+.5?b.map?f(b):0:b)
indirgeyebilirsin

1
@ETHproductions Evet, saymayı unuttum f=. Ayrıca işlerim biraz şaşırttı +.5ama diğer aramada bir dize ekleme yaptığı görüyorum.
Neil,


4

Mathematica, 55 bayt

#-Unitize@ArrayFilter[Det,Power~Array~Dimensions@#,1]#&

Test durumu

%[RandomInteger[9,{5,5}]]
(*
  {{8,8,3,6,5},
   {7,0,0,0,4},
   {2,0,0,0,7},
   {3,0,0,0,5},
   {8,6,1,0,8}}
*)

açıklama

Bu cevabın ana fikri DavidC'in cevabı ile aynıdır. (önce bir maske matrisi oluşturun ve sonra orijinal matrisle çarpın), ancak maske matrisinin yapısı farklıdır.

ArrayFilter[f,list,r]yarıçapı içindeki fher öğeyi eşler .listr

ArrayFilter[f,{1,2,3,4,5},1]
(* { f[{1,1,2}], f[{1,2,3}], f[{2,3,4}], f[{3,4,5}], f[{4,5,5}] } *)

Sınır öğelerinin, yetersiz komşuların bulunduğu yerlerde çoğaltıldığına dikkat edin. Ne zaman list2-boyutları olan bu özellik birlikte iyi çalışır Detdört sınırları üzerinde yinelenen sütun veya satır belirleyicilerini kaybolur beri, istenilen sonucu elde edilir.

ArrayFilter[Det,Power~Array~{4,4},1]
(*
  {{0, 0,  0,    0},
   {0, 12, 72,   0},
   {0, 48, 1152, 0},
   {0, 0,  0,    0}}
*)

burada Power~Array~{4,4}iç pozisyonlar garanti belirleyici olmayan sıfır olmasını. Ve

1-Unitize@%
(*
  {{1,1,1,1},
   {1,0,0,1},
   {1,0,0,1},
   {1,1,1,1}}
*)

maske matrisini verir.


4

Python, 50 bayt

def f(a):
 for l in a[1:-1]:l[1:-1]=[0]*(len(l)-2)

Bir liste listesini kabul eder ve yerinde değiştirir. Python'un dilim sözdizimi bu görev için uygun değil.

Bir listeyi negatif bir sayı ile çarpmanın, yukarıdaki kodun küçük girdilerde çalışmasına izin veren boş bir listeyle sonuçlandığını öğrendim.


4

Julia, 50 35 bayt

A->A[2:size(A,1)-1,2:size(A,2)-1]=0

Bu, bir diziyi kabul eden ve yerinde değiştiren anonim bir işlevdir. Aramak için değişkene atayın.

Buradaki yaklaşım oldukça basittir: için n ile m , giriş dizi A , atar bir ij = 0 tüm i = 2, ..., n, 1 ve j = 2, ..., m -1 aralıkları oluşturarak Endekslerin Aralıklar boş olabilir, örneğin n veya m = 1, bu durumda değiştirme yapılmaz.

Çevrimiçi deneyin

Dennis sayesinde 15 bayt kurtarıldı!


4

C, 62 bayt

y;f(a,b,c)int **a;{for(b--;b-->1;)for(y=1;y<c-1;)a[b][y++]=0;}

Dizinin uzunluğunu / genişliğini parametre olarak almak sorun değil. Memset / bzero ile biraz oynadım ama çarparaksizeof(int) kod boyutunu büyük ölçüde artırarak .

EDIT: 55 byte, kuralları daha fazla bükebilir ve dizilimimizi karakter olarak saklayabilirsek, girdi her biri yalnızca bir rakamdır.

x;
#define f(a,b,c) for(x=1;x<b-1;)bzero(a[x++]+1,c-2);

EDIT: Bahşiş için teşekkürler Washington Guedes!


Kelimenin tam anlamıyla çarpmayı denediniz sizeof(int)mi? Bunun 4yerine kullanabilirsiniz ...
anatolyg

sizeof(int) != 4makinemde: P
Josh

Bahse girerim hala kullanabileceğin tek haneli bir rakam.
anatolyg

Bu noktada, sadece tek basamaklı sayılar kullandığından, bunun sadece inç yerine karakter dizisi olduğuna karar verebileceğimi kastetmiştim. Sadece kuralları ne kadar bükmek istediğimize bağlı.
Josh,

Teşekkürler! Şimdi ben de uzaktaki -->operatörü kullanabiliyorum ;)
Josh

3

Perl 6 , 28 bayt

{.[1..*-2]»[1..*-2] »=»0}

Bu, girişi yerinde değiştirir

kullanım

my @test-cases = (
  [[3],] => [[3],],
  [[7,2,8],] => [[7,2,8],],
  [[3],[5],[12],[-6]] => [[3],[5],[12],[-6]],
  [[99,98,97],[88,87,86]] => [[99,98,97],[88,87,86]],
  [[6,7],[8,9],[10,11]] => [[6,7],[8,9],[10,11]],
  [[ -1,-2,-3],[1,2,3],[5,5,5]] => [[ -1,-2,-3],[1,0,3],[5,5,5]],
  [[67,4,-8,5,13],[9,13,42,4,-7],[1,1,3,-9,29],[16,99,8,77,0]] => [[67,4,-8,5,13],[9,0,0,0,-7],[1,0,0,0,29],[16,99,8,77,0]],
  [[0,1,0,1,0],[1,0,1,0,1],[0,1,0,1,0],[1,0,1,0,1],[0,1,0,1,0]] => [[0,1,0,1,0],[1,0,0,0,1],[0,0,0,0,0],[1,0,0,0,1],[0,1,0,1,0]],
);

use Test;
plan +@test-cases;

for @test-cases {
  my $k = .key;
  {.[1..*-2]»[1..*-2] »=»0}( $k ); # <==
  ok $k eqv .value
}
1..8
ok 1 - 
ok 2 - 
ok 3 - 
ok 4 - 
ok 5 - 
ok 6 - 
ok 7 - 
ok 8 - 

{.[1..*-2]»[1..*-2]X=0}2 bayt kaydeder
raiph

@raiph, son iki davada işe yaramaz gibi görünmüyor
Brad Gilbert b2gills

3

JavaScript ES6, 69 66 57 bayt

Y=>Y.map((X,y)=>X.map((N,x)=>x*y&&X[x+1]+.5&&Y[y+1]?0:N))

Nasıl çalışır

Bu çözüm , girdideki her y-endeksi yve x-endeksi boyunca harita çizer ve xbu iki endekse dayanarak atıp atmamaya karar verir. Saklamamız gereken dört durum var:

  • x 0
  • y 0
  • x eksi 1 iç dizinin uzunluğuna eşittir
  • y eksi 1'in dış dizisinin uzunluğuna eşittir

Biz biraz çarpma ile ilk iki bakabilirim: x*ydöner 0ya iff xveya y0, ve pozitif bir tamsayı aksi. Şimdi üçüncü için: kontrol edebilir miyiz X.length>x+1, ama bu çok fazla bayt alır. Bunu yapmanın başka bir yolu, ilerideki öğenin sahte olup olmadığını kontrol etmek, yani undefinedolmayan bir öğeye erişmeye çalışırken ne elde edeceğinizdir. Ancak, bir sonraki öğe ise bu da eşleşir, bu 0yüzden olmadığından emin olmak için 0.5 ekleriz:

1 + 0.5 = 1.5 (truthy)
0 + 0.5 = 0.5 (truthy)
-1 + 0.5 = -0.5 (truthy)
undefined + 0.5 = NaN (falsy)

Son olarak, dördüncü nokta: dış dizi sadece içeride diziler içerdiğinden ve herhangi bir dizi gerçeği olduğundan, sadece kontrol edebiliriz Y[y+1]. Şimdi , yukarıdakilerin tümü gerçeğe dönüşmüşse ?0:Nbunu dönüştürürüz 0; Naksi takdirde. Ve bu kadar!


3

Retina ,31 24 22

(?<=¶.+ )\S+(?= .*¶)
0

Randomra sayesinde 2 bayt kaydedildi

Çevrimiçi deneyin!

Muhtemelen bunu yapmanın daha iyi bir yolu var, çünkü bu oldukça basit bir çok satırlı değiştirme. Temel olarak her satırdan önce yeni bir satır, bazı karakter ve boşluk sayılan ve hemen ardından bir boşluk izleyen ve ardından yeni bir satır izleyen her sayıyı buluruz. Bu sayılar daha sonra hepsi ile değiştirilir 0.

Bu sütun dolgusunu korumaz, ancak bunun bir sorun olduğunu sanmıyorum.


3

Java 8, bir lambda işlevi olarak: 82 83 95 karakter / bayt

Lambda İmzası: int[][] -> (void)(yani Consumer<int[][]>)

(a)->{int[]v={1,1};while(++v[0]<a.length){while(++v[1]<a[0].length)a[v[0]-1][v[1]-1]=0;v[1]=1}}

EDIT Bir hata yaptı, [x, y] 'nin xth row ve yth col olduğunu düşündüm. Açıkçası bu bir [x] [y] olmalı!

EDIT Kodu test etmeyi unuttum ve her döngü içinde +12 bayt olan sütunu sıfıra ayarlamam gerekiyor. : /


3

Haskell, 59 58 bayt

k _[x]=[x]
k f(x:y)=x:(f<$>init y)++[last y]
f=k(k(\_->0))

Expanded

onInner :: (a -> a) -> [a] -> [a]
onInner _ [x]    = [x]
onInner f (x:xs) = x : map f (init xs) ++ [last xs]

hollowOut :: [[Int]] -> [[Int]]
hollowOut = 
   onInner       -- leave first and last line alone 
     (onInner    -- leave first and last entry per line 
       (const 0) -- replace entries by 0
     )

Sen çevirmek gerekir ++[last y]içine :(last y)veya:last y
HEGX64

@ HEGX64: Hayır, yanlış tip. x : map f (…)Zaten türden [a]ve last ytürden aise (:) :: a -> [a] -> [a]. Haskell'deki bir listenin sonuna bir eleman eklemek, bu listeler tek bağlantılı ileri listelerdir.
Zeta

Opps. Göndermeden önce kendim
denemem

1
Sen açabilirsiniz kdiyelim, bir infix operatör içine #ve bir bayt kaydetmek için argümanlar çevirmek: [x]#_=..., (x:y)#f=..., f=(#(# \_->0))ve size ana işlevi, yani adını bırakabilirsiniz f=başka bir iki bayt için.
nimi

2

Pyth, 18 bayt

Qjbm:dSttld0P.Qe.Q

açıklama

                   - autoassign Q=eval(input())
                   - autoassign .Q = map(eval, rest_of_input)
Q                  - imp_print(Q)
   m        P.Q    -  [V for d in .Q[:-1]]
      Sttld        -     range(1, len(d)-2+1)
    :d     0       -    assign_indexes(d, ^, 0)
 jb                - "\n".join(^)
               e.Q - imp_print(.Q[-1])

Giriş dizileri newlines ile ayrılır

Burada dene


2

Groovy, 70 bayt

Bu çok yaratıcı değil, ama kısa!

g={a->for(i=1;i<a.size()-1;i++)for(j=1;j<a[i].size()-1;)a[i][j++]=0;a}

açıklama

Bir argümanla kapanma

g={a-> 

İlk ve son elemanları atlayarak iç diziyi tekrar eder.

for(i=1;i<a.size()-1;i++)

İç dizideki orta nesneler üzerinde yineleyin

for(j=1;j<a[i].size()-1;)

Öğeleri ayarlamak 0ve geri dönmeka

a[i][j++]=0;a}

Testler

assert g([[3]]) == [[3]]
assert g([[7, 2, 8]]) == [[7, 2, 8]]
assert g([[3], [5], [12], [-6]]) == [[3], [5], [12], [-6]]
assert g([[99, 98, 97], [88, 87, 86]]) == [[99, 98, 97], [88, 87, 86]]
assert g([[6, 7], [8, 9], [10, 11]]) == [[6, 7], [8, 9], [10, 11]]
assert g([[-1, -2, -3], [1, 2, 3], [5, 5, 5]]) == [[-1, -2, -3], [1, 0, 3], [5, 5, 5]]
assert g([[67, 4, -8, 5, 13], [9, 13, 42, 4, -7], [1, 1, 3, -9, 29], [16, 99, 8, 77, 0]]) == [[67, 4, -8, 5, 13], [9, 0, 0, 0, -7], [1, 0, 0, 0, 29], [16, 99, 8, 77, 0]]
assert g([[0, 1, 0, 1, 0], [1, 0, 1, 0, 1], [0, 1, 0, 1, 0], [1, 0, 1, 0, 1], [0, 1, 0, 1, 0]]) == [[0, 1, 0, 1, 0], [1, 0, 0, 0, 1], [0, 0, 0, 0, 0], [1, 0, 0, 0, 1], [0, 1, 0, 1, 0]]

2

R, 71 64 57 Bayt

function(m){if(all((y<-dim(m)-1)>1))m[2:y[1],2:y[2]]=0;m}

düzenlemek -7 açıkça <2-satır veya <2-kolon matrisleri açıkça ele alınarak bayt EDIT2 boyutu kontrol ederken matris boyutları atayarak -7 bayt


1

C ++ 80 79 bayt

Diziyi int**verilen boyutlarda olduğu gibi bekler nve k:

void p(int**c,int n,int k){for(int j,i=1;1+i<n;++i)for(j=1;j+1<k;)c[i][j++]=0;}

Sahip olan size()ve value_type & operator[](int)(98 bayt) herhangi bir tür için çalışan bir alternatif :

template<class C>void p(C&c){for(int j,i=1;1+i<c.size();++i)for(j=1;j+1<c[i].size();)c[i][j++]=0;}

Genişletilmiş sürüm

template <class Container>
void hollowOut(Container & ctn){
    const auto size = ctn.size();

    for(typename Container::size_type i = 1; i + 1 < size; ++i) {
        const auto inner_size = ctn[i].size();

        for(decltype(inner_size) j = 1; j + 1 < inner_size; ++j) {
            ctn[i][j] = 0;
        }
    }
}

Girişe matris boyutları eklemek gibi görünüyor, standart
boşlukdur

1

PHP, 82 81 80 71 bayt

function(&$z){for(;$z[++$i+1];)for(;0 .$z[0][++$$i+1];)$z[$i][$$i]=0;};

Bu şekilde koş:

php -r '$f = function(&$z){for(;$z[++$i+1];)for(;0 .$z[0][++$$i+1];)$z[$i][$$i]=0;};   $z=[[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]]; $f($z); print_r($z);'
  • Sabit boyutlu satırlar varsayılarak bir bayt kaydedildi (manatwork için thx)
  • İsimsiz bir işlev yaparak bir bayt kaydedildi
  • Kod dizisi countiçin çok uzun bir ad olan aramaları engelleyerek, sonraki dizi öğesinin doğruluğunu kullanarak 7 bayt kurtarıldı

Bir matris işlenirken, tüm alt diziler aynı uzunlukta olmalıdır. Yani iç kısımda forher zaman count($z[0])-11 karaktere kadar yineleme yapmak güvenlidir .
Manatwork

1

APL, 17 bayt 15 bayt

{⍵×(⌽∨⊖)1∊¨⍳⍴⍵}

Nasıl çalışır

  • ⍳⍴⍵ Tüm hücrelerin, argümanın tüm hücrelerinin koordinatlarını içerdiği bir 2D dizi oluşturur.
  • 1∊¨Bu hücrelerin her birinde 1 olup olmadığını arar ve eğer varsa 1, aksi halde 0 döndürür. Bu, ilk satırın ve ilk sütunun 1s ve geri kalanının 0 olduğu bir matris oluşturur.
  • (⌽∨⊖) biri matrisin mantıksal "veya" iki versiyonu ile birleşir, biri ilk diğeri ters, diğeri son eksen boyunca terstir.
  • ⍵× standart çarpımdır.

(⊣∨⊖∘⌽) yerine (⊖∨⌽), iki byte az kullanabilirsiniz
Moris Zucca

Parlak! Bunu yapmama izin ver!
lstefano

0

Perl, 34 + 2 = 36 bayt

next if$.==1||eof;s/ .+?(?= )/ 0/g

Gerektirir -pBayrağı :

$ perl -pE'next if$.==1||eof;s/ .+?(?= )/ 0/g' <<< $'1 2 3\n4 5 6\n7 8 9'
1 2 3
4 0 6
7 8 9

Nasıl çalışır:

# '-p' Read each line into `$_` and auto prints
next if$.==1||eof; # `$.` is set to to the current line in file (1, 2, ..., n)
                   # and `eof` is true if its the last line
s/ .+?(?= )/ 0/g

0

Lua, 69 bayt

function f(a)for i=2,#a-1 do
for o=2,#a[i]-1 do
a[i][o]=0
end
end end

Sadece dos yerine kaşlı ayraçlar olsaydı ve biterse ...


0

SmileBASIC, 69 51 bayt

DEF H A,W,H
FOR I=1TO H-2FILL A,0,W*I+1,W-2NEXT
END

Bir dizideki 2B alanın doldurulması genellikle bir döngüde FILL kullanılmasını gerektirir. Ancak grafik sayfasında 2D verilerle çalışmak çok daha kolaydır, bu yüzden ilk önce dizi oraya kopyalanır.

Aww Grafik komutları kullanarak çok zeki olduğumu düşündüm ... ama ortaya FILL birkaç kez daha kısa oluyor.

Neyse, fonksiyon girişleri dizi ve genişlik / yüksekliktir (Smilebasic'te standarttır çünkü bir dizinin boyutlarını kontrol etmenin bir yolu yoktur.)


0

APL (Dyalog Klasik) , 12 bayt

⊢-(⍉01↓⌽)⍣4

Çevrimiçi deneyin!

⍉⌽⍵ normalde rotasyondur (yatay olarak ters çevirir ve transpoze edilir)

burada 0⍪1↓⍵ilk sırayı sıfırlarla (bir sıra bırakıp sonra 0'ı birleştirmek) tek bir trende değiştiren ile birleştiriyoruz:⍉0⍪1↓⌽

⍣4 4 kez tekrarlar

⊢- orijinal matristen çıkarır

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.