グリッドASCIIアートコードゴルフ


19

チャレンジ

要件を満たす最短のプログラムを作成する

必要条件

  1. コードは次のように0の5x5グリッドを生成する必要があります。

    00000
    00000
    00000
    00000
    00000
    
  2. コードは入力(列、行、文字)を受け入れる必要があります。グリッドはそれに応じて変更する必要があります。

    開始:

    00000
    00000
    00000
    00000
    00000
    

    入力:

    (2,5,*)
    

    出力:

    0*000
    00000
    00000
    00000
    00000
    

    (注:左下隅の位置は1,1です。)

  3. 行/列の入力が(それはグリッドではない限り)これはあなたの選択の任意のメッセージとすることができる1,2,3,4、または5でない場合、プログラムはそう、グリッド以外のエラーメッセージを返す必要があります0です許容可能なエラー出力。

  4. プログラムは(USキーボードの)すべての印刷可能なASCII文字で動作する必要があります。

勝者

勝者は、最短のコードを持ち、すべての要件を満たす人です。複数の回答が機能し、同じ(最短の)長さである場合、最初に回答した人が勝者になります。


8
プログラムはエラーメッセージを返さなければなりません。どんなエラーメッセージ?プログラム0はエラーを返し、グリッドを成功させることができますか?
ロッド

1
マトリックスの原点はどこですか?0または1つのインデックスが必要ですか?
ジョージ

3
ところで、PPCGへようこそ。
エリックアウトゴルファー

4
彼のプログラムはUSキーボード上のすべての文字で動作しなければなりません 私は米国のキーボードの文字すら知らず、それが挑戦に何も追加しません
ルイスメンドー

1
@LuisMendo USキーボードはASCII、または少なくともサブセットだと思います。
コナーオブライエン

回答:


11

Dyalog APL17 13 10 バイト

(行、列)を含む囲まれた配列を要求し、次に文字を要求します。誤った入力でINDEX ERRORを提供します。

⊖⍞@⎕⊢5 50

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

 結果を逆さまにひっくり返す

 入力文字

@位置 のコンテンツ置き換える

 評価された入力(囲まれた行、列)

 の

5 5⍴ 5×5の配列

0 ゼロ


である必要?この場合、それは冗長だと思います。
コナーオブライエン

1
@ ConorO'Brien @ ConorO'Brienが存在しない場合、パーサーは(⊂⎕)5 5単一の3要素配列、つまりの引数と見なします
アダム

これは13バイトではなく、13個のUnicode文字ですよね?
ウィルクス

1
@wilx単語バイトをクリックしてください!
アダム

この答えが勝者です。
デイブジョーンズ

5

ルビー、157 149バイト

g=(1..5).map{[0]*5}
loop{puts g.map(&:join).join ?\n
x=gets.match /\((.),(.),(.)\)/
a,b=x[1].hex,x[2].hex
1/0 if a<1||a>5||b<1||b>5
g[5-b][a-1]=x[3]}

不正な入力または境界外の位置でのエラー

ConorO'Brien(8バイト)とafuous(2バイト)に感謝してバイトを節約


loop do...end-> loop{...}; Array.new(5,[0]*5)うまくいくと思います[*[0]*5]*5
コナーオブライエン

@ ConorO'Brien Nope、Array.new(5,[0]*5)参照の配列を[*[0]*5]*5作成し、フラット配列を作成します
TuxCrafting

ああ、そう。最初は省略し*ます。その後、それはまだ参照の配列を作成します。
コナーオブライエン

Array.new(5){[0]*5}に置き換えて(1..5).map{[0]*5}2バイト節約できます。
激しい

4

バッチ、199バイト

@echo off
if %1 gtr 0 if %1 lss 6 if %2 gtr 0 if %2 lss 6 goto g
if
:g
for /l %%j in (5,1,-1)do call:l %* %%j
exit/b
:l
set s=000000
if %2==%2 call set s=%%s:~0,%1%%%3%%s:~%1%%
echo %s:~1,5%

位置が範囲外の場合はエラーになります。


<ようなシンボルを使用できると思います^<。よくわかりません。
コナーオブライエン

3

PHP、111 100 97バイト

$s=str_repeat("00000\n",5);$s[($x=($a=$argv)[1])+29-6*$y=$a[2]]=$a[3];echo$x&&$y&&$x<6&$y<6?$s:E;

E行/列が範囲外の場合に出力します。
で実行php -r <code> <row> <column> <character>


3

Python、66バイト

