Покладіть камінь на порожню дошку Go


34

Дивіться також: Зробіть рух на дошці Go .

Завдання

Go - це настільна гра, де два гравці (Чорно-білий) розміщують камені на перетинах ліній сітки на дошці 19 × 19. Чорний рухається спочатку - наприклад, на D4:

       йти координати

У цьому виклику ви повинні взяти координату дошки Go на зразок D4входу та вивести ASCII-представлення дошки з першим кроком, відтвореним у даній точці.

Зауважимо, що немає колонки I. Це історично для зменшення плутанини з J та L.

Цей вихід складається з 19 рядків, кожен з яких містить 19 символів. Позначена точка з каменем на ній O. Порожні точки на платі показані ., за дев'ять крім зіркових точок (на D4, D10, D16, K4, K10, K16, Q4, Q10, і Q16), які відзначені *.

Наприклад, поданий F5як вхід, вихід вашої відповіді повинен бути:

...................
...................
...................
...*.....*.....*...
...................
...................
...................
...................
...................
...*.....*.....*...
...................
...................
...................
...................
.....O.............
...*.....*.....*...
...................
...................
...................

І даючи Q16як вхід, ваш вихід повинен бути:

...................
...................
...................
...*.....*.....O...
...................
...................
...................
...................
...................
...*.....*.....*...
...................
...................
...................
...................
...................
...*.....*.....*...
...................
...................
...................

Правила

  • Ви можете записати функцію, яка приймає координату як аргумент, або програму, яка зчитує координату з командного рядка або з STDIN.

  • Ви можете прийняти вхідні або малі, або великі, але у вашій відповіді не потрібно обробляти і те, і інше.

  • Вхід завжди - це один рядок, як a1або T19, ніколи - рядок + число або два рядки.

  • Якщо ви пишете повну програму, ваша відповідь повинна бути надрукована у STDOUTвигляді рядка, необов'язково після якого буде прокладено новий рядок. Якщо ваша відповідь є функцією, ви можете друкувати STDOUT, або  повертати рядок, або  повертає масив / список рядків (рядків), або  повертає двовимірний масив або вкладений список символів.

  • Це . Виграє найкоротша відповідь у байтах.


Просто напевне, "координата як аргумент" має на увазі, що ми не можемо приймати два аргументи, наприклад f("G", 14), правильно?
FryAmTheEggman

8
З повагою 20k !!
Луїс Мендо

2
"Це, історично, щоб зменшити плутанину з J та L." Але і J, і L є на дошці ??!
Фаталізувати

2
Так. Також, звичайно, пропущений лист, ймовірно, викликав більше плутанини та здивування, ніж будь-що…
Лінн

2
@ Фаталізувати, J і L виглядають досить виразно, оскільки нижні частини повертаються в окремі сторони. Як і j і l, один спускається, інший йде вгору. Але i i j трохи схожі, і так само я, l і я ...
ilkkachu

Відповіді:


9

MATL , 33 байти

'*O.'19: 6\4=&*Hj1&)Uw64-t8>-&(P)

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

Пояснення

'*O.'    % Push string with needed characters. Will be indexed into
19:      % Push numeric vector [1 2 ... 19]
6\4=     % 1 for values that equal 4 mod 6, 0 for the rest
&*       % Multiply by transposed version of itself with broadcast. This gives
         % the 19×19 board with 0 instead of '.' and 1 instead of '*'
H        % Push 2. This will correspond to 'O' (stone)
j        % Input string, such as 'Q16'
1&)      % Split into its first char ('Q') and then the rest ('16')
U        % Convert to number (16)
w        % Swap, to move 'Q' to top
64-      % Subtract 64. Thus 'A' gives 1, 'B' gives 2 etc
t8>-     % Duplicate. Subtract 1 if it exceeds 8. This corrects for missing 'I'
&(       % Fill a 2 at coordinates given by the number and the letter
P        % Flip upside down, because matrix coordinates start up, not down
)        % Index the string '*O.' with the 19×19 array containing 0,1,2.
         % Implicitly display

16

C, 212 195 193 181 171 132 103 98 байт

Збережено 1 байт завдяки @FryAmTheEggman, 5 байт завдяки @orlp

Зателефонуйте f()з позицією для гри (має бути з великої літери), і вона виведе друковану дошку.

i;f(char*p){for(i=380;i--;)putchar(i%20?i^20*atoi(p+1)+64-*p+(*p>72)?i%6^4|i/20%6^3?46:42:79:10);}

Спробуйте це на ideone .


