Griglia ASCII art code golf


19

Sfida

Crea il programma più breve che soddisfi i requisiti

Requisiti

  1. Il codice deve generare una griglia 5x5 di 0, in questo modo:

    00000
    00000
    00000
    00000
    00000
    
  2. Il codice deve accettare un input (colonna, riga, carattere). La griglia deve cambiare di conseguenza:

    Inizio:

    00000
    00000
    00000
    00000
    00000
    

    Ingresso:

    (2,5,*)
    

    Produzione:

    0*000
    00000
    00000
    00000
    00000
    

    (Nota: l'angolo in basso a sinistra è la posizione 1,1).

  3. Il programma deve restituire un messaggio di errore diverso dalla griglia se l'input di riga / colonna non è 1,2,3,4 o 5. Questo può essere qualsiasi messaggio di tua scelta (purché non sia la griglia), quindi 0è un output di errore accettabile.

  4. Il programma deve funzionare con tutti i caratteri ASCII stampabili (di una tastiera americana).

IL VINCITORE

Il vincitore sarà la persona che ha il codice più breve e soddisfa tutti i requisiti. Se più di una risposta funziona e ha la stessa lunghezza (più breve), la persona che ha risposto per prima sarà la vincitrice.


8
Il programma deve restituire un messaggio di errore . Quale messaggio di errore? Il programma può restituire 0per errore e la griglia per il successo?
Rod

1
Dov'è l'origine sulla matrice? deve essere zero o uno indicizzato?
george

3
Benvenuto a PPCG, comunque.
Erik the Outgolfer,

4
il programma deve funzionare con tutti i caratteri della tastiera americana Perché non solo ASCII? Non conosco nemmeno i personaggi di una tastiera americana, e questo non aggiunge nulla alla sfida
Luis Mendo,

1
@LuisMendo Penso che la tastiera americana sia ASCII, o almeno un sottoinsieme.
Conor O'Brien,

Risposte:


11

Dyalog APL , 17 13 10 byte

Richiede un array chiuso contenente (riga, colonna) e quindi un carattere. Fornisce INDEX ERROR su input difettoso.

⊖⍞@⎕⊢5 50

Provalo online!

 capovolgere il risultato di

 immessi caratteri

@ sostituzione del contenuto in posizione

 input-valutato (riga chiusa, colonna)

 di

5 5⍴ Matrice 5 × 5 di

0 zeri


È necessario? Penso che in questo caso sia ridondante.
Conor O'Brien,

1
@ ConorO'Brien @ ConorO'Brien se non c'è, il parser vede (⊂⎕)5 5come un singolo array di 3 elementi - l'argomento di .
Adám,

Sono 13 caratteri Unicode, non 13 byte, no?
Wilx,

1
@wilx Fai clic sulla parola byte !
Adám,

Questa risposta è il vincitore.
Dave Jones,

5

Rubino, 157 149 byte

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

Errore su input non valido o posizione fuori limite

Grazie a ConorO'Brien (8 byte) e afuous (2 byte) per l'aiuto nel salvataggio dei byte


loop do...end-> loop{...}; Penso che Array.new(5,[0]*5)funzioni anche o addirittura [*[0]*5]*5.
Conor O'Brien,

@ ConorO'Brien No, Array.new(5,[0]*5)crea un array di riferimento e [*[0]*5]*5crea un array flat
TuxCrafting,

Oh giusto. Ometti il ​​primo *. Quindi ciò crea ancora una serie di riferimenti.
Conor O'Brien,

Array.new(5){[0]*5}può essere sostituito con (1..5).map{[0]*5}per salvare 2 byte.
afoso

4

Lotto, 199 byte

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

Errori fuori se la posizione è fuori portata.


Penso che puoi usare simboli per <, come ^<. non sono sicuro.
Conor O'Brien,

3

PHP, 111 100 97 byte

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

stampa Ese la riga / colonna non rientra nell'intervallo.
Corri conphp -r <code> <row> <column> <character>


3

Python, 66 byte

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

Questo non fallirà per a = 4, b = 3?
Tito

@Titus non più; D
Rod

1
La soluzione funziona anche con Python3
george

3

Dyalog APL, 24 20 18 byte

Risparmiato 4 byte grazie a Zgarb! Salvato 2 byte grazie ad Adam!

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

Richiede input. Vedi sotto per una spiegazione.


20 byte

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

Assegna a una funzione e chiamala y x f 'c'. Per esempio:

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

Spiegazione

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

{...}è una funzione con argomento sinistro e argomento destro . separa le istruzioni, quindi ci sono tre istruzioni:

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

La prima istruzione a←5 5⍴0set aad una 5di 5griglia di 0s.

La seconda istruzione imposta il membro a coordinate dettate da a (cioè, il carattere).

Infine, eseguiamo su ae ritorno che, producendo i primi di ainvertito.


{a←5 5⍴0⋄a[⊂⌽⍺]←⍵⋄⊖a}salva qualche byte.
Zgarb,

@Zgarb Oh, fantastico! Non sapevo che l'indicizzazione funzionasse così.
Conor O'Brien,

Puoi salvare due byte convertendoli in un corpo tradfn:a←5 5⍴0⋄a[⊂⎕]←⍞⋄⊖a
Adám

@Adám come funziona? Non sembra funzionare su TryAPL.
Conor O'Brien,

@ ConorO'Brien Right. TryAPL vieta la richiesta di input, ma è possibile ottenere la versione completa gratuitamente.
Adám,

3

JavaScript (ES6), 73 76 byte

Genera a TypeErrorse la colonna o la riga non rientra nell'intervallo.

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

dimostrazione


Dolce, ma genera un errore se uno co rè inferiore a 1?
ETHproductions

@ETHproductions È solo un test c == 0 || r == 0. Ma credo che tu abbia ragione: lo aggiornerò per evitare valori negativi.
Arnauld,

3

C #, 199 byte

Basato sulla risposta di 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
    }

