วางก้อนหินบนกระดานโกที่ว่างเปล่า


34

ดูเพิ่มเติม: ให้ย้ายบนกระดานไป

งาน

Go เป็นเกมกระดานที่ผู้เล่นสองคน (ขาว - ดำ) วางก้อนหินที่จุดตัดของเส้นกริดบนกระดานขนาด 19 × 19 Black เคลื่อนที่ก่อน - ตัวอย่างเช่นบน D4:

       ไปพิกัด

ในการท้าทายนี้คุณจะต้องใช้พิกัดบอร์ด Go เหมือนD4อินพุทและเอาท์พุทการเป็นตัวแทน ASCII ของบอร์ดโดยการเคลื่อนที่ครั้งแรกที่เล่น ณ จุดที่กำหนด

โปรดทราบว่าไม่มีคอลัมน์ Iนี่คือประวัติศาสตร์เพื่อลดความสับสนกับ J และ L

เอาต์พุตนี้ประกอบด้วย 19 บรรทัดแต่ละอันมี 19 ตัวอักษร Oจุดด้วยหินที่มันมีการทำเครื่องหมาย จุดที่ว่างในกระดานจะแสดงเป็น.ยกเว้นสำหรับงวดเก้าจุดดาว (อย่างD4, D10, D16, K4, K10, K16, Q4, Q10และQ16) *ซึ่งมีการทำเครื่องหมาย

ตัวอย่างเช่นให้F5เป็นอินพุตเอาต์พุตคำตอบของคุณจะต้อง:

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

และให้Q16เป็นอินพุตเอาต์พุตของคุณจะต้อง:

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

กฎระเบียบ

  • STDINคุณอาจจะเขียนฟังก์ชั่นที่ใช้เวลาประสานงานเป็นอาร์กิวเมนต์หรือโปรแกรมที่อ่านการประสานงานจากบรรทัดคำสั่งหรือจาก

  • คุณอาจเลือกที่จะยอมรับการป้อนข้อมูลด้วยตัวพิมพ์เล็กหรือตัวพิมพ์ใหญ่ แต่คำตอบของคุณไม่จำเป็นต้องจัดการทั้งสองอย่าง

  • อินพุตมักเป็นสตริงเดียวเช่นa1หรือT19ไม่เคยมีสตริง + หมายเลขหรือสองสตริง

  • หากคุณเขียนโปรแกรมเต็มคำตอบของคุณจะต้องพิมพ์STDOUTเป็นสตริงตามด้วยบรรทัดใหม่ต่อท้าย ถ้าคำตอบคือฟังก์ชั่นที่คุณอาจพิมพ์ไปSTDOUT, หรือ  กลับสตริงหรือ  กลับอาร์เรย์ / รายการของสตริง (แถว) หรือ  กลับอาร์เรย์สองมิติหรือรายการที่ซ้อนกันของตัวละคร

  • นี่คือรหัสกอล์ฟคำตอบที่สั้นที่สุดเป็นไบต์ชนะ


เพียงเพื่อให้แน่ใจว่า "พิกัดเป็นอาร์กิวเมนต์" หมายถึงการที่เราไม่สามารถรับสองอาร์กิวเมนต์เช่นf("G", 14)ถูกต้องหรือไม่
FryAmTheEggman

8
ขอแสดงความยินดีกับ 20k !!
Luis Mendo

2
"นี่คืออดีตเพื่อลดความสับสนกับ J และ L" แต่ทั้ง J และ L อยู่ในคณะกรรมการ ??!
ลดขนาด

2
อ๋อ แน่นอนว่าจดหมายที่หายไปอาจทำให้เกิดความสับสนและความประหลาดใจมากกว่าสิ่งใด ๆ ...
ลินน์

2
@ ทำให้ J และ L ดูค่อนข้างแตกต่างเนื่องจากส่วนล่างหันไปในทิศทางที่แยกกัน เช่นเดียวกับ j และ l หนึ่งสืบทอดมาอีกอันหนึ่งขึ้น แต่ฉันและเจนั้นค่อนข้างคล้ายคลึงกันและก็คือฉัน, l และฉัน ...
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 ไบต์