2
98 байтputchar(i%20?i^20*atoi(p+1)+64-*p+(*p>72)?i%6^4|i/20%6^3?46:42:79:10)
orlp

Спасибі. Я шукав спосіб зменшити цей модульний вираз.
овакодер

9

C (gcc), 132 128 109

i;m;f(char*s){for(i=380;i--;putchar(m?m^84-*s+(*s>73)|(i/20+1)^atoi(s+1)?m%6^4|i/20%6^3?46:42:79:10))m=i%20;}

Ідеон

Функція, яка друкує дошку STDOUT. Вимагає, щоб координати літер були великими. Друк в одному циклі, здається, трохи коротший, ніж попередній вкладений цикл.


7

MATLAB, 135 байт

Перша спроба, нічого розумного, просто щоб побачити, наскільки краще можуть зробити інші:

function go(a)
b=repmat('.',19);
b(4:6:end,4:6:end)='*';
a=sscanf(a,'%c%d');
a(1)=a(1)-64;
if a(1)>8
a(1)=a(1)-1;
end
b(20-a(2),a(1))='0'

Використання:

go('T19')

4
Ласкаво просимо до PPCG! Деякі поради щодо зменшення байтів: використовуйте ім’я функції з 1 знаком (або сценарій з a=input('');); видалити нові рядки; перейти '*'на 42та '0'до 48; замінити endна 19; віднімати логічне значення безпосередньо замість ifгілки. Насправді ви можете замінити останні фінішні лінії наb(20-a(2),a(1)-64-(a(1)>8))=48
Луїс Мендо

Привіт і ласкаво просимо до PPCG. Якщо я не помиляюся, ваш код довжиною 137 байт і не 135. (Я думаю, це не має великого значення, але я просто хотів вас повідомити)
Dada

7

Рубі, 93 91 байт

Здійснює введення в командному рядку, наприклад $ ruby script.rb Q16.

19.downto(1){|c|puts ([*?A..?T]-[?I]).map{|d|d+c.to_s==$*[0]??O:"DKQ"[d]&&c%6==4??*:?.}*""}

Перевірте його на repl.it (загорнуте в лямбда там, оскільки repl.it не приймає аргументи командного рядка: https://repl.it/CkvT/1

Безумовно

19.downto(1) do |row|
  puts ([*?A..?T] - [?I]).map {|column|
    if column + row.to_s == ARGV[0]
      "O"
    elsif "DKQ"[column] && row % 6 == 4
      "*"
    else
      "."
    end
  }.join
}

Я думаю, ви можете зберегти байт, зробивши $><<замість цьогоputs . Не впевнений, хоча.
Фонд позову Моніки

@QPaysTaxes На жаль, мені доведеться десь додати новий рядок.
Йорданія

О, так. Не важливо
Судовий процес Фонду Моніки

6

Іди, 319 286 байт

import(."strconv"
."strings")
func g(c string)(s string){p:=SplitN(c,"",2)
n,_:=Atoi(p[1])
for i:=19;i>0;i--{
for j:= 'a';j<'t';j++{
if j=='i'{
}else if n==i&&ContainsRune(p[0],j){s+="o"
}else if((i==4||i==10||i==16)&&(j=='d'||j=='k'||j=='q')){s+="*"
}else{s+="."}}
s+="\n"}
return}

Напевно, гольф кинув трохи, я жебрак


Чи можете ви зберегти 9 символів, перейменувавши їх partна p?
corsiKa

Поради щодо гольфу в Го. Я взяв на себе сміливість застосувати їх до своєї відповіді.
EMBLEM

Ви помітили, що коментар "+1 для вибору мови" має більше відгуків, ніж сама публікація? (трапляється, що коментарі мають більше відгуків, але для такого коментаря це досить несподівано)
Dada

4

Ruby, 130 128 121 + 3 ( -nпрапор) = 124 байти

Переключено -pна, -nтому що puts bна один байт коротше, ніж$_=b*$/

~/(.)(.+)/
b=(1..19).map{?.*19}
(a=3,9,15).map{|i|a.map{|j|b[i][j]=?*}}
b[19-$2.to_i][([*?A..?T]-[?I]).index$1]=?o
puts b

Чи можете ви зберегти байти, перевіривши, чи індекс мод 6 дорівнює 3 замість жорсткого кодування 3, 9 та 15?
FryAmTheEggman

@FryAmTheEggman Можливо, але я ще не повинен знайти рішення, яке це робить.
Значення чорнила

4

Пітона, 148 145 136 130 121 119 116 Байт

