Aşağıdaki senaryoyu hayal edin: Bir arkadaşınızla savaş gemileri oynuyorsunuz ama hile yapmaya karar veriyorsunuz. Geminizin olduğu yere ateş ettikten sonra bir gemiyi taşımak yerine, hiç gemi yerleştirmemeye karar verdiniz. Gemileri bu şekilde yerleştirmek imkansız olana kadar, tüm atışlarının özleştiğini söylersin.
Tarla boyutu, gemi büyüklüklerinin bir listesi ve bir çekim listesi: Bir şekilde 3 argüman alan bir fonksiyon veya tam bir program yazmalısınız.
savaş alanı
Verilen parametrelerden biri pano büyüklüğüdür. Savaş alanı bir hücre karesidir ve verilen parametre karenin sadece bir tarafıdır.
Örneğin, aşağıdaki 5 boyutlu bir tahtadır.
Alandaki koordinatlar 2 bileşenli bir dize olarak belirtilir: bir harf ve ardından bir sayı. Belirli bir durumda olan harflere güvenebilirsiniz.
Harf sütunu belirtir, sayı hücrenin satırını belirtir (1 indeksli). Örneğin yukarıdaki resimde, vurgulanan hücre ile gösterilir "D2"
.
Sadece 26 harf olduğundan, alan 26x26'dan büyük olamaz.
Gemiler
Gemiler 1 veya daha fazla bloktan oluşan düz çizgilerdir. Gemilerin miktarı, birinci öğenin 1 hücreli gemilerin, ikincisinin 2 hücreli gemilerin sayısı olduğu bir listede belirtilir.
Örneğin, liste [4,1,2,0,1]
aşağıdaki gemi setini oluşturur:
Savaş alanına yerleştirildiğinde, gemiler kesişemez, hatta birbirlerine dokunamaz. Köşelerde bile değil. Bununla birlikte, alanın kenarlarına dokunabilirler.
Aşağıda geçerli bir gemi yerleştirme örneği görebilirsiniz:
Belirli bir gemi için, her zaman verilen büyüklükteki boş bir tahtanın üzerinde bir yerleşim bulunduğunu varsayabilirsiniz.
Çıktı
Eğer böyle bir gemi yerleşimi varsa, bunlardan herhangi birini çıkarmanız gerekir.
Programın, biri boş hücreyi, birini - bir gemi parçasını ve birini - "cevapsız" olarak işaretlenmiş bir hücreyi (biri boş hücreyi, biri de bir gemi parçasını belirtmek için) 3 türden birinin yeni satırla ayrılmış bir ascii karakter matrisi çıkarması gerekiyor. Başka karakterlerin çıkışı yapılmamalıdır.
Örneğin,
ZZ@Z
\@@Z
@\\Z
\Z\\
(Bu örnekte, @
boş hücre, \
"kaçırılmış" bir hücre ve Z
gemi parçası olarak tanımladım )
Eğer böyle bir yerleşim mevcut değilse, program / fonksiyon hiçbir şey çıkarmadan geri dönmelidir.
Giriş
Tam kapsamlı bir program yapmaya karar verirseniz, listelerin nasıl girileceğini belirtmek yeterlidir, bazıları argümanlardan, bazıları da stdin'den geçer.
Bu kod-golf , en az sayıda karakter kazanır.
Golf sahası olmayan en iyi duruma getirilmiş çözümlere bir örnek burada bulunabilir
Derleme ile -std=c99
, ilk argüman tahtanın boyutu, diğer argümanlar gemi boyutlarıdır. Stdin'de yeni satırlarla ayrılmış bir çekim listesi verilir. Örnek:
./a 4 1 1 1 <<< $'A2\nA4\nB3\nC3\nC4\D4'
10x10
bir 4,3,2,1
gemi setiyle anında hesaplanıyor
26x26
? Regexps ve özyinelemeye dayanan bir çözüm taslağını çizdim ve fazlasıyla yavaşlıyor = alanlar için kullanılamaz6x6
. Ya çok aptalca bir şey yapıyorum ya da cevap eksikliği diğerlerinin de başarılı olamadığı anlamına geliyor.