lambda a,b,n,l='00000\n':6>b>0<a<6and(5-b)*l+l[:a-1]+n+l[a:]+~-b*l

これはa = 4、b = 3で失敗しませんか?
タイタス

@タイタスはもうありません; D-
ロッド

1
ソリューションはまたのpython3のために働く
ジョージ・

3

Dyalog APL、24 20 18バイト

Zgarbのおかげで4バイト節約できました!Adamのおかげで2バイト節約されました!

a←5 5⍴0⋄a[⊂⎕]←⍞⋄⊖a

入力を求めます。説明については、以下を参照してください。


20バイト

{a←5 5⍴0⋄a[⊂⍺]←⍵⋄⊖a}

関数に割り当てて呼び出しますy x f 'c'。例えば:

      f←{a←5 5⍴0⋄a[⊂⍺]←⍵⋄⊖a}

      5 2 f '*'
0 * 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0

      6 6 f '*'
INDEX ERROR                   
     ←{a←5 5⍴0 ⋄ a[⊂⍺]←⍵ ⋄ ⊖a}
               ∧              

      0 0 f '*'
INDEX ERROR                   
     ←{a←5 5⍴0 ⋄ a[⊂⍺]←⍵ ⋄ ⊖a}
               ∧   

説明

{a←5 5⍴0⋄a[⊂⍺]←⍵⋄⊖a}

{...}は、左引数と右引数を持つ関数です。ステートメントを分離するため、3つのステートメントがあります。

a←5 5⍴0⋄a[⊂⍺]←⍵⋄⊖a

最初のステートメントa←5 5⍴0は、sのby グリッドに設定aします。550

2番目のステートメントは、to で指定された座標(つまり、文字)にメンバーを設定します。

最後に、私たちはそれを実行aて返し、最初のaリバースを返します。


{a←5 5⍴0⋄a[⊂⌽⍺]←⍵⋄⊖a}数バイト節約します。
ズガルブ

@Zgarbああ、素晴らしい!インデックス作成がそのように機能することを知りませんでした。
コナーオブライエン

tradfn本体に変換することにより、2バイトを節約できます。a←5 5⍴0⋄a[⊂⎕]←⍞⋄⊖a
Adám16年

@Adámはどのように機能しますか?TryAPLでは動作しないようです。
コナーオブライエン

@ ConorO'Brienそうですね。TryAPLは入力のプロンプトを禁止しています、無料でフルバージョンを入手できます
アダム

3

JavaScript(ES6)、73 76バイト

TypeError列または行が範囲外の場合にaをスローします。

(c,r,C,a=[...`00000
`.repeat(5)])=>(a[29+c-r*6]=C,c<1|r<1|c>5|r>5||a).join``

デモ


甘いですが、どちらかcまたはr1未満の場合、エラーがスローされますか?
ETHproductions

@ETHproductionsこれはテストのみc == 0 || r == 0です。しかし、あなたは正しいと思います。負の値を防ぐために更新します。
アーナウルド

3

C#、199バイト

ピートアーデンの答えに基づく

string g(int c, int r, char a){if(c<1|c>5|r<1|r>5)return "Index Error";var b="00000";var d=new[]{b,b,b,b,b};c--;d[r-1]=new string('0',c)+a+new string('0',4-c);return string.Join("\r\n",d.Reverse());}

ゴルフをしていない:

public static string G(int c, int r, char a)
    {
        if (c < 1 || c > 5 || r < 1 || r > 5) return "Index Error"; // Check it's not out of range
        var b = "00000";
        var d = new [] { b, b, b, b, b };                           // Generate display box, and fill with the default character
        c--;                                                        // Convert the X to a 0 based index
        d[r - 1] = new string('0',c) + a + new string('0',4-c);     // Replace the array's entry in y coordinate with a new string containing the new character
        return string.Join("\r\n", d.Reverse());                    // Reverse the array (so it's the right way up), then convert to a single string
    }

サイトへようこそ!私はC#の専門家ではありませんが、削除できる空白があるようです。
DJMcMayhem

1
(申し訳ありませんが、提出エチケットはわかりません)短いG():public static string G(int c、int r、char a){return(0 <c && c <6 && 0 <r && r <6)?string.Concat(Enumerable.Range (1,29).Select(i => i%6> 0?i / 6 == 5-r && i%6 == c?a: '0': '\ n')): "インデックスエラー";}
エリック


2

ゼリー、28 バイト

これは長すぎます...

Ṫ0ẋ24¤;ṙÑs5UY
’ḅ5
Ṗḟ5R¤
-ÑÇ?

TryItOnline!

どうやって?

