空のGoボードに石を置きます


34

関連項目:Goボードで移動する

仕事

Goは、2人のプレイヤー(黒と白)が19×19のボード上のグリッド線の交点に石を置くボードゲームです。黒が最初に移動します—たとえば、D4で:

       行く座標

この課題では、D4入力としてGoボード座標を取得し、指定されたポイントで最初の動きが再生されたボードのASCII表現を出力する必要があります。

列Iがないことに注意してください。これは、歴史的に、JとLとの混乱を減らすためです。

この出力は19行で構成され、各行には19文字が含まれています。石のあるポイントがマークされていOます。ボード上の空のポイントは次のように示されている.9つのを除き、スターポイント(でD4D10D16K4K10K16Q4Q10、とQ16マークされています)、 *

たとえばF5、入力として指定された場合、回答の出力は次のようになります。

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

そしてQ16、入力として与えられる、あなたの出力は以下でなければなりません:

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

ルール

  • 引数として座標を取得する関数、またはコマンドラインまたはから座標を読み取るプログラムを作成できますSTDIN

  • 小文字または大文字で入力を受け入れることもできますが、答えは両方を処理する必要はありません。

  • 入力は常にa1またはのような単一の文字列でT19、文字列+数値または2つの文字列ではありません。

  • 完全なプログラムを作成する場合、回答はSTDOUT文字列として出力する必要があり、オプションで末尾に改行が続きます。あなたの答えが関数である場合は、に印刷することができSTDOUTまたは  文字列を返す、または  文字列(行)の配列/リストを返す、または  二次元配列または文字のネストされたリストを返します。

  • これはです。バイト単位の最短回答が優先されます。


ただ確かに、「引数としての座標」は、のような2つの引数を取ることができないことを意味するのf("G", 14)ですか?
FryAmTheEggman

8
20kおめでとうございます!!
ルイスメンドー

2
「これは歴史的に、JとLとの混乱を減らすためです。」しかし、JとLの両方がボードにいますか??!
16

2
うん。また、もちろん、行方不明の手紙はおそらく何よりも多くの混乱と驚きを引き起こした…
リン

2
@ Fatalize、JとLは、下の部分が別々の方向に回転するため、まったく異なって見えます。jとlのように、一方が下降し、もう一方が上昇します。しかし、iとjは少し似ており、i、lとIも同様です
。– 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

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に出力する関数。文字座標は大文字である必要があります。1つのループでの印刷は、以前のネストされたループアプローチよりもわずかに短いようです。


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。置き換えるendことで19if分岐の代わりに論理値を直接減算します。実際、最後の5行を次のように置き換えることができますb(20-a(2),a(1)-64-(a(1)>8))=48
ルイスメンドー

こんにちは、PPCGへようこそ。誤解がない場合、コードは135バイトではなく137バイトです(あまり重要ではないと思いますが、お知らせしたいと思います)
ダダ

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

非ゴルフ

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}

おそらくゴルファーは少しやめました、私は初心者です


に名前partを変更して9文字を保存できますpか?
corsiKa

Goでのゴルフのヒント。私はあなた自身の答えにそれらを適用する自由を取りました。
エンブレム

「言語の選択に+1」というコメントには、投稿自体よりも多くの賛成票があることに気づきましたか?(コメントにはより多くの賛成票があることがありますが、そのようなコメントの場合、それは予想外です)
ダダ

4

Ruby、130 128 121 + 3(-nフラグ)= 124バイト

切り替え-p-nするのでputs bより1バイト短いです$_=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、9、15のハードコーディングではなく3であるかどうかを確認することでバイトを節約できますか?
FryAmTheEggman 16

@FryAmTheEggmanそれはそうかもしれませんが、私はまだそうする解決策を見つけていません。
バリューインク

4

パイソン、148 145 136 130 121 119 116のバイト

