giriş
f A\/
Gibi karakterlerin bir ızgarasını düşünün
f f f
A
A / \
\ / A
A \/
/
\/
nerede:
f
bir su akışını aşağıya akan bir musluğu temsil ederA
su akışını iki katına çıkarır, böylece yarısı tam sola ve yarısı sağa gider\
su akışını bir birim sağa kaydırır/
su akışını bir birim sola kaydırır- kombinasyonlar
\/
, üstündeki su akışlarını toplayan sonsuz kapasiteye sahip bir çukur yaratır [space]
suyun hareket edebileceğinden daha fazla boş alan
Buradan, suyun ( *
) musluklardan çıktığı ve oluklara veya ızgara alanının dışına düştüğü sırada izleyeceği yolu hayal edebiliriz :
f f f <-- first second and third faucets
* * *A*
* *A*/ \*
\*/ * *A <-- a '*' is not drawn to the right of this A because it would be out of the 9×7 bounds
* *A*\/ <-- upper trough
**/ *
\/ * <-- lower trough
3 armatürün her seferinde aynı miktarda su verdiğini varsayarsak,
- İlk musluğun suyu alt oluğa gider.
- İkinci musluğun suyunun yarısı alt oluğa giderken, diğer yarısı alt oluk ve ızgaradan düşüyor.
- Üçüncü musluğun suyunun dörtte biri alt oluğa gider, dörtte biri ızgaranın dibinden düşer, dörtte biri üst oluğa düşer ve dörtte biri sağdaki ızgaradan düşer.
Buradan (1 + 3/4 + 1/4 + 1/4) / 3 = 75%
suyun oluklara yakalandığını (1/4 + 1/4 + 1/4) / 3 = 25%
ve şebekeden düştüğünü söyleyebiliriz .
Zorluklar
Bu ASCII su akışı kurulumuyla ilgili bu zorlukların herhangi birini veya tümünü tamamlayabilirsiniz. Hepsi kod golf, her meydan okuma için en kısa cevap kazanır. Kabul edilen cevap, toplam kod uzunluğu kravat kırıcı olarak en fazla zorluğu tamamlayan kişi olacaktır.
Zorluk 1
Belirli bir ızgara için oluklara akan suyun fraksiyonunu veren bir program yazın. Yukarıdaki örneğin çıktısı basitçe olacaktır 0.75
.
Zorluk 2
Bir ızgara verildiğinde, *
yukarıda yaptığım gibi suyun aktığı yerlere çeken bir program yazın . Boşluk karakterlerinin yanı sıra hiçbir şeyin üzerine yazmamalısınız ve ızgara boyutunu değiştirmemelidir. Yani böyle bir şey için
f
/A
Su A'nın her iki tarafından akmasına rağmen, çıkarılmadan sola /
çekilemez ve 2 × 2 ızgarayı büyütmeden sağa çizilemez.
Zorluk 3 (Güncelleme)
Toplam T ve K tutacak miktar olmak üzere iki negatif olmayan tamsayı alan bir program yazın (T> = K). Tam olarak bir tane ile bir ızgara oluşturun ve çizin f
, böylece musluk T ünite su döktüğünde, tam olarak K oluklara akacaktır. Bunu belirli bir (T, K) çifti için sonlu bir ızgarada yapmak mümkün değilse 'İmkansız' çıktısını alın.
Açıklamalar (tüm zorluklar için geçerlidir)
- Giriş stdin veya bir dosya veya hatta ızgaranın dize gösterimi üzerindeki bir işlev çağrısı yoluyla olabilir. Farklı girişlerin nasıl çalıştırılacağını açıkça belirtmeniz yeterlidir.
- Çıktı stdout'a gitmelidir.
\A
veA/
veAA
beklediğiniz gibi de çukurlarının vardır.- Bir g x h ızgarası her zaman yeni satırları saymayan w * h karakterlerinin iyi biçimlendirilmiş bir dikdörtgeni olacaktır. Sondaki boşluklar eksik olmayacak
*
. - Izgara boyutları 1 × 1 kadar küçük ve keyfi olarak büyük olabilir. (Makul değer dahilinde keyfi olarak büyük, int.maxDeğer veya benzeri kabul edilebilir bir sınırdır. T ve K için de geçerlidir.)
- Üstünden bir dere
f
akar. - Musluklar sadece üst sırada değil, herhangi bir yerde olabilir.
A
üzerine dökülen su miktarını daima ikiye böler.
Not: gibi /A
ve //
tamamen geçerlidir. Su yok (meydan okuma 2 için çizmek için yeterli yer olmasa da) serbestçe karakterler arasında akar.
Yani, kurulumda
ff
/A
Sol f
akış aşağı akar, vurur /
ve sola kayar. Doğru f
akım, aşağıya dökülüyor vurur A
, yarım doğru gider ve yarım arasında kalan gider A
ve /
.
Örneğin
ff
**
*/A*
** *
** *
/A
suyun üzerine düşüyormuş gibi girişi nasıl ele alacağınızı belirtmeniz gerekir A
. Tüm zorluklar için \A
, bir oluk olup olmadığını açıklığa kavuşturmak iyi olur . Üçüncü meydan okuma için, düşen 3 ünitenin A
bölüneceği varsayılacaktır 1.5 / 1.5
(bu nedenle girdi gerçekten tek bir rasyonel sayıdır) mı yoksa 2 / 1
bu durumda hangi tarafın 2
?
A
her iki taraf da 1.5 kazanır. Şamandıra hassasiyetinin bir sorun olmadığından emin olmak kodlayıcıya bağlıdır.)
f
ler