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:
Dalam tantangan ini, Anda harus mengambil koordinat Go board seperti D4
sebagai 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 F5
sebagai input, output jawaban Anda harus:
...................
...................
...................
...*.....*.....*...
...................
...................
...................
...................
...................
...*.....*.....*...
...................
...................
...................
...................
.....O.............
...*.....*.....*...
...................
...................
...................
Dan diberikan Q16
sebagai 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
a1
atauT19
, tidak pernah string + angka atau dua string.Jika Anda menulis program lengkap, jawaban Anda harus dicetak
STDOUT
sebagai string, secara opsional diikuti oleh baris baru. Jika jawaban Anda adalah fungsi, Anda dapat mencetak keSTDOUT
, atau mengembalikan string, atau mengembalikan array / daftar string (baris), atau mengembalikan array dua dimensi atau daftar karakter bersarang.Ini adalah kode-golf . Jawaban terpendek dalam byte menang.
f("G", 14)
, benar?Jawaban:
MATL , 33 byte
Cobalah online!
Penjelasan
sumber
C,
21219519318117113210398 byteDisimpan 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.Cobalah di ideone .
sumber
putchar(i%20?i^20*atoi(p+1)+64-*p+(*p>72)?i%6^4|i/20%6^3?46:42:79:10)
C (gcc),
132128109Ideone
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.
sumber
MATLAB, 135 byte
Upaya pertama, tidak ada yang pintar, hanya untuk melihat seberapa baik yang bisa dilakukan orang lain:
Pemakaian:
sumber
a=input('');
); hapus baris baru; mengubah'*'
ke42
dan'0'
ke48
; gantiend
dengan19
; kurangi nilai logis langsung bukanif
cabang. Bahkan, Anda dapat mengganti jalur lima terakhir olehb(20-a(2),a(1)-64-(a(1)>8))=48
Ruby,
9391 byteMengambil input pada baris perintah, mis
$ ruby script.rb Q16
.Uji di repl.it (dibungkus lambda di sana karena repl.it tidak mengambil argumen baris perintah: https://repl.it/CkvT/1
Tidak disatukan
sumber
$><<
alih - alihputs
. Tapi tidak yakin.Pergi,
319286 byteMungkin golf sedikit berhenti, saya pemula
sumber
part
menjadip
?Ruby,
130128121 + 3 (-n
flag) = 124 byteBeralih
-p
ke-n
karenaputs b
lebih pendek satu byte dari$_=b*$/
sumber
Python,
148145136130121119116 Bytes-3 Bytes berkat @RootTwo
fungsi lambda anonim, mengambil input dari bentuk "A1" (huruf besar) dan menampilkan daftar daftar karakter (len == 1 string dengan Python)
sumber
".*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"."
(x>'I')
daripada(x[0]>'I')
menyimpan 3 byte lebih banyak.> <> ,
9896 bytePerhatikan bahwa ada
0x14
baris pertama setelah baris pertama'
, dan baris0x19
antara9
dan baris pertama^
. Cobalah online!Input dipetakan sehingga
A-T
menjadi1-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 melaluii % 20 == 0
, dan titik bintang diperiksa oleh((i%20-1)%6)*((i/20)%6) == 9
.sumber
F #,
241 237 225 216 214211 byteYang 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 nantiSelesai.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
sumber
Retina ,
134129122 byte11 byte terima kasih kepada Martin Ender, dan untuk inspirasi 1 lagi.
Cobalah online!
sumber
Perl, 132 byte
-3 byte terima kasih @Dom Hastings
Mengambil input baris perintah. Kebutuhan
-M5.010
jalankan. Contohnya :Saya pikir ini bisa lebih pendek, tapi saya tidak tahu bagaimana ... tolong beri tahu saya jika Anda melakukannya!
sumber
@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 ...@v=([(".")x19])x19
tidak 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! :)eval
untuk -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!Batch,
322310308 bytePenjelasan: 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
y
koordinat. Kurangi 1 darix
koordinat karena itu 1-diindeks dan kami ingin 0-diindeks dan juga menghitungz=y+1
karena akan membutuhkannya nanti. Kemudian, loopr
dari 18 ke 0 untuk setiap baris. Mengambil string...*.....*.....*...
dan mengekstrak karakter dir
posisi th untuk nanti. Dix
baris th,y
karakter th diganti dengano
. 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.)sumber
PowerShell v2 +,
157152 byte(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$x
dan huruf lainnya ke dalam$y
. Ini secara efektif membagi input menjadi huruf / angka.Kami kemudian membangun array multidimensi kami
$a
. Kami pra-mengisi array ukuran19
dengan0
menggunakan koma-operator. Kami kemudian mengulang0..18
untuk 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,15
untuk mengatur elemen yang sesuai*
. Kami kemudian mengindeksnya di tempat yang tepat untuk mengatur batuO
. Untuk melakukannya, kita kurangi65
dari$x
(mis., ASCII "A" adalah 65, dan kami tidak diindeks), dan kurangi yang tambahan menggunakan Boolean-to-int cast jika$x
lebih besar dari73
(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-join
ed bersama untuk membentuk string.sumber
> <> , 124 byte
Menggunakan pendekatan yang sama persis seperti jawaban C saya. Input harus berupa huruf kapital diikuti dengan angka desimal.
Cobalah online!
Penjelasan:
sumber
JavaScript, 138 byte
Mengembalikan array string. Penjelasan:
sumber
join
. Juga menempatkan o di baris yang salah dan kolom yang salah untuk D5 (test case pertama).R,
169161 byteDengan indentasi dan baris baru:
Pemakaian:
sumber
Lua, 187 Bytes
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.
sumber
PHP,
280 268 263 261 255 218216 byteGolf pertamaku.
Penggunaan:
Simpan sebagai file PHP dan panggil dengan
php filename.php coordinate
misphp go.php k13
sumber