Ṫ0ẋ24¤;ṙÑs5UY - Link 1, make grid: [row, column, character] e.g. [5,2,'*']
Ṫ             - tail: character                                  '*'
     ¤        - nilad followed by link(s) as a nilad  
 0            -     zero
  ẋ           -     repeated
   24         -     24 times                                     [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
      ;       - concatenate:                                     "000000000000000000000000*"
        Ñ     - call next link (2) as a monad                    21
       ṙ      - rotate left by                                   "000*000000000000000000000"
         s5   - split into chunks of length 5                    ["000*0","00000","00000","00000","00000"]
           U  - upend (reveres each)                             ["0*000","00000","00000","00000","00000"]
            Y - join with line feeds                              0*000
              - implicit print                                    00000
                                                                  00000
’ḅ5 - Link 2, position: [row, column]                             00000
’   - decrement                                                   00000
 ḅ5 - convert from base 5

Ṗḟ5R¤ - Link 3, input error checking: [row, column, character]
Ṗ     - pop: [row, column]
 ḟ    - filter out values in
  5R¤ - range(5): [1,2,3,4,5] - any values not in this remain giving a truthy result

-ÑÇ? - Main link: [row, column, character]
   ? - ternary if:
  Ç  -    last link (3) as a monad
-    -    -1 (if truthy - the error identification)
 Ñ   - next link (1) as a monad (if falsey - the grid)

2

JavaScript(ES6)、89バイト

f=(X,Y,Z,x=5,y=5)=>x+y>1?(x?X+x-6|Y-y?0:Z:`
`)+f(X,Y,Z,x?x-1:5,y-!x):X<1|X>5|Y<1|Y>5?e:""

再帰が大好きだから。ReferenceError無効な座標にをスローします。



2

Brain-Flak 415バイト

+3を含む -c

([][()()()]){{}}{}({}<(({}<(({})<>)<>>)<>)<>([((((()()()){}){}){}){}]{}<([((((()()()){}){}){}){}]{})>)(()()()()()){({}[()]<(({})){{}(<({}[()])>)}{}({}<(({})){{}(<({}[()])>)}{}>)>)}{}({}{}){<>{{}}<>{}}<>>)<>(()()()()()){({}[()]<(((((((((()()()){}){}){}){})))))((()()()()()){})>)}{}{}<>({}<()((((((()()()){}){}()){}){}()[{}])({})({})({})({}){}{}[((((()()()){}){}){}){}()]){({}[()]<<>({}<>)>)}{}<>{}>)<>{({}<>)<>}<>

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

最初に挿入する文字を取り、次にスペースなしで行、次に列を取ります。

このほとんどは単なるエラー処理です。Brain-Flakには、値が範囲内にあるかどうかを確認する良い方法がありません。エラーの場合、何も出力されないか、挿入されるはずの文字のみが出力されます。実際の問題を解決するには、211バイトしかかかりません。

<>(()()()()()){({}[()]<(((((((((()()()){}){}){}){})))))((()()()()()){})>)}{}{}<>({}<()((((((()()()){}){}()){}){}()[{}])({})({})({})({}){}{}[((((()()()){}){}){}){}()]){({}[()]<<>({}<>)>)}{}<>{}>)<>{({}<>)<>}<>

2

Excel VBA、67バイト

vbaプロジェクトのアクティブシートの範囲A1:E5に出力し、終了します

実行時エラー '1004':

アプリケーション定義またはオブジェクト定義のエラー

無効な入力が提供されたとき。

コード:

Sub a(c,r,x)
c=IIf(r<1Or c>5,-1,c)
[A1:E5]=0
Cells(6-r,c)=x
End Sub

使用法:

a 4,5,"#"

出力(上記の例から)

    A   B   C   D   E
1   0   0   0   #   0
2   0   0   0   0   0
3   0   0   0   0   0
4   0   0   0   0   0
5   0   0   0   0   0

1

C#、208バイト

ゴルフ:

string G(int c,int r,char a){if(c<1||c>5||r<1||r>5)return"Index Error";var b="00000";var d=new string[]{b,b,b,b,b};d[r-1]=d[r-1].Substring(0,c-1)+a+d[r-1].Substring(c);return string.Join("\r\n",d.Reverse());}

ゴルフをしていない:

public string G(int c, int r, char a)
{
  if (c < 1 || c > 5 || r < 1 || r > 5) return "Index Error";
  var b = "00000";
  var d = new string[] { b, b, b, b, b };
  d[r - 1] = d[r - 1].Substring(0, c - 1) + a + d[r - 1].Substring(c);
  return string.Join("\r\n", d.Reverse());
}

テスト:

Console.Write(G(6, 6, '*')); //Index Error

Console.Write(G(1, 4, '#'));

00000
#0000
00000
00000
00000

Console.Write(G(5, 5, '@'));

0000@
00000
00000
00000
00000

Console.Write(G(1, 1, '}'));

00000
00000
00000
00000
}0000

