打印此井字游戏板!


9

这是一个井字游戏板:

   a     b     c
      |     |     
1  -  |  -  |  -  
 _____|_____|_____
      |     |     
2  -  |  -  |  -  
 _____|_____|_____
      |     |     
3  -  |  -  |  -  
      |     |     

给定一组动作,在印有令牌的板上打印。

输入将以空格分隔的移动形式输入,每个移动为:

  • 首先,将要使用的令牌
  • 接下来,它要继续前进的列的字母
  • 最后,它正在前进的行号

请注意,通常的井字游戏规则并不重要。

另外,也不需要打印字母和数字。

例如,输入Ob2 Xc2 Ob3 Xa1将导致

     |     |     
  X  |  -  |  -  
_____|_____|_____
     |     |     
  -  |  O  |  X  
_____|_____|_____
     |     |     
  -  |  O  |  -  
     |     |     

记住,这是 ,因此字节数最少的代码将获胜。

排行榜

这是一个堆栈片段,用于按语言生成常规排行榜和获胜者概述。

为确保您的答案显示出来,请使用以下Markdown模板以标题开头。

# Language Name, N bytes

N您提交的文件大小在哪里。如果您提高了分数,则可以通过打败旧分数保持标题。例如:

# Ruby, <s>104</s> <s>101</s> 96 bytes

如果要在标头中包含多个数字(例如,因为您的分数是两个文件的总和,或者您想单独列出解释器标志罚分),请确保实际分数是标头中的最后一个数字:

# Perl, 43 + 2 (-p flag) = 45 bytes

您还可以将语言名称设置为链接,然后该链接将显示在页首横幅代码段中:

# [><>](http://esolangs.org/wiki/Fish), 121 bytes


繁琐的I / O格式可避免编写挑战。请使您的输入格式足够灵活。下次尝试沙盒
暴民埃里克(Erik the Outgolfer)'16年

1
@EriktheGolfer麻烦吗?这种输入格式简单
明了

@ edc65我的意思是,我想获得任何格式的输入,不仅是这种格式,而且我想它已经很晚了。我认为您的意思是视觉上清晰,但我根本无法处理。为什么要空格而不是其他分隔符?
暴民埃里克(Erik the Outgolfer)'16年

1
@EriktheGolfer不会误会我的意思,但是如果您的超级深奥语言无法处理空格,那就太糟糕了……这次您将不得不使用其他方法。
edc65

1
@ edc65例如,在Sesos中,甚至很难加载输入数据。我宁愿整数列表(三级整数的一招),喜欢1 2 3Xb3(不必是正是)。
暴民埃里克

Answers:


7

的JavaScript(ES6),136个 133 129字节

let f =

i=>eval("for(y=9,s='';y--;s+=`\n`)for(x=18;--x;)s+=x%6-3|y%3-1?' __|'[x%6?y/3:3]||' ':i[i.search('cba'[x/6|0]+(10-y)/3)-1]||'-'")

console.log(f("Ob2 Xc2 Ob3 Xa1"))


5

Python(2.7), 188 180字节

def f(s):a,b=3*[' '*5],3*['_'*5];c,d,e=[['  '+dict((m[1:],m[0])for m in s.split(' ')).get(x+y,'-')+'  'for x in'abc']for y in'123'];print'\n'.join(map('|'.join,[a,c,b,a,d,b,a,e,a]))

在第三行中,您可以删除's 之前的空格
Daniel Daniel

欢迎使用python打高尔夫球!看一下Python高尔夫技巧。您可以通过;允许将所有代码放在一行上来节省缩进,从而分隔语句。
xnor

for y in '123'-> for y in'123'。另外,xnor说的是:您可以使函数成为单一函数,;用于分隔语句。使用所有这些打高尔夫球技巧,您可以打6个字节。
暴民埃里克

4

Python 2,112字节

s=input()+'- '
r=3;exec"print'|'.join([' '*5,'  %s  '%s[s.find(c+`r/3`)-1],'_'*5][r%11%3]for c in'abc');r+=1;"*9

对应于行索引打印九行r。行索引从向上计数311在一个exec循环。每行由垂直线组成,这些垂直线|连接三个5个字符的段,它​​们在以下之间循环:

  • 五个空间
  • 两个空格,一个玩家符号,然后两个空格
  • 五个下划线

该类型可与一起循环使用r%3,除了最后一行具有而不是下划线(由下划线表示)之外,使用来实现r%11%3

要查找当前单元格的玩家符号,我们来看看行数 r/3和列信c"abc"。我们将它们串联起来,形成一个两个字符的字符串,例如b3,在输入字符串中找到它的索引,然后更早地将符号(XO)作为一个索引。如果两个玩家都没有在那玩,find将会默认为-1,减为-2。当我们接受输入时,我们s[-2]-通过添加两个字符来破解。


1

PHP,187字节

<?for(;$i++<162;)$s.=$i%18?($i%6?($i<144&&$i%54>36?"_":($i<144&&$i%54>18&&$i%6==3?"-":" ")):"|"):"\n";foreach(explode(" ",$_GET[a])as$t)$s[20+6*(1+($t[1]<=>b))+54*($t[2]-1)]=$t[0];echo$s;

将输入作为字符串。如果我可以使用数组,可以将其简化为$_GET[a]而不是explode(" ",$_GET[a])

207字节

<?foreach(explode(" ",$_GET[a])as$t)$a[(1+($t[1]<=>b))+3*($t[2]-1)]=$t[0];for(;$i++<162;)$s.=$i%18?($i%6?($i<144&&$i%54>36?"_":" "):"|"):"\n";for(;$x<9;)$s[18+54*(($x/3)^0)+2+6*($x%3)]=$a[+$x++]??"-";echo$s;

创建此194字节的最简单方法

<?for(;++$i<10;)$s.=($i==9||$i%3?($i%3==2?"  -  |  -  |  -  ":"     |     |     "):"_____|_____|_____")."\n";foreach(explode(" ",$_GET[a])as$t)$s[20+6*(1+($t[1]<=>b))+54*($t[2]-1)]=$t[0];echo$s;

1

Mathematica,205个字节

StringReplacePart[a="     |     |     
";b="  -  |  -  |  -  
";c="_____|_____|_____
";{a,b,c,a,b,c,a,b,a}<>"",##]&@@Transpose[{#,{#,#}&[54LetterNumber@#2+6FromDigits@#3-39]}&@@@Characters/@StringSplit@#]&

如果我可以使用内置...(92字节),这会更短

Grid@SparseArray[{LetterNumber@#2,FromDigits@#3}->#&@@@Characters/@StringSplit@#,{3,3},"-"]&

1

Java,138个字节

编辑:

  • -2个字节。感谢@Kevin Kruijssen

片段:

m->{char[][]o=new char[3][3];for(char[]a:m)o[a[1]-'a'][a[2]-'0']=a[0];for(char[]a:o)System.out.println(a[0]+'|'+a[1]+'|'+a[2]+"\n-----");}

码:

public static void tictactoe(char[][]moves){
  char[][]o=new char[3][3];
  for(char[]a:moves){
    o[a[1]-79][a[2]-48]=a[0];
  }
  for(char[]a:o){
    System.out.println(a[0]+'|'+a[1]+'|'+a[2]+"\n-----");
  }
}

o[a[1]-'a'][a[2]-'0']=a[0]可以打两个字节到o[a[1]-97][a[2]-48]=a[0]
凯文·克鲁伊森

但是如果输出错误,不是吗?
norganos

你是什​​么意思
罗曼·格拉夫(RomanGräf)

输出格式与OP要求的格式不同。
seshoumara

1

分批,341个 339 305 287字节

@for %%a in (a1 a2 a3 b1 b2 b3 c1 c2 c3)do @set %%a=-
@for %%a in (%*)do @set s=%%a&call call set %%s:~1%%=%%s:~0,1%%
@set s="     |     |     "
@for %%l in (%s% "  %a1%  |  %b1%  |  %c1%" %s: =_% %s% "  %a2%  |  %b2%  |  %c2%" %s: =_% %s% "  %a3%  |  %b3%  |  %c3%" %s%)do @echo %%~l

假定输出一致。编辑:通过删除不必要的空间节省了2个字节。通过使用for循环写入输出节省了34个字节。通过消除子程序节省了18个字节。


0

Autovim,110个字节(不竞争)

试驾Autovim ...这几乎是Vimscript的答案。不竞争,因为仍在开发Autovim。

ñ5i ␛a|␛ÿp3hr-phv0r_⌥v$kkyPPy2jPP$⌥vG$xGđkÿjp
…nsplit(@m)
ñğ0(@n[2]*3-2)j((char2nr(@n[1])-96)*6-4)lr(@n[0])
e…

要运行它:

./bin/autovim run tictactoe.autovim -ni -@m "Ob2 Xc2 Ob3 Xa1"

取消高尔夫:

execute "normal 5i \<esc>a|\<esc>yyp3hr-phv0r_\<c-v>$kkyPPy2jPP$\<c-v>G$xGddkyyjp"
for @n in split(@m)
execute "normal gg0".(@n[2]*3-2)."j".((char2nr(@n[1])-96)*6-4)."lr".(@n[0]).""
endfor

如果有兴趣,请遵循以下说明:)


0

Groovy,174字节

{s->def r=0,o,t=[:];s.split(' ').each{t[it[1..2]]=it[0]};9.times{y->o='';17.times{x->o+=x%6==5?'|':y in [2,5]?'_':x%6==2&&y%3==1?t['abc'[r++%3]+(y+2)/3]?:'-':' '};println o}}

松散:

{s->
    def r=0, o, t=[:];
    s.split(' ').each{
        t[it[1..2]]=it[0]
    };
    9.times{y->
        o='';
        17.times{x->
            o+= x%6==5 ? '|' : y in [2,5]? '_' : x%6==2 && y%3==1 ? t['abc'[r++%3]+(y+2)/3]?:'-' : ' '
        };
        println o
    }
}

0

CJam,62个字节

" -_ -_ - "_'-Ser_+_@\]3*sqS/{)~\)'a-F*@+3*G+\t}/9/5/'|9*a*zN*

在线尝试

说明:

" -_ -_ - "_'-Ser_+_@\]3*s e# Build a 135 character string representing the 
                           e# columns of the board (top to bottom, left to right)
qS/{)~\)'a-F*@+3*G+\t}/    e# Process the input, put the tokens (O,X) in the string
                           e# The tokens have to placed at indexes 
                           e# [19 22 25 64 67 70 109 112 115]
                           e# This is done with the formula 3*(15x+y)+16,
                           e# where x is the code point of the column letter 
                           e# (minus 'a') and y is the row number.
9/5/'|9*a*zN*              e# Split into its parts, add the column separators, zip 
                           e# and join with newlines.
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.