Flippin 'Kareler


34

Yalnızca satırları ve sütunları çevirerek (orta nokta etrafında ters çevirerek) bir basamağın hanesini çıkarmak için bir program veya işlev oluşturun.

Giriş

Giriş, aşağıdaki gibi 9 satırlık bir dize biçimindeki 9x9 basamaklı bir ızgara olacaktır:

986553229
264564891
759176443
643982153
567891234
526917874
685328912
891732537
117644378

Bu giriş formatı pazarlık konusu değildir - giriş formatıyla "yaratıcı" olan herhangi bir çözüm geçersiz sayılır.

Çıktı

Çıktı, verilen sıraya girildiğinde uygulandığında hedef ızgarayı yeniden yaratması gereken bir flip hareket listesi olmalıdır.

Bir örnek çıktı (önceki giriş örneğine çözüm değil):

28IF5D3EAB9G3

Bu çıktı formatı da pazarlık konusu değil. Çıktıda yeni satırlar veya boşluklar olmamalıdır, yalnızca 1- 9ve A- Ikarakterleri (eğer tercih ederseniz büyük harfler yerine kabul edilebilir).

Hedef kılavuz (yeniden oluşturmanız gereken durum) aşağıdaki gibidir:

123456789
234567891
345678912
456789123
567891234
678912345
789123456
891234567
912345678

Rakamlar 1- 9satırları çevirmek için talimatlar olarak kullanılmalı ve harfler A- Isütunlar için kullanılmalıdır. Bu, ızgara restore edilmiş durumdayken aşağıda gösterilmiştir.

     ABCDEFGHI
     |||||||||
     vvvvvvvvv
1 -> 123456789
2 -> 234567891
3 -> 345678912
4 -> 456789123
5 -> 567891234
6 -> 678912345
7 -> 789123456
8 -> 891234567
9 -> 912345678

Böylece bir 8araç ikinci sırayı alttan Fçevirir ve bir araç altıncı sütunu çevirir.

Hiçbir çözümün mümkün olmadığı durumlarda, program hiçbir şey vermeden sona ermelidir.

Örnekler

Giriş:

987654321
234567891
345678912
456789123
567891234
678912345
789123456
891234567
912345678

Çıktı:

1

Bu durumda sadece en üstteki sıranın hedef durumuna geri dönmesi gerekir.

Giriş:

123456788
234567897
345678916
456789125
567891234
678912343
789123452
891234561
912345679

Çıktı:

I

Bu durumda, yalnızca son sütunun (sütun I) hedef durumunu yeniden oluşturmak için saygısız olması gerekir.

Giriş:

123456788
798765432
345678916
456789125
567891234
678912343
789123452
891234561
912345679

Çıktı:

2I

Bu durumda, satır durumuna çevirip hedef durumuna geri dönmek için 2sütunu çevirmemiz gerekir I.

Notlar:

  • Lütfen cevabınıza bir örnek kullanım ekleyin.
  • Verilen çıkışın hedef durumuna geri dönecek en kısa dizi olması gerekmez - hedef durumu döndüren herhangi bir dizi çalıştığı sürece (yani test edebildiğim sürece)
  • Her cevabı test etmeye çalışıyorum ve çalışanların hepsine kızgınım ve açık bir şekilde golf oynama girişiminde bulundum.
  • Bu açık uçlu bir yarışma - Gelecek hafta en kısa cevabı kabul edeceğim, ancak gelecekte herhangi bir noktada daha kısa olan daha yeni geçerli bir cevap gelirse kabul etmek için cevabı değiştireceğim .
  • Kelle tarafından alınan en kısa cevap için 200 ün olarak belirlenmiştir 26/01/2014 tarihinde 23:59:59 (GMT) ödül verildi Howard onun için 268 karakter GolfScript çözümü .

Test yapmak

Lütfen programınızın çıktısını, cevabınızla birlikte aşağıdaki üç test kılavuzu için sağlayın:

986553229
264564891
759176443
643982153
567891234
526917874
685328912
891732537
117644378

927354389
194762537
319673942
351982676
567891234
523719844
755128486
268534198
812546671

813654789
738762162
344871987
341989324
567891234
576217856
619623552
194435598
926543271

