Поместите камень на пустую доску Го

34

Смотрите также: Сделайте ход на доске Го .

задача

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
Поздравляю с 20к !!
Луис Мендо
2
«Это исторически, чтобы уменьшить путаницу с J и L.» Но оба J и L находятся на доске ??!
Fatalize
2
Ага. Кроме того, конечно, пропущенное письмо, вероятно, вызвало больше смятения и удивления, чем что-либо еще ...
Линн
2
@Fatalize, J и L выглядят довольно отчетливо, поскольку нижние части поворачиваются в разных направлениях. Как с j и l, один спускается, другой идет вверх. Но я и 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

С 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 .

owacoder
источник
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
Спасибо. Я искал способ уменьшить это выражение по модулю.
owacoder
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;}

Ideone

Функция, которая печатает плату на STDOUT. Требует, чтобы координата буквы была заглавной. Печать в одном цикле кажется немного короче, чем предыдущий подход с вложенным циклом.

FryAmTheEggman
источник
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')
user58321
источник
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. (Я думаю, это не имеет большого значения, но я просто хотел, чтобы вы знали)
Дада
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

Ungolfed

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
Советы по игре в гольф на Go. Я позволил себе применить их к вашему ответу сам.
ЭМБЛЕМА
Вы заметили, что комментарий "+1 за выбор языка" имеет больше голосов, чем сам пост? (бывает, что в комментариях больше голосов, но для такого комментария это довольно неожиданно)
Дада,
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 Возможно, но мне еще предстоит найти решение, которое делает это.
Value Ink
4

Python, 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]]

анонимная лямбда-функция, принимает ввод в форме «A1» (большие буквы) и выводит список списков символов (len == 1 строк в Python)

KarlKastor
источник
Сохраните 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.

Sp3000
источник
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
источник
О, это была проблема. Забавно, это то, на что я не смотрел дважды
asibahi
3

Retina , 134 129 122 байта

11 байтов спасибо Мартину Эндеру и за вдохновение еще 1.

S2=`
[K-S]
1$&
T`xL`d9d
.+
$*
$
aaab
a
bbbcbb
b|c
¶$0
c
ddd.
d
...*..
b
19$*.
1(1)*¶1(1)*¶((?<-2>.+¶)*(?<-1>.)*).
$3O
O^$`

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

Дрянная Монахиня
источник
2
Привет, поздравляю с вашим золотым значком!
Луис Мендо
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.010tử перспективе. Например :

$ 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), потому что он создает только один arrayref и копирует 19 раз ref, а не массив (так что в итоге у вас будет только 1 строка, дублированная 19 раз). Замена, @{..}как вы предложили, тоже не работает. Я предполагаю, что это потому, что я работаю над срезом, а не только над одним элементом. Если у вас есть другие предложения, не стесняйтесь! :)
Дада
1
Черт, конечно , было бы то же самое ... Я сумел использовать evalдля -3 , хотя: @v=eval"[('*')x19],"x19;. И вы на 100% правы с помощью arrayref ... Возможно ли использовать одномерный массив и рассчитать индекс? Поиграй с этим попозже!
Дом Гастингс
@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%%%

Пояснение: Начинается с запроса камня на стандартный ввод. Затем задает переменные для каждого возможного столбца, чтобы он мог оценить первый символ камня как переменную для получения yкоординаты. Вычитает 1 из xкоординаты, потому что она 1-проиндексирована, и мы хотим 0-индексировать, а также вычисляем, z=y+1как это потребуется позже. Затем циклы rот 18 до 0 для каждого ряда. Принимает строку ...*.....*.....*...и извлекает символ в rй позиции на потом. В xстроке yth символ th заменяется на 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]ее в массив символов, сохраняет первую букву $xи остальные буквы $y. Это эффективно разбивает ввод на буквы / цифры.

Затем мы строим наш многомерный массив $a. Мы предварительно заполнить массив размером 19с 0с использованием запятых-оператора. Затем мы делаем цикл, 0..18чтобы сделать каждый элемент $a[$_]равным массиву периодов, снова используя оператор запятой. (NB. Теоретически это должно быть сжато $a=,(,'.'*19)*19, но, похоже, это не сработает с заданием индексации ... В итоге я получил целые столбцы, установленные на* )

Затем мы дважды повторяем цикл, 3,9,15чтобы установить соответствующие элементы в *. Затем мы указываем на него в нужном месте, чтобы установить камень O. Для этого мы вычитаем 65из $x(т. Е. ASCII «A» равно 65, и мы проиндексированы с нулями), и вычитаем дополнительный, используя приведение типа Boolean-to-int, если $xоно больше чем73 (т. Е. ASCII «I» ).

Теперь наш вывод обратный (т. Е. Левый верхний угол A1), поэтому нам нужно повернуть массив с помощью $a[18..0]. Наконец, мы выводим каждую строку -joinвместе, чтобы сформировать строку.

AdmBorkBork
источник
2

> <> , 124 байта

Использует тот же подход, что и мой ответ C. На входе должна быть прописная буква, за которой следует десятичное число.

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 '.'
owacoder
источник
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 Массив строк допускается в качестве возвращаемого значения. Тем не менее, возможно, что мои строки и столбцы перепутаны, поэтому я проверю их еще раз.
Нил
Хм, действительно массив строк
Konijn
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.....*...
...................
...................
...................
...................
...................
...*.....*.....*...
...................
...................
...................
plannapus
источник
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 для этого конкретного проекта. Луа по-прежнему очень неуклюже относится к гольфу, но я очень горжусь тем, как далеко я могу зайти с ним.

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

gabe3886
источник