코드 골프 : 소등! “P”는 누른 사각형을 나타냅니다. XOO

모든 가능성을 전달하는 가장 짧은 코드가 승리

스위치가 켜진 그리드로 시작하는 많은 그리드 기반 게임이 만들어졌습니다. 조명 중 하나를 누르면 해당 조명과 그에 인접한 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/⎕]