-3 байти завдяки @RootTwo

lambda x,r=range(19):[[".*o"[[i%6==j%6==3,2][j==ord(x[0])-(x>"I")-65and-~i==int(x[1:])]]for j in r]for i in r[::-1]]

анонімна лямбда-функція, приймає введення форми "А1" (великі літери) та виводить список списків символів (len == 1 рядок у Python)


Збережіть 8 байт, використовуючи ".*oo"[2*(j==ord(x[0])-(x[0]>"I")-65and int(x[1:])==i+1)+(i%6==j%6==3)]замість"o"if...else"*"if...else"."
RootTwo

Також, я думаю, ви можете використовувати (x>'I')замість того, (x[0]>'I')щоб зберегти ще 3 байти.
RootTwo

@RootTwo Спасибі, перша пропозиція вже не корисна, оскільки я знайшов ще коротше рішення. Другий зараз здається очевидним і змушує задуматися, чому я не думав про це раніше.
КарлКастор

4

> <> , 98 96 байт

'_U'i-:b)-0\
+*a$%cv?(0:i<
{*+{4*\+
+4gf-o>1-:?!;:{:}=3*&::aa+%::0=2*&+&6%1-}-aa+,6%{*9=&
=9^^

Зауважте, що 0x14в першому рядку є перший після першого ', а 0x19між 9і до першого ^в останньому рядку. Спробуйте в Інтернеті!

Вхід відображається так, що A-Tстають 1-19(з 0 позначає уявний стовпець "новий рядок") і ціле число рядка зменшується на 1. Програма робить цикл від 379 вниз до 0, вибираючи таблицю з нижнього рядка, як йде ( змінено на 15, щоб врахувати той факт, що ви не можете ввести буквальний новий рядок у кодовому полі). Нові рядки перевіряються через i % 20 == 0, а зіркові точки перевіряються ((i%20-1)%6)*((i/20)%6) == 9.


4

F #, 241 237 225 216 214 211 байт

let G(c:string)=for k=1 to 380 do printf(if k%20=0 then"\n"elif"_ABCDEFGHJKLMNOPQRST".IndexOf c.[0]=k%20&&19-k/20=int(c.Substring 1)then"o"elif(k%20=4||k%20=10||k%20=16)&&(k/20=3||k/20=9||k/20=15)then"*"else".")

Хитрий один цей ... Цікаво, чи можна його скоротити.

Редагувати: виправлено помилку, додано номери, десь місця видалено, в інших місцях якимось чином закінчився однаковим рахунком. Можливо, спробуйте перетасувати номери пізніше Готово.

Edit2: збережено більше байтів, прописавши один із умов, інтуїтивно лічильник.

Edit3: Виправлена ​​ще одна помилка: повинна працювати зараз для фрагментів останнього рангу і мені вдалося зберегти два байти, поки я перебуваю на ній.

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


О, це була проблема. Смішно, це одне, на що я не дивився двічі
asibahi


3

Perl, 132 байти

-3 байти завдяки @Dom Hastings

@v=eval"[('.')x19],"x19;@{$v[$_]}[@t]=("*")x3for@t=(3,9,15);pop=~/\d+/;$v[19-$&][($t=ord$`)-65-($t>73)]=O;map{say}map{join"",@$_}@v;

Бере введення командного рядка. Потреби -M5.010бігти. Наприклад :

$ cat go_board.pl
@v=eval"[('.')x19],"x19;@{$v[$_]}[@t]=("*")x3for@t=(3,9,15);pop=~/\d+/;$v[19-$&][($t=ord$`)-65-($t>73)]=O;map{say}map{join"",@$_}@v;
$ perl -M5.010 go_board.pl Q16

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


Приємне використання більше магічних змінних знову! Я не перевірив це належним чином, але, думаю, ви можете зберегти ще кілька, @v=([(".")x18])x18;щоб ініціалізувати список ... Можливо, навіть буде кращий спосіб, ніж це, але я зараз не в терміналі! Я думаю, що ви також можете замінити @{...}розширення стрілками з перенаправленням: $v[$_]->[@t]хоча б знову не перевірено! Також я сподіваюся, що ви не заперечуєте проти того, щоб запропонувати зміни коду ...
Дом Гастінгс

1
@DomHastings Звичайно, я не заперечую, навпаки, я б закликав вас запропонувати поліпшення! @v=([(".")x19])x19не працює (я спробував це до btw), тому що він створює лише один масив, і він копіює 19 разів реф, а не масив (так що врешті-решт у вас є лише 1 рядок, дубльований 19 разів). Заміна, @{..}як ви запропонували, теж не працює. Я здогадуюсь це тому, що я працюю над фрагментом, а не лише одним елементом. Якщо у вас є якісь інші пропозиції, сміливо пропонуйте! :)
Дада

1
Чорт, звичайно , було б те ж саме ... Я зумів використати evalдля -3 , хоча: @v=eval"[('*')x19],"x19;. І ви на 100% правильні з arrayref ... Чи можливо можливо використовувати 1D масив і опрацювати індекс в цьому, хоча? Можна пограти з цим більше пізніше!
Дом Гастінгс

@DomHastings Дякую за -3 байти. Можливо, щось спробувати з 1D-масивом. Я спробую це скоро
Дада,

3

Пакетна, 322 310 308 байт

@echo off
set/pi=
set/aa=0,b=1,c=2,d=3,e=4,f=5,g=6,h=7,j=8,k=9,l=10,m=11,n=12,o=13,p=14,q=15,r=16,s=17,t=18,x=%i:~1%-1,y=%i:~,1%,z=y+1
for /l %%r in (18,-1,0)do call:l %%r
exit/b
:l
set s=...*.....*.....*...
call set t=%%s:~%1,1%%
if %x%==%1 call set s=%%s:~,%y%%%o%%s:~%z%%%
call echo %%s:.*=.%t%%%

Пояснення: Починається з підказки для каменю на stdin. Потім встановлює змінні для кожного можливого стовпця, щоб він міг оцінити перший символ каменю як змінну для отримання yкоординати. Віднімаємо 1 з xкоординати, тому що він 1-індексований, і ми хочемо 0-індексувати, а також обчислюємо, z=y+1як це знадобиться пізніше. Потім петлі rвід 18 до 0 для кожного ряду. Займає рядок ...*.....*.....*...і витягує символ у тій rпозиції для подальшого. У xтретьому ряду yсимвол th замінюється на an o. Нарешті, .*s замінюються .плюсом раніше вилученого символу; це необов’язковий варіант у рядках 4, 10 та 16, але це найкоротший спосіб досягти цього. (Я повинен використовувати.* оскільки *в Batch заміщення , очевидно, є незаконним.


2

PowerShell v2 +, 157 152 байти

$x,$y=[char[]]$args[0];$a=,0*19;0..18|%{$a[$_]=,'.'*19};3,9,15|%{$i=$_;3,9,15|%{$a[$_][$i]='*'}};$a[-join$y-1][$x-65-($x-gt73)]='O';$a[18..0]|%{-join$_}

(Я думаю, я зіткнувся з якоюсь дивною проблемою з комою-оператором, тому конструкція масиву трохи довша, ніж повинна бути)

Приймає введення як великі рядки через $args[0], передає їх як масив char, зберігає першу букву в, $xа інші літери - $y. Це ефективно розбиває введення на букву / цифру.

Потім ми побудуємо наш багатовимірний масив $a. Ми заздалегідь заповнюємо масив розміру 19з 0s за допомогою кома-оператора. Потім ми робимо цикл, 0..18щоб зробити кожен елемент $a[$_]рівним замість масиву періодів, знову використовуючи оператор коми. (Примітка. Теоретично це має бути у змозі бути скороченим $a=,(,'.'*19)*19, але це, здається, не справляється із призначенням індексування ... Я завершив отримання цілих стовпців, встановлених на* )

Далі двічі обводимо цикл, 3,9,15щоб встановити відповідні елементи *. Потім індексуємо його в потрібне місце, щоб встановити камінь O. Для цього ми віднімаємо 65з $x(тобто ASCII "A" дорівнює 65, і ми індексуємо нуль), і віднімаємо додатковий, використовуючи булевий бут-in-in, якщо $xбільший, ніж73 (тобто ASCII "I" ).

Тепер наш вихід обернений (тобто, лівий верхній край буде A1), тому нам потрібно повернути масив $a[18..0]. Нарешті, ми виводимо кожен рядок -joined разом, щоб утворити рядок.


2

> <> , 124 байти

Використовується точно такий же підхід, як і моя відповідь С. Вхідні дані повинні бути великими літерами з десятковим числом.

88*i:&-&'I')+0 v
*a&-'0'v!?)0:i&<+
+**2a&~/*a'&'&
:;!?:-1<o'O'v!?=&:&
{*?!v'*'o63.>:6%4=}:a4*+'x'%aa*)
*2a:/  av?%
.37o<'.'<

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

Пояснення:

88*i:&-&'I')+0 v         'Push 64-<first input char>+(<first input char> > 'I')
*a&-'0'v!?)0:i&<+        'Set register to 0, parse decimal integer into register.
+**2a&~/*a'&'&           'Pop the -1 (EOF) from stack, multiply register by 20.
                         'Add result of first line to register.
                         'Push 380 onto stack.
:;!?:-1<o'O'v!?=&:&      'Main loop, while top of stack is not 0.
                         'Subtract 1 from top of stack (loop counter)
                         'If current index is the playing piece index, print 'O'
{*?!v'*'o63.>:6%4=}:a4*+'x'%aa*) 
                         'If (index%6)=4 and (index+40)%120>100, print '*'
*2a:/  av?%              'If (index%20)=0, print newline
.37o<'.'<                'Otherwise, print '.'

1

JavaScript, 138 байт

s=>[...t="...*.....*.....*..."].map((c,i)=>t.replace(/\*/g,c).replace(/./g,(c,j)=>x-j|19-i-s.slice(1)?c:'o'),x=parseInt(s[0],36)*.944-9|0)

