Grille ASCII art code golf

19

Défi

Créez le programme le plus court qui répond aux exigences

Exigences

  1. Le code doit générer une grille 5x5 de 0, comme ceci:

    00000
    00000
    00000
    00000
    00000
    
  2. Le code doit accepter une entrée (colonne, ligne, caractère). La grille doit changer en conséquence:

    Début:

    00000
    00000
    00000
    00000
    00000
    

    Contribution:

    (2,5,*)
    

    Production:

    0*000
    00000
    00000
    00000
    00000
    

    (Remarque: le coin inférieur gauche est en position 1,1.)

  3. Le programme doit retourner un message d'erreur autre que la grille si l'entrée de ligne / colonne est pas 1,2,3,4 ou 5. Cela peut être un message de votre choix (tant que ce n'est pas la grille), donc 0est une sortie d'erreur acceptable.

  4. Le programme doit fonctionner avec tous les caractères ASCII imprimables (d'un clavier américain).

LE GAGNANT

Le gagnant sera la personne possédant le code le plus court et remplissant toutes les conditions. Si plusieurs réponses fonctionnent et ont la même longueur (la plus courte), la personne qui a répondu en premier sera la gagnante.

Dave Jones
la source
8
Le programme doit renvoyer un message d'erreur . Quel message d'erreur? Le programme peut-il retourner 0pour l'erreur et la grille pour réussir?
Rod
1
Où est l'origine sur la matrice? doit-il être zéro ou un indexé?
George
3
Soit dit en passant, bienvenue chez PPCG.
Erik the Outgolfer
4
Le programme doit fonctionner avec tous les caractères du clavier américain. Pourquoi pas seulement ASCII? Je ne connais même pas les caractères d'un clavier américain, et cela n'ajoute rien au défi
Luis Mendo
1
@LuisMendo Je pense que le clavier américain est ASCII, ou est au moins un sous-ensemble.
Conor O'Brien

Réponses:

11

Dyalog APL , 17 13 10 octets

Demande un tableau fermé contenant (ligne, colonne) puis un caractère. Donne INDEX ERROR sur une entrée défectueuse.

⊖⍞@⎕⊢5 50

Essayez-le en ligne!

 retourner le résultat de

 caractère entré

@ remplacement du contenu en position

 entrée-évaluée (ligne, colonne fermée)

 de

5 5⍴ 5 × 5 tableau de

0 zéros

Adam
la source
Est nécessaire? Je pense que dans ce cas, c'est redondant.
Conor O'Brien
1
@ ConorO'Brien @ ConorO'Brien s'il n'est pas là, l'analyseur voit (⊂⎕)5 5comme un seul tableau à 3 éléments - l'argument de .
Adám
C'est 13 caractères Unicode, pas 13 octets, n'est-ce pas?
wilx
1
@wilx Cliquez sur le mot octets !
Adám
Cette réponse est la gagnante.
Dave Jones
5

Ruby, 157 149 octets

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

Erreur sur une entrée mal formée ou en position hors limite

Merci à ConorO'Brien (8 octets) et afuous (2 octets) pour avoir aidé à économiser des octets

TuxCrafting
la source
loop do...end-> loop{...}; Je pense que ça Array.new(5,[0]*5)marche aussi, ou même [*[0]*5]*5.
Conor O'Brien
@ ConorO'Brien Nope, Array.new(5,[0]*5)faites un tableau de référence et [*[0]*5]*5faites un tableau plat
TuxCrafting
Oh, c'est vrai. Omettez le premier *. Ensuite, cela crée toujours un tableau de références.
Conor O'Brien
Array.new(5){[0]*5}peut être remplacé par (1..5).map{[0]*5}pour économiser 2 octets.
afuous
4

Lot, 199 octets

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

Erreurs hors si la position est hors de portée.

Neil
la source
Je pense que vous pouvez utiliser des symboles pour <, comme ^<. pas sûr.
Conor O'Brien
3

PHP, 111 100 97 octets

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

s'imprime Esi la ligne / colonne est hors plage.
Courir avecphp -r <code> <row> <column> <character>

Titus
la source
3

Python, 66 octets

lambda a,b,n,l='00000\n':6>b>0<a<6and(5-b)*l+l[:a-1]+n+l[a:]+~-b*l
Barre
la source
Cela ne va-t-il pas échouer pour a = 4, b = 3?
Titus
@Titus no longer; D
Rod
1
La solution fonctionne également pour Python3
George
3

Dyalog APL, 24 20 18 octets

4 octets enregistrés grâce à Zgarb! Sauvegardé 2 octets grâce à Adam!

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

Invite à entrer. Voir ci-dessous pour une explication.


20 octets

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

Attribuez à une fonction et appelez-la y x f 'c'. Par exemple:

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

Explication

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

{...}est une fonction avec un argument de gauche et un argument de droite . sépare les instructions, il y a donc trois instructions:

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

La première déclaration des a←5 5⍴0ensembles aà une 5par 5grille de 0s.

La deuxième déclaration définit le membre aux coordonnées dictées par à (qui est, le caractère).

Enfin, nous effectuons sur aet retour qui, ce qui donne les premières d' ainversion.

Conor O'Brien
la source
{a←5 5⍴0⋄a[⊂⌽⍺]←⍵⋄⊖a}enregistre quelques octets.
Zgarb
@Zgarb Oh, fantastique! Je ne savais pas que l'indexation fonctionnait comme ça.
Conor O'Brien
Vous pouvez économiser deux octets en convertissant en un corps tradfn:a←5 5⍴0⋄a[⊂⎕]←⍞⋄⊖a
Adám
@ Adám comment ça marche? Il ne semble pas fonctionner sur TryAPL.
Conor O'Brien
@ ConorO'Brien Droite. TryAPL interdit de demander des entrées, mais vous pouvez obtenir la version complète gratuitement.
Adám
3

JavaScript (ES6), 73 76 octets

Lance un TypeErrorsi la colonne ou la ligne est hors limites.

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

Démo

Arnauld
la source
Doux, mais cela renvoie-t-il une erreur si l'un cou l' autre rest inférieur à 1?
ETHproductions
@ETHproductions Ce ne sont que des tests c == 0 || r == 0. Mais je suppose que vous avez raison: je vais le mettre à jour pour éviter les valeurs négatives.
Arnauld
3

C #, 199 octets

D'après la réponse 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());}

Non 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
    }
marksfrancis
la source
Bienvenue sur le site! Je ne suis pas un expert en C #, mais il semble qu'il y ait un espace à supprimer.
DJMcMayhem
1
(Désolé, je ne sais pas l'étiquette de soumission) G plus court (): chaîne statique publique G (int c, int r, char a) {return (0 <c && c <6 && 0 <r && r <6)? String.Concat (Enumerable.Range (1,29). Sélectionnez (i => i% 6> 0? I / 6 == 5-r && i% 6 == c? A: '0': '\ n')): "Erreur d'index";}
Eric
2

05AB1E , 27 22 octets

Ne renvoie aucune grille lorsque ligne / colonne> 5.

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

Essayez-le en ligne!

La version précédente

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

Gelée , 28 octets

Cela semble beaucoup trop long ...

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

TryItOnline!

Comment?

Ṫ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
la source
2

JavaScript (ES6), 89 octets

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

Parce que j'aime la récursivité. Lance un ReferenceErrorsur des coordonnées invalides.

ETHproductions
la source
2

Mathematica, 38 octets

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

Brain-Flak 415 octets

Comprend +3 pour -c

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

Essayez-le en ligne!

Prend le caractère à insérer en premier, puis la ligne puis la colonne sans espaces.

La plupart de cela n'est qu'une gestion des erreurs. Brain-Flak n'a pas un bon moyen de vérifier si les valeurs sont dans une plage. Pour les erreurs, il ne génère rien, ou simplement le caractère qui devait être inséré. La résolution du problème réel ne prend que 211 octets:

<>(()()()()()){({}[()]<(((((((((()()()){}){}){}){})))))((()()()()()){})>)}{}{}<>({}<()((((((()()()){}){}()){}){}()[{}])({})({})({})({}){}{}[((((()()()){}){}){}){}()]){({}[()]<<>({}<>)>)}{}<>{}>)<>{({}<>)<>}<>
Riley
la source
2

Excel VBA, 67 octets

Sorties vers la plage A1: E5 sur la feuille active du projet vba, quitte avec

Erreur d'exécution '1004':

Erreur définie par l'application ou définie par l'objet

lorsqu'une entrée non valide est fournie.

Code:

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

Usage:

a 4,5,"#"

Sortie (de l'exemple ci-dessus) :

    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
la source
1

C #, 208 octets

Golfé:

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

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

Essai:

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
la source
Si cet / ou rsont hors limites, cela lancera un IndexOutOfRangeExceptionafin que vous puissiez supprimer la première instruction if même si je n'ai pas vérifié correctement les spécifications pour cela. Vous pouvez compiler en un Func<int, int, char, string>pour économiser des octets, je crois que vous devez l'ajouter using System.Linq;à cause de l' Reverseappel, même si je ne me souviens pas du haut de ma tête
TheLethalCoder
Changer d[r - 1] = d[r - 1].Substring(0, c - 1) + a + d[r - 1].Substring(c);pour d[--r] = d[r].Substring(0, c - 1) + a + d[r].Substring(c);enregistrer 4 octets
TheLethalCoder
1

WinDbg, 95 octets

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

Près de la moitié de juste les indices sont en vérifiant dans la plage ... L' entrée est fait en réglant les registres de pseudo- $t0, $t1et $t2(où $t2détient la valeur ascii du charbon pour remplacer). Par exemple, (2,5,*)comme l'exemple serait:

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

Imprime 0en cas d'erreur.

Comment ça fonctionne:

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

Exemple de sortie:

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
Lait
la source
1

Haskell, 77 octets

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]

Exemple d'utilisation:

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

Si xet ysont à portée, boucle extérieure et intérieure à travers [1..5]et prendre le charbon csi elle touche la donnée xet yet un 0autre. Si xou yn'est pas à portée, une Non-exhaustive patternsexception est levée.

nimi
la source
1

Octave 49 octets

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

QBIC , 53 50 octets

EDIT: Maintenant que je sais que je n'ai pas besoin d'afficher la grille de départ, j'ai échangé les entrées utilisateur _!_!_?pour les paramètres de ligne de commande ::;, économisant 3 octets.

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

Version originale: Cela s'arrête entre l'impression de la grille 0 et la prise des coordonnées pour la substitution, montrant la grille 0.

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

Imprime 5 chaînes de 5 0, demande à l'utilisateur 2 entrées numériques et 1 entrée de chaîne, vérifie si les nombres sont <5 et utilise la LOCATEfonction de QBasic pour remplacer le bon caractère.

steenbergh
la source
0

Java, 99 octets

(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
la source
0

> <> (Fish), 36 octets (non concurrents)

1-$p;
00000
00000
00000
00000
00000

Essayez-le ici!

Ceci est exécuté en plaçant les paramètres sur la pile comme [ chr, y, x]. L'un des zéros en bas est en fait changé chrpar l'instruction p. Il existe probablement de meilleures façons de le faire, mais je pensais que c'était une situation unique et divertissante où cette fonctionnalité> <> était utile.

Explication

Ce programme soustrait simplement 1 de x(comme dans> <>, 0serait en fait la première colonne), échange xavec y, puis change le point de la boîte de code x, yen chrvia p. yn'a pas besoin d'en soustraire 1, car le code est déjà entièrement compensé par 1!

Explication non concurrente

Ce n'est pas concurrent car il ne produit pas réellement de sortie. Je viens de trouver cela extrêmement amusant. Si cela est considéré comme une sortie valide, faites-le moi savoir!

Il est également non concurrent car il ypeut être égal à 0, mais je pense que c'est le seul problème avec la réponse. Je vais corriger si cela est considéré comme une sortie valide, mais sinon, cela rend la réponse moins divertissante ...

redstarcoder
la source
2
Si des réponses comme celle-ci sont découragées, faites-le moi savoir et je les supprimerai!
redstarcoder
0

Bash, 59 octets

Golfé

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

$ 1 , $ 2 - ligne, colonne, $ 3 - caractère de remplacement, l'erreur est signalée via le code de sortie

Tester

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

>./box 6 2 '*'     
>echo $?
1
Zeppelin
la source
0

Vim, 60 47 42 76 touches

L'entrée est au format (sur la première ligne):

25*

Avec le curseur commençant au début

"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 l'entrée n'est pas valide, lance alors: E492: Not an editor command: ^

Le cide qui produit la sortie n'est que des 42octets, mais afin de créer une erreur, mon octet est considérablement augmenté.

Kritixi Lithos
la source
BTW Je ne sais pas comment créer l'erreur dans Vim
Kritixi Lithos
0

Java 8, 194 192 octets

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

Essayez-le ici avec une entrée correcte.
Essayez-le ici avec une entrée incorrecte.

Ce serait plutôt 116 114 octets en tant que fonction au lieu du programme complet:

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

Essayez-le ici.

Explication:

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
la source