Сетка 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ошибку и таблицу успеха?
Род
1
Где находится источник на матрице? это должно быть ноль или один индексированный?
Георгий
3
Добро пожаловать в PPCG, кстати.
Эрик Outgolfer
4
Программа должна работать со всеми символами на клавиатуре США. Почему не только ASCII? Я даже не знаю символов американской клавиатуры, и это ничего не добавляет к вызову
Луис Мендо
1
@ LuisMendo Я думаю, что американская клавиатура ASCII, или, по крайней мере, подмножество.
Конор О'Брайен

Ответы:

11

Дьялог АПЛ , 17 13 10 байт

Запрашивает закрытый массив, содержащий (строка, столбец), а затем символ. Выдает ОШИБКУ ИНДЕКСА при неправильном вводе.

⊖⍞@⎕⊢5 50

Попробуйте онлайн!

 перевернуть вверх дном результат

 введенный символов

@ замена контента на позиции

 оцененный ввод (вложенная строка, столбец)

 из

5 5⍴ 5 × 5 массив

0 нули

Адам
источник
Является ли необходимым? Я думаю, что в этом случае это избыточно.
Конор О'Брайен,
1
@ ConorO'Brien @ ConorO'Brien, если его там нет, синтаксический анализатор видит (⊂⎕)5 5как один массив из 3 элементов - аргумент для .
Адам
Это 13 символов Юникода, а не 13 байтов, не так ли?
Wilx
1
@wilx Нажмите на слово байтов !
Адам
Этот ответ является победителем.
Дэйв Джонс
5

Рубин, 157 149 байт

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 байта) за помощь в сохранении байтов

TuxCrafting
источник
loop do...end-> loop{...}; Я думаю Array.new(5,[0]*5), что работает тоже или даже [*[0]*5]*5.
Конор О'Брайен
@ ConorO'Brien Нет, Array.new(5,[0]*5)создайте массив ссылок и [*[0]*5]*5создайте плоский массив
TuxCrafting
О верно. Опущу первое *. Тогда это все еще создает массив ссылок.
Конор О'Брайен
Array.new(5){[0]*5}может быть заменен на, (1..5).map{[0]*5}чтобы сохранить 2 байта.
afuous
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>

Titus
источник
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?
Тит
@ Титуса больше нет; D
Род
1
Решение также работает для Python3
джордж
3

Дьялог АПЛ, 24 20 18 байт

Сохранено 4 байта благодаря Zgarb! Благодаря Адаму сэкономлено 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устанавливает aв 5по 5сетке 0с.

Второй оператор устанавливает элемент в точке с координатами , диктуемых к (то есть, характер).

Наконец, мы выполняем на aи вернуться , что, получая от нововведений aвспять.

Конор О'Брайен
источник
{a←5 5⍴0⋄a[⊂⌽⍺]←⍵⋄⊖a} сохраняет несколько байтов.
Згарб
@ Zgarb О, фантастика! Я не знал, что индексация работает так.
Конор О'Брайен
Вы можете сохранить два байта, преобразовав в тело tradfn: a←5 5⍴0⋄a[⊂⎕]←⍞⋄⊖a
Adám
@ Adám как это работает? Кажется, он не работает на TryAPL.
Конор О'Брайен
@ ConorO'Brien Верно. TryAPL запрещает запрашивать ввод, но вы можете получить полную версию бесплатно.
Адам
3

JavaScript (ES6), 73 76 байт

Выдает a, TypeErrorесли столбец или строка находятся вне диапазона.

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

демонстрация

Arnauld
источник
Сладкий, но выдает ли ошибка, если один cили rменьше 1?
ETHproductions
@ETHproductions Это только тестирование c == 0 || r == 0. Но я думаю, что вы правы: я буду обновлять его, чтобы предотвратить отрицательные значения.
Арно
3

C #, 199 байт

На основании ответа Пита Ардена

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
    }
marksfrancis
источник
Добро пожаловать на сайт! Я не эксперт в 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). Выберите (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неправильные координаты.

ETHproductions
источник
2

Mathematica, 38 байт

(x=Table[0,5,5];x[[-#2,#]]=#3;Grid@x)&
ngenisis
источник
2

Brain-Flak 415 Bytes

Включает +3 для -c

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

Попробуйте онлайн!

Сначала вводится символ, затем строка, затем столбец без пробелов.

Большая часть этого - просто обработка ошибок. У Brain-Flak нет хорошего способа проверить, находятся ли значения в диапазоне. Для ошибок он либо ничего не выводит, либо просто символ, который должен был быть вставлен. Решение актуальной проблемы занимает всего 211 байт:

<>(()()()()()){({}[()]<(((((((((()()()){}){}){}){})))))((()()()()()){})>)}{}{}<>({}<()((((((()()()){}){}()){}){}()[{}])({})({})({})({}){}{}[((((()()()){}){}){}){}()]){({}[()]<<>({}<>)>)}{}<>{}>)<>{({}<>)<>}<>
Райли
источник
2

Excel VBA, 67 байт

Выходы в диапазон A1: E5 в активном листе проекта vba, выход с

Ошибка времени выполнения «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 байт

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

Тестирование:

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вызова, хотя я не могу вспомнить до
предела
Изменить, 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
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

Если xи yнаходятся в пределах досягаемости, внешний и внутренний цикл проходят [1..5]и принимают символ, cесли он попадает в заданное, xи, yи 0иначе. Если xили yне находится в диапазоне, возникает Non-exhaustive patternsисключение.

Ними
источник
1

Октава 49 байт

@(c,r,s)char(accumarray([6-r c],s+0,[5 5],[],48))
rahnema1
источник
1

QBIC , 53 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, и использует LOCATEфункцию QBasic для замены правильного символа.

steenbergh
источник
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

Попробуй это здесь!

Это выполняется путем размещения параметров в стеке , как [ chr, y, x]. Один из нулей внизу фактически заменен chrинструкцией p. Возможно, есть лучшие способы сделать это, но я подумал, что это уникальная и интересная ситуация, когда эта функция> <> полезна.

объяснение

Эта программа просто вычитает 1 из x(как в> <>, 0фактически будет первым столбцом), обменивается xс y, а затем изменяет точку кодовой коробки x, yна chrvia p. yне нужно вычитать из него 1, так как код уже смещен на 1!

Неконкурентное объяснение

Это неконкурентоспособно, потому что на самом деле это не дает результата. Я просто нашел это чрезвычайно забавным. Если это считается действительным выводом, пожалуйста, дайте мне знать!

Это также неконкурентоспособно, потому что yможет быть 0, но я считаю, что это единственная проблема с ответом. Я исправлю, если это будет считаться действительным выводом, но в противном случае ответ будет менее интересным ...

redstarcoder
источник
2
Если такие ответы не приветствуются, пожалуйста, дайте мне знать, и я удалю их!
Redstarcoder
0

Баш, 59 байт

Golfed

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

Cide, который производит вывод, является только 42байтами, но для того, чтобы создать ошибку, мой счет байта резко увеличен.

Kritixi Lithos
источник
Кстати, я не знаю, как создать ошибку в 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
Кевин Круйссен
источник