アレイをくり抜く


35

タスク

この課題は非常に簡単です。入力は、少なくとも1×1のサイズの整数の長方形の2D配列です。任意の合理的な形式で取得できます。出力は入力配列になりますが、最初または最後の行または列にないすべてのエントリに設定され0ます。入力と同じ形式である必要があります。

たとえば、入力配列が

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

ルールとスコアリング

完全なプログラムまたは関数を書くことができ、関数は入力を返す代わりにその場で修正することができます。最小のバイトカウントが優先され、標準の抜け穴は許可されません。

テストケース

これらは、コピーアンドペーストを容易にするためにネストされたリストとしてフォーマットされます。

[[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]]

リーダーボード

これは、通常のリーダーボードと言語ごとの勝者の概要の両方を生成するスタックスニペットです。回答が表示されるようにするには、次のマークダウンテンプレートを使用して、見出しから回答を開始してください。

## Language Name, N bytes

複数の数値を含める場合(たとえば、スコアを改善した場合や、インタープリターフラグを個別にリストする場合)、実際のスコアがヘッダーの最後の数値であることを確認してください。

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

言語名をリンクにして、リーダーボードスニペットに表示することもできます。

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

回答:


13

MATL、9バイト

0HJ_ht4$(

入力は次の形式です

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

編集(2016年6月12日):言語の変更に対応するため、以下のリンクがに_置き換えられましたq

オンラインでお試しください

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
いいね!MATLが実行されることはわかっていました。:D
ビーカー

12

完全な名前の関数としてのJava 7: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;}

Java 8でこれをラムダにして数バイト削除することもできますが、実際にはそうしません。


を使用してスペースを節約できますArrays.fill(a[i],1,a[i].length-1,0);か?37バイトではなく36バイトです。=)
corsiKa

@corsiKaいいでしょうが、インポートするか完全に修飾する必要があります:/
Geobits

好奇心から、なぜ両方のループが異なるのですか?どうしてfor(int i=0,j;++i<a.length-1;)for(j=0;++j<a[i].length-1;)a[i][j]=0;?バイトを節約しませんが、両方のループが同じ場合の方が一貫性があります。:)
ケビンクルーッセン16

12

ゼリー、18 17 15 9バイト

0W&ṖZ
ÇÇ^

オンラインでお試しください!または、すべてのテストケースを確認します

バックグラウンド

このアプローチは、@ Sp3000のJellyの回答、特に異なる長さのリスト間のベクトル化された操作を利用するという彼のアイデアに基づいています。

まず、0のビット単位のANDと入力の最初の行のすべての整数を取得します。自動ベクトル化により、[0]のビット単位のANDと最後の行のない入力を取得することでこれを実現できます。0は最初の行とペアになり、ゼロの行になります。残りの行には[0]に対応する行がないため、そのまま残ります。

次に、結果を転置し、上記の変換を再度適用し(最後の列を効果的に削除し、最初の列をゼロに戻します)、再度転置します。

入力用

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

これは

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

次に、この結果と元の行列のビット単位のXORを取ります。整数をそれ自体とXORすると、0になります。整数を0とXORする(またはまったくXORしない)と、同じ整数が得られます。これにより、マトリックスがくり抜かれます。

使い方

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バイト

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

2
印象的。さて、説明していただけますか?内側のセルをゼロに再割り当てしているように見え、-2sは2番目に最後の列または行を示します。
DavidC

なんて簡単なことでしょう!
njpipeorgan

7

R33 48バイト

私はRがゴルフ用に作られていないことを知っています。しかし、それは位置のインデックス付けのために作られています...例をロードします。

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

エッジの行または列にない任意の位置の値を0に置き換えます。

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

2列のテストも確認します。

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

後世:以前の試み

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

すべての例をテストする:

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行または2行の行列で何が起こりますか?
mnel

良い点です。最初の試行で2列のテストに失敗し、中央の行が削除されます。更新します。
ジョナサンキャロル

1
プログラミングパズルとコードゴルフへようこそ!すべての提出物は、完全なプログラムまたは機能である必要があります。この場合、スコア付きコードは単なるスニペットaです。変数が存在すると想定しているためです。ルールに準拠するために、function(a){a[-c(1,nrow(a)),-c(1,ncol(a))]=0;a}47バイトなどのマトリックスを取る関数にすることができます。
アレックスA.

6