บันทึก 1 ไบต์ขอบคุณ @FryAmTheEggman และ 5 ไบต์ขอบคุณ @orlp

โทร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;}

Ideone

ฟังก์ชั่นที่พิมพ์บอร์ดไปยัง STDOUT ต้องใช้ตัวอักษรประสานงานเป็นทุน การพิมพ์ในลูปหนึ่งดูเหมือนว่าจะสั้นกว่าการวนลูปซ้อนก่อนหน้าเล็กน้อย


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ด้วย19; ลบค่าตรรกะโดยตรงแทนที่จะเป็นifสาขา ในความเป็นจริงคุณสามารถแทนที่สาย fiive ครั้งสุดท้ายโดยb(20-a(2),a(1)-64-(a(1)>8))=48
หลุยส์ Mendo

สวัสดีและยินดีต้อนรับสู่ PPCG หากฉันไม่เข้าใจผิดรหัสของคุณมีความยาว 137 ไบต์และไม่ 135 (ฉันเดาว่ามันไม่สำคัญมาก แต่ฉันแค่อยากให้คุณรู้)
Dada

7

Ruby, 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

Ungolfed

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 ไม่แน่ใจว่า
Nic Hartley

@QPaysTaxes อนิจจาฉันจะต้องเพิ่มบรรทัดใหม่ที่ใดที่หนึ่งแล้ว
จอร์แดน

โอ้ใช่แล้ว ไม่เป็นไร
Nic Hartley

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}

น่าจะเป็นสนามกอล์ฟที่ออกได้สักหน่อยฉันเป็นคนขอทาน


คุณสามารถบันทึก 9 ตัวอักษรโดยเปลี่ยนชื่อpartเป็นp?
corsiKa

เคล็ดลับสำหรับการเล่นกอล์ฟในโก ฉันใช้เสรีภาพในการตอบคำถามของคุณด้วยตัวเอง
EMBLEM

คุณสังเกตเห็นว่าความคิดเห็น "+1 สำหรับการเลือกภาษา" มี upvotes มากกว่าโพสต์เอง? (มันเกิดขึ้นที่ความคิดเห็นมี upvotes มากขึ้น แต่สำหรับความคิดเห็นเช่นนั้นมันค่อนข้างที่ไม่คาดคิด)
Dada

4

Ruby, 130 128 121 + 3 ( -nแฟล็ก) = 124 ไบต์

เปลี่ยน-pเป็น-nเพราะputs bสั้นกว่าหนึ่งไบต์$_=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

คุณสามารถบันทึก bytes โดยการตรวจสอบว่า index mod 6 เป็น 3 แทนที่จะเป็น hardcoding 3, 9 และ 15 หรือไม่
FryAmTheEggman

@FryAmTheEggman มันอาจ แต่ฉันยังไม่ได้คิดวิธีแก้ปัญหาที่ทำ
หมึกมูลค่า

4

Python, 148 145 136 130 121 119 116 ไบต์

-3 ไบต์ขอบคุณ @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]]

ฟังก์ชั่นแลมบ์ดานิรนามรับอินพุตของฟอร์ม "A1" (ตัวอักษรใหญ่) และส่งออกรายการของตัวอักษร (len == 1 สตริงใน Python)


บันทึก 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

@RootTwo ขอบคุณคำแนะนำแรกไม่มีประโยชน์อีกต่อไปแล้วตั้งแต่ฉันพบวิธีแก้ปัญหาที่สั้นกว่านี้แล้ว ตอนที่สองตอนนี้ดูเหมือนชัดเจนและทำให้ฉันถามว่าทำไมฉันไม่ได้คิดถึงเรื่องนี้ก่อนหน้านี้
KarlKastor

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

โปรดทราบว่ามี0x14ในแถวแรกหลังจากแถวแรก'และ0x19ระหว่าง9และระหว่าง^บรรทัดแรก ลองออนไลน์!

