Tempatkan batu di papan Go kosong


34

Lihat juga: Bergerak di papan Go .

Tugas

Go adalah permainan papan di mana dua pemain (Hitam dan Putih) menempatkan batu di persimpangan garis kisi pada papan 19 × 19. Hitam bergerak lebih dulu - misalnya, pada D4:

       pergi koordinat

Dalam tantangan ini, Anda harus mengambil koordinat Go board seperti D4sebagai input, dan mengeluarkan representasi ASCII dari papan dengan gerakan pertama yang dimainkan pada titik yang diberikan.

Perhatikan bahwa tidak ada kolom I. Ini, secara historis, untuk mengurangi kebingungan dengan J dan L.

Output ini terdiri dari 19 baris, masing-masing berisi 19 karakter. Titik dengan batu di atasnya ditandai O. Poin kosong di papan ditampilkan sebagai ., kecuali untuk sembilan poin bintang (di D4, D10, D16, K4, K10, K16, Q4, Q10, dan Q16), yang ditandai *.

Misalnya, diberikan F5sebagai input, output jawaban Anda harus:

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

Dan diberikan Q16sebagai input, output Anda harus:

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

Aturan

  • Anda dapat menulis fungsi yang menggunakan koordinat sebagai argumen, atau program yang membaca koordinat dari baris perintah atau dari STDIN.

  • Anda dapat memilih untuk menerima input baik dalam huruf kecil atau huruf besar, tetapi jawaban Anda tidak perlu menangani keduanya.

  • Input selalu berupa string tunggal seperti a1atau T19, tidak pernah string + angka atau dua string.

  • Jika Anda menulis program lengkap, jawaban Anda harus dicetak STDOUTsebagai string, secara opsional diikuti oleh baris baru. Jika jawaban Anda adalah fungsi, Anda dapat mencetak ke STDOUT, atau  mengembalikan string, atau  mengembalikan array / daftar string (baris), atau  mengembalikan array dua dimensi atau daftar karakter bersarang.

  • Ini adalah . Jawaban terpendek dalam byte menang.


Hanya untuk memastikan, "koordinat sebagai argumen" dimaksudkan untuk menyiratkan bahwa kita tidak dapat mengambil dua argumen, seperti f("G", 14), benar?
FryAmTheEggman

8
Selamat atas 20rb !!
Luis Mendo

2
"Ini, secara historis, untuk mengurangi kebingungan dengan J dan L." Tapi baik J dan L ada di papan tulis ??!
Fatalkan

2
Ya. Juga, tentu saja, surat yang hilang itu mungkin menyebabkan lebih banyak kebingungan dan kejutan daripada apa pun ...
Lynn

2
@Fatalize, J dan L terlihat sangat berbeda karena bagian bawah berputar ke arah yang berbeda. Seperti halnya j dan l, satu turun, yang lain naik. Tapi aku dan aku agak mirip, dan aku, aku dan aku ...
ilkkachu

Jawaban:


9

MATL , 33 byte

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

Cobalah online!

Penjelasan

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

Disimpan 1 byte berkat @FryAmTheEggman, 5 byte terima kasih kepada @orlp

Panggilan f()dengan posisi untuk bermain (harus ditulis dengan huruf besar), dan ia mencetak papan yang dihasilkan.

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

Cobalah di ideone .


2
98 byteputchar(i%20?i^20*atoi(p+1)+64-*p+(*p>72)?i%6^4|i/20%6^3?46:42:79:10)
orlp

Terima kasih. Saya sedang mencari cara untuk mengurangi ekspresi modulo itu.
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;}

Ideone

Fungsi yang mencetak papan ke STDOUT. Membutuhkan surat koordinat untuk menjadi modal. Mencetak dalam satu loop tampaknya sedikit lebih pendek daripada pendekatan loop bersarang sebelumnya.


7

MATLAB, 135 byte