Benvenuti nel sito! Non sono un esperto di C #, ma sembra che ci sia uno spazio bianco che potresti rimuovere.
DJMcMayhem

1
(Siamo spiacenti, non conosco l'etichetta di presentazione) Shorter G (): stringa statica pubblica G (int c, int r, char a) {return (0 <c && c <6 && 0 <r && r <6)? String.Concat (Enumerable.Range (1,29) .Seleziona (i => i% 6> 0? I / 6 == 5-r && i% 6 == c? A: '0': '\ n')): "Errore indice";}
Eric

2

05AB1E , 27 22 byte

Non restituisce alcuna griglia quando riga / colonna> 5.

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

Provalo online!

Versione precedente

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

2

Gelatina , 28 byte

Sembra troppo lungo ...

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

TryItOnline!

Come?

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

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

Perché amo la ricorsione. Lancia a ReferenceErrorsu coordinate non valide.


2

Mathematica, 38 byte

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

2

Brain-Flak 415 byte

Include +3 per -c

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

Provalo online!

Accetta prima il carattere da inserire, quindi la riga, quindi la colonna senza spazi.

La maggior parte di questo è solo la gestione degli errori. Brain-Flak non ha un buon modo per verificare se i valori sono compresi in un intervallo. Per errori, non genera nulla o solo il carattere che avrebbe dovuto essere inserito. La risoluzione del problema effettivo richiede solo 211 byte:

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

2

Excel VBA, 67 byte

Emette nell'intervallo A1: E5 sul foglio attivo del progetto vba, esce con

Errore di runtime "1004":

Errore definito dall'applicazione o definito dall'oggetto

quando viene fornito un input non valido.

Codice:

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

Output (dall'esempio sopra) :

    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 byte

golfed:

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

test:

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 / o rsono fuori limite, verrà emesso un messaggio, IndexOutOfRangeExceptionquindi potresti essere in grado di rimuovere la prima istruzione if anche se non ho verificato correttamente le specifiche. Puoi compilare un Func<int, int, char, string>per salvare byte, credo che devi aggiungere using System.Linq;a causa della Reversechiamata, anche se non riesco a ricordare in cima alla mia testa
TheLethalCoder

Passare 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);per salvare 4 byte
TheLethalCoder

1

WinDbg, 95 byte

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

Quasi la metà sta solo verificando che gli indici siano nell'intervallo ... L'input viene fatto impostando i psuedo-register $t0e $t1, $t2(dove $t2contiene il valore ASCII del carattere da sostituire). Per esempio,(2,5,*) come nell'esempio sarebbe:

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

stampe 0 in caso di errore.

Come funziona:

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

Uscita campione:

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 byte

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]

