Grade arte código ASCII golf


19

Desafio

Crie o programa mais curto que atenda aos requisitos

Exigências

  1. O código deve gerar uma grade 5x5 de 0s, da seguinte forma:

    00000
    00000
    00000
    00000
    00000
    
  2. O código deve aceitar uma entrada (coluna, linha, caractere). A grade deve mudar de acordo:

    Começar:

    00000
    00000
    00000
    00000
    00000
    

    Entrada:

    (2,5,*)
    

    Resultado:

    0*000
    00000
    00000
    00000
    00000
    

    (Nota: o canto inferior esquerdo é a posição 1,1.)

  3. O programa deve retornar uma mensagem de erro diferente da grade se a entrada de linha / coluna não for 1,2,3,4 ou 5. Essa pode ser qualquer mensagem de sua escolha (desde que não seja a grade), por isso 0é uma saída de erro aceitável.

  4. O programa deve funcionar com todos os caracteres ASCII imprimíveis (de um teclado americano).

O VENCEDOR

O vencedor será a pessoa que tiver o código mais curto e atender a todos os requisitos. Se mais de uma resposta funcionar e tiver o mesmo comprimento (menor), a pessoa que responder primeiro será a vencedora.


8
O programa deve retornar uma mensagem de erro . Que mensagem de erro? O programa pode retornar 0por erro e a grade para obter sucesso?
Rod

11
Onde está a origem na matriz? precisa ser zero ou um indexado?
george

3
Bem-vindo ao PPCG, por sinal.
Erik the Outgolfer

4
O programa deve funcionar com todos os caracteres do teclado dos EUA. Por que não apenas ASCII? Eu não sei mesmo os caracteres de um teclado dos EUA, e que não acrescenta nada ao desafio
Luis Mendo

11
@LuisMendo Acho que o teclado dos EUA é ASCII, ou é pelo menos um subconjunto.
Conor O'Brien

Respostas:


11

Dyalog APL , 17 13 10 bytes

Solicita uma matriz fechada contendo (linha, coluna) e, em seguida, um caractere. Dá ERRO INDEX a entrada defeituosa.

⊖⍞@⎕⊢5 50

Experimente online!

 virar de cabeça para baixo o resultado de

 caractere de entrada

@ substituindo o conteúdo na posição

 entrada avaliada (linha fechada, coluna)

 do

5 5⍴ Matriz 5 × 5 de

0 zeros


É necessário? Eu acho que neste caso é redundante.
Conor O'Brien 29/11

11
@ ConorO'Brien @ ConorO'Brien se não estiver lá, o analisador vê (⊂⎕)5 5como uma única matriz de 3 elementos - o argumento para .
Adám 29/11/16

São 13 caracteres Unicode, não 13 bytes, não é?
Wilx 29/11

11
@ wilx Clique na palavra bytes !
Adám 29/11/16

Esta resposta é a vencedora.
Dave Jones

5

Ruby, 157 149 bytes

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

Erro na entrada malformada ou na posição fora do limite

Agradecimentos a ConorO'Brien (8 bytes) e afuous (2 bytes) por ajudar a salvar bytes


loop do...end-> loop{...}; Eu acho que Array.new(5,[0]*5)funciona também, ou até mesmo [*[0]*5]*5.
Conor O'Brien

@ ConorO'Brien Não, Array.new(5,[0]*5)faça uma matriz de referência e [*[0]*5]*5faça uma matriz plana
TuxCrafting

Oh, certo. Omita o primeiro *. Então isso ainda cria uma matriz de referências.
Conor O'Brien

Array.new(5){[0]*5}pode ser substituído por (1..5).map{[0]*5}para salvar 2 bytes.
afuous

4

Lote, 199 bytes

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

Erros fora se a posição estiver fora da faixa.


Eu acho que você pode usar símbolos para <, como ^<. não tenho certeza tho.
Conor O'Brien

3

PHP, 111 100 97 bytes

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

imprime Ese a linha / coluna está fora do intervalo.
Correr comphp -r <code> <row> <column> <character>