Upaya pertama, tidak ada yang pintar, hanya untuk melihat seberapa baik yang bisa dilakukan orang lain:

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'

Pemakaian:

go('T19')

4
Selamat datang di PPCG! Beberapa saran untuk mengurangi byte: gunakan nama fungsi dengan 1 char (atau skrip dengan a=input('');); hapus baris baru; mengubah '*'ke 42dan '0'ke 48; ganti enddengan 19; kurangi nilai logis langsung bukan ifcabang. Bahkan, Anda dapat mengganti jalur lima terakhir olehb(20-a(2),a(1)-64-(a(1)>8))=48
Luis Mendo

Hai dan selamat datang di PPCG. Jika saya tidak salah, kode Anda panjangnya 137 byte dan bukan 135. (saya kira itu tidak masalah, tapi saya hanya ingin memberi tahu Anda)
Dada

7

Ruby, 93 91 byte

Mengambil input pada baris perintah, mis $ 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??*:?.}*""}

Uji di repl.it (dibungkus lambda di sana karena repl.it tidak mengambil argumen baris perintah: https://repl.it/CkvT/1

Tidak disatukan

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
}

Saya pikir Anda dapat menyimpan byte dengan melakukan $><<alih - alih puts . Tapi tidak yakin.
Dana Gugatan Monica

@ QPaysTaxes Alas, saya harus menambahkan baris baru di suatu tempat, kalau begitu.
Jordan

Oh ya Tidak apa
Mendanai Gugatan Monica

6

Pergi, 319 286 byte

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}

Mungkin golf sedikit berhenti, saya pemula


Bisakah Anda menyimpan 9 karakter dengan mengubah nama partmenjadi p?
corsiKa

Kiat untuk bermain golf di Go. Saya mengambil kebebasan menerapkannya pada jawaban Anda sendiri.
EMBLEM

Apakah Anda memperhatikan bahwa komentar "+1 untuk pilihan bahasa" memiliki lebih banyak semangat daripada pos itu sendiri? (Kebetulan komentar memiliki lebih banyak upvotes, tetapi untuk komentar seperti itu, itu agak tak terduga)
Dada

4

Ruby, 130 128 121 + 3 ( -nflag) = 124 byte

Beralih -pke -nkarena puts blebih pendek satu byte dari$_=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

Bisakah Anda menyimpan byte dengan memeriksa apakah mod mod 6 adalah 3 bukannya hardcoding 3, 9 dan 15?
FryAmTheEggman

@FryAmTheEggman Mungkin, tapi saya belum menemukan solusi yang melakukannya.
Value Ink

4

Python, 148 145 136 130 121 119 116 Bytes

-3 Bytes berkat @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]]

fungsi lambda anonim, mengambil input dari bentuk "A1" (huruf besar) dan menampilkan daftar daftar karakter (len == 1 string dengan Python)


Simpan 8 byte dengan menggunakan ".*oo"[2*(j==ord(x[0])-(x[0]>"I")-65and int(x[1:])==i+1)+(i%6==j%6==3)]bukan"o"if...else"*"if...else"."
RootTwo

Juga, saya pikir Anda dapat menggunakan (x>'I')daripada (x[0]>'I')menyimpan 3 byte lebih banyak.
RootTwo

@ BootTwo Terima kasih, saran pertama tidak lagi berguna, karena saya telah menemukan solusi yang lebih pendek. Yang kedua sekarang tampak jelas dan membuat saya mempertanyakan mengapa saya belum memikirkan ini sebelumnya.
KarlKastor

4

> <> , 98 96 byte

