汚染された広場


17

前書き

数字のみで構成される次の正方形を観察してみましょう0 - 9

1034
4167
8414
3542

この正方形の外側のシェルは次のとおりです。

1034
4  7
8  4
3542

ゼロが含まれているため、外側のシェルを剥がす必要があります:

16
41

この正方形の外側のシェルは次のとおりです。

16
41

ゼロ含まれていないため、汚染されていない正方形です。したがって、基本的に、汚染されていない正方形の定義は、正方形の外殻にゼロが含まれていない場合です。

タスク

任意の妥当な形式で(負でない整数のみを含む)数字の2乗が与えられた場合、任意の妥当な形式で外側のシェルを絶えず剥がして、汚染されていない最大の2乗を出力します。

テストケース

テストケース1:

Input         Output

1234          1234
2345          2345
3456          3456
4567          4567

テストケース2:

Input         Output

123           123
204           204
346           346

テストケース3:

Input         Output

101           1
010           
101           

テストケース4:

Input         Output

000           (none)
000
000

これはであるため、バイト数が最小の提出が勝ちです!


416\n841\n354\n(左下隅)を作成できませんか?
リーキー修道女

さて、あなたは「言った最大の非汚染広場
漏れ修道女

エラーは許されますか?
リーキー修道女

@KennyLau最後のテストケースでですか?はい、それが出力しない0か、そのようなものである限り。
アドナン

2
「数字の2乗」は「数字の2乗」としてより適切に表される
Mego

回答:


6

ゼリー19 16 バイト

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

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

使い方

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

@Patrick Robertsのおかげで8バイト節約されました!

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

s入力として整数の2D配列が提供されると、整数の2D配列を返す関数を定義します。

使い方

  • function l:配列を指定するaと、最初と最後のインデックスなしでコピーを返します。

  • 機能p:2次元配列を指定はa、呼び出しl残りの各列呼び出し、次いで、最初と最後の行を削除するにはl拳と最後の列を削除します。これはタマネギの皮むきを行います。

  • function c:2D配列を指定するとa、の文字列化0形式のs のみを含む文字列を返しますa

  • function s:2D配列が与えられ、で与えられた配列の剥離された形式、および配列自体をa呼び出します。これらの文字列を辞書式に比較して、剥離したフォームのsが元のフォームよりも少ないかどうかを判断します。もしそうなら、オリジナルは汚染されているので、皮をむいた形で再帰的に呼び出します。それ以外の場合は、元を返します。cp0s


2
in a.lengthend引数から削除して、8バイトを節約できます。負のインデックスにすることができます。array.slicelend
パトリックロバーツ

7

網膜60 57バイト

バイトカウントはISO 8859-1エンコーディングを前提としています。後続の改行は重要です。

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

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

説明

後続の改行のため、これは正規表現のすべての一致を検索`し、入力から削除します。先行するため、+これは出力の変更が停止するまで繰り返し行われます(正規表現のマッチングが停止するためです)。

正規表現自体については、次の2つの部分で構成されています。

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

この部分0は、外部シェルのどこかにあるかどうかをチェックします。これは、正規表現エンジンの「カーソル」を後読みで文字列の先頭に移動することで行います([^_]数字と改行の両方を一致させるために使用します)。

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

そして、その位置から先読みを使用0して、最初の行、改行に隣接する行、または最後の行のいずれかを見つけます。

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

実際の一致は、最初の行(末尾の改行を含む)、最後の行(先頭の改行を含む)、または行\bの最初/最後として単語境界を悪用する行の最初または最後の文字のいずれかで構成されますアンカー:

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

6

MATL26 21バイト

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

入力は次の形式です

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

したがって、他の4つのテストケースは

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

プログラムは最後のテストケースでエラーになりますが、正しい出力を生成します(これは何もありません)。気づいてくれた@Dennisに感謝します!

オンラインでお試しください!。または、すべてのテストケースを検証します(これにはラッピングコードが含まれます)。

説明

これは、入力行列の列数と同じ回数だけ繰り返されますが、これは十分以上です。各反復で、シェルはその値に応じて削除または保持されます。

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

.W}\0.-`H`JutCPG2HJ

テストスイート

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

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

各行を改行で区切った文字列形式の入力を受け取ります(ただし、先頭または末尾の改行はありません)。説明:/^.*0|0\n|\n0|0.*$/汚染された正方形に一致する正規表現ですが、保持する/^.*\n?|.(.*).|\n.*$/必要がある部分を除き、削除する必要がある正方形の部分に一致します(.*)。(これは、改行文字を前方または後方から見るよりも短くなります。)


4

Perl 5、63 + 3 = 66バイト

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

-0フラグが必要です。入力に末尾の改行文字を含めることはできません


3

パイク、29バイト

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

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

また29バイト

QeQhQmhQme]4sBI
/)QtOmtmO=Qr;

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


2
両方のリンクでエラーが発生します。「実行」を押す前に何かする必要がありますか?
ルイスメンドー

実行したときに常にエラーが発生することをおそらく述べたはずです。出力は2番目の行のどこかにあります(実際に出力され、エラーメッセージの一部ではありません)
ブルー

2

Pyth31 30バイト

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

テストスイート。(最後のテストケースエラー)

改善:一部を外部ループ抽出機能にした(L+hbeb)。

以前の31バイトバージョン:

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

使い方:

コードは基本的には次のとおりです。アウターシェルの積はゼロですが、それをはがします。

メインコードを分析してみましょう(ここではQは暗黙的です)。

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

Q(入力)、while最初のラムダから開始し、2番目のラムダを実行します。

最初の部分は、次のラムダになりHます。

!*F+1iRTs++hHm+hdedHeH

2番目の部分は、次のラムダになりZます。

PtmPtdZ

最初の部分

!*F+1iRTs++hHm+hdedHeH

これを分析しましょう:

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はプレフィックス表記を使用するため、これは評価されます。

!*F+1iRT

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

第二部

PtmPtdZ
  mPtdZ   the inner of each row
Pt        the inner rows

2

Mathematica、78バイト

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

無名関数。入力を行列として受け取ります。実行中に発生する可能性のあるエラーを無視します。

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