빈 바둑판에 돌을 놓으십시오


34

참조 : 이동 보드에서 이동하십시오 .

태스크

바둑은 19x19 보드에서 두 명의 플레이어 (흑백)가 그리드 선의 교차점에 돌을 놓는 보드 게임입니다. 예를 들어 D4에서 검은 색이 먼저 움직입니다.

       좌표를 이동

이 도전에서는 D4입력 과 같은 Go 보드 좌표를 가져 와서 주어진 지점에서 첫 번째 이동으로 보드의 ASCII 표현을 출력해야합니다.

열 I 없습니다. 이는 역사적으로 J 및 L과의 혼동을 줄이기위한 것입니다.

이 출력은 19 개의 줄로 구성되며 각 줄에는 19 개의 문자가 포함됩니다. 돌이있는 지점이 표시 O됩니다. 보드에 빈 점으로 표시됩니다 .아홉을 제외하고, 스타 포인트 (에 D4, D10, D16, K4, K10, K16, Q4, Q10,과 Q16), 표시되는 *.

예를 들어 F5입력으로 제공 되는 답변의 출력은 다음과 같아야합니다.

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

Q16입력으로 제공 되는 출력은 다음과 같아야합니다.

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

규칙

  • 좌표를 인수로 사용하는 함수 또는 명령 행 또는에서 좌표를 읽는 프로그램을 작성할 수 있습니다 STDIN.

  • 소문자 또는 대문자로 입력을 받도록 선택할 수 있지만 답이 두 가지 모두를 처리 할 필요는 없습니다.

  • 입력은 항상a1 or 와 같은 단일 문자열 T19이며 문자열 + 숫자 또는 두 개의 문자열 이 아닙니다 .

  • 전체 프로그램을 작성하는 경우 답은 STDOUT문자열로 인쇄되고 선택적으로 후행 줄 바꿈이 뒤에 와야합니다. 당신의 대답은 함수 인 경우에 인쇄 할 수 있습니다 STDOUT, 또는  문자열을 반환, 또는  문자열 (행)의 배열 / 목록을 반환, 또는  2 차원 배열 또는 문자의 중첩 된 목록을 반환합니다.

  • 이것은 입니다. 바이트 단위의 최단 답변이 이깁니다.


"인수로서의 좌표"는 우리가 f("G", 14)옳고 같은 두 개의 인수를 취할 수 없다는 것을 의미하기 위한 것입니다.
FryAmTheEggman

8
20k 축하합니다 !!
Luis Mendo

2
"이것은 역사적으로 J와 L과의 혼동을 줄이는 것입니다." 그러나 J와 L 모두 보드에 있습니다!
페이탈 라이즈

2
네. 또한, 실종 된 편지는 아마도 무엇보다 혼란과 놀라움을 불러 일으켰을 것입니다…
Lynn

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에 인쇄하는 기능입니다. 문자 좌표가 대문자 여야합니다. 하나의 루프로 인쇄하는 것은 이전의 중첩 루프 방식보다 약간 짧은 것 같습니다.


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브랜치 대신 논리 값을 직접 빼십시오 . 실제로 마지막 파이브 라인을 다음으로 대체 할 수 있습니다.b(20-a(2),a(1)-64-(a(1)>8))=48
Luis Mendo

PPCG에 오신 것을 환영합니다. 내가 실수하지 않으면 코드의 길이는 137 바이트이고 135는 아닙니다. (많이 중요하지는 않지만 알려 드리고 싶었습니다)
Dada

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 . 그래도 확실하지 않습니다.
Nic Hartley 1

@ QPaysTaxes Alas, 그렇다면 어딘가에 개행을 추가해야합니다.
Jordan

네 신경 쓰지 마라
Nic Hartley 1

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의 골프 팁. 나는 그것들을 당신의 대답에 자유롭게 적용했습니다.
EMBLEM

"언어 선택을위한 +1"이라는 주석이 게시물 자체보다 더 많은 찬사를 보냈습니까? (의견은 더 많은 찬사를 받았지만 그러한 의견은 다소 예상치 못한 일입니다.)
Dada

4

루비 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

인덱스 모드 6이 하드 코딩 3, 9 및 15 대신 3인지 확인하여 바이트를 절약 할 수 있습니까?
FryAmTheEggman

@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"(큰 문자) 형식의 입력을 사용하여 문자 목록 (파이썬의 경우 len == 1 문자열)을 출력합니다.


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