อินพุตถูกแมปเพื่อให้A-Tกลายเป็น1-19(โดยมี 0 แสดงถึงคอลัมน์ "newline" ในจินตนาการ) และหมายเลขแถวจำนวนเต็มลดลง 1 โปรแกรมจะวนจาก 379 เป็น 0 เลือก char จากแถวด้านล่างขณะที่มันไป ( ชดเชยด้วย 15 เพื่อดูว่าคุณไม่สามารถป้อนบรรทัดใหม่ตามตัวอักษรในกล่องรหัส) การขึ้นบรรทัดใหม่จะถูกตรวจสอบผ่านทางและจุดที่ดาวจะถูกตรวจสอบโดยi % 20 == 0((i%20-1)%6)*((i/20)%6) == 9


4

F #, 241 237 225 216 214 211 ไบต์

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

เจ้าเล่ห์อันนี้ ... ข้าสงสัยว่ามันจะสั้นกว่านี้ได้ไหม

แก้ไข: แก้ไขข้อผิดพลาดเพิ่มหมายเลขสถานที่บางแห่งลบตัวเลขในที่อื่น ๆ อย่างใดท้ายที่สุดด้วยการนับเดียวกัน อาจลองเปลี่ยนหมายเลขในภายหลังเสร็จ

แก้ไข 2: บันทึกได้มากขึ้นไบต์โดยการสะกดเงื่อนไขอย่างใดอย่างหนึ่งตอบโต้อย่างสังหรณ์ใจ

แก้ไข 3: แก้ไขข้อผิดพลาดอื่น: ควรทำงานตอนนี้สำหรับชิ้นส่วนในอันดับสุดท้ายและจัดการเพื่อบันทึกสองไบต์ในขณะที่ฉันอยู่ที่มันอย่างใด

ลองออนไลน์


โอ้นั่นเป็นปัญหา ตลกมันเป็นสิ่งหนึ่งที่ฉันไม่ได้ดูสองครั้ง
asibahi

3

เรติน่า , 134 129 122 ไบต์

11 ไบต์ขอบคุณ Martin Ender และเป็นแรงบันดาลใจให้อีก 1 คน

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

ลองออนไลน์!


2
เฮ้ขอแสดงความยินดีกับตราทองของคุณ!
Luis Mendo

3

Perl, 132 ไบต์

-3 ไบต์ขอบคุณ@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;

รับอินพุตบรรทัดคำสั่ง ต้องการ-M5.010เรียกใช้ tu ตัวอย่างเช่น

$ 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;เพื่อเริ่มต้นรายการ ... อาจมีวิธีที่ดีกว่านั้น แต่ตอนนี้ฉันไม่ได้อยู่ที่เทอร์มินัล! ฉันคิดว่าคุณสามารถแทนที่ส่วน@{...}ขยายด้วยลูกศร dereferencing ด้วย: $v[$_]->[@t]ยังไม่ได้ทดสอบอีกครั้ง! นอกจากนี้ผมหวังว่าคุณไม่ใจฉันบอกการเปลี่ยนแปลงรหัส ...
Dom เฮสติ้งส์

1
@ DomHastings แน่นอนฉันไม่คิดตรงกันข้ามฉันอยากจะแนะนำให้คุณแนะนำการปรับปรุง! @v=([(".")x19])x19ไม่ทำงาน (ฉันลองก่อน btw) เพราะมันสร้าง arrayref เพียงอันเดียวและมันคัดลอก 19 ครั้งอ้างอิงไม่ใช่อาร์เรย์ (ดังนั้นในที่สุดคุณก็มี 1 บรรทัดซ้ำ 19 ครั้ง) การแทนที่@{..}ตามที่คุณแนะนำไม่ทำงานเหมือนกัน ฉันเดาว่าเป็นเพราะฉันทำงานชิ้นและไม่เพียงองค์ประกอบเดียว หากคุณมีข้อเสนอแนะอื่น ๆ อย่าลังเลที่จะแนะนำ! :)
Dada

1
ประณามแน่นอนมันจะเป็นเหมือนกัน ... ฉันจัดการเพื่อใช้evalสำหรับ -3 @v=eval"[('*')x19],"x19;ว่า: และคุณถูกต้อง 100% กับ arrayref ... อาจเป็นไปได้ไหมที่จะใช้อาร์เรย์ 1D และหาดัชนีในที่นั้น อาจเล่นด้วยสิ่งนี้ในภายหลัง!
Dom Hastings