Mathematica 81 76バイト

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

使い方

入力配列がに格納されていると仮定しmます。の寸法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セルが最初の||行または()の最後の行または最初または最後の列のいずれかにある場合、Trueです。それ以外の場合はFalseです。

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

true


関数Booleを配列に適用すると、Trueが1に、Falseが0に変換されます。

b = Boole[a]

boole


行列を乗算mすることによってb。これにより、mの各セルにbの対応するセルが乗算されます。

m b

hollow matrix


||ORとして数バイトを節約するために使用できます。また、他のいくつかのバイトも保存できます。
シモンズ

シモンズ、提案をありがとう。
DavidC

#-Unitize @ ArrayFilter [Det、Array [Norm @ * List、Dimensions @#]、1]#&
njpipeorgan

@njpipeorgan、提出することをお勧めします。(そして、うまくいけばそれがどのように機能するかを説明してください!)
DavidC


6

GNU Sed、31

  • 4バイトを節約してくれた@manatworkに感謝します。

このコミット (議論)の前のバージョン4.2.2以前。

スコアには-rオプションの+1が含まれます。

入力行は改行で区切られます。各行の要素は単一行で区切られています。

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

説明

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`

オンラインでお試しください。


1
なるほど、先読みを回避するための「派手な」方法です。ありがとう!
andlrc

1
中括弧が多すぎます:1n;$n;:;s/ -?\w+ / : /;t;y/:/0/
manatwork

1
引用ブロックに回答を機能させるコミットに関する情報を含めることができます。サイトは非常に遅く、完全にロードするのに1分かかります
-Ferrybig

@manatworkありがとう-4バイト節約しました!
デジタル外傷

@Ferrybig このトピックに関する開発者ディスカッションへのリンクを追加しました。
デジタル外傷

5

オクターブ、34バイト

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

入力では、配列行を区切るためにセミコロンが必要であることに注意してください。

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

説明:

Octave(およびMATLAB)配列インデックスは1ベースです。の範囲を指定するArray(1:end)と、(この例では1次元の)配列のすべての要素が得られます。最初と最後を除くArray(2:end-1)すべての要素提供します。

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

0最初または最後の行または列にないすべての要素に設定します。

>> 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

ディメンションの1つが2 以下の場合、範囲end-1は2 未満であるため、範囲の終わりは(2:end-1)始まりより小さくなります。この場合、Octaveは範囲を無視し、何もしません。これはforループに類似しています:

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

停止条件は最初の反復で真であるため、ループから抜け出します。

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

    6    7
    8    9
   10   11

>> h(A)
M =

    6    7
    8    9
   10   11

5

ゼリー、12 バイト

ZṖṖ1;¥€
¬ÇÇ×

私はこれがうまくいくと思うが、それでも私の頭をゼリーに巻きつけている。オンラインでお試しください!

(-2バイトの@Dennisに感謝)

入力配列に、各方向に1次元小さい1と0の配列を掛けることで機能します。たとえば、[[67,4,-8,5,13],[9,13,42,4,-7],[1,1,3,-9,29],[16,99,8,77,0]]要素ごとに

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

完全な説明

[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バイト

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

編集:@ user81655のおかげで4バイトを保存しました。@ETHproductionsのおかげでさらに2バイト節約されました。


賢い!以下は、非常によく似たアプローチgで、数バイトを節約できますf=a=>a.map((b,i)=>i&&a[i+1]!=a.x?b.map?f(b):0:b)
。– user81655

良くやった!私は48バイトを数えます(おそらく、数えるのを忘れたかもしれませんf=)が、46までf=a=>a.map((b,i)=>i&&a[i+1]+.5?b.map?f(b):0:b)
減らす

1
@ETHproductionsはい、カウントするのを忘れましたf=。また、私は+.5作品に少し驚いていますが、他の呼び出しで文字列の追加を行うことがわかります。
ニール

4

Javascript、62 59 56バイト

s=>s.replace(/(^.*|\n\s*\S+)|\S+(?= .*\n)/g,(a,b)=>b||0)

このアプローチでは、引数として文字列が必要です。ここで正規表現の動作を確認できます:https : //regex101.com/r/kC6xA8/3


4

Mathematica、55バイト

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

テストケース

%[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}}
*)

説明

この答えの主な考え方は、DavidCの答えと同じです(最初にマスクマトリックスを構築し、次にそれを元のマトリックスに乗算します)が、マスクマトリックスの構築は異なります。

ArrayFilter[f,list,r]の半径内のfすべての要素にマッピングします。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}] } *)

隣接要素が不十分な場合、境界要素が複製されることに注意してください。場合list2次元であり、この機能は一緒にうまく機能しDet4つの境界に重複列または行が決定基を消失するので、所望の結果を与えます。

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

ここでPower~Array~{4,4}、内部位置の行列式がゼロ以外になることが保証されます。そして

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

マスク行列を与えます。


4

Python、50バイト

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

リストのリストを受け入れ、所定の位置に変更します。Pythonのスライス構文は、このタスクには不便ではありません。

リストに負の数を掛けると、空のリストになり、上記のコードが小さな入力で機能することを学びました。


4

ジュリア、50 35バイト

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

これは、配列を受け入れ、その配列を変更する匿名関数です。呼び出すには、変数に割り当てます。

ここでのアプローチは非常に簡単です:用のnによってm個の入力配列A、我々はアサインA IJ = 0すべてのためのI = 2、...、nは -1とJ = 2、...、M -1の範囲を構築することにより、インデックスの。範囲は、nまたは mの = 1のません。この場合、置換は行われません。

オンラインで試す

デニスのおかげで15バイト節約できました!


4

C、62バイト

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

パラメータとして配列の長さ/幅を受け入れても問題ないことを願っています。memset / bzeroで少し遊んでみましたが、sizeof(int)コードサイズが大幅に増加しました。

編集:入力がそれぞれ1桁のみであるため、ルールをさらに曲げて配列を文字として保存できる場合は55バイト。

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

編集:ヒントをワシントン・ゲデスに感謝します!


あなたは文字通り乗算しようとしましたsizeof(int)か?4代わりに使用できます
...-アナトリグ

sizeof(int) != 4私のマシンで:P
ジョシュ

私はそれがまだあなたが使用できる1桁の数字だと思う。
アナトリグ

問題は1桁の数字しか使用しないため、intではなくcharの配列であると判断できるということです。ルールをどれだけ曲げたいかによって異なります。
ジョシュ

ありがとう!今、私もaloofを使用します-->演算子 ;)
ジョシュ

3

Perl 6、28バイト

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

これにより、入力がその場で変更されます

使用法

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バイト節約
レイフ

それは最後の2例のための仕事には表示されません@raiph
ブラッド・ギルバートはb2gills

3

JavaScriptのES6、69の 66 57バイト

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

使い方

このソリューションは、入力内の各yインデックスyとx インデックスをマッピングしx、これら2つのインデックスに基づいてそれを破棄するかどうかを決定します。保持する必要がある4つのケースがあります。

  • x 0
  • y 0
  • x 内部配列の長さから1を引いたものに等しい
  • y 外側の配列の長さから1を引いたものに等しい

最初の2つは、少しの乗算で処理できます。0であるか、0である場合にx*y戻り、それ以外の場合は正の整数を返します。3番目の場合:をチェックできますが、これには多くのバイトが必要です。これを行う別の方法は、前のアイテムが偽物であるかどうかを確認することです。つまり、存在しないアイテムにアクセスしようとすると取得されます。ただし、次の項目がの場合も一致するため、0.5を追加して、それが発生しないようにします。0xyX.length>x+1undefined0

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

最後に、4番目のポイント:外側の配列には内側の配列しかなく、どの配列も真実であるため、単にチェックできY[y+1]ます。ここで?0:N0上記のすべてが真実であることが判明した場合に変換します。Nさもないと。以上です!


3

網膜31 24 22

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

randomraのおかげで2バイト節約

オンラインでお試しください!

これはかなり基本的な複数行の置換に過ぎないため、おそらくより良い方法があります。基本的に、改行、いくつかの文字数、スペースが先行し、すぐにスペースが続き、最終的に改行が続く各番号を見つけます。これらの番号はすべてに置き換えられ0ます。

これは列のパディングを保持しませんが、それは問題ではないと思います。


3

Java 8、ラムダ関数として:82 83 95文字/バイト

ラムダ署名:(int[][] -> (void)つまり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}}

編集間違えて、a [x、y]がx番目の行でy番目の列だと思いました。明らかにそれはa [x] [y]であるべきです!

編集コードをテストするのを忘れて、ループ内で毎回+12バイトの列をゼロに戻す必要があります。:/


3

ハスケル、 59 58バイト

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

拡大

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
     )

あなたはターンすることができるはず++[last y]:(last y):last y
HEGX64

@ HEGX64:いいえ、間違ったタイプです。x : map f (…)はすでにタイプ[a]であり、タイプをlast y持ってa(:) :: a -> [a] -> [a]ますが、Haskellのようなリストの最後に要素を追加するのは、これらのリストが単一リンクの前方リストであるためです。
ゼータ

おっと。投稿する前に自分で試してみるべきだとわかっていました:)
HEGX64

1
あなたはk中置演算子に変えることができます、そして、#1バイトを保存するために引数を言って反転させましょう:、そして、あなたはあなたのメイン関数の名前を落とすことができます。[x]#_=...(x:y)#f=...f=(#(# \_->0))f=
-nimi

2

Pyth、18バイト

Qjbm:dSttld0P.Qe.Q

説明

                   - 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])

入力配列は改行で区切られます

ここで試してみてください


2

Groovy、70バイト

これはあまり創造的ではありませんが、短いです!

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

説明

1つの引数を持つクロージャー

g={a-> 

最初の要素と最後の要素をスキップして、内部配列を反復処理します

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

内部配列の中央の項目を反復処理します

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

要素を設定し0て返すa

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

テスト

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バイト

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

編集 -7明示<2行又は<2列の行列を明示的に対処することによってバイト EDIT2サイズを確認しながら行列の次元を割り当てることによって-7バイト


1

C ++、 80 79バイト

int**与えられたサイズnと同様に配列を期待し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;}

size()およびvalue_type & operator[](int)(98バイト)を持つすべてのタイプで機能する代替手段:

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;}

拡張版

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;
        }
    }
}

入力に行列の次元を追加することは標準的な抜け穴である
16

1

PHP、82 81 80 71バイト

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

次のように実行します:

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);'
  • 一定サイズの行(thx to manatwork)を想定してバイトを保存しました
  • 匿名関数にしてバイトを保存しました
  • 次の配列項目の真実性を使用して7バイトを節約しcount、の呼び出しを防ぎました。これはcodegolfにとっては長すぎる名前です

行列を処理するとき、すべてのサブ配列は同じ長さでなければなりません。そのため、内部でforは常にcount($z[0])-11文字までスペアを反復しても安全です。
マナトワーク

1

APL、17バイト 15バイト

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

使い方

  • ⍳⍴⍵ すべてのセルに引数のすべてのセルの座標が含まれる2D配列を生成します。
  • 1∊¨1があればそのような各セルを検索し、そうであれば1を返し、そうでなければ0を返します。これにより、最初の行と最初の列が1で残りのすべてが0であるマトリックスが作成されます。
  • (⌽∨⊖) 論理の「または」マトリックスの2つのバージョンと結合します。1つは最初の軸に沿って反転し、もう1つは最後の軸に沿って反転します。
  • ⍵× は標準の乗算です。

(⊣∨⊖∘⌽)を(⊖∨⌽)に置き換えることができます。2バイト少なくなります
Moris Zucca

ブリリアント!それをさせてください!
lstefano

0

Perl、34 + 2 = 36バイト

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

-pフラグが必要です:

$ 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

使い方:

# '-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バイト

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

私がdosとendsの代わりに中括弧を持っていた場合...


0

SmileBASIC、69 51バイト

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

通常、配列の2Dエリアを塗りつぶすには、ループでFILLを使用する必要があります。しかし、グラフィックスページで2Dデータを扱う方がはるかに簡単なので、最初に配列をそこにコピーします。

ああ、私はグラフィックコマンドを使うのがとても賢いと思った...しかし、FILLを何回も呼び出すのは実際には短いことが判明した。

とにかく、関数入力は配列と幅/高さです(配列の次元をチェックする方法がないため、これはSmilebasicの標準です)。


0

APL(Dyalog Classic)、12バイト

⊢-(⍉01↓⌽)⍣4

オンラインでお試しください!

⍉⌽⍵ 通常は回転(水平方向に反転して転置)

ここで0⍪1↓⍵、最初の行をゼロに置き換えて(1行削除してから、先頭に0を連結して)単一のトレインに結合します。⍉0⍪1↓⌽

⍣4 4回繰り返す

⊢- 元の行列から減算します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.