Çöpleri topla


9

Bir caddeye bakıyorsunuz ve birisi çöpleri dışarıda bırakıyor! Çöpü çöp kutularına koyarak sorunun çözülmesine yardımcı olacak bir program yazmanız gerekir.

Görev

Cadde yazdırılabilir ASCII karakter dizisinden oluşur, örneğin:

[[](dust)[]] car ((paper)vomit) (broken(glass)) [[] (rotten) fence (dirty)

Buradaki parantezlerin bazıları eşsiz; bunlar sadece tuzaklardır. Bizim için önemli olan eşleşen parantez setleri.

Bir çöp tenekesi ile başlayan bir dizedir [ve ile biten ]ve içten eşleşti parantez ve parantez ile. Örneğin, []ve[[](dust)[]] yukarıdaki dize çöp kutuları vardır.

Bir çöp torbası , dahili olarak eşleşen parantez ve parantezlerle başlayan (ve biten bir dizedir ). Örneğin (dust), yukarıdaki dizede bir çöp torbasıdır.

Çöp torbalarının bazılarının zaten çöp kutularında olması mümkündür. Bununla birlikte, en az biri dışarıda bırakılmış olacak ve çöp torbalarını hepsi çöp kutularının içinde olacak şekilde taşımamız gerekiyor. Özellikle, şu anda bir çöp kutusunun içinde olmayan her çöp torbası için (yani o çöp kutusunun bir alt dizesi), dizedeki mevcut konumundan kaldırmamız ve bunun yerine bir çöp kutusunun içindeki bir yere eklememiz gerekir. .

Burada ek bir kural var. Çöp toplayıcılarına çok fazla para harcamak istemediğimiz ve rotaları onları cadde boyunca sağdan sola götürdüğümüz için, her çöp torbasını sola taşımak istiyoruz (en önemli kriter, onu taşımak zorunda olduğumuzu varsayarsak) tümü) ve mümkün olan en kısa mesafe (sola kaydırıldığı sürece). Örneğin, tek doğru çıktı

[can1](bag)[can2]

dır-dir

[can1(bag)][can2]

(çantayı sadece bir karakter sola hareket ettirerek). Ayrıca, çantaların aynı göreceli sırada kalmaları gerekir:

[can](bag1)(bag2)

olmak zorunda

[can(bag1)(bag2)]

(yani (bag2)soluna koyamazsınız (bag1).)

Açıklamalar

  • En soldaki çöp kutusunun solunda çöp torbası olmayacak; tüm çöpleri sola doğru hareket ettirmek her zaman mümkün olacaktır.
  • Hareket etmek için her zaman en az bir çanta olacaktır. Birden fazla olabilir.
  • Bir çöp torbasının içinde asla bir çöp tenekesi olmayacaktır (kutular atmak için çok değerlidir).
  • Bir çanta zaten bir kutunun içindeyse, yalnız bırakın.
  • Girdi ve çıktının arka boşlukta (yeni satırlar dahil) farklı olması sorun yaratmaz.

Örnekler:

  • Giriş: [[](dust)[]] car ((paper)vomit) (broken(glass)) [[] (rotten) fence (dirty)

    Çıktı: [[](dust)[]((paper)vomit)(broken(glass))] car [[(rotten)(dirty)] fence

  • Giriş: []] (unusable) door (filthy) car

    Çıktı : [(unusable)(filthy)]] door car


5
Yakın seçmenler, belirsiz bulduklarınızı açıklayabilir misiniz? Gönderinin neyin yanlış olduğuna dair açık bir rehber olmadan düzeltilmesi zor olacak.

@ ais523 Görevin ne olduğunu anlayamıyorum. Bunun yorgun olduğum için geçerli olabileceği ancak şu anki ifade pek mantıklı değil
Blue

1
Temel olarak, parantezlerin içinde bulunan ancak parantezlerin içinde olmayan her alt dize için, parantez içinde de olana kadar sola doğru hareket ettirin.

Bu sorun tekrar tekrar kapanıp tekrar açıldığı için, sorunu anladığım şekilde düzenledim. Umarım bu süreçte problemi değiştirmedim.

@ ais523 Bu benim için sorun değil. Tüm düzenlemeleriniz için çok teşekkür ederim.
Ewan Delanoy

Yanıtlar:


3

JavaScript (ES6), 263 228 209 205 184 177 173 162 bayt

Kod / düzenli ifadeler ile herhangi bir yardım büyük beğeni topluyor.

f=s=>s.match(t=/\[\[][\w()]*\[]]|\[]/g,g=/\([\w()]*\)/g,i=0,u=s.split(t).filter(e=>e)).map(e=>e.substr(0,e.length-1)+u[i].match(g).join``+`]`+u[i++].replace(g,``)).join``

Anonim bir işlev; bir Stringparametre alır sve çıktıyı döndürür.

/\[\[][\w()]*\[]]|\[]/g çöp kutularını iç içe çöp torbaları ile eşleştirir, ancak gerekirse çöp torbaları içindeki dengeli parantezleri kontrol edebileceğini düşünmüyorum.

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.