Повертає масив рядків. Пояснення:

s=>[...                         Parameter
 t="...*.....*.....*..."        Pattern of lines 4, 10 and 16
].map((c,i)=>                   Loop 19 times
 t.replace(/\*/g,c)             Change the `*` to `.` on other lines
  .replace(/./g,(c,j)=>         Loop over each character
   x-j|19-i-s.slice(1)?c:'o'),  Change to o at the appropriate position
 x=parseInt(s[0],36)*.944-9|0)  Compute the column number from the letter

Масив рядків просто не відповідає необхідному виводу join. Також він розміщує o в неправильному рядку та неправильному стовпчику для D5 (перший тестовий випадок).
Конінь

@tomdemuyt Масив рядків дозволений як повернене значення. Однак, можливо, я змішав рядки та стовпці, тому я ще раз перевірю.
Ніл

Хм, справді масив струн
Конінь

1

R, 169 161 байт

f=function(p){S=substr;N=rep(".",114);N[61+6*0:2]="*";M=matrix(N,19,19);M[(S(p,2,3):1)[1],which(LETTERS[-9]==S(p,1,1))]="O";for(i in 19:1)cat(M[i,],"\n",sep="")}

З відступами та новими рядками:

f=function(p){
    S=substr
    N=rep(".",114) # 6 lines of dots
    N[61+6*0:2]="*" # Place the hoshis
    M=matrix(N,19,19) # Make the 19x19 board using vector recycling
    M[(S(p,2,3):1)[1],  #grab and force coerce the row number to integer
      which(LETTERS[-9]==S(p,1,1))]="O" #Place the first stone
    for(i in 19:1) cat(M[i,],"\n",sep="")
}

