Rejilla ASCII art code golf

19

Desafío

Cree el programa más corto que cumpla con los requisitos.

Requisitos

  1. El código debe generar una cuadrícula de ceros de 5x5, así:

    00000
    00000
    00000
    00000
    00000
    
  2. El código debe aceptar una entrada (columna, fila, carácter). La cuadrícula debe cambiar en consecuencia:

    Comienzo:

    00000
    00000
    00000
    00000
    00000
    

    Entrada:

    (2,5,*)
    

    Salida:

    0*000
    00000
    00000
    00000
    00000
    

    (Nota: la esquina inferior izquierda es la posición 1,1).

  3. El programa debe devolver un mensaje de error que no sea la cuadrícula si la entrada de la fila / columna no es 1,2,3,4 o 5. Este puede ser cualquier mensaje de su elección (siempre que no sea la cuadrícula), también lo 0es Una salida de error aceptable.

  4. El programa debe funcionar con todos los caracteres ASCII imprimibles (de un teclado de EE. UU.).

EL GANADOR

El ganador será la persona que tenga el código más corto y cumpla con todos los requisitos. Si más de una respuesta funciona y tiene la misma longitud (la más corta), la persona que respondió primero será la ganadora.

Dave Jones
fuente
8
El programa debe devolver un mensaje de error . ¿Qué mensaje de error? ¿Puede el programa regresar 0por error y la grilla por éxito?
Rod
1
¿Dónde está el origen en la matriz? ¿necesita ser cero o uno indexado?
George
3
Bienvenido a PPCG, por cierto.
Erik the Outgolfer
44
El programa debe funcionar con todos los caracteres en el teclado de EE. UU. ¿Por qué no solo ASCII? Ni siquiera conozco los caracteres de un teclado estadounidense, y eso no agrega nada al desafío
Luis Mendo
1
@LuisMendo Creo que el teclado de EE. UU. Es ASCII, o es al menos un subconjunto.
Conor O'Brien

Respuestas:

11

Dyalog APL , 17 13 10 bytes

Solicita una matriz cerrada que contiene (fila, columna) y luego un carácter. Da error de índice en la entrada defectuosa.

⊖⍞@⎕⊢5 50

Pruébalo en línea!

 voltear al revés el resultado de

 carácter ingresado

@ reemplazar el contenido en la posición

 entrada-evaluada (fila, columna adjunta)

 de

5 5⍴ Conjunto de 5 × 5 de

0 ceros

Adán
fuente
Es necesario? Creo que en este caso es redundante.
Conor O'Brien el
1
@ ConorO'Brien @ ConorO'Brien si no está allí, el analizador lo ve (⊂⎕)5 5como una única matriz de 3 elementos: el argumento para .
Adám
Eso es 13 caracteres Unicode, no 13 bytes, ¿no?
wilx
1
@wilx ¡Haz clic en la palabra bytes !
Adám
Esta respuesta es la ganadora.
Dave Jones el
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]}

Error en entrada malformada o fuera de posición encuadernada

Gracias a ConorO'Brien (8 bytes) y afuous (2 bytes) por ayudar a guardar bytes

TuxCrafting
fuente
loop do...end-> loop{...}; Creo que también Array.new(5,[0]*5)funciona, o incluso [*[0]*5]*5.
Conor O'Brien
@ ConorO'Brien Nope, Array.new(5,[0]*5)haga una matriz de referencia y [*[0]*5]*5haga una matriz plana
TuxCrafting
Correcto. Omita el primero *. Entonces eso todavía crea una serie de referencias.
Conor O'Brien
Array.new(5){[0]*5}se puede reemplazar con (1..5).map{[0]*5}para guardar 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%

Errores fuera si la posición está fuera de rango.

Neil
fuente
Creo que puedes usar símbolos para <, como ^<. No estoy seguro aunque.
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 Esi la fila / columna está fuera del rango.
Corre conphp -r <code> <row> <column> <character>

Titus
fuente
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
varilla
fuente
¿No fallará esto para a = 4, b = 3?
Tito
@Titus ya no; D
Rod
1
La solución también funciona para Python3
george
3

Dyalog APL, 24 20 18 bytes