Test amacıyla geçerli ızgaralar oluşturmak için küçük bir Python programı oluşturdum:

import random

def output(array):
  print '\n'.join([''.join(row) for row in array])

def fliprow(rownum, array):
  return [row[::1-2*(rownum==idx)] for idx,row in enumerate(array)]

def flipcol(colnum, array):
  return zip(*fliprow(colnum, zip(*array)))

def randomflip(array):
  op=random.randint(0,1)
  row=random.randint(0,9)
  if(op==1):
    return fliprow(row, array)
  else:
    return flipcol(row, array)

def jumble(array):
  arraycopy=array
  for i in range(10, 1000):
    arraycopy=randomflip(arraycopy)
  return arraycopy

startarray=[
['1','2','3','4','5','6','7','8','9'],
['2','3','4','5','6','7','8','9','1'],
['3','4','5','6','7','8','9','1','2'],
['4','5','6','7','8','9','1','2','3'],
['5','6','7','8','9','1','2','3','4'],
['6','7','8','9','1','2','3','4','5'],
['7','8','9','1','2','3','4','5','6'],
['8','9','1','2','3','4','5','6','7'],
['9','1','2','3','4','5','6','7','8']]

print output(jumble(startarray))

8
Sıralama tamamlanana kadar rastgele satır / sütunları çeviren kısa bir çözüm yazdım. 500 milyon yinelemeden sonra, verdiğiniz ilk bulmacayı hala çözmedi (sadece satır 1'i çevirmeniz gereken). Rastgele olma, bu soruna kullanışlı bir çözüm gibi görünmüyor!
Josh

3
@Josh şaşırtıcı değil. Bu sorunun bir rubik küpünü çözmeye çok benzer olduğu görülüyor. Bir çeşit genişlik-birinci aramanın en iyi kaba kuvvet olacağını düşünüyorum. Olduğu söyleniyor, rastgele algoritma teorik olarak sonunda sonlandırmak zorunda ve belirtilen kurallara uyacak gibi görünüyor.
Cruncher

4
Kaba kuvvet gerekli değildir. Her ızgara döşemesinin yalnızca dört konumdan birinde sona erebileceğini düşünün : doğru konumu, çevrilmiş X, çevrilmiş Y veya çevrilmiş XY. Izgarayı zihinsel olarak ele almanıza yardımcı olabilir (0,0) en orta karo. Eğer (-2, 4) karo çözme ediyorsanız, sadece yerleri hedef sayıdır olabilir (-2, 4), (2, 4), (2, -4), veya (-2, -4).
Bay Llama,

2
@Cruncher: Tüm satır / sütun çevirmelerini kullanmak bunu imkansız hale getirir. Örneğin, en üstte bulunan 1 ( A1) işaretini alın ve konumuna getirin B1. Bir 1pozisyona bir alabilirsiniz B1, ancak o kiremit B9değil, kiremit olacak A1. Yalnızca tam satır / sütun çevirmelerine izin verildiğinden, en üstteki 1, yalnızca en dıştaki dört köşeden birinde olacaktır. Kuralları yanlış yaparsam, lütfen bana bildirin.
Bay Llama,

7
Tebrikler Gareth. Bu çok iyi tasarlanmış bir sorundur. Ayrıca, oldukça zorlu.
DavidC

Yanıtlar:


7

GolfScript, 300 279 268 karakter

n%`{\5,{.9+}%{;.2/\2%},\;''{1${.9/7+7*+}%+:z;}:?~{{.9<77*{\zip\9-}>:Z~{1$!{-1%}*\(\}@%\Z;}/}:E~{:^;{:c;.`{[\E[.^=\8^-=]{.c=\8c-=}%[^c+^8c-+8^-c+16c-^-]{9%49+}%=}+[[]]:K[[8^- 17c-][^9c+]1$]{:s;{[[]s.+.2$+]{1$+}/}%.&}/\,K+0=z?E}5,/}5,/{{+9%)}+9,%''*}9,%={z:u;}*}+1024,/u

Bu kodun oldukça yavaş olduğuna dikkat edin (ayrıca ağır kod bloğu manipülasyonu nedeniyle) ve birkaç dakika sürebilir. Kod çok değişkenli ve açık döngülere sahip olan çok golfscript un-ish'dir.

