网格ASCII艺术代码高尔夫


19

挑战

创建满足要求的最短程序

要求

  1. 该代码必须生成一个5x5的0网格,如下所示:

    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. 该程序必须使用所有可打印的ASCII字符(使用美国键盘)。

获胜者,冠军

获胜者将是代码最短且满足所有要求的人。如果一个以上的答案有效且长度相同(最短),则第一个回答的人将成为赢家。


8
程序必须返回错误消息。什么错误消息?程序可以返回0错误并返回网格以成功吗?
Rod

1
矩阵的原点在哪里?它需要为零还是一个索引?
乔治,

3
欢迎来到PPCG。
暴民埃里克(Erik the Outgolfer)

4
他的程序必须使用美国键盘上的所有字符,为什么不只使用ASCII?我什至不知道美国键盘的字符,这对挑战没有任何帮助
Luis Mendo

1
@LuisMendo我认为美国键盘是ASCII或至少是子集。
科纳·奥布莱恩

Answers:


11

Dyalog APL17 13 10 字节

提示输入一个包含(行,列)的封闭数组,然后输入一个字符。输入错误时给出INDEX ERROR。

⊖⍞@⎕⊢5 50

在线尝试!

 颠倒结果

 输入字符

@ 替换内容位置

 评估输入(封闭的行,列)

 的

5 5⍴ 5×5的

0 零


必要吗?我认为在这种情况下是多余的。
科纳·奥布赖恩

1
@ ConorO'Brien @ ConorO'Brien如果不存在,则解析器将其(⊂⎕)5 5视为单个3元素数组–的参数
亚当

那是13个Unicode字符,而不是13个字节,不是吗?
wilx

1
@wilx单击单词字节
2013年

这个答案是赢家。
戴夫·琼斯

5

Ruby,157149字节

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个字节。
2016年

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,这会失败吗?
泰特斯

@Titus不再了; D
Rod

1
该解决方案也适用于Python3
乔治,

3

Dyalog APL,24 20 18字节

感谢Zgarb,节省了4个字节!感谢亚当,节省了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}

{...}是具有左参数和右参数的函数分隔语句,因此有以下三个语句:

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

第一条语句a←5 5⍴0设置a5通过5电网0秒。

第二条语句设置坐标由所规定的成员(即,字符)。

最后,我们执行a,并返回,产生的首创a逆转。


{a←5 5⍴0⋄a[⊂⌽⍺]←⍵⋄⊖a}保存一些字节。
Zgarb '16

@Zgarb哦,太棒了!我不知道索引如此工作。
科纳·奥布莱恩

:您可以通过转换为tradfn体保存两个字节a←5 5⍴0⋄a[⊂⎕]←⍞⋄⊖a
亚当

@Adám如何运作?在TryAPL上似乎不起作用。
科纳·奥布莱恩

@ ConorO'Brien正确。TryAPL禁止提示输入,但是您可以免费获取完整版本。
阿达姆(Adám)'16

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

演示版


很好,但是如果其中一个cr小于1 ,是否会引发错误?
ETHproductions's

@ETHproductions这只是测试c == 0 || r == 0。但是我想您是对的:我将对其进行更新以防止出现负值。
Arnauld

3

C#,199字节

基于Pete Arden的回答

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():公共静态字符串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因此您可能可以删除第一个if语句,尽管我尚未对此进行适当的检查。您可以编译为a 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 '16

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

如果xy在范围之内,外环和内环通过[1..5]并采取炭c如果它击中给定的xy以及0以其他方式。如果x还是y不在范围内,一个Non-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

Java,99个字节

(i,j,k)->{int[]b=new int[]{60,60,60,60,60};int[][]a=new int[][]{b,b,b,b,b};a[i-1][5-j]=k;return a;}

0

> <>(鱼),36个字节(非竞争)

1-$p;
00000
00000
00000
00000
00000

在这里尝试!

这是通过将所述参数的堆栈等[上运行chryx]。底部的零实际上是chr由指令变为p。可能有更好的方法来执行此操作,但我认为这是一种独特且有趣的情况,此> <>功能很有用。

说明

该程序只需从中减去1 x(如> <>,0实际上是第一列),x与交换y,然后将代码箱点更改x, ychrvia py不需要从中减去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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.