高尔夫代码:熄灯!


15

传递所有可能性的最短代码获胜

已经开发出许多基于网格的游戏,它们以打开的灯光网格开​​始。按下任何一个灯都会导致该灯和与其相邻的四个灯切换。切换灯光时,灯光是关闭还是打开,这取决于它是最初打开还是关闭。目标是按顺序击中灯光,导致所有灯光最后都关闭。

“ 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),即灯光网格的大小,即xx。第二行将包含y(0 <= y <=(x * 3)2),即最初点亮的灯数。接下来的y行包含网格上照亮的灯光的坐标,格式为“行列”。应该重新关闭已经打开的灯(之前已切换过)。下一行将包含z,即按下的灯光数量。最终z 行以“行列”的格式包含按其按下顺序的按下的灯光的坐标。

没有输入将是不正确的。所有数字都将在网格的给定边界内。

切换所有灯光后,输出将是最后一个网格。它应该是一个n × 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

Answers:


4

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

6

Python中,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用于切换灯光。我在每行上多留一点以防止回绕。


杰作!从这里可以学到很多。
Oleh Prypin 2011年

exec是关键字,而不是内置函数(在Python 2.x中),因此不需要那些多余的括号。
hallvabo

5

Ruby 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)简化了条件

3

Perl,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;
}

2

APL(71)

'OX'[1+⊃{⍵≠(⍳⍴⍵)∊(⊂⍺)+K,⌽¨K←(0 1)(0 0)(0 ¯1)}/({⎕}¨⍳⎕),⊂({⎕}¨⍳⎕)∊⍨⍳2/⎕]

您可以为此提供十六进制转储吗?
凯文·布朗

@KevinBrown:这只是Unicode。您要什么格式?这5个块实际上称为“四边形”,应该看起来像这样。
marinus
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.