Bir saniyeden daha az süren analitik bir çözüm yazmıştım. Golf sırasında bunu tamamen kırdım. Ne yazık ki, son iki gün içinde kodu geri izleyemedim ya da onaramadım. Bu nedenle, yine de daha kısa olan bu dene ve kontrol et versiyonunu hazırladım.

Yukarıda verilen bulmacaların cevapları:

1A2C4D9G9G9G9G1C1C1C1C9F9F9F9F1D1D1D1D2A2A2A2A8H8H8H8H2B2B2B2B2C2C8F8F2D2D2D2D3A3A7I7I3B3B7H7H7G7G7G7G3D3D7F7F6I6I6I6I4A4A4A4A6H6H6H6H6G6G4C4C4C4C6F6F4D4D

1AB39I9I1A1A9I9I1B1B9F9F8I8I8I8I2B2B8H8H8G8G8G8G2D2D2D2D3A3A3A3A7H7H7H7H3C3C3C3C3D3D7F7F6I6I4A4A6I6I4B4B4B4B6G6G4C4C4C4C6F6F6F6F4D4D

1A34D9I9I9I9I1A1A1A1A1B1B1B1B9G9G1C1C1C1C9F9F9F9F1D1D9F9F8I8I2A2A2A2A8H8H8H8H2C2C2C2C8F8F2D2D8F8F7I7I7I7I3A3A3B3B7G7G7G7G3C3C3C3C6I6I6I6I6H6H6H6H4B4B4B4B6G6G6G6G4C4C6G6G6F6F4D4D6F6F

Bunu yenmek oldukça zor olacak ...
Gareth

Görünüşe göre yanılmışım ...
Gareth

@ Gareth, bunun örneğin matematiğe karşı golfscript ile zor olacak bir zorluk olduğunu biliyordum.
Howard

1
@Howard - hangi yaklaşımı kullandınız? Bahsettiğiniz 'dene ve kontrol et sürümü' nedir?
SergeyS

24

Mathematica 582 575 503 464 282

Golf spikerleri ile savaşmak için ağır toplar kullanmalıyım!

i = "986553229
264564891
759176443
643982153
567891234
526917874
685328912
891732537
117644378";

