Code-Golf: Işıklar Kapalı!


15

Tüm olasılıkları geçecek en kısa kod kazanır

Açık olan bir ışık ızgarası ile başlayan birçok ızgara tabanlı oyun yapılmıştır. Işıklardan herhangi birine basmak, ışığın ve yanındaki dört ışığın yanmasına neden olur. Bir ışık açıldığında, açık veya kapalı olmasına bağlı olarak kapatılır veya açılır. Amaç, tüm ışıkların sonunda kapanmasına neden olacak şekilde ışıkları vurmaktır.

"X", açık ışıkları temsil eder. "O" kapalı ışıkları gösterir. "P", basılan kareyi temsil eder.

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

Giriş, bağımsız değişken olarak veya standart girdi olarak iletilen bir dosyadan doğrudan alınabilir. Giriş ilk satırı içerecektir X (1 <= x <= 20), yani ışık ızgara boyutu, x ile x . İkinci satırda başlangıçta yanan ışık sayısı y (0 <= y <= ( x * 3) 2 ) olacaktır. Sonraki y satırında, ızgaradaki "sıra sütunu" biçimindeki yanan ışıkların koordinatları bulunur. Zaten açık olan ışıklar (daha önce değiştirilmiş olan) tekrar kapatılmalıdır. Bir sonraki satır, basılan ışık sayısı olan z içerecektir . Son z çizgiler, basılan ışıkların koordinatlarını, basıldıkları sırayla, "satır sütunu" biçiminde içerir.

Hiçbir girdi yanlış olmayacak. Tüm sayılar ızgaranın belirtilen sınırları içinde olacaktır.

Tüm ışıklar açıldıktan sonra çıkış son ızgara olacaktır. Bir n , n ızgara olmalıdır. Açık olan her alan için büyük harf "X" kullanılmalıdır. Işığı kapalı olan her alan için büyük harf "O" kullanılmalıdır.

Şebekeden çıkan etkilenen ışıklar göz ardı edilmelidir. Bir ızgaranın kenarındaki bir ışığın değiştirilmesi sadece ızgaranın üzerindeki ışıkları etkilemelidir.

Test Durumları


Giriş

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

Çıktı

OXOO
XOXO
XOXO
OXOO

Giriş

1
3
1 1
1 1
1 1
2
1 1
1 1

Çıktı

X

Yanıtlar:


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

Muhtemelen çok daha fazla golf yapılabilir.

  • Yalnızca konsol, stdin-> stdout. Linux'ta j602'de test edildi.
  • Verilen her iki testi de geçer.
  • X için aklı başında üst sınır olduğunu varsayar (genişletilmiş hassasiyet yok)

Orijinal ungolfed sürümü:

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

Piton, 209 203 199 karakter

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)

Işıkların durumu tek (büyük) bir tamsayı değişkeninde tutulur s. Bitmasksli XOR'lar ışıkları değiştirmek için kullanılır. Ben sarma önlemek için her satırda bir bit biraz tutmak.


Bir başyapıt! Buradan çok şey öğrenilebilir.
Oleh Prypin

execbir anahtar sözcüktür, yerleşik bir işlev değildir (Python 2.x'te), bu nedenle bu ekstra parantezlere gerek yoktur.
hallvabo

5

Yakut 1.9, 167 karakter

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]}

Düzenlemeler:

  • (198 -> 191) Gereksiz bazı şeyler kaldırıldı
  • (191 -> 180) Girişin ayrıştırma şekli basitleştirildi
  • (180 -> 172) Kaldırılan parantezler, z[u]*=-1yerine z[u]=-z[u]kullanılmayan değişkeni kaldır
  • (172 -> 169) Bazı basitleştirmeler
  • (169 -> 167) Bir koşullu basitleştirildi

3

Perl, 139 karakter

@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}

Açıklama:

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

Bunun için altıgen çöplük sağlayabilir misiniz?
Kevin Brown

@KevinBrown: Sadece Unicode. Hangi biçimi istiyorsunuz? 5 bloğa aslında 'dörtlü' denir ve böyle görünmesi gerekir.
marinus
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.