@DomHastings ขอบคุณสำหรับ -3 ไบต์ อาจเป็นเรื่องที่ต้องลองกับอาร์เรย์ 1D แน่นอน ฉันจะลองเร็ว ๆ นี้
Dada

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

คำอธิบาย: เริ่มต้นด้วยการพร้อมท์ให้ใส่หินบน stdin จากนั้นตั้งค่าตัวแปรสำหรับแต่ละคอลัมน์ที่เป็นไปได้เพื่อให้สามารถประเมินอักขระตัวแรกของหินเป็นตัวแปรเพื่อรับyพิกัด ลบ 1 จากxพิกัดเพราะมันเป็น 1 ดัชนีและเราต้องการ 0 ดัชนีและคำนวณz=y+1ตามที่มันต้องการในภายหลัง จากนั้นวนrซ้ำจาก 18 ลงไปที่ 0 สำหรับแต่ละแถว รับค่าสตริง...*.....*.....*...และแยกอักขระที่rตำแหน่ง th สำหรับภายหลัง ในxแถววันที่yตัวอักษร TH oจะถูกแทนที่ด้วย ในที่สุด.*s จะถูกแทนที่ด้วยเครื่องหมาย.บวกแยกก่อนหน้านี้; นี่คือไม่มีตัวเลือกในแถว 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จากนั้นเราจะสร้างอาร์เรย์หลายมิติของเรา เราเติมข้อมูลอาร์เรย์19ด้วยขนาด0s ล่วงหน้าโดยใช้เครื่องหมายจุลภาค จากนั้นเราวนรอบ0..18เพื่อทำให้แต่ละองค์ประกอบ$a[$_]เท่ากันแทนที่จะเป็นอาร์เรย์ของช่วงเวลาอีกครั้งโดยใช้เครื่องหมายคอมม่า (NB - ตามทฤษฎีแล้วสิ่งนี้ควรจะถูกย่อให้แน่น$a=,(,'.'*19)*19แต่ดูเหมือนจะไม่ทำงานกับการมอบหมายการจัดทำดัชนี ... ฉันได้รับการตั้งค่าคอลัมน์ทั้งหมด*)

ต่อไปเราห่วงสองครั้งเพื่อกำหนดองค์ประกอบที่สอดคล้องกับ3,9,15 จากนั้นเราก็ดัชนีลงในจุดที่เหมาะสมในการตั้งหิน* Oในการทำเช่นนั้นเราจะลบออก65จาก$x(เช่น ASCII "A" คือ 65 และเราไม่มีดัชนี) และลบอันเพิ่มเติมโดยใช้ Boolean-to-int cast ถ้า$xใหญ่กว่า73(เช่น ASCII "I" )

ตอนนี้ผลผลิตของเราจะถูกกลับรายการ (เช่นบนซ้ายจะเป็นA1) $a[18..0]ดังนั้นเราจึงจำเป็นที่จะย้อนกลับอาร์เรย์ที่มี สุดท้ายเราก็ออกแต่ละบรรทัด-joined เข้าด้วยกันเพื่อสร้างสตริง


2

> <> , 124 ไบต์

ใช้วิธีการเดียวกันกับคำตอบ C ของฉัน ข้อมูลที่ป้อนต้องเป็นตัวพิมพ์ใหญ่และตามด้วยตัวเลขทศนิยม

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 (กรณีทดสอบครั้งแรก)
Konijn

@tomdemuyt อนุญาตให้ใช้อาร์เรย์ของสตริงเป็นค่าที่ส่งคืนได้ อย่างไรก็ตามเป็นไปได้ว่าฉันได้แถวและคอลัมน์ผสมกันดังนั้นฉันจะตรวจสอบอีกครั้ง
Neil

อืมมชุดสตริงแน่นอน
Konijn

1

R, 169 161 ไบต์

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 สำหรับโครงการนี้โดยเฉพาะ ลัวะยังคงออกมาเป็น clunky มากสำหรับการเล่นกอล์ฟ แต่ฉันค่อนข้างภูมิใจว่าฉันสามารถไปกับมันได้ไกลแค่ไหน


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.