コードゴルフ:消灯!


15

すべての可能性を渡す最短のコードが勝つ

多くのグリッドベースのゲームは、点灯するライトのグリッドで開始されます。いずれかのライトを押すと、そのライトとそれに隣接する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。2行目には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

回答:


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が使用されます。ラップアラウンドを防ぐため、行ごとに余分なビットを保持します。


最高傑作!ここから多くを学ぶことができます。
オレPrypin

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/⎕]

このために16進ダンプを提供できますか?
ケビンブラウン

@KevinBrown:ユニコードです。どのフォーマットが必要ですか?5つのブロックは実際には「クワッド」と呼ばれ、そのように見えるはずです。
マリヌス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.