Esempio di utilizzo:

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

Se xe ysono entro la portata, anello esterno ed interno attraverso [1..5]e prendere il char cse colpisce il dato xed ye 0altrimenti. Se xo ynon rientra nell'intervallo, Non-exhaustive patternsviene sollevata un'eccezione.


1

Ottava 49 byte

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

1

QBIC , 53 50 byte

EDIT: Ora che so che non devo mostrare la griglia iniziale, ho scambiato gli input dell'utente _!_!_?con i parametri della riga di comando ::;, salvando 3 byte.

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

Versione originale: si interrompe tra la stampa della griglia 0 e il rilevamento delle coordinate per la sostituzione, mostrando la griglia 0.

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

Stampa 5 stringhe di 5 0', chiede all'utente 2 input numerici e 1 input stringa, controlla se i numeri sono <5 e usa la LOCATEfunzione di QBasic per sostituire il carattere giusto.


0

Java, 99 byte

(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

> <> (Pesce), 36 byte (non concorrenti)

1-$p;
00000
00000
00000
00000
00000

Provalo qui!

Questo è gestito da ponendo i parametri sullo stack come [ chr, y, x]. Uno degli zeri in basso viene effettivamente modificato chrdall'istruzionep . Probabilmente ci sono modi migliori per farlo, ma ho pensato che si trattasse di una situazione unica e divertente in cui questa funzione <>> è utile.

Spiegazione

Questo programma sottrae semplicemente 1 da x(come in> <>, 0sarebbe effettivamente la prima colonna), scambia xcon y, quindi cambia il punto della casella di codice x, yin chrvia p. ynon è necessario sottrarre 1 da esso, poiché il codice è già tutto compensato da 1!

Spiegazione non competitiva

Questo non è competitivo perché in realtà non produce output. Ho appena trovato questo estremamente divertente. Se questo è considerato un output valido, per favore fatemi sapere!

È anche non competitivo perché ypuò essere 0, ma credo che sia l'unico problema con la risposta. Risolverò se questo è considerato un output valido, ma per il resto, rende la risposta meno divertente ...


2
Se le risposte come questa sono sconsigliate, per favore fatemi sapere e lo cancellerò!
redstarcoder il

0

Bash, 59 byte

golfed

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

$ 1 , $ 2 - riga, colonna, $ 3 - carattere sostitutivo, l'errore viene segnalato tramite il codice di uscita

Test

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

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

0

Vim, 60 47 42 76 sequenze di tasti

L'input è nel formato (sulla prima riga):

25*

Con il cursore che inizia all'inizio

"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 l'input non è valido, genera: E492: Not an editor command: ^

Il cide che produce l'output è solo 42byte, ma per creare un errore, il mio byte viene aumentato drasticamente.


A proposito, non so come creare l'errore in Vim
Kritixi Lithos il

0

Java 8, 194 192 byte

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

Provalo qui con l'input corretto.
Provalo qui con un input errato.

Questo sarebbe 116 114 byte invece come funzione anziché come programma 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";}

Provalo qui.

Spiegazione:

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.