a=Array;h@M_:=Join@@a[9(M〚##〛/. 9->9⌈2Random[]⌉)+Abs[{##}-5]&,n={9,9}];
For[i_~t~j_:=i{#2,10-#2}+j#-9&~a~{9,4},!ListQ[e=GroupElementToWord[
PermutationGroup[Cycles/@Join[1~t~9,9~t~1]],
h[ToCharacterCode@StringSplit@i-48]~FindPermutation~h@a[Mod[8+##,9,1]&,n]]],];
e~IntegerString~36<>""

Çıktı:

g69g69g8g8g7g7gd96d96d8d8d7d7dh6h64a6a46d6d4g4g6b6b7h7h7c7c2a8a27b7bd8db8b7f7fg8g82c2c94a4a3a3aigfdc91

İşte PermutationGroup[...]olası çevirileri ayarlar ve GroupElementToWord[...]problemi çözer (yaklaşık 0.2saniye). Asıl sorun, 9başlangıçtaki ve son kılavuzdaki pozisyon arasındaki uyuşmazlığı tespit etmenin zor olmasıdır . Golf oynamak için rastgele yapıyorum (birkaç saniye sürer). Bazı uyarılar var ama bunlardan biri görmezden gelebilir.

Izgaraları test etmek için diğer:

g69g69g8g8g7g7gh89h89h7h7h6h6hf6f6g6g64f4f4h4hg7g73g3g2a8a28d8db8b83d3dg8g82c2c9a3a643a3a2g9f9d9c9ga
h89h89h7h7h6h6h6h6h6f6f6g6g6d6d3a7a37g7g7h7h3c3c2a8a27b7b8d8d2f2f8b8b3f3f2b2ba2a764a8aih9g9c9gb1i

Örnekleri tamamen yeniden üretir:

1
i
2i

Önceki çözüm (464)

akıllı yerleşik işlevler olmadan ve çalışma zamanı 4 ms ile:

M=ToCharacterCode@StringSplit@i-48;
S="";s=Signature;H=(S=S<>{#,#2+9}~IntegerString~36)&;
A=(m=M〚##〛)-9Mod[m+##,2]&[s@{2#3,5}#,2#2#3~Mod~2-#2]&~Array~{4,4,4};
u=s/@Join@@A;
H@@({k,l}=#&@@@#~Position~1&/@{v=u〚13;;〛;{h=#2u〚2〛,-#u〚5〛,-#u〚9〛}&@@v,v〚4〛=u〚4〛h;v});
A〚k〛=A〚k,;;,{2,1,3,4}〛;A〚;;,l〛=A〚;;,l,{3,2,1,4}〛;
MapIndexed[4#≠#4&&H@@@If[#2<3,#0[#3,#,#2,#4];k,#0[#,#3,#4,#2];10-k]&@@
If[s@#<0,#〚{1,3,2,4}〛,#]&@Ordering[k={#2,#2};#]&,A,{2}];
M〚5,1〛<5&&5~H~{};M〚1,5〛<5&&{}~H~5;S

Buradaki tüm yeni hatlar gerekli değildir.

Çıktı:

3b9i9i1a1a1a1a9i9i1a1a9h9h1b1b1b1b9h9h9g9g1c1c9g9g9f9f1d1d9f9f8h8h2b2b8f8f8f8f7i7i7h7h3b3b3b3b7h7h3b3b7h7h7g7g3c3c7g7g3c3c7f7f6i6i4a4a6h6h4b4b4b4b6g6g4c4c6g6g4c4c6f6f4d4d4d4d6f6f4d4d6f6f4d4d

Diğer iki test ızgarası:

13ab9i9i1a1a9i9i9h9h1b1b1b1b9h9h9f9f8i8i8i8i8h8h2b2b2b2b8h8h8h8h8g8g8g8g8f8f2d2d2d2d8f8f2d2d7i7i3a3a3a3a7i7i7h7h3b3b7h7h3b3b7g7g3c3c3c3c7g7g3c3c7f7f3d3d3d3d7f7f7f7f6i6i4a4a6i6i6h6h4b4b4b4b6h6h4b4b6g6g4c4c4c4c6f6f4d4d4d4d6f6f4d4d6f6f
2bc9i9i1a1a9i9i9g9g1c1c9g9g1c1c9f9f1d1d1d1d8i8i8i8i8h8h2b2b2b2b8f8f2d2d7i7i7h7h3b3b3b3b7h7h3b3b7g7g3c3c7f7f3d3d3d3d7f7f3d3d6i6i4a4a4a4a6h6h4b4b6g6g6g6g6f6f4d4d

Görselleştirme:

anim = Reap[Fold[Function[{m, i}, 
 If[i > 9, (Sow@Grid[#, Background -> {i - 9 -> Pink, None}] & /@ {m, #}; #) &@
   Transpose@MapAt[Reverse, Transpose@m, i - 9], (Sow@Grid[#, 
         Background -> {None, i -> Pink}] & /@ {m, #}; #) &@
   MapAt[Reverse, m, i]]], M, IntegerDigits[FromDigits[S, 36], 36]]];

ListAnimate[Join[{#, #} &@Grid@M, anim[[2, 1]], {#, #} &@Grid@anim[[1]]], 5]

görüntü tanımını buraya girin

Giriş dizisi irasgele olarak üretilebilir

M = Array[Mod[8 + ##, 9, 1] &, {9, 9}];
(M[[#]] = Reverse@M[[#]]; M[[All, #2]] = Reverse@M[[All, #2]];) & @@@
   RandomInteger[{1, 9}, {10000, 2}];
i = ToString /@ # <> "\n" & /@ M <> ""

Kısa tartışma

  • Çeviriler yalnızca şu öğeleri değiştirebilir ("dörtlü"):

    görüntü tanımını buraya girin

  • Bu elemanları, yalnızca ilk ve son sipariş aynı imzaya sahipse, diğer elemanlardan ayrı olarak değiştirmek mümkündür.

  • Bu dört elementin klipleri, 4. derece değişken grubunu oluşturur (= tetrahedral dönme grubu). Bu grubun her elemanı 2 üretici elemanın bir bileşimidir. Öyleyse ilk ve son konumu biliyorsak, karşılık gelen dönüşümü basit bir çevirme kombinasyonu olarak çözebiliriz.

ayrıntılar

Sporculuk için ödülün bitiminden önce detayları yazıyorum!

M=ToCharacterCode@StringSplit@i-48;

Dizeyi imatrise dönüştürün M.

S="";s=Signature;H=(S=S<>{#,#2+9}~IntegerString~36)&;

Karakterleri ekleyeceğiz S. Şimdi boş dize. H[i,j]karakter i( 1,2,3,...,9) ve karakter eklenir j( a,b,c,...,itaban-36).

A=(m=M〚##〛)-9Mod[m+##,2]&[s@{2#3,5}#,2#2#3~Mod~2-#2]&~Array~{4,4,4};

Öğeleri farklı olarak dönüştürürüm

görüntü tanımını buraya girin

Hedef matrisi aşağıdaki şekilde elde etmek için

görüntü tanımını buraya girin

O zaman algoritmamda iki ana adım var

  1. Bul (örn imzası hedef matrisinde olarak imza elde etmek çevirir {-7,-1,1,7}IS 1ve imzası {-6,2,-2,6}olan -1):

    u=s/@Join@@A;
    H@@({k,l}=#&@@@#~Position~1&/@{v=u〚13;;〛;{h=#2u〚2〛,-#u〚5〛,-#u〚9〛}&@@v,v〚4〛=u〚4〛h;v});
    A〚k〛=A〚k,;;,{2,1,3,4}〛;A〚;;,l〛=A〚;;,l,{3,2,1,4}〛;
    
  2. Doğru sırayı almak için her "dört" ü çevirin:

    MapIndexed[4#≠#4&&H@@@If[#2<3,#0[#3,#,#2,#4];k,#0[#,#3,#4,#2];10-k]&@@
    If[s@#<0,#〚{1,3,2,4}〛,#]&@Ordering[k={#2,#2};#]&,A,{2}];
    

    Algoritmanın en önemsiz kısmı. Örneğin, dönüşüm 1b1bdönüştürür {-7,-1,1,7}için {-1,1,-7,7}. Dönüşüm 9h9hdönüştürür {-7,-1,1,7}için {-7,7,-1,1}. Yani iki haritamız var

    {1,2,3,4} -> {2,3,1,4}
    {1,2,3,4} -> {1,4,2,3}
    

    ve keyfi bir sipariş {x,y,z,w}vermek istiyoruz {1,2,3,4}. Basit yöntem (rastgele bir arama hariç)

    repeat   
    {x, y, z, w} -> If[z < 3, {y, z, x, w}, {x, w, y, z}]
    until {1,2,3,4}
    

    Kanıtlayamam ama işe yarıyor!

Son adım

M〚5,1〛<5&&5~H~{};M〚1,5〛<5&&{}~H~5;S

Orta satır ve orta sütunun önemsiz çevirmelerini gerçekleştirir ve sonucu döndürür.


@Gareth Çıktıda küçük karakterler kullanabilir miyim? Bana birkaç karakter kazandırıyor.
ybeltukov

Evet, çıktıdaki küçük harfleri kabul edeceğim (bunu not etmek için soruyu değiştireceğim). Mathematica'ya sahip değilim, bu yüzden başka bir Mathematica kullanıcısı kodun gerçekten çıktı oluşturduğunu onaylayabilir mi? Üç test çözümünü doğruladım ve hepsi doğru, yani +1. İyi iş!
Gareth

Sadece merak ediyorum - yaklaşımınızın performansı nedir? Binlerce çevirme tarafından oluşturulan girdileri test ettiniz mi?
SergeyS

@SergeyS Evet, yaklaşık 50 ms sürer :)
ybeltukov

@Gareth Programımı yeniden yazdım, sonuçları kontrol edebilir misiniz? Testlerim her şeyin doğru olduğunu göstermiştir.
ybeltukov

7

J 487 438

q=:3 :'(>:9|+/~i.9)=/&((,{;/(,.8&-)y){])g'
l=:2 :0
:
o=:o,(m+x){a.
x&(|.@{`[`]})&.v y
)
r=:49 l]
c=:97 l|:
w=:2 :'g=:4 v^:(4=(<m){g)g'
p=:_1=C.!.2@,@:I.@q
t=:2 :'for_i.>:i.3 do.g=:i v^:(p m*i)g end.'
z=:2 :0
'i j I J'=.y,8-y
g=:".'(',(,' ',.,(I.m{q y){,;._1 n),'])^:2 g'
)
d=:3 :0
g=:9 9$".,_ list,' ',.y
o=:''
0 4 w c
4 0 w r
0 1 t c
g=:0 c^:(-.(p 1 0)=p 1 2)g
1 0 t r
for_k.>,{;~i.4 do.0 z';;jcir;irjc;Irjc'k
3 z';;IrJc;JcIr;'k end.o
)

d Belirtilen biçimde bir ızgara dizesi alan ve belirtilen biçimde bir çözüm dizesi döndüren bir fiildir.

Örnek kullanım:

   d '987654321',LF,'234567891',LF,'345678912',LF,'456789123',LF,'567891234',LF,'678912345',LF,'789123456',LF,'891234567',LF,'912345678'
bcda2341a1a1b1b1c1c1d1da2a2b2b2c2c2d2d2a3a3b3b3c3c3d3d3a4a4b4b4c4c4d4d4

Şimdi her iki yeni satır türünü de kabul eder.

Test şebekelerine yönelik çözümler:

b3a1a11b1bc9c99g9gd9d99f9fb8b8f8f87i7i7h7hc3c3g7g77f7fa6a64b4bh6h6c4c4g6g6d6d6f6f6
cd24a9a91c1c1d1d9f9fa2a2i8i88h8hc2c2g8g82d2d3b3bh7h7d3d37f7fa6a64b4bg6g64d4d6f6f
bc2a9a99i9ic1c1g9g91d1df9f9i8i8b2b2h8h82c2cd8d87i7ib3b3c7c7d3d34a4ai6i6b6b6g6g6d6d6

J için oldukça yeniyim; Bu muhtemelen daha da golf olabilir.


Geçersiz / çözülemeyen ızgaraları kontrol etmek 123 karakter cezasına neden olur. Şimdiye kadarki cevapların böyle bir hata kontrolü olduğunu sanmıyorum.

Bunu yapmak için, bunun ilk satırını değiştirin d:

if.-.+./89 90=#y do.0 return.end.if.-.*./(/:~y)=/:~(#y)$'123456789',LF do.0 return.end.g=:9 9$".,_ list,' ',.y

ve buna son satır:

3 z';;IrJc;JcIr;'k end.if.*./,g=>:9|+/~i.9 do.o return.end.0

0Boş bir dize döndürmek, tamamen çözülmüş bir ızgarayı doğru bir şekilde çözmekten ayırt edilemeyeceği için bu tür hatalara dönmeyi seçtim . Bunun UNIX yeni satırlarını varsaydığını unutmayın (tekrar).


Tebrikler, daha yeni öne geçtin. :-)
Gareth

Girdi kurallarınız gereği bir dize değil gibi görünüyor, yoksa bir şey mi özledim?
SergeyS

@SergeyS: Kafan karışmış olabilir. Bildiğim kadarıyla, J dizeleri değişmezleri içine kaçış (newline gibi) koymanın hiçbir yolu yoktur. J'deki 'a', LF, 'b' yapıları + karakterlerinin eklenmeye çalıştığı dillerde "a" + "\ n" + "b" ile benzerdir.
AlliedEnvy

Tamam, anlamlı geliyor, teşekkürler.
SergeyS

1962 APL kitabındaki dosyalar hakkındaki bölümü okuyordum ve @AlliedEnvy'nin doğru olduğunu düşünüyorum. Bu, soru biçimindeki bir dosyadan okunduğunda verinin programa nasıl görüneceğidir. LFLer temsil bölümleri sıralı dosya.
kullanıcı

5

C # 540 399

Eh, fedakarlık performansı (şimdi 30 saniye kadar sürer), dinamik değişkenler, biraz değişmiş çözüm mantığı getirdi. Ve evet, şimdi satır sonları içeren bir dize olarak bekleniyor (kurallarda istendiği gibi).

Tabii ki C # önceden tanımlanmış matematik fonksiyonlarına sahip değil, bu yüzden Mathematica adamlarıyla savaşmak zor olurdu. Yine de, yazar sayesinde bu büyük bir zorluktu!

string S(string _){for(i=0,e=1>0;e;){
for(h=v=j=0;j<89;)m[j/10,j%10+9]=_[j++]-49;a="";
for(j=i++;j>0;v++,j/=2)if(j%2>0)F(v);
for(;h<9&(h<4|!e);h+=j/36,j%=36)if((e=m[h,g=j++%9+9]!=(t=(h+g)%9))|m[v=8-h,g]==t){F(v);F(g);F(v);F(g);}
}return a;}void F(int z){for(f=z<9;++l<9;)m[0,l]=m[f?z:l,f?9+l:z];for(;l-->0;)m[f?z:l,f?9+l:z]=m[0,8-l];a+=(char)(z+=f?49:56);}
dynamic h,v,i,j,e,t,l=-1,g,a,m=new int[9,19],f;

Test ızgaraları:

3B9A9A9B9B9C9C9D9D9F9F9G9G9H9H9I9I9B9B9C9C9D9D9F9F9G9G9H9H9C9C9D9D9C9C9D9D8B8B8F8F8H8H8B8B8F8F8B8B8H8H7B7B7C7C7F7F7H7H7I7I7H7H6A6A6B6B6C6C6D6D6F6F6H6H6A6A6B6B6D6D6F6F6D6D6D6D6F6F5A5A5B5B5C5C5D5D5E5E5F5F5G5G5H5H5I5I5A5A5B5B5C5C5D5D5E5E5F5F5G5G5H5H5I5I5A5A5B5B5C5C5D5D5E5E5F5F5G5G5H5H5I5I5A5A5B5B5C5C5D5D5E5E5F5F5G5G5H5H5I5I

13AB9A9A9B9B9F9F9H9H9A9A9B9B9H9H9I9I8B8B8D8D8F8F8G8G8H8H8I8I8B8B8G8G8H8H8I8I8H8H7A7A7B7B7C7C7D7D7F7F7G7G7I7I7A7A7D7D7F7F7I7I7F7F6A6A6B6B6C6C6D6D6F6F6G6G6H6H6I6I6A6A6C6C6F6F6I6I6A6A6A6A5A5A5B5B5C5C5D5D5E5E5F5F5G5G5H5H5I5I5A5A5B5B5C5C5D5D5E5E5F5F5G5G5H5H5I5I5A5A5B5B5C5C5D5D5E5E5F5F5G5G5H5H5I5I5A5A5B5B5C5C5D5D5E5E5F5F5G5G5H5H5I5I

2BC9A9A9C9C9D9D9F9F9A9A9D9D9I9I8B8B8D8D8H8H8I8I8B8B8D8D8I8I7B7B7C7C7D7D7F7F7G7G7H7H7I7I7C7C7C7C7G7G6A6A6B6B6D6D6F6F6G6G6I6I6A6A6B6B6D6D6G6G6D6D6F6F5A5A5B5B5C5C5D5D5E5E5F5F5G5G5H5H5I5I5A5A5B5B5C5C5D5D5E5E5F5F5G5G5H5H5I5I5A5A5B5B5C5C5D5D5E5E5F5F5G5G5H5H5I5I5A5A5B5B5C5C5D5D5E5E5F5F5G5G5H5H5I5I

Eski Çözüm (540)

Herhangi bir girişte bir saniyeden daha kısa sürede çalışır (rastgele oluşturulmuş binlerce ızgarada test edilmiştir). Çıkış dizgisinin maksimum uzunluğu 165'dir (başlangıçta herhangi bir ızgara en fazla 82 klipte çözüldü, ancak golf sırasında bunu feda ettim).

string S(string[]_){for(i=0;i<1<<18;){
for(j=0;j<81;)m[j/9+49,j%9+65]=_[j/9][j++%9]-49;a="";char g,h='1',v='9',b,x=h,y;
for(j=i;j>0;x=x==v?'A':++x,j/=2)if(j%2>0)F(x);j=i+1;
for(i+=1<<19;h<58;h++,v--)for(g='A',b='I';g<74;g++,b--){
t=(h+g-6)%9;e=m[h,g];q=m[v,g];i=h>52&t!=e?j:i;
if(e!=t|q==t){x=q==t?v:g;y=q==t?g:v;
if(m[h,b]==t){x=b;y=h;}
F(x);F(y);F(x);F(y);}}}return a;}
void F(char z){var f=z<65;for(l=0;l<4;l++){n=m[d=f?z:49+l,s=f?65+l:z];m[d,s]=m[o=f?z:57-l,u=f?73-l:z];m[o,u]=n;}a+=z;}
int i,j,q,e,t,l,s,d,n,u,o;int[,]m=new int[99,99];string a;

Örnek 1 için cevap:

15A5A5B5B5C5C5D5DE5E55F5F5G5G5H5H5I5I

Örnek 2 için cevap:

19AI1I1H1H1G1G1F1F19F9F9G9G9H9H9I9I8A8AI8I87A7AI7I76A6AI6I65A5A5B5B5C5C5D
5DE5E55F5F5G5G5H5H5I5I

Örnek 3 için cevap:

129AI1I1H1H1G1G1F1F19F9F9G9G9H9H9I9I8A8AI8I87A7AI7I76A6AI6I65A5A5B5B5C5C5
D5DE5E55F5F5G5G5H5H5I5I

Test karelerinin cevapları:

346B9A9AH1H1C9C9D9D99F9F9G9GH9H99I9IB8B8F8F87B7B7C7C7F7FH7H77I7I6A6A6B6BC6C66D6DG6G6H6H66I6I5A5A5B5B5C5C5D5DE5E55F5F5G5G5H5H5I5I

1346ABA9A9H1H19F9FH9H99I9IH2H28D8D8F8FG8G8I8I8I3I37B7B7C7CF3F37G7GI7I7H4H4D6D66F6F5A5A5B5B5C5C5D5DE5E55F5F5G5G5H5H5I5I

2BCA9A99C9CF1F19F9F9I9IH2H2D8D88H8HI8I87B7BC7C77D7D7F7F7H7H7I7II4I4B6B6D6D6G6G66I6I5A5A5B5B5C5C5D5DE5E55F5F5G5G5H5H5I5I

Şimdi sadece Mac'im için Mono'yu indiriyorum, böylece programın kendisini test edebiliyorum, ama zaten belirli bir çözüm için belirli bir çözümü çalıştıran ve çözümün bu ızgara için geçerli bir çözüm olup olmadığını söyleyen bir doğrulayıcım var - ve bu Bana verdiğin üç örnek çözümün geçerli olmadığını söylemek. Sadece neden şimdi araştırıyorum.
Gareth

Aha! Burada ne olduğunu anladım! Verdiğiniz cevaplar, 3 test ızgarasının değil (soruda daha düşük olan) 3 örneğe cevap olarak görünmektedir. Onlar biraz daha uzun olsa, gerçekten de bu ızgaralara doğru çözümleridir 1, Ave 2Ihangi basit çözümlerdir - ama ızgara çözüm uzunluğuna yargılamıyorum çünkü aslında önemli değil :-) düzenleme Yapabilseydim ve 3 test ızgarasının cevaplarını verin (Mac’te şimdi çalışabilir mi, bakalım) +1'inizi verebilirim.
Gareth

@Gareth - ayy, test kareleri için cevapları özledim, teşekkürler. Onları şimdi cevaplarıma ekledim.
SergeyS

Mükemmel, bunun için teşekkürler. Hepsi doğrulandı. Xamarin bir sebepten dolayı Mac'imde çalışmadı, bu yüzden programı birkaç saat içinde işte test etmek zorunda kalacağım.
Gareth

@Gareth - Aslında bu kodda C # için özel bir şey yok, büyük olasılıkla Java ya da C ++ 'a çok acı çekmeden dönüştürebilir ve ... bazı karakterleri golf oynayabilir :) Ayrıca GolfScript ya da başka bir şeye dönüştürmekten çekinmeyin özlü - bu iki veya daha kısa görünebilir;)
SergeyS
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.