3

Python, 66 bytes

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

Isso não falhou para a = 4, b = 3?
Titus

@Titus não é mais; D
Rod

11
A solução também funciona para o Python3
george

3

Dyalog APL, 24 20 18 bytes

Economizou 4 bytes graças ao Zgarb! Economizou 2 bytes graças a Adam!

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

Solicita entrada. Veja abaixo uma explicação.


20 bytes

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

Atribua a uma função e chame-a y x f 'c'. Por exemplo:

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

Explicação

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

{...}é uma função com argumento à esquerda e argumento à direita . separa instruções, então existem três instruções:

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

A primeira instrução é a←5 5⍴0definida acomo a 5por 5grade de 0s.

A segunda declaração define o membro nas coordenadas ditadas por para (ou seja, o caractere).

Por fim, realizamos em ae retornar que, produzindo as estreias de arevertida.


{a←5 5⍴0⋄a[⊂⌽⍺]←⍵⋄⊖a}salva alguns bytes.
Zgarb

@ Zgarb Oh, fantástico! Eu não sabia que a indexação funcionava assim.
Conor O'Brien

Você pode salvar dois bytes convertendo em um corpo tradfn:a←5 5⍴0⋄a[⊂⎕]←⍞⋄⊖a
Adám 29/11/16

@ Adám como isso funciona? Parece não funcionar no TryAPL.
Conor O'Brien

@ ConorO'Brien Certo. O TryAPL proíbe a solicitação de entrada, mas você pode obter a versão completa gratuitamente.
Adám 29/11/16

3

JavaScript (ES6), 73 76 bytes

Lança a TypeErrorse a coluna ou a linha estiver fora do intervalo.

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

Demo


Doce, mas isso gera um erro se cou ré menor que 1?
ETHproductions

@ETHproductions É apenas um teste c == 0 || r == 0. Mas acho que você está certo: vou atualizá-lo para evitar valores negativos.
precisa

3

C #, 199 bytes

Com base na resposta de 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());}

Ungolfed:

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
    }

Bem vindo ao site! Não sou especialista em c #, mas parece que há algum espaço em branco que você pode remover.
DJMcMayhem

11
(Desculpe, não sei etiqueta de envio) Menor G (): sequência estática pública G (int c, int r, char a) {return (0 <c && c <6 && 0 <r && r <6)? String.Concat (Enumerable.Range (1,29). Selecione (i => i% 6> 0? I / 6 == 5-r && i% 6 == c? A: '0': '\ n')): "Erro de índice";}
Eric

2

05AB1E , 27 22 bytes

Retorna sem grade quando linha / coluna> 5.

‚6‹Pi25L²<5*¹+Q5äR»1³‡

Experimente online!

Versão anterior

‚6‹Pi26G¾5²<*¹+NQi\³}})5äR»

2

Gelatina , 28 bytes

Isso parece muito longo ...

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

TryItOnline!

Quão?

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

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

Porque eu amo recursão. Lança ReferenceErrorcoordenadas inválidas.


2

Mathematica, 38 bytes