또한 3 바이트를 절약 하는 (x>'I')대신 사용할 수 있다고 생각합니다 (x[0]>'I').
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및 제 ^마지막 라인. 온라인으로 사용해보십시오!

입력은 (가상 "줄 바꿈"열을 나타내는 0으로 ) 맵핑 A-T되고 1-19정수 행 번호는 1 씩 감소합니다. 프로그램은 맨 아래 행에서 문자를 선택하여 379에서 0으로 루프를 수행합니다 ( 코드 상자에 리터럴 줄 바꿈을 입력 할 수 없다는 사실을 설명하기 위해 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".")

이것 하나를 까다롭게 ... 그것이 더 짧아 질 수 있는지 궁금합니다.

편집 : 버그 수정, 일부 장소에서 다른 장소에서 번호를 제거하고 어떻게 든 같은 수로 끝났습니다. 나중에 완료 주위 숫자를 섞을 수 있습니다 .

Edit2 : 조건부 중 하나를 철자하여 더 많은 바이트를 절약하고 직관적으로 대응합니다.

Edit3 : 다른 버그 수정 : 마지막 순위의 조각에 대해 지금 작동해야하며 내가있는 동안 2 바이트를 절약 할 수 있습니다.

온라인으로 사용해보십시오


아 그게 문제 였어 웃긴, 그것은 내가 두 번 보지 않은 것입니다
asibahi


3

펄, 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.010합니다. 예를 들면 :

$ 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]다시 테스트되지 않았습니다! 또한 코드 변경을 제안하는 것이 마음에 들지 않기를 바랍니다 ...
Dom Hastings

1
@DomHastings 물론 나는 상관하지 않습니다, 오히려 개선을 제안하는 것이 좋습니다! @v=([(".")x19])x19작동하지 않습니다 (btw 전에 시도했습니다). 하나의 arrayref 만 만들고 배열이 아닌 참조의 19 배를 복사하기 때문에 (결국 19 번 복제 된 한 줄만 있습니다). 교체 @{..}당신이 중 하나가 작동하지 않는 것 제안. 하나의 요소뿐만 아니라 슬라이스 작업을하고 있기 때문입니다. 다른 제안이 있으시면 언제든지 제안하십시오! :)
Dada

1
젠장, 물론 같을 것입니다 ... eval하지만 -3 에 사용 했습니다 @v=eval"[('*')x19],"x19;. 그리고 당신은 arrayref와 100 % 정확합니다 ... 아마도 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으로 반복 합니다. 문자열을 가져 와서 나중에 th 위치 ...*.....*.....*...에서 문자를 추출합니다 r. 세 x번째 행에서 세 y번째 문자는로 대체됩니다 o. 마지막으로 .*s는 .이전에 추출한 문자를 더한 문자 로 대체됩니다 . 이것은 행 4, 10 및 16에서 작동하지 않지만이를 달성하는 가장 짧은 방법입니다. (사용해야합니다.**Batch에서 교체 는 불법입니다.)


2

PowerShell v2 +, 157152 바이트

$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쉼표 연산자를 사용하여들. 그런 다음 반복 해서 쉼표 연산자를 사용하여 0..18각 요소 $a[$_]를 기간 배열 대신 동일하게 만듭니다 . (NB-이론적으로 이것은 압축 될 수 있어야 $a=,(,'.'*19)*19하지만 인덱싱 할당에서 제대로 작동하지 않는 것 같습니다 ... 전체 열을로 설정했습니다. *)

다음으로 두 번 반복 3,9,15하여 해당 요소를로 설정합니다 *. 그런 다음 올바른 지점에서 색인을 생성하여 석재를 설정합니다 O. 이렇게하려면, 우리는 빼기 65에서 $x(즉, ASCII "A"를 65이고, 우린 제로 인덱스), 및 경우 부울 - 투 - INT 캐스트를 사용하여 추가로 하나를 뺀 $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

자바 스크립트, 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. 또한 D5 (첫 번째 테스트 사례)에 대해 잘못된 행과 잘못된 열에 o를 배치합니다.
Konijn

@tomdemuyt 문자열 배열은 반환 값으로 허용됩니다. 그러나 행과 열이 섞여있을 가능성이 있으므로 다시 확인하겠습니다.
Neil

흠, 실제로 문자열 배열
Konijn

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

루아, 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.