もしcおよび/またはr範囲外であることがスローされますIndexOutOfRangeException私はそのために適切に仕様をチェックしていないのに文の場合は、最初に削除することができるかもしれませんので。あなたはにコンパイルすることができFunc<int, int, char, string>、私はあなたが追加する必要があると信じて、バイトを保存するusing System.Linq;ための中でReverse、私は私の頭の上をオフに思い出すことができないものの、コール
TheLethalCoder

変更d[r - 1] = d[r - 1].Substring(0, c - 1) + a + d[r - 1].Substring(c);するためにd[--r] = d[r].Substring(0, c - 1) + a + d[r].Substring(c);4バイト救うために
TheLethalCoder

1

WinDbg、95バイト

j(0<(@$t0|@$t1))&(6>@$t0)&(6>@$t1)'f8<<16 L19 30;eb2000018+@$t0-@$t1*5 @$t2;da/c5 8<<16 L19';?0

ほぼ半数それだけでインデックスの検証の範囲で...入力は疑似レジスタを設定することによって行われている$t0$t1$t2(ここで、$t2置換するための文字のASCII値を保持しています)。たとえば、例の(2,5,*)ようになります:

0:000> r$t0=2
0:000> r$t1=5
0:000> r$t2=2a

0エラー時に印刷します。

使い方:

j (0<(@$t0|@$t1)) & (6>@$t0) & (6>@$t1)  * If $t0 and $t1 are both positive and less than 6
'
    f 8<<16 L19 30;                      * Put 19 (0n25) '0's (ascii 30) at 2000000 (8<<16)
    eb 2000018+@$t0-@$t1*5 @$t2;         * Replace the specified cell with the new char
    da /c5 8<<16 L19                     * Print 19 (0n25) chars in rows of length 5
';
    ?0                                   * ...Else print 0

サンプル出力:

0:000> r$t0=2
0:000> r$t1=5
0:000> r$t2=2a
0:000> j(0<(@$t0|@$t1))&(6>@$t0)&(6>@$t1)'f8<<16 L19 30;eb2000018+@$t0-@$t1*5 @$t2;da/c5 8<<16 L19';?0
Filled 0x19 bytes
02000000  "0*000"
02000005  "00000"
0200000a  "00000"
0200000f  "00000"
02000014  "00000"


0:000> r$t0=-2
0:000> j(0<(@$t0|@$t1))&(6>@$t0)&(6>@$t1)'f8<<16 L19 30;eb2000018+@$t0-@$t1*5 @$t2;da/c5 8<<16 L19';?0
Evaluate expression: 0 = 00000000


0:000> r$t0=4
0:000> r$t1=2
0:000> r$t2=23
0:000> j(0<(@$t0|@$t1))&(6>@$t0)&(6>@$t1)'f8<<16 L19 30;eb2000018+@$t0-@$t1*5 @$t2;da/c5 8<<16 L19';?0
Filled 0x19 bytes
02000000  "00000"
02000005  "00000"
0200000a  "00000"
0200000f  "000#0"
02000014  "00000"


0:000> r$t1=f
0:000> j(0<(@$t0|@$t1))&(6>@$t0)&(6>@$t1)'f8<<16 L19 30;eb2000018+@$t0-@$t1*5 @$t2;da/c5 8<<16 L19';?0
Evaluate expression: 0 = 00000000

1

Haskell、77バイト