@RootTwoのおかげで-3バイト

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"(大きな文字)の形式の入力を受け取り、文字リスト(Pythonではlen == 1文字列)のリストを出力します。


を使用して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 16

@RootTwoおかげで、最初の提案はもう役に立たなくなりました。2番目のものは今明らかであるように思われ、なぜ私はこれを以前に考えなかったのか疑問に思います。
カールカストール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^^

0x14firstの後の最初の行にはがあり、最後の行の最初'と最初の行の0x19間にあることに注意してください。オンラインでお試しください!9^

入力は(0は仮想の「改行」列を示す)にA-Tなるようにマッピングされ1-19、整数の行番号は1ずつ減らされます。コードボックスにリテラルの改行を入力できないという事実を考慮して、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:条件の1つをつづり、直感的に反論することで、より多くのバイトを節約しました。

編集3:別のバグを修正しました:最後のランクの作品で今すぐ動作するはずで、どうにかして2バイトを節約できました。

オンラインで試す


ああ、それが問題でした。おかしい、それは私が二度見なかった一つのことです
-asibahi


3

Perl、132バイト

@Dom Hastingsのおかげで-3バイト

@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.010tuの実行が必要です。例えば ​​:

$ 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を1つだけ作成し、配列ではなくrefの19倍をコピーするためです(結局、1行だけが19回複製されます)。@{..}あなたが提案したように置き換えることもうまくいかないようです。これは、1つの要素だけでなく、スライスで作業しているためだと推測しています。他に提案があれば、気軽に提案してください!:)
ダダ

1
くそー、もちろんそれは同じだろう...私は使用に管理しているevalため-3かかわら:@v=eval"[('*')x19],"x19;。そして、あなたはarrayrefで100%正しいです... 1D配列を使用して、その中でインデックスを計算することはおそらく可能ですか?あとでこれで遊ぶかもしれません!
ドムヘイスティングス

@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座標を取得できるようにします。x1がインデックス付けされているため、座標から1を減算します。0インデックス付けz=y+1が必要であり、後で必要に応じて計算します。次に、r各行で18から0までループします。文字列...*.....*.....*...を取得し、r後で使用するためにth番目の位置の文字を抽出します。上x行目、y目の文字が置き換えられo。最後に、.*ある、sがa.プラスで抽出された文字にます。これは、行4、10、および16で何もしませんが、これを実現する最短の方法です。(使用する必要があります.*交換*は明らかにバッチでは違法だからです。)


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ます。我々のサイズの事前移入配列190カンマ演算子を使用して、S。次に、ループの代わりに、コンマ演算子を使用0..18して各要素$a[$_]をピリオドの配列に等しくします。(NB-理論的には、これはに凝縮できるはず$a=,(,'.'*19)*19ですが、それはインデックスの割り当てでは正しく機能しないようです...列全体をに設定することになりました*

次に、3,9,15対応する要素をに設定するために2回ループし*ます。次に、適切な場所でインデックスを作成して、石を設定しOます。そうするために、我々は引く65から$x(すなわち、ASCII「A」65であり、我々はしているゼロのインデックス)、および場合ブール・ツー・int型キャストを使用して追加の1を減算$xよりも大きい73(すなわち、ASCII「I」 )。

ここで、出力が逆になります(つまり、左上がになりますA1)ので、配列を逆にする必要があり$a[18..0]ます。最後に、-join文字列を形成するために一緒に各行を出力します。


2

> <>、124バイト

私のCの答えとまったく同じアプローチを使用します。入力は、大文字とそれに続く10進数でなければなりません。

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の間違った行と間違った列に配置します(最初のテストケース)。
コニン

@tomdemuyt文字列の配列は戻り値として許可されます。ただし、行と列が混同される可能性があるため、再確認します。
ニール

うーん、確かに文字列の配列
コニン

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についてはあまり気になりません。ルアはまだゴルフに非常に不格好であるように見えますが、私はそれがどこまでできるかをかなり誇りに思っています。


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

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