Bu görev, Birinci Periyodik Premier Programlama Bilmece Baskısının bir parçasıdır .
Aşağıdaki biçimde öğelerin sıradüzenini alırsınız:
2
Hat
1
Gloves
hangi gibi kutulara koymak gerekir:
.------------.
| Hat |
| .--------. |
| | Gloves | |
| '--------' |
'------------'
Girdi biçiminde sayılar, sayının belirttiği sayıda öğe içeren bir kutu başlatır. İlk kutunun içinde iki eşya vardır (Şapka ve Eldivenleri içeren kutu), ikincisi sadece tek bir parça içerir - eldivenler.
Görülebileceği gibi, kutular da kutular içinde yaşayabilir. Ve her zaman yuvarlanırlar ... bir çeşit (sivri köşeler bir yara tehlikesidir ve biz bunu istemeyiz).
Aşağıda, şartnamenin verdiği her küçük parçayı kullanmak isteyenler için kötü detaylar var. Dikkat edin, spec okumayan yanlış çözümler sunmak için hiçbir bahane değildir. En sonunda bir test senaryosu ve birkaç test senaryosu var.
Şartname
Kutular aşağıdaki karakterlerden oluşur:
|
(U + 007C) dikey kenarları oluşturmak için kullanılır.-
Yatay kenarları oluşturmak için (U + 002D) kullanılır.'
(U + 0027) yuvarlak alt köşelerdir..
(U + 002E) yuvarlak üst köşelerdir.
Bir kutu bu nedenle şöyle görünür:
.--. | | '--'
Unicode'un ayrıca yuvarlak köşeleri ve uygun kutu çizim karakterleri olmasına rağmen, bu görevin yalnızca ASCII'de olduğunu unutmayın. Unicode'u sevdiğim kadarıyla, son on yılda, tam olarak varılmayan dillerin ve ortamların olduğunu fark ediyorum.
Kutular, metin veya diğer öğelerden oluşan bir dizi dizisi içerebilir. Kutudaki tek tek öğeler yukarıdan aşağıya doğru oluşturulur. Böylece A, B, C dizileri aşağıdaki gibi işler:
.---. | A | | B | | C | '---'
Elbette bu, metin gibi bir öğe olan iç içe geçmiş kutular için de geçerlidir. Böylece A, B, Kutu (C, Kutu (D, E)), F dizisi aşağıdaki gibi olacaktır:
.-----------. | A | | B | | .-------. | | | C | | | | .---. | | | | | D | | | | | | E | | | | | '---' | | | '-------' | | F | '-----------'
Kutular boyutlarını içeriğe göre ayarlar ve iç içe geçmiş kutular her zaman ana öğelerinin boyutuna genişletilir. İçerikten önce ve sonra bir boşluk vardır, böylece ne metin ne de iç içe geçmiş kutular dış kutunun kenarına çok yakın olmaz. Kısacası, aşağıdaki yanlış:
.---. |Box| '---'
Ve aşağıdaki doğrudur:
.-----. | Box | '-----'
Çok daha güzel görünüyor :-)
Metin öğeleri (aşağıdaki Girişe bakınız) tam olarak çoğaltılmalıdır.
Her zaman tek bir üst seviye kutu vardır (cf. XML). Ancak, bir kutu başka birkaç kutu içerebilir.
Giriş
Giriş standart girişte verilir; Daha kolay bir test için muhtemelen bir dosyadan yönlendirildi.
Girdi satır şeklinde verilir; her satır geçerli kutuya koymak için bir metin öğesini temsil eder veya yeni bir kutu açar.
Her satır bir satır sonu ile sonlanır.
Metin öğeleri, sayı içermeyen bir satırla işaretlenmiştir (aşağıya bakınız). Metin alfabetik karakterler, boşluk ve noktalama işaretleri (
.,-'"?!()
) kullanır. Metin boşlukla başlamaz veya bitmez ve her zaman en az bir karakter olur.Bir kutu içinde bir sayı bulunan tek bir satırla başlar. Sayı, kutunun boyutunu, yani içine konulan aşağıdaki öğelerin sayısını söyler:
2 A B
iki metin öğeli bir kutu verir:
.---. | A | | B | '---'
Bir kutu her zaman en az bir öğe içerecektir.
Kutuların sonu açıkça bir çizgiyle işaretlenmez; bunun yerine kutular, belirtilen sayıda öğenin içine koyulduktan sonra örtük olarak kapatılır.
Bir kutu, içinde kaç tane öğe olduğuna bakılmaksızın, her zaman yalnızca bir öğedir. Örneğin
3 A 4 a b c d B
ikincisi dört maddeli bir başka kutu olan üç maddeli bir kutu üretecektir.
Yuvalama ayrıca bir kutunun yalnızca tek bir öğe olduğu gerçeğini etkilemez.
Sınırları
Maksimum iç içe geçme seviyesi beş . Yani birbirlerinin içinde en fazla beş kutu var. Bu en dıştaki olanı içerir.
Kutu başına en fazla on öğe var.
Metin öğelerinin maksimum uzunluğu 100 karakterdir.
Çıktı
- Çıktı, yukarıda belirtilen kurallara göre tüm içeren ve iç içe geçen öğeleri içeren işlenmiş kutudur.
- Çıktı standart çıktıda verilmelidir ve tam olarak eşleşmelidir. Baştaki veya sondaki boşluklara izin verilmez.
- Her satır, sonuncusu da dahil olmak üzere bir satır sonu ile sonlandırılmalıdır.
Kazanma koşulu
- En kısa kod kazanır (yani kabul edilen cevabı alır).
Örnek giriş 1
3
This is some text!
Oh, more text?
Just text for now, as this is a trivial example.
Örnek çıktı 1
.--------------------------------------------------.
| This is some text! |
| Oh, more text? |
| Just text for now, as this is a trivial example. |
'--------------------------------------------------'
Örnek giriş 2
4
Extreme
nesting
3
of
boxes
4
might
lead
to
2
interesting
1
visuals.
Indeed!
Örnek çıktı 2
.--------------------------.
| Extreme |
| nesting |
| .----------------------. |
| | of | |
| | boxes | |
| | .------------------. | |
| | | might | | |
| | | lead | | |
| | | to | | |
| | | .--------------. | | |
| | | | interesting | | | |
| | | | .----------. | | | |
| | | | | visuals. | | | | |
| | | | '----------' | | | |
| | | '--------------' | | |
| | '------------------' | |
| '----------------------' |
| Indeed! |
'--------------------------'
Örnek giriş 3
1
1
1
1
1
Extreme nesting Part Two
Örnek çıktı 3
.------------------------------------------.
| .--------------------------------------. |
| | .----------------------------------. | |
| | | .------------------------------. | | |
| | | | .--------------------------. | | | |
| | | | | Extreme nesting Part Two | | | | |
| | | | '--------------------------' | | | |
| | | '------------------------------' | | |
| | '----------------------------------' | |
| '--------------------------------------' |
'------------------------------------------'
Örnek giriş 4
3
Foo
2
Bar
Baz
2
Gak
1
Another foo?
Örnek çıktı 4
.----------------------.
| Foo |
| .------------------. |
| | Bar | |
| | Baz | |
| '------------------' |
| .------------------. |
| | Gak | |
| | .--------------. | |
| | | Another foo? | | |
| | '--------------' | |
| '------------------' |
'----------------------'
Test Komut Dosyası
Doğru bilgileri almak bazen zor olabileceğinden ( Ventero ve ben) doğru olup olmadığını kontrol etmek için çözümünüzü çalıştırabileceğiniz bir test senaryosu hazırladık. Bu bir hem de kullanılabilir PowerShell komut dosyası ve bir bash betiği . Çağırma geçerli: <test-script> <program invocation>
.
GÜNCELLEME: Test komut dosyaları güncellendi; Tanımladığım sınırlara uymayan birkaç test vakası vardı. PowerShell test komut dosyası, sonucu kontrol etmek için büyük / küçük harfe duyarlı karşılaştırma kullanmamıştır. Umarım şimdi her şey yolundadır. Sonuncusu oldukça büyük olmasına rağmen test vakalarının sayısı 156'ya düşürüldü.
GÜNCELLEME 2: Test çantası oluşturucumu yükledim . .NET 2 çalışma zamanını hedef alan C # ile yazılmış . Mono'da çalışıyor. İnsanların uygulamalarını test etmelerine yardımcı olabilir. Kesin bir kötü durum olarak görevdeki limitleri göz önünde bulundurarak deneyebilirsiniz:
nb.exe 1 10 10 5 100 100 | my invocation
yalnızca en iç düzeye kadar olan kutuları üretecek ve kutu başına maksimum öğe sayısını ve maksimum metin öğesi uzunluğunu kullanacaktır. Bu test senaryosunu test betiğine dahil etmedim, çünkü oldukça büyük ve çıktı daha büyük.
GÜNCELLEME 3: Satır sonlarının kodda nasıl olduğuna ve çözümün hangi satırda biteceğine bağlı olarak hata atmaya yatkın olan PowerShell test komut dosyasını güncelledim. Şimdi her ikisine de agnostik olmalı. Karışıklık için tekrar özür dilerim.