Vim'de, bir komuttan önce gelen bir sayı 3dd
ile eşdeğer bir komutu tekrarlayabilirsiniz dd dd dd
. Bu yinelenen model Vim komutlarıyla sınırlı değil. Dize de bu şekilde çoğaltılabilir.
Şartname:
Yalnızca basamaklar, alfabetik karakterler (hem büyük hem de küçük harf) ve boşluklardan oluşan ve isteğe bağlı bir son satır olan girdi olarak, aşağıdaki işi yapan bir program yazın:
Her "kelime" rakam ve harflerden oluşur. Harfden önce bir sayı gelirse (bir sayıda birden fazla basamak olabilir veya sayı sıfırsa), verilen harf için bu harfi tekrarlayın. Örneğin:
a2bc -> abbc 3xx1yz -> xxxxyz 10ab0c0d0e -> aaaaaaaaaab # No 'cde' because there's a zero 2A2a2A2a -> AAaaAAaa
Kelimeler boşluklarla ayrılır. Bitişik her iki kelime arasında en fazla bir boşluk vardır.
Kolay değil mi? İşte ek şeyler:
Boşluktan önce bir sayı varsa, verilen süreler için sonraki kelimeyi tekrarlayın. Sayı her zaman önceki sözcüğün sonuna veya dizenin başlangıcına eklenir. Misal:
a2bc3 2d -> abbc dd dd dd 3 3a -> aaa aaa aaa 33a -> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 0 abcd0 efgh3 2x -> xx xx xx a3 0xc b -> a c c c b
Boş bir kelimenin tekrarlanması gerekiyorsa, arka arkaya birden fazla boşluk bırakmayın. Ezin onları:
a3 0x2 b -> a b b # NOT 'a b b'
Başka bir deyişle, programınız asla iki boşluğun birlikte çıktısını almamalıdır.
Giriş asla boş değildir, ancak çıktının boş olmaması gerekli değildir:
0 3x -> (empty)
Giriş ve çıkış tercih edilen herhangi bir şekilde alınabilir. Bağımsız değişkenlerden girdi alan ve dönüş değerleri üzerinden çıktı veren bir işlev de kabul edilebilir.
Bir program ise, hata ile çıkmamalıdır (yani, dönüş değeri sıfırdır).
Sayılar her zaman ondalıktır ve sayının kendisi sıfır olmadığı sürece asla sıfırla başlamaz, bu durumda yalnızca bir sıfır vardır. Yani girdi olarak düşünmenize
077a
veya vermenize gerek yok000a
.Tüm sayılar 2 ^ 31'in altındadır (2.147.483.648). Maksimum çıkış uzunluğu 2 ^ 32 (4,294,967,296) baytın altında.
Program isteğe bağlı olarak bir sondaki boşluk ve / veya bir sondaki yeni hat çıktısı verebilir. Bu alan ve satırsonu, çıktının geçerliliğini etkilemez. Doğru çıktı boş olsa bile, bir boşluğun çıktısı ve ardından bir yeni satır verilir.
Kısacası, geçerli bir girdi şu normal ifadeyle eşleşir:
([0-9]+ )?([0-9A-Za-z]*[A-Za-z])([0-9]* [0-9A-Za-z]*[A-Za-z])*( ?\n?)
Ve geçerli bir çıktı için:
([A-Za-z]+)( [A-Za-z]+)*( ?\n?)
Örnek test senaryoları:
abcdefg -> abcdefg
a3bcd -> abbbcd
a3bbbc -> abbbbbc
3a0b -> aaa
abc 3d -> abc ddd
abc3 d -> abc d d d
5 1x5 1y0 z -> x x x x x y y y y y
a999 0x b -> a b
999 0s -> (empty)
0 999s -> (empty)
0 999s4 t -> t t t t
a3 0xc b -> a c c c b
ABC3 abc -> ABC abc abc abc
Bu bir kod golf , bu yüzden her dilde bayt en kısa program kazanır!
a3 0xc b
-> gibi bir test a c c c b
eklenmesi gerektiğini düşünüyorum.