r=[1..5]
(x#y)c|x>0,x<6,y>0,y<6=unlines[[last$'0':[c|i==x,j==6-y]|i<-r]|j<-r]

使用例:

*Main> putStr $ (2#5) '*'
0*000
00000
00000
00000
00000

xおよびyが範囲内にある場合、外側と内側はループし、指定されたand とaにヒットする場合[1..5]はcharを取得します。または範囲内にない場合、例外が発生します。cxy0xyNon-exhaustive patterns


1

オクターブ49バイト

@(c,r,s)char(accumarray([6-r c],s+0,[5 5],[],48))

1

QBIC53 50バイト

編集:開始グリッドを表示する必要がないことがわかったので、_!_!_?コマンドラインパラメーターのユーザー入力を交換して、::;3バイトを節約しました。

[5|?@00000|]::;~(b>5)+(c>5)>1|_Xd\$LOCATE 6-c,b|?B

元のバージョン:0グリッドを印刷してから置換の座標を取得するまで停止し、0グリッドを表示します。

[5|?@00000|]_!_!_?~(b>5)+(c>5)>1|_Xd\$LOCATE 6-c,b|?B

5文字の5 0文字列を出力し、2つの数値入力と1つの文字列入力をユーザーに要求し、数値が5未満かどうかを確認し、QBasicのLOCATE関数を使用して正しい文字を置き換えます。



0

> <>(魚)、36バイト(競合しない)

1-$p;
00000
00000
00000
00000
00000

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

これは、[のようなスタック上にパラメータを置くことによって実行されますchryx]。下部のゼロの1つは、実際にchrは命令によって変更されますp。おそらくこれを行うためのより良い方法がありますが、これはこの機能が便利なユニークで面白い状況だと思いました。

説明

このプログラムは、単に1を減算しx(> <>のように、0実際には最初の列になります)、と交換xy、コードボックスポイントx, ychrviaに変更しpます。yコードはすでに1ずつオフセットされているため、1を引く必要はありません!

競合しない説明

実際には出力を生成しないため、これは競合しません。これは非常に面白いことがわかりました。これが有効な出力と見なされる場合は、お知らせください!

またy、0になる可能性があるため競合しませんが、それが答えの唯一の問題だと思います。これが有効な出力と見なされる場合は修正しますが、そうでない場合は、答えが面白くなりません...


2
このような回答が推奨されない場合はお知らせください。削除します。
redstarcoder 16

0

Bash、59バイト

ゴルフ

printf '00000%0.s\n' {1..5}|sed "$1 s/./$3/$2"|grep -z "$3"

$ 1$ 2-行、列、$ 3-置換文字、エラーは終了コードで報告されます

テスト

>./box 2 2 "*"
00000
0*000
00000
00000
00000
>echo $?
0

>./box 6 2 '*'     
>echo $?
1

0

Vim、60 47 42 76キーストローク

入力は次の形式です(最初の行):

25*

カーソルが先頭から始まる

"ax"bxx:if<C-r>a<1||<C-r>a>5||<C-r>b<1||<C-r>b>5
^
endif
6i0<ESC>Y5pG:norm <C-r>al<C-r>bkr<C-r>-
Hqqxjq5@qdd

入力が無効な場合、スローされます: E492: Not an editor command: ^

出力を生成する42サイドはバイトのみですが、エラーを作成するために、バイトカウントが大幅に増加します。


ところで私はVimの中でエラーを作成する方法がわからない
KritixiのLithos

0

Java 8、194 192バイト

interface M{static void main(String[]a){String r="";int i=0,j,z=new Byte(a[0]),y=new Byte(a[1]);for(;++i<6;r+="\n")for(j=0;++j<6;r+=6-i==y&j==z?a[2]:0);System.out.print(z>0&z<7&y>0&y<7?r:0);}}

正しい入力でここで試してください。
間違った入力でここで試してください。

これは、完全なプログラムではなく関数として116 114バイトになります。

(a,b,c)->{String r="";for(int i=0,j;++i<6;r+="\n")for(j=0;++j<6;r+=b==6-i&a==j?c:0);return a>0&a<7&b>0&b<7?r:"0";}

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

説明:

interface M{                  // Class
  static void main(String[]a){//  Mandatory main-method
    String r="";              //   Result-String, starting empty
    int i=0,j,                //   Index-integers
        z=new Byte(a[0]),     //   First input converted to integer
        y=new Byte(a[1]);     //   Second input converted to integer
    for(;++i<6;               //   Loop (1) from 1 to 6 (inclusive)
        r+="\n")              //     After every iteration: Append a new-line to the result
      for(j=0;++j<6;          //    Inner loop (2) from 1 to 6 (inclusive)
        r+=6-i==y             //     If the second input equals `6-1`,
           &j==z?             //     and the first input equals `j`:
            a[2]              //      Append the third input to the result-String
           :                  //     Else:
            0                 //      Append a zero to the result-String
      );                      //    End of inner loop (2)
                              //   End of inner loop (1) (implicit / single-line body)
    System.out.print(         //   Print:
     z>0&z<7&y>0&y<7?         //    If the coordinates are valid (1-6):
      r                       //     Print the result `r`
     :                        //    Else:
      0);                     //     Print 0 as error instead
  }                           //  End of main-method
}                             // End of class
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.