Сітка арт-коду ASCII гольф


19

Виклик

Створіть найкоротшу програму, яка відповідає вимогам

Вимоги

  1. Код повинен генерувати 5x5 сітку 0s, наприклад:

    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.
Ерік Аутгольфер

4
він повинен працювати з усіма символами на клавіатурі США Чому б не просто ASCII? Я навіть не знаю персонажів американської клавіатури, і це не додає нічого складного
Луїс Мендо

1
@LuisMendo Я думаю, що клавіатура США - це ASCII, або принаймні підмножина.
Конор О'Браєн

Відповіді:


11

Діалог APL , 17 13 10 байт

Запрошення для вкладеного масиву, що містить (рядок, стовпець), а потім символ. Подає помилку INDEX на несправному введенні.

⊖⍞@⎕⊢5 50

Спробуйте в Інтернеті!

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

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

@ заміна змісту в позиції

 оцінюваний вхід (додається рядок, стовпець)

 з

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

0 нулі


Чи потрібно? Я думаю, що в цьому випадку це зайве.
Conor O'Brien

1
@ ConorO'Brien @ ConorO'Brien якщо його немає, аналізатор розглядає (⊂⎕)5 5як єдиний 3-елементний масив - аргумент .
Adám

Це 13 символів Unicode, а не 13 байт, чи не так?
wilx

1
@wilx Клацніть на байті слова !
Adám

Ця відповідь є переможцем.
Дейв Джонс

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 байтів) та негідний (2 байти) за допомогу в збереженні байтів


loop do...end-> loop{...}; Я думаю Array.new(5,[0]*5), що теж працює, або навіть [*[0]*5]*5.
Conor O'Brien

@ ConorO'Brien Nope, Array.new(5,[0]*5)зробіть масив посилань і [*[0]*5]*5складіть плоский масив
TuxCrafting

О, так. Пропустіть перше *. Потім це все ще створює масив посилань.
Conor O'Brien

Array.new(5){[0]*5}можна замінити, (1..5).map{[0]*5}щоб зберегти 2 байти.
невдалий

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%

Помилки, якщо позиція знаходиться поза діапазоном.


Я думаю, ви можете використовувати символи для <, наприклад ^<. не впевнений, Тхо.
Conor O'Brien

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>



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 О, фантастично! Я не знав, що індексація працює так.
Conor O'Brien

Ви можете зберегти два байти, перетворившись на тіло tradfn:a←5 5⍴0⋄a[⊂⎕]←⍞⋄⊖a
Adám

@ Adám, як це працює? Схоже, це не працює на TryAPL.
Conor O'Brien

@ ConorO'Brien Right. 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``

Демо


Солодкий, але чи видає це помилка, якщо 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());}

Безголівки:

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
    }

Ласкаво просимо на сайт! Я не фахівець з 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¤
-ÑÇ?

СпробуйтеItOnline!

Як?

Ṫ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на недійсні координати.



2

Мозок-Флак 415 байт

Включає +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 байт

Гольф:

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

Безголівки:

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так, що ви, можливо, зможете видалити перше, якщо заява, хоча я не перевірив специфікації для цього належним чином. Ви можете компілювати до а, Func<int, int, char, string>щоб зберегти байти, я вважаю, що вам потрібно додати using System.Linq;через Reverseдзвінок, хоча я не можу згадати вгорі голови
TheLethalCoder

Змініть, 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

QBIC , 53 50 байт

EDIT: Тепер, коли я знаю, що не потрібно показувати стартову сітку, я поміняв користувацькі введення _!_!_?на параметри командного рядка ::;, заощадивши 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's, запитує у користувача 2 числові входи та 1 рядок введення, перевіряє, чи є числа <5, і використовує LOCATEфункцію QBasic для підстановки потрібного символу.



0

> <> (Риба), 36 байт (не конкуруючий)

1-$p;
00000
00000
00000
00000
00000

Спробуйте тут!

Це виконується шляхом розміщення параметрів у стек , як [ chr, y, x]. Одне з нулів на дні насправді змінюється chrінструкцією p. Напевно, є кращі способи зробити це, але я подумав, що це унікальна і захоплююча ситуація, коли ця <<> функція корисна.

Пояснення

Ця програма просто віднімає 1 з x(як в> <>, 0буде фактично перший стовпець), свопи xз y, а потім змінює точку CodeBox x, yв с chrдопомогою p. yне потрібно 1 відняти від нього, так як код уже все зміщено на 1!

Неконкурентне пояснення

Це неконкурентоспроможне, оскільки воно фактично не дає результату. Мені це здалося надзвичайно кумедним. Якщо це вважається дійсним результатом, будь ласка, повідомте мене!

Це також є неконкурентом, оскільки yможе бути 0, але я вважаю, що це єдине питання з відповіддю. Я виправлю, якщо це вважається дійсним результатом, але в іншому випадку це просто робить відповідь менш цікавою ...


2
Якщо подібні відповіді не рекомендують, будь ласка, повідомте мене, і я видалю його!
redstarcoder

0

Баш, 59 байт

Гольф

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

Вим, 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: ^

Сид, який видає вихід, є лише 42байтами, але для того, щоб створити помилку, мій байтовий рахунок різко збільшується.


До речі, я не знаю, як створити помилку у 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.