Використання:

> f("A19")
O..................
...................
...................
...*.....*.....*...
...................
...................
...................
...................
...................
...*.....*.....*...
...................
...................
...................
...................
...................
...*.....*.....*...
...................
...................
...................
> f("D4")
...................
...................
...................
...*.....*.....*...
...................
...................
...................
...................
...................
...*.....*.....*...
...................
...................
...................
...................
...................
...O.....*.....*...
...................
...................
...................
> f("K10")
...................
...................
...................
...*.....*.....*...
...................
...................
...................
...................
...................
...*.....O.....*...
...................
...................
...................
...................
...................
...*.....*.....*...
...................
...................
...................

1

Луа, 187 байт

function g(i)i:gsub("(%a+)(%d+)",function(a,b)q=string.byte(a)-64 r=b+0 end)for x=1,19 do s=""for y=1,19 do s=s..(x+y*19==r+q*19 and"o"or(x-4)%6+(y-4)%6==0 and"*"or"-")end print(s)end end

Я не дуже погано відчуваю 187 для цього конкретного проекту. Луа все ще виходить дуже незграбним для Гольфінгу, але я дуже пишаюся тим, як далеко я можу зайти з цим.


1

PHP, 280 268 263 261 255 218 216 байт

<?php $a=ucfirst($argv[1]);$x=substr($a,0,1);$y=substr($a,1);$s=['DKQ',4,16,10];$i=85;while(64<$i--){$j=0;while($j++<20){echo($x==chr($i)&&$y==$j)?'O':((strpos($s[0],chr($i))>-1&&in_array($j,$s))?'*':'.');}echo"\n";}

Мій перший гольф.

Використання:
Збережіть як файл PHP і зателефонуйте, php filename.php coordinateнаприклад,php go.php k13

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