在空的Go板上放置一块石头


34

另请参阅:在Go板上移动

任务

Go是一种棋盘游戏,两名玩家(黑白)将石头放在19×19棋盘的网格线相交处。黑色先行-例如,在D4上:

       去坐标

在此挑战中,您必须像D4输入棋盘一样进入棋盘坐标,并输出棋盘的ASCII表示,并在给定点进行第一步移动。

请注意,没有列I。从历史上看,这是为了减少与J和L的混淆。

此输出包含19行,每行包含19个字符。标有石头的点已标记O。在板空点被示出为.,除了九个星点(在D4D10D16K4K10K16Q4Q10,和Q16),其被标记*

例如,F5作为输入,您答案的输出必须为:

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

而鉴于Q16作为输入,你的输出必须是:

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

规则

  • 您可以编写将坐标作为参数的函数,或者编写从命令行或从中读取坐标的程序STDIN

  • 您可以选择以小写或大写形式接受输入,但是您的答案不需要同时处理这两种情况。

  • 输入始终是单个字符串,例如a1T19,决不能是字符串+数字或两个字符串。

  • 如果编写完整的程序,则答案必须打印STDOUT为字符串,并可以选择在其后跟换行符。如果您的答案是函数,则可以打印到STDOUT或者  返回一个字符串,或者  返回一个字符串/行列表(行),或者  返回一个二维数组或嵌套的字符列表。

  • 这是。以字节为单位的最短答案将获胜。


可以肯定的是,“将坐标作为参数”是指我们不能接受两个参数,例如f("G", 14),对吗?
FryAmTheEggman

8
恭喜20k !!
路易斯·门多

2
“从历史上看,这是为了减少与J和L的混淆。” 但是J和L都在棋盘上?!
致命

2
是的 另外,当然,这封丢失的信可能比什么都引起了更多的混乱和惊奇……
Lynn

2
@ Fatalize,J和L看起来很不同,因为下部朝着不同的方向旋转。与j和l一样,一个下降,另一个上升。但是我和j有点相似,所以我,l和我...
ilkkachu

Answers:


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字节

@FryAmTheEggman节省了1个字节,@ orlp节省了5个字节

打电话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

谢谢。我一直在寻找一种减少模数表达的方法。
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;}

伊迪奥

将板子打印到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; 替换end19; 直接减去逻辑值而不是if分支。实际上,您可以用b(20-a(2),a(1)-64-(a(1)>8))=48
路易斯·门多

嗨,欢迎来到PPCG。如果我没记错的话,您的代码长137个字节,而不是135个字节。(我想这没什么大不了,但我只是想让您知道)
Dada

7

Ruby,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不接受命令行参数,因此包装在lambda中: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 las,那么我必须在某处附加一个换行符。
约旦

哦是的 没关系
基金莫妮卡的诉讼

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个字partp
corsiKa

Go中打高尔夫球的技巧。我本人可以自由地将它们应用于您的回答。
EMBLEM

您是否注意到“ +1语言选择”这一评论比帖子本身具有更多的赞誉?(碰巧评论有更多的赞誉,但是对于这样的评论,这是出乎意料的)
Dada

4

红宝石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

您是否可以通过检查索引mod 6是否为3而不是对3、9和15进行硬编码来保存字节?
FryAmTheEggman'8

@FryAmTheEggman可能,但是我还没有找到解决方案。
价值墨水

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

匿名lambda函数,采用形式“ A1”(大写字母)的输入,并输出字符列表的列表(Python中len == 1字符串)


使用".*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'8

另外,我认为你可以使用(x>'I'),而不是(x[0]>'I')保存3个字节。
RootTwo 2016年

@RootTwo谢谢,第一个建议不再有用,因为我找到了一个更短的解决方案。现在第二个似乎很明显,这使我提出疑问,为什么我以前没有想到这一点。
KarlKastor '16

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第一行之后的第一行中有一个',最后一行0x199和之间^有一个。在线尝试!

输入被映射为A-T变为1-19(用0表示一个假想的“换行”列),并且整数行号递减1。程序从379向下循环到0,并从最下面的行中选择一个char(偏移15,以说明您无法在代码框中输入文字换行符的事实)。通过检查换行符,通过检查i % 20 == 0星点((i%20-1)%6)*((i/20)%6) == 9


4

F#,241237225216214211字节

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".")

棘手的这个……我想知道它是否可以缩短。

编辑:修复了一个错误,在某些地方添加了数字,在其他地方删除了数字,以某种方式最终得到了相同的计数。可能会在稍后的 Done中尝试改组数字

Edit2:通过拼写条件条件之一来节省更多字节,直观地进行反算。

Edit3:修复了另一个错误:现在应该可以处理最后一个等级的文件,并且设法以某种方式节省了两个字节。

在线尝试


哦,那是问题所在。有趣的是,这是我没两次
看过

3

视网膜134个 129 122字节

感谢马丁·恩德(Martin Ender)提供了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.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]不过再次未经测试!我也希望你不要介意我建议更改代码...
Dom Hastings

1
@DomHastings当然,我不介意,相反,我希望鼓励您提出改进建议!@v=([(".")x19])x19不起作用(我在btw之前尝试过),因为它仅创建一个arrayref,并且它复制ref是该数组的19倍,而不复制该数组(因此最后您只有1行重复了19次)。@{..}按照您的建议进行替换似乎也不起作用。我猜这是因为我正在处理一个切片,而不仅仅是一个元素。如果您还有其他建议,请随时提出建议!:)
达达(Dada)

1
该死的,当然是一样的... eval尽管我设法在-3 上使用过:@v=eval"[('*')x19],"x19;。而且您对arrayref的看法是100%正确的……也许可以使用一维数组并计算出索引吗?以后再玩吧!
Dom Hastings

@DomHastings感谢-3个字节。实际上,也许可以尝试一维阵列。我会尽快尝试的
达达

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坐标。从x坐标中减去1,因为它是1索引的,而我们希望是0索引的,并且也进行计算z=y+1,因为以后需要它。然后,r每行从18 循环到0。取得字符串...*.....*.....*...并在第rth个位置提取字符以供以后使用。在第xth行,第y个字符被替换为o。最后,将.*s替换.为之前提取的字符plus;这是第4、10和16行上的禁止操作,但这是实现此目的的最短方法。(我必须使用.*因为*批量替换显然是非法的。)


2

PowerShell v2 +,157152字节

$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。我们使用逗号运算符预填充大小190的数组。然后,我们再次使用逗号运算符循环0..18使每个元素$a[$_]相等,而不是一个句点数组。(注意-从理论上讲,这应该可以简化为$a=,(,'.'*19)*19,但这似乎不适用于索引分配...我最终将整个列都设置为*

接下来,我们循环两次3,9,15以将相应的元素设置为*。然后,我们在正确的位置对其进行索引以设置石头O。为此,我们65从中减去$x(即ASCII“ A”为65,并且我们从零开始索引),并且在布尔转换为int的情况下减去另一个$x大于73(即ASCII“ I” )。

现在,我们的输出反转了(即,左上角将是A1),因此我们需要使用反转数组$a[18..0]。最后,我们将每行-joined一起输出以形成一个字符串。


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

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的错误行和错误列中(第一个测试用例)。
Konijn

@tomdemuyt允许使用字符串数组作为返回值。但是,可能我的行和列混合在一起,所以我将仔细检查。
尼尔

嗯,确实是字符串数组
Konijn

1

R,169161字节

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

Lua,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并不感到遗憾。Lua对于打高尔夫球仍然很笨拙,但是我为它能走多远而感到自豪。


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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.