¡Guardado 4 bytes gracias a Zgarb! ¡Ahorré 2 bytes gracias a Adam!

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

Solicitudes de entrada. Ver abajo para una explicación.


20 bytes

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

Asignar a una función y llamarla y x f 'c'. P.ej:

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

Explicación

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

{...}es una función con argumento izquierdo y argumento derecho . separa las declaraciones, por lo que hay tres declaraciones:

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

La primera instrucción se a←5 5⍴0establece en aa 5por 5cuadrícula de 0s.

La segunda instrucción establece el miembro en las coordenadas dictadas por a (es decir, el carácter).

Por último, se realiza en ay retorno que, produciendo los primeros de arevertido.

Conor O'Brien
fuente
{a←5 5⍴0⋄a[⊂⌽⍺]←⍵⋄⊖a}Guarda algunos bytes.
Zgarb
@ Zgarb ¡Oh, fantástico! No sabía que la indexación funcionaba así.
Conor O'Brien
Puede guardar dos bytes mediante la conversión a un cuerpo tradfn:a←5 5⍴0⋄a[⊂⎕]←⍞⋄⊖a
Adám
@ Adám, ¿cómo funciona eso? No parece funcionar en TryAPL.
Conor O'Brien
@ ConorO'Brien Derecha. TryAPL prohíbe la solicitud de entrada, pero puede obtener la versión completa de forma gratuita.
Adám
3

JavaScript (ES6), 73 76 bytes

Lanza un TypeErrorsi la columna o la fila está fuera de rango.

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

Manifestación

Arnauld
fuente
Dulce, pero ¿arroja un error si co res menor que 1?
ETHproductions
@ETHproductions Solo está probando c == 0 || r == 0. Pero supongo que tienes razón: lo actualizaré para evitar valores negativos.
Arnauld
3

C #, 199 bytes

Basado en la respuesta 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());}

Sin golf:

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
    }
francofrancis
fuente
Bienvenido al sitio! No soy un experto en C #, pero parece que hay algunos espacios en blanco que podría eliminar.
DJMcMayhem
1
(Lo siento, no sé la etiqueta de envío) Más corto G (): cadena 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) .Seleccione (i => i% 6> 0? I / 6 == 5-r && i% 6 == c? A: '0': '\ n')): "Error de índice";}
Eric
2

05AB1E , 27 22 bytes

No devuelve cuadrícula cuando fila / columna> 5.

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

Pruébalo en línea!

Versión previa

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

Jalea , 28 bytes

Esto se siente demasiado tiempo ...

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

TryItOnline!

¿Cómo?

Ṫ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)
Jonathan Allan
fuente
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 amo la recursividad. Lanza un ReferenceErrorsobre coordenadas inválidas.

ETHproducciones
fuente
2

Mathematica, 38 bytes

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

Brain-Flak 415 Bytes

Incluye +3 para -c

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

Pruébalo en línea!

Primero toma el carácter para insertar, luego la fila y luego la columna sin espacios.

La mayor parte de esto es solo manejo de errores. Brain-Flak no tiene una buena manera de verificar si los valores están en un rango. Para los errores, no genera nada o solo el carácter que se suponía que debía insertarse. Resolver el problema real solo toma 211 bytes:

<>(()()()()()){({}[()]<(((((((((()()()){}){}){}){})))))((()()()()()){})>)}{}{}<>({}<()((((((()()()){}){}()){}){}()[{}])({})({})({})({}){}{}[((((()()()){}){}){}){}()]){({}[()]<<>({}<>)>)}{}<>{}>)<>{({}<>)<>}<>
Riley
fuente
2

Excel VBA, 67 bytes

Salidas al rango A1: E5 en la hoja activa del proyecto vba, sale con

Error en tiempo de ejecución '1004':

Error definido por la aplicación o definido por el objeto

cuando se proporciona una entrada inválida.

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,"#"

Salida (del ejemplo anterior) :

    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
Taylor Scott
fuente
1

C #, 208 bytes

Golfizado:

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

Sin golf:

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

Pruebas:

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
Pete Arden
fuente
Si cy / o restán fuera de los límites, arrojará un, IndexOutOfRangeExceptionpor lo que es posible que pueda eliminar la primera declaración if, aunque no he verificado las especificaciones correctamente para eso. Puede compilar en a Func<int, int, char, string>para guardar bytes, creo que necesita agregarlo using System.Linq;debido a la Reversellamada, aunque no puedo recordarlo
TheLethalCoder
Cambiar d[r - 1] = d[r - 1].Substring(0, c - 1) + a + d[r - 1].Substring(c);a d[--r] = d[r].Substring(0, c - 1) + a + d[r].Substring(c);para guardar 4 bytes
TheLethalCoder
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

Casi la mitad de los que sólo la verificación de los índices están en el rango de entrada ... se hace estableciendo los pseudo-registros $t0, $t1y $t2(donde $t2tiene el valor ASCII del carbón para reemplazar). Por ejemplo, (2,5,*)como el ejemplo sería:

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

Imprime 0en caso de error.

Cómo 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

Salida de muestra:

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
Leche
fuente
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]

Ejemplo de uso:

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

Si xy yestán dentro del rango, el bucle externo e interno lo atraviesan [1..5]y toman el char csi golpea el dado xy yy de lo 0contrario. Si xo yno está dentro del rango, se Non-exhaustive patternsgenera una excepción.

nimi
fuente
1

Octava 49 bytes

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

QBIC , 53 50 bytes

EDITAR: ahora que sé que no tengo que mostrar la cuadrícula de inicio, he cambiado las entradas del usuario _!_!_?por los parámetros de la línea de comandos ::;, ahorrando 3 bytes.

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

Versión original: Esto se detiene entre imprimir la cuadrícula 0 y tomar las coordenadas para la sustitución, mostrando la cuadrícula 0.

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

Imprime 5 cadenas de 5 0's, solicita al usuario 2 entradas numéricas y 1 entrada de cadena, comprueba si los números son <5 y utiliza la LOCATEfunción QBasic para sustituir el carácter correcto.

Steenbergh
fuente
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;}
Roman Gräf
fuente
0

> <> (Pescado), 36 bytes (no competidor)

1-$p;
00000
00000
00000
00000
00000

Pruébalo aquí!

Esto se ejecuta mediante la colocación de los parámetros en la pila como [ chr, y, x]. chrLa instrucción cambia uno de los ceros en la parte inferior p. Probablemente haya mejores formas de hacerlo, pero pensé que era una situación única y entretenida en la que esta función> <> es útil.

Explicación

Este programa simplemente resta 1 de x(como en> <>, en 0realidad sería la primera columna), intercambia xcon y, luego cambia el punto del cuadro de código x, yen chrvia p. yno necesita 1 restado de él, ya que el código ya está compensado por 1.

Explicación no competitiva

Esto no es competitivo porque en realidad no produce resultados. Acabo de encontrar esto extremadamente divertido. Si esto se considera una salida válida, ¡hágamelo saber!

Tampoco es competitivo porque ypuede ser 0, pero creo que ese es el único problema con la respuesta. Lo arreglaré si esto se considera una salida válida, pero de lo contrario, solo hace que la respuesta sea menos entretenida ...

redstarcoder
fuente
2
Si se desaconsejan respuestas como esta, ¡hágamelo saber y lo eliminaré!
redstarcoder
0

Bash, 59 bytes

Golfed

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

$ 1 , $ 2 - fila, columna, $ 3 - reemplazo de caracteres, el error se informa a través del código de salida

Prueba

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

>./box 6 2 '*'     
>echo $?
1
zepelín
fuente
0

Vim, 60 47 42 76 pulsaciones de teclas

La entrada está en el formato (en la primera línea):

25*

Con el cursor empezando por el principio

"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

Si la entrada no es válida, arroja: E492: Not an editor command: ^

El cide que produce la salida son solo 42bytes, pero para crear un error, mi bytecount aumenta drásticamente.

Kritixi Lithos
fuente
Por cierto, no sé cómo crear el error en Vim
Kritixi Lithos
0

Java 8, 194192 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);}}

Pruébelo aquí con la entrada correcta.
Pruébelo aquí con una entrada incorrecta.

Esto sería 116 114 bytes en su lugar como función en lugar 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";}

Pruébalo aquí

Explicación:

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
Kevin Cruijssen
fuente