'_U'i-:b)-0\
+*a$%cv?(0:i<
{*+{4*\+
+4gf-o>1-:?!;:{:}=3*&::aa+%::0=2*&+&6%1-}-aa+,6%{*9=&
=9^^

Perhatikan bahwa ada 0x14baris pertama setelah baris pertama ', dan baris 0x19antara 9dan baris pertama ^. Cobalah online!

Input dipetakan sehingga A-Tmenjadi 1-19(dengan 0 menunjukkan kolom "baris baru" imajiner) dan nomor baris integer dikurangi oleh 1. Program melakukan loop dari 379 ke 0, memilih char dari baris bawah saat berjalan ( diimbangi dengan 15, untuk memperhitungkan fakta bahwa Anda tidak dapat memasukkan baris baru literal dalam kotak kode). Baris baru diperiksa melalui i % 20 == 0, dan titik bintang diperiksa oleh ((i%20-1)%6)*((i/20)%6) == 9.


4

F #, 241 237 225 216 214 211 byte

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

Yang rumit yang satu ini ... Saya ingin tahu apakah ini bisa dibuat lebih pendek.

Sunting: memperbaiki bug, menambahkan nomor beberapa tempat menghapus nomor di tempat lain, entah bagaimana berakhir dengan jumlah yang sama. Mungkin mencoba mengacak-acak angka di sekitar nanti Selesai.

Sunting2: menyimpan lebih banyak byte dengan mengeja salah satu kondisional, melawan secara intuitif.

Sunting3: Memperbaiki bug lain: harus berfungsi sekarang untuk potongan-potongan pada peringkat terakhir dan berhasil menyelamatkan dua byte saat saya melakukannya, entah bagaimana.

Cobalah online


Oh itu masalahnya. Lucu, itu adalah satu hal yang tidak saya lihat dua kali
asibahi

3

Retina , 134 129 122 byte

11 byte terima kasih kepada Martin Ender, dan untuk inspirasi 1 lagi.

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^$`

Cobalah online!


2
Hei, selamat atas lencana emasmu!
Luis Mendo

3

Perl, 132 byte

-3 byte terima kasih @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;

Mengambil input baris perintah. Kebutuhan-M5.010 jalankan. Contohnya :

$ 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

Saya pikir ini bisa lebih pendek, tapi saya tidak tahu bagaimana ... tolong beri tahu saya jika Anda melakukannya!


Penggunaan variabel ajaib yang lebih baik lagi! Saya belum menguji ini dengan benar, tetapi saya pikir Anda dapat menyimpan lebih banyak dengan @v=([(".")x18])x18;menginisialisasi daftar ... Bahkan mungkin ada cara yang lebih baik dari itu, tapi saya tidak di terminal sekarang! Saya pikir Anda dapat mengganti @{...}ekspansi dengan panah dereferencing juga: $v[$_]->[@t]sekali lagi belum teruji! Juga saya harap Anda tidak keberatan saya menyarankan perubahan kode ...
Dom Hastings

1
@HomHastings Tentu saja saya tidak keberatan, sebaliknya, saya lebih suka mendorong Anda untuk menyarankan perbaikan! @v=([(".")x19])x19tidak berfungsi (saya sudah mencobanya sebelum btw), karena hanya membuat satu arrayref dan menyalin 19 kali ref, bukan array (jadi pada akhirnya Anda hanya memiliki 1 baris yang digandakan 19 kali). Mengganti @{..}seperti yang Anda sarankan tampaknya juga tidak berhasil. Saya menduga itu karena saya mengerjakan slice dan bukan hanya satu elemen. Jika Anda memiliki saran lain, silakan menyarankan! :)
Dada

1
Sial, tentu saja itu akan menjadi sama ... aku sudah berhasil digunakan evaluntuk -3 meskipun: @v=eval"[('*')x19],"x19;. Dan Anda 100% benar dengan arrayref ... Apakah mungkin menggunakan 1D array dan menghitung indeksnya? Boleh bermain lagi dengan ini nanti!
Dom Hastings

@HomHastings Terima kasih atas -3 byte. Mungkin sesuatu untuk dicoba dengan array 1D, memang. Saya akan segera mencobanya
Dada

3

Batch, 322 310 308 byte

@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%%%

Penjelasan: Mulai dengan meminta batu di stdin. Kemudian, tetapkan variabel untuk setiap kolom yang mungkin, sehingga dapat mengevaluasi karakter pertama dari batu sebagai variabel untuk mendapatkan ykoordinat. Kurangi 1 dari xkoordinat karena itu 1-diindeks dan kami ingin 0-diindeks dan juga menghitung z=y+1karena akan membutuhkannya nanti. Kemudian, loop rdari 18 ke 0 untuk setiap baris. Mengambil string ...*.....*.....*...dan mengekstrak karakter di rposisi th untuk nanti. Di xbaris th, ykarakter th diganti dengan o. Akhirnya,.*. huruf s diganti dengan karakter plus yang sebelumnya diekstraksi; ini adalah no-op pada baris 4, 10 dan 16 tetapi ini adalah cara terpendek untuk mencapai itu. (Saya harus menggunakan.*karena mengganti *tampaknya ilegal di Batch.)


2

PowerShell v2 +, 157 152 byte

$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$_}

(Saya pikir saya mengalami semacam kesalahan aneh dengan koma-operator, sehingga konstruksi array sedikit lebih lama dari yang seharusnya)

Mengambil input sebagai string huruf besar via $args[0], melemparkannya sebagai char-array, menyimpan huruf pertama ke dalam $xdan huruf lainnya ke dalam $y. Ini secara efektif membagi input menjadi huruf / angka.

Kami kemudian membangun array multidimensi kami $a. Kami pra-mengisi array ukuran 19dengan 0menggunakan koma-operator. Kami kemudian mengulang 0..18untuk membuat setiap elemen $a[$_]sama dengan array periode, lagi menggunakan operator koma. (NB - Secara teori, ini seharusnya bisa dikondensasi $a=,(,'.'*19)*19, tapi itu sepertinya tidak berfungsi dengan baik pada tugas pengindeksan ... Saya akhirnya mendapatkan seluruh kolom diatur ke *)

Selanjutnya, kita mengulang dua kali 3,9,15untuk mengatur elemen yang sesuai *. Kami kemudian mengindeksnya di tempat yang tepat untuk mengatur batu O. Untuk melakukannya, kita kurangi 65dari $x(mis., ASCII "A" adalah 65, dan kami tidak diindeks), dan kurangi yang tambahan menggunakan Boolean-to-int cast jika $xlebih besar dari 73(yaitu, ASCII "I" ).

Sekarang, output kita dibalik (yaitu, kiri atas akan A1), jadi kita perlu membalikkan array $a[18..0]. Akhirnya, kami output setiap baris -joined bersama untuk membentuk string.


2

> <> , 124 byte

Menggunakan pendekatan yang sama persis seperti jawaban C saya. Input harus berupa huruf kapital diikuti dengan angka desimal.

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

Cobalah online!

Penjelasan:

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 byte

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)

Mengembalikan array string. Penjelasan:

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

Array string tidak cocok dengan output yang dibutuhkan, cukup join. Juga menempatkan o di baris yang salah dan kolom yang salah untuk D5 (test case pertama).
Konijn

@tomdemuyt Array string diizinkan sebagai nilai balik. Namun, mungkin saya membuat baris dan kolom saya tercampur, jadi saya akan memeriksa ulang.
Neil

Hmm, memang berbagai string
Konijn

1

R, 169 161 byte

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

Dengan indentasi dan baris baru:

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

Pemakaian:

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

1

Lua, 187 Bytes

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

Saya tidak merasa sedih tentang proyek khusus ini. Lua masih tampil sangat kikuk untuk bermain Golf, tetapi saya cukup bangga dengan seberapa jauh saya bisa melakukannya.


1

PHP, 280 268 263 261 255 218 216 byte

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

Golf pertamaku.

Penggunaan:
Simpan sebagai file PHP dan panggil dengan php filename.php coordinatemisphp go.php k13

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.