(x=Table[0,5,5];x[[-#2,#]]=#3;Grid@x)&

2

Brain-Flak 415 bytes

Inclui +3 para -c

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

Experimente Online!

Leva o caractere para inserir primeiro, depois a linha e a coluna sem espaços.

A maior parte disso é apenas manipulação de erros. O Brain-Flak não tem uma boa maneira de verificar se os valores estão dentro de um intervalo. Por erros, ele não gera nada ou apenas o caractere que deveria ser inserido. A resolução do problema real leva apenas 211 bytes:

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

2

Excel VBA, 67 bytes

Saídas para o intervalo A1: E5 na planilha ativa do projeto vba, sai com

Erro em tempo de execução '1004':

Erro definido pelo aplicativo ou definido pelo objeto

quando uma entrada inválida é fornecida.

Código:

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

Uso:

a 4,5,"#"

Saída (do exemplo acima) :

    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 bytes

Golfe:

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

Ungolfed:

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

Teste:

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

Se ce / ou restiver fora dos limites, será emitido um, IndexOutOfRangeExceptionassim você poderá remover a primeira instrução if, embora eu não tenha verificado as especificações adequadamente para isso. Você pode compilar a um Func<int, int, char, string>para salvar bytes, eu acredito que você precisa adicionar using System.Linq;por causa da Reversechamada embora eu não me lembro fora do topo da minha cabeça
TheLethalCoder

Altere d[r - 1] = d[r - 1].Substring(0, c - 1) + a + d[r - 1].Substring(c);para d[--r] = d[r].Substring(0, c - 1) + a + d[r].Substring(c);salvar 4 bytes
TheLethalCoder 29/11

1

WinDbg, 95 bytes

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

Quase metade disso apenas verificando os índices estão dentro do alcance ... A entrada é feita configurando os registros psuedo $t0,$t1 e $t2(onde $t2detém o valor ASCII do caractere para substituir). Por exemplo, (2,5,*)como o exemplo seria:

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

Imprime 0com erro.

Como funciona:

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

Saída de amostra:

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 bytes

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]

Exemplo de uso:

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

Se xe yestiver dentro do alcance, faça um loop externo e interno [1..5]e pegue o caractere cse ele atingir o dado xe ye um 0contrário. Se estiver xou ynão estiver dentro do alcance, uma Non-exhaustive patternsexceção será gerada.


1

Octave 49 bytes

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

1

QBIC , 53 50 bytes

EDIT: Agora que sei que não preciso mostrar a grade inicial, troquei as entradas do usuário _!_!_?pelos parâmetros da linha de comando ::;, economizando 3 bytes.

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

Versão original: entre a impressão da grade 0 e as coordenadas da substituição, mostrando a grade 0.

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

Imprime 5 cadeias de 5 0, solicita ao usuário 2 entradas numéricas e 1 entrada de cadeia, verifica se os números são <5 e usa a LOCATEfunção do QBasic para substituir o caractere correto.


0

Java, 99 bytes

(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

> <> (Peixe), 36 bytes (não concorrente)

1-$p;
00000
00000
00000
00000
00000

Experimente aqui!

Este é executado colocando os parâmetros para a pilha como [ chr, y, x]. Na verdade, um dos zeros na parte inferior é alterado chrpela instruçãop . Provavelmente existem maneiras melhores de fazer isso, mas achei que era uma situação única e divertida, em que esse recurso> <> é útil.

Explicação

Este programa simplesmente subtrai 1 de x(como em> <>, 0na verdade seria a primeira coluna), troca xcom ye altera o ponto do codebox x, ypara chrvia p. ynão precisa de 1 subtraído, pois o código já está todo compensado por 1!

Explicação não concorrente

Isso não é concorrente porque na verdade não produz saída. Achei isso extremamente divertido. Se isso for considerado uma saída válida, entre em contato!

Também não é concorrente porque ypode ser 0, mas acredito que esse é o único problema com a resposta. Vou corrigir se isso for considerado uma saída válida, mas, caso contrário, isso tornará a resposta menos divertida ...


2
Se respostas como essa não forem recomendadas, entre em contato e eu a excluirei!
Redstarcoder

0

Bash, 59 bytes

Golfe

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

$ 1 , $ 2 - linha, coluna, $ 3 - char de substituição, o erro é relatado via código de saída

Teste

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

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

0

Vim, 60 47 42 76 pressionamentos de teclas

A entrada está no formato (na primeira linha):

25*

Com o cursor começando no começo

"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

Se a entrada é inválida, lança: E492: Not an editor command: ^

O objetivo que produz a saída é de apenas 42bytes, mas, para criar um erro, meu número de bytes é aumentado drasticamente.


BTW eu não sei como criar o erro no Vim
Kritixi Lithos 7/16/16

0

Java 8, 194 192 bytes

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

Experimente aqui com a entrada correta.
Experimente aqui com entrada incorreta.

Isso seria 116 114 bytes como função, em vez de programa completo:

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

Experimente aqui.

Explicação:

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.