모든 가능성을 전달하는 가장 짧은 코드가 승리
스위치가 켜진 그리드로 시작하는 많은 그리드 기반 게임이 만들어졌습니다. 조명 중 하나를 누르면 해당 조명과 그에 인접한 4 개의 조명이 토글됩니다. 표시등이 전환되면 초기에 켜지거나 꺼 졌는지에 따라 꺼 지거나 켜집니다. 목표는 순서대로 조명을 쳐서 모든 조명이 끝날 때 꺼지는 것입니다.
“X”는 켜져있는 표시등을 나타냅니다. “O”는 꺼진 표시등을 나타냅니다. “P”는 누른 사각형을 나타냅니다.
XOO XOO XOX XOX XXX
XOX XOP -> XXO -> OPO -> XOX
OOX OOX POO XXO XOO
Intial Grid Press 1 Press 2 Press 3 Ending Grid
입력은 인수 또는 표준 입력으로 전달 된 파일에서 직접 가져올 수 있습니다. 입력의 첫 번째 줄에 포함 X (1 <= X <= 20), 즉 조명 그리드의 크기 X를 하여 X . 두 번째 줄에는 y (0 <= y <= ( x * 3) 2 )가 포함되며 처음에는 불이 켜집니다. 다음 y 줄에는 “행 열”형식으로 그리드의 점등 된 조명 좌표가 포함됩니다. 이미 켜져있는 (이전에 토글 된) 라이트는 다시 토글되어야합니다. 다음 줄에는 누른 조명 수인 z 가 포함됩니다 . 마지막 z 라인은 “행 열”형식으로 눌러 진 순서대로 누른 조명의 좌표를 포함합니다.
입력이 올바르지 않습니다. 모든 숫자는 그리드의 주어진 경계 안에 있습니다.
모든 라이트가 토글 된 후 출력이 최종 그리드가됩니다. n x n 격자 여야합니다 . 표시등이 켜져있는 각 영역에는 대문자 “X”를 사용해야합니다. 표시등이 꺼져있는 각 영역에는 대문자 “O”를 사용해야합니다.
그리드를 벗어난 영향을받는 조명은 무시해야합니다. 그리드 가장자리에서 조명을 전환하면 그리드 자체에있는 조명에만 영향을 미칩니다.
테스트 사례
입력
4
5
2 3
2 4
3 1
3 4
4 3
7
3 3
4 4
3 4
4 2
4 1
2 2
3 2
산출
OXOO
XOXO
XOXO
OXOO
입력
1
3
1 1
1 1
1 1
2
1 1
1 1
산출
X
답변
J, 132
'x f'=:0 2{,i=:".;._2(1!:1)3
echo u:79+9*}:"1}."1}.}:2|+/(1:`[`]}&(0$~,~x+2))"0<"1(f{.2}.i),;([:<[,[:|:(2 4$0 0,,~1 _1)+])"1(3+f)}.i
아마 훨씬 더 골프를 칠 수 있습니다.
- 콘솔 만, stdin-> stdout. Linux의 j602에서 테스트되었습니다.
- 주어진 두 테스트를 모두 통과합니다.
- X에서 제곱 상한을 가정합니다 (확장 정밀도 없음).
원래 언 골프 버전 :
NB. Whole input as two column grid
i=:".;._2(1!:1)3
NB. x is x, f is number of initial toggles
'x f'=:0 2{,i
NB. z is 1..x
z =: >:i.x
NB. Take a boxed pair of indices, generate 'cross' indices (boxed)
f2=:3 :'y,,<"1(>y)+"1>0 1;1 0;0 _1;_1 0'
NB. List of initial toggles, individually boxed
init=: <"1 f {. 2 }. i
NB. List of Ps, individually boxed
toggle=: <"1 (3 + f) }. i
NB. Grid of 0s padded on all sides
g =:0$~(x+2),(x+2)
NB. For each initial toggle, make a grid with a 1 in that position. Sum each 'position'.
grid =: +/ (1:`[`]}&g)"0 init
NB. For each position in the cross (f2) of each press, make a grid with a 1 in that position.
NB. Sum each 'position', add to 'grid', take mod 2, and select inner rows/columns.
gfinal =: z {"1 z { 2|grid + +/ (1:`([:f2[)`]}&g)"0 toggle
NB. Translate 0/1 to O/X through ascii and print
echo u:79+9*gfinal
답변
파이썬, 209 (203) 199 자
I=input
x=I()+1
s=0
C=lambda:eval(raw_input().replace(' ','*%d+'%x))
exec's^=1<<C();'*I()
exec's^=1+(7<<x)/2+(1<<x<<x)<<(C()-x);'*I()
R=range(1,x)
for r in R:print''.join('OX'[s>>r*x+c&1]for c in R)
라이트의 상태는 단일 (큰) 정수 변수로 유지됩니다. s
. 비트 마스크가있는 XOR은 조명을 토글하는 데 사용됩니다. 줄 바꿈을 방지하기 위해 행당 여분의 비트를 유지합니다.
답변
루비 1.9, 167 자
n=gets.to_i
y=z=[*[1]*n,0]*n
$<.map{|i|a,b=i.split.map &:to_i;b ?[*y&&[b>1&&-1,b<n&&1,a>1&&~n,a<n&&n+1],0].map{|f|f&&z[n*a+a-n-2+b+f]*=-1}:y=!y}
z.map{|a|putc"
OX"[a]}
편집 :
- (198-> 191) 불필요한 물건 제거
- (191-> 180) 입력 파싱 방식을 단순화했습니다.
- (180-> 172) 괄호를 제거했습니다.
z[u]*=-1
대신 사용하십시오.z[u]=-z[u]
하지 않는 변수 제거 - (172-> 169) 일부 단순화
- (169-> 167) 조건부 단순화
답변
펄, 139 자
@s=1..<>;<>=~/ /,$f{$`,$'+0}=1for 1..<>;<>=~/ /,map$f{$`+$_*($_&1),$'+int$_/2}^=1,-2..2for 1..<>;$\=$/;for$x(@s){print map$f{$x,$_}?X:O,@s}
설명:
# Read size and generate an array of integers from 1 to the size.
# We’ll need to iterate over this array often, but otherwise we don’t need the size
@s = 1..<>;
# Read number of prelit lights
for (1..<>) {
# Find the space; sets $` and $' to row and column, respectively
<> =~ / /;
# Set the relevant light; need +0 because $' includes the newline
$f{$`, $'+0} = 1;
}
# Read number of light switchings
for (1..<>) {
# As above
<> =~ / /;
# Some nice formulas that flip the 5 relevant lights,
# including the ones “off the board”, but we don’t care about those
map {
$f{ $`+$_*($_&1), $'+int$_/2 } ^= 1
}, (-2..2);
}
# Cause each subsequent print statement to print a newline after it
$\ = $/;
# For each row...
for $x (@s) {
# Print X’s and O’s as required
print map { $f{$x,$_} ? X : O }, @s;
}
답변
APL (71)
'OX'[1+⊃{⍵≠(⍳⍴⍵)∊(⊂⍺)+K,⌽¨K←(0 1)(0 0)(0 ¯1)}/({⎕}¨⍳⎕),⊂({⎕}¨⍳⎕)∊⍨⍳2/⎕]