この三目並べボードを印刷してください!


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

ヘッダーに複数の数値を含めたい場合(たとえば、スコアが2つのファイルの合計である場合、またはインタープリターフラグのペナルティを個別にリストしたい場合)、実際のスコアがヘッダーの最後の数値であることを確認してください。

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

言語名をリンクにして、リーダーボードスニペットに表示することもできます。

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


書き込みの問題を回避するために、面倒なI / Oフォーマットがあります。入力形式を十分に柔軟にしてください。次回はサンドボックスをお試しください。
Erik the Outgolfer 2016年

1
@EriktheGolfer面倒?この入力フォーマットは明白で明白です
edc65

@ edc65つまり、これだけでなく、どのような形式でも入力を取得したいのですが、今のところ遅いと思います。見た目ははっきりしていると思いますが、全然対応できませんでした。なぜスペースを使用し、他のセパレータを使用しないのですか?
Erik the Outgolfer 2016年

1
@EriktheGolferは私を誤解しないでください、しかしあなたの超余分な難解な言語が空白を処理できない場合は、あまりにも悪い...今度は何か他のものを使わなければならないでしょう。
edc65

1
@ edc65たとえば、Sesosでは、入力データをロードすることさえかなり困難です。ように私は、整数(1つの移動のための3つのint)のリストを好む1 2 3ためのXb3(まさにそれである必要はありません)。
Erik the Outgolfer 2016年

回答:


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

3行目では、'sの前のスペースを削除できます
Daniel

Pythonゴルフへようこそ!見てください、Pythonのゴルフのヒントを;インデントを節約するためにすべてのコードを1行に配置できるようにすることで、ステートメントを分離できます。
xnor 2016年

for y in '123'-> for y in'123'。また、xnorの発言:関数をワンライナーにし;て、ステートメントを区切ることができます。これらすべてのゴルフのヒントを使用すると、6バイトをゴルフできます。
Erik the Outgolfer 2016年

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

行インデックスに対応して9行が印刷されますr。行インデックスは、以下からカウントアップされる3まで11execループ。各行は、|次の間を循環する3つの5文字のセグメントを結ぶ垂直線で構成されます。

  • 5つのスペース
  • 2つのスペース、プレーヤーシンボル、次に2つのスペース
  • 5つのアンダースコア

r%3最後の行にアンダースコアではなくスペースがあることを除いて、型はで循環しr%11%3ます。

現在のセルのプレーヤーシンボルを見つけるには、の行番号 r/3と列文字を確認c"abc"ます。それらを連結して、のような2文字の文字列を作成し、その文字列b3のインデックスを入力文字列で見つけて、シンボル(XまたはO)を1つ前に取得します。どちらのプレーヤーもそこでプレイしなかった場合、findはデフォルトでになり-1、に減少し-2ます。入力を受け取るときに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]2バイトでゴルフできますo[a[1]-97][a[2]-48]=a[0]
Kevin Cruijssen、

しかし、間違った出力であれば、そうではありませんか?
norganos

どういう意味ですか
RomanGräf2016年

出力フォーマットは、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.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.