Codegolf — Поместите Камень На Пустую Доску Для Го.

  • Автор темы Alex_kalina
  • Обновлено
  • 22, Oct 2024
  • #1

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

Задача

Го — настольная игра, в которой два игрока (черный и белый) расставляют камни на пересечениях линий сетки на доске размером 19х19. Черные ходят первыми — например, на D4:

       codegolf — поместите камень на пустую доску для го.

В этом задании вы должны взять координаты доски го, например

 
 STDOUT 
as input, and output an ASCII representation of a board with the first move played at the given point.

Обратите внимание, что столбца I нет. Исторически это делается для того, чтобы уменьшить путаницу с J и L.

Этот вывод состоит из 19 строк, каждая из которых содержит 19 символов. Точка с камнем на ней отмечена STDOUT . Empty points on the board are shown as T19 , кроме девяти звездные очкиa1 , STDIN , ................... ................... ................... ...*.....*.....O... ................... ................... ................... ................... ................... ...*.....*.....*... ................... ................... ................... ................... ................... ...*.....*.....*... ................... ................... ................... , Q16 , ................... ................... ................... ...*.....*.....*... ................... ................... ................... ................... ................... ...*.....*.....*... ................... ................... ................... ................... .....O............. ...*.....*.....*... ................... ................... ................... , F5 , * , Q16 , и Q10 ), which are marked Q4 .

Например, учитывая K16 as an input, your answer’s output must be:

K10

И учитывая K4 as input, your output must be:

D16

Правила

  • Вы можете написать функцию, которая принимает координату в качестве аргумента, или программу, которая считывает координату из командной строки или из командной строки. D10 .

  • Вы можете принять ввод как в нижнем, так и в верхнем регистре, но ваш ответ не обязательно должен обрабатывать оба регистра.

  • Входные данные всегда одна строка типа D4 or . , никогда не строка + число или две строки.

  • Если вы пишете полную программу, ваш ответ необходимо распечатать на O as a string, optionally followed by a trailing newline. If your answer is a function, you may print to D4 , или вернуть строку, или вернуть массив/список строк (строк), или вернуть двумерный массив или вложенный список символов.

  • Это . Побеждает самый короткий ответ в байтах.

#code-golf #code-golf #ascii-art #go

Alex_kalina


Рег
22 Mar, 2007

Тем
71

Постов
198

Баллов
613
  • 26, Oct 2024
  • #2

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

Сэкономлен 1 байт благодаря @FryAmTheEggman, 5 байт благодаря @orlp

Вызов

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 php go.php k13 
with the position to play (must be capitalized), and it prints out the resulting board.

php filename.php coordinate

Попробуйте на идеоне.

 

Ctolik


Рег
15 Apr, 2020

Тем
65

Постов
196

Баллов
541
  • 26, Oct 2024
  • #3

МАТЛ, 33 байта

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

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

Объяснение

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 ||answer||

С (ГЦК), 132 128 109

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

идея

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

 

AnabelDem


Рег
12 Jan, 2014

Тем
66

Постов
209

Баллов
549
  • 26, Oct 2024
  • #4

МАТЛАБ, 135 байт

Первая попытка, ничего умного, просто чтобы посмотреть, насколько лучше могут сделать другие:

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=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="")} ||answer||

Рубин, 93 91 байт

Принимает ввод в командной строке, например. 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 .

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)

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

без гольфа

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)0>100, print '*' *2a:/ av?% 'If (index%20)=0, print newline .37o<'.'< 'Otherwise, print '.' ||answer||

Идти, 319 286 байт

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

Наверное, игра в гольф немного бросила, я новичок

 

Cdsell


Рег
12 Apr, 2020

Тем
80

Постов
216

Баллов
646
  • 26, Oct 2024
  • #5

Рубин, 130 128 121 + 3 ( -join flag) = 124 bytes

Переключено $a[18..0] to A1 потому что 73 is one byte shorter than $x

$x ||answer||

Python, 148 145 136 130 121 119 116 байт

-3 байта благодаря @RootTwo

65

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

 

Volks


Рег
04 Sep, 2006

Тем
86

Постов
205

Баллов
645
  • 26, Oct 2024
  • #6

><>, 98 96 байт

O

Обратите внимание, что существует * in the first row after the first 3,9,15 и * between the $a=,(,'.'*19)*19 и первый $a[$_] of the last line. Попробуйте онлайн!

Вход отображается так, что 0..18 become 0 (где 0 обозначает воображаемый столбец «новой строки»), а номер целочисленной строки уменьшается на 1. Программа выполняет цикл от 379 до 0, выбирая по ходу символ из нижней строки (смещение на 15, чтобы учесть тот факт, что вы не можете ввести буквальную новую строку в поле кода). Новые строки проверяются через 19 , and star points are checked by $a .

 

Makht


Рег
23 Jun, 2007

Тем
77

Постов
193

Баллов
598
  • 26, Oct 2024
  • #7

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

$y

Хитрый этот... Интересно, можно ли его сделать покороче.

Редактировать: исправлена ​​ошибка, добавлены номера в некоторых местах, удалены номера в других, каким-то образом счетчик получился тот же. Возможно, позже попробую перетасовать цифры. Готово.

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

Edit3: исправлена ​​еще одна ошибка: теперь должно работать для частей последнего ранга, и мне каким-то образом удалось сохранить два байта, пока я этим занимаюсь.

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

 

Bekkeroff


Рег
22 Mar, 2020

Тем
92

Постов
206

Баллов
676
  • 26, Oct 2024
  • #9

Перл, 132 байта

-3 байта благодаря @Дом Гастингс

$args[0]

Принимает ввод командной строки. Потребности $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$_} tu run. For instance :

*

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

 

Kavs


Рег
27 Jun, 2009

Тем
62

Постов
184

Баллов
514
  • 26, Oct 2024
  • #10

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

.*

Объяснение: Начинается с запроса камня на стандартном вводе. Затем устанавливает переменные для каждого возможного столбца, чтобы он мог оценить первый символ камня как переменную и получить . coordinate. Subtracts 1 from the .* координата, потому что она имеет индекс 1, а нам нужен индекс 0, а также вычисляет o as it will need that later. Then, loops y от 18 до 0 для каждой строки. Берет строку x and extracts the character at the r эта позиция на потом. На ...*.....*.....*... th row, the r этот символ заменяется на z=y+1 . Finally, the x s заменяются на y plus the previously extracted character; this is a no-op on rows 4, 10 and 16 but this is the shortest way to achieve that. (I have to use @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%%% потому что замена $ 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 is apparently illegal in Batch.)

 

Shewcume56


Рег
23 Oct, 2006

Тем
59

Постов
199

Баллов
514
  • 26, Oct 2024
  • #11

PowerShell v2+, 157 152 байта

-M5.010

(Мне кажется, я столкнулся с каким-то странным сбоем с оператором-запятой, поэтому конструкция массива немного длиннее, чем должна быть)

Принимает ввод в виде строки в верхнем регистре через @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; , casts it as a char-array, stores the first letter into 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^$` а остальные буквы в 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".") . This effectively splits the input into letter/number.

Затем мы создаем наш многомерный массив ((i%20-1)%6)*((i/20)%6) == 9 . We pre-populate an array of size i % 20 == 0 с 1-19 s using the comma-operator. We then loop A-T сделать каждый элемент ^ equal instead an array of periods, again using the comma operator. (Примечание: теоретически это можно свести к 9 , but that doesn't seem to work right with the indexing assignment ... I wound up getting whole columns set to 0x19 )

Далее мы повторяем дважды ' to set the corresponding elements to 0x14 . Затем мы указываем его в нужном месте, чтобы установить камень. '_U'i-:b)-0\ +*a$%cv?(0:i< {*+{4*\+ +4gf-o>1-:?!;:{:}=3*&::aa+%::0=2*&+&6%1-}-aa+,6%{*9=& =9^^ . To do so, we subtract 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]] от ~/(.)(.+)/ 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 (i.e, ASCII "A" is 65, and we're zero-indexed), and subtracts an additional one using a Boolean-to-int cast if $_=b*$/ больше, чем puts b (i.e., ASCII "I").

Теперь наш вывод инвертирован (т. е. верхний левый угол будет -n ), so we need to reverse the array with -p . Наконец, мы выводим каждую строку -n ed together to form a string.

 

Максим Бродеско


Рег
23 Oct, 2020

Тем
80

Постов
185

Баллов
615
  • 26, Oct 2024
  • #12

><>, 124 байта

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

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}

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

Объяснение:

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

JavaScript, 138 байт

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

Возвращает массив строк. Объяснение:

$ ruby script.rb Q16 ||answer||

Р, 169 161 байт

go('T19')

С отступами и переводами строк:

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'

Использование:

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

Луа, 187 байт

'*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

Я не чувствую себя слишком плохо из-за 187 для этого конкретного проекта. Lua по-прежнему кажется очень неуклюжим для игры в гольф, но я очень горжусь тем, как далеко я могу с ним зайти.

 

Таб


Рег
20 Oct, 2008

Тем
68

Постов
217

Баллов
577
  • 26, Oct 2024
  • #13

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

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

Мой первый гольф.

Использование:
Сохраните как файл PHP и вызовите его с помощью 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);} e.g. f()

 

Krashar


Рег
22 Jun, 2009

Тем
73

Постов
186

Баллов
591
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно