Boşluk ekleyerek metni yaslama


10

Bu metin verildi

Lorem ipsum dolor sit amet, adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. En az adenim veniam, burun deliği egzersizi ullamco labouris nisi ut aliquip ex ea commodo resultsat. Voluptate velit esse cillum dolore eu fugiat nulla pariatur içinde reprehenderit içinde Duis aute irure dolor. Dışlayıcı sint occaecat cupidatat non proident, culpa qui officia deserunt mollit anim id est laborum sunt.

80 karakter ile aynı metni üreten en kısa programı yazınız. Yukarıdaki metin tam olarak şöyle görünmelidir:

Lorem ipsum dolor sit amet,  consectetur adipisicing elit, sed do eiusmod tempor
incididunt ut  labore et  dolore magna aliqua.  Ut  enim ad  minim veniam,  quis
nostrud exercitation ullamco laboris nisi ut  aliquip ex  ea  commodo consequat.
Duis aute irure dolor in  reprehenderit in voluptate velit esse cillum dolore eu
fugiat nulla pariatur.  Excepteur sint occaecat cupidatat non proident,  sunt in
culpa qui officia deserunt mollit anim id est laborum.

Kurallar:

  • kelimeler kesilmemelidir
  • fazladan boşluk eklenmelidir
    • bir noktadan sonra.
    • virgül sonra
    • en kısa kelimeden sonra (soldan sağa)
    • sonuçta birbirini takip eden 2'den fazla boşluk olmamalıdır
  • son satır haklı değildir.
  • çizgiler virgül veya nokta ile başlamamalıdır.
  • programınızın çıktısını sağlayın

kazanan: En kısa program.

Not: Giriş dizesi STDIN'de bir satır olarak sağlanır (satır besleme veya satır başı yok)

Güncelleme:

Giriş dizesi, kelime uzunluğu makul olan herhangi bir metin olabilir (örn. En fazla 20 ~ 25 karakter):

Lorem ipsum dolor sit amet, adipisizing seçkinler. Sed olmayan risus. Suspendisse lectus tortor, dignissim sit amet, başka yerde adipiscing, ultricies sed, dolor. Cras elementum ultrices diam. Maecenas ligula massa, varius a, semper congue, euismod non, mi. Proin porttitor, oric nec nonmymy molestie, enim est eleifend mi, fermentum olmayan diam nisl sit amet erat. Duis semper. Duis arcu massa, scelerisque vita, sonuç, pretium a, enim. Pellentesque congue. Risus volutpat libero pharetra tempor içinde ut. Cras vestibulum bibendum augue. Praesent egestas leo pede içinde. Praesent blandit odio eu enim. Pellentesque sed dui ut augue blandit sodalar. Vestibulum ante ipsum primis faucibus orci luctus ve ultrisler pozuere cubilia Curae; Aliquam nibh. Mauris ac mauris sed pede pellentesque fermentum. Maekenas adipisting ante olmayan sodales hendrerit. Ut velit mauris, egestas sed, gravida nec, ornare ut, mi. Aenean ut orci vel massa suscipit pulvinar. Nulla sollicitudin. Fusce varius, ligula non tempus aliquam, nunc turpis ullamcorper nibh, tempus sapien eros vitae ligula içinde. Pellentesque rhoncus nunc ve augue. Tam sayı kimliği felis. Curabitur aliquet pellentesque diam. Tamsayı quis metus vitae elit lobortis egestas. Lorem ipsum dolor sit amet, seçmenler adipiscing elit. Morbi vel erat non mauris convallis vehicula. Nulla ve sapien. Tamsayı tortor tellus, aliquam faucibus, convallis id, congue eu, quam. Mauris ullamcorper felis vitae erat. Proin feugiat, augue non elementum posuere, metus purus iaculis lectus, et tristique ligula justo vitae magna. Aliquam convallis sollicitudin purus. Praesent aliquam, enment fermentum mollis, ligula massa adipiscing nisl, ac euismod nibh nisl eu lectus. Sapien şirketinde Fusce vulputate sem Vivamus leo. Aliquam euismod libero eu enim. Nulla nec felis sed leo placerat imperdiet. Aenean suscipit nulla justo içinde. Suspendisse cursus rutrum augue. Nulla tincidunt tincidunt mi. Curabitur iaculis, lorem vel rhoncus faucibus, felis magna fermentum augue, ve ultricies lacus lorem varius purus. Curabitur ab amet.


3
Neden insanlardan programlarının çıktısını vermelerini istesiniz? Göndermeden önce sonuçlarını kontrol edemeyenlerden endişe duyuyor musunuz?
Peter Taylor

1
Ben çıktı metinden oluşan bir php programı sağlamak için cazip. ;-) Cidden, çıktı metninin ikinci satırındaki boşluklar rastgele boşluklara eklenmiş gibi görünüyor? Görmediğim bir model var mı ve eğer değilse, verilen girdi için tam olarak bu çıktıyı nasıl üretmemiz beklenebilir ?
Gareth

@Gareth: Üzgünüm, benim hatam. Ben bir hata yaptım, incididunt sonra değil, virgül sonra. Soru düzenlendi.
Toto

@Peter Taylor: Sadece tüm dilleri test edemediğim için.
Toto

1
@Ilmari Karonen: Evet, giriş dizesi herhangi bir şey olabilir.
Toto

Yanıtlar:


5

Perl, 94 karakter

for(/(.{0,80}\s)/g){$i=1;$i+=!s/^(.*?\.|.*?,|(.*? )??\S{$i}) \b/$1  /until/
|.{81}/;chop;say}

İle çalıştırın perl -nM5.01. ( nKarakter sayısına dahil edilir.)

Yukarıdaki kod , tam olarak spesifikasyona göre ona attığım herhangi bir eğri topu (bir satırın başında bir harfli kelimeler, giriş satırları tam olarak 80 karakter uzunluğunda, vb.) İşleyebilecek en kısa şeydir:

Lorem ipsum dolor sit amet,  consectetur adipisicing elit, sed do eiusmod tempor
incididunt ut  labore et  dolore magna aliqua.  Ut  enim ad  minim veniam,  quis
nostrud exercitation ullamco laboris nisi ut  aliquip ex  ea  commodo consequat.
Duis aute irure dolor in  reprehenderit in voluptate velit esse cillum dolore eu
fugiat nulla pariatur.  Excepteur sint occaecat cupidatat non proident,  sunt in
culpa qui officia deserunt mollit anim id est laborum.

I'm  tempted to  provide a  php  program which consists of  the output text. ;-)
Seriously though,  the spaces on the second line of the output text seem to have
been added to  the spaces at  random? Is  there some pattern to  it that I'm not
seeing,  and if  not,  how can we be expected to produce exactly that output for
the given input?

(Yorumunu ek test girdisi olarak kullandığından Gareth'e özür dileriz.)

Aşağıdaki 75 karakterlik sürüm, örnek girişinden örnek çıktısı üretmek için yeterince iyi çalışır, ancak diğer girişler için başarısız olabilir. Ayrıca, her bir çıktı satırının sonunda fazladan bir boşluk karakteri bırakır.

for(/(.{0,80}\s)/g){s/(.*?\.|.*?,|.*? ..) \b/$1  /until/.{81}/||s/
//;say}

Her iki sürüm, doğru bir şekilde haklı çıkaramayacakları girdilerle karşılaşırsa sonsuza kadar döngü yapacaktır. (Uzun versiyonunda, değiştirilmesi untilile until$i>80||yedi ekstra karakter pahasına düzeltmek istiyorum.)


Ah, bir perl çözümü ile başlamalıydım ;-) Bu dil elbette böyle bir görev için gerçekten iyi.
Howard

Quantifier in {,} bigger than 32766 in regex; marked by <-- HERE in m/^(.*?\.|.*?,|(.*? )??\S{ <-- HERE 32767}) \b/İkinci metni aldım .
Toto

@ M42: Çünkü ikinci örnek metin kurallara göre gerekçelendirilemez. Ben de eklersek $i>80çek, bunun için 11. çizgisini genişletir pede  pellentesque  fermentum.  Maecenas  adipiscing  ante  non  diam  sodalessadece 78 karakter uzunluğunda, ve sonra iki boşluk izlemektedir (son hariç) her kelimenin beri vazgeçer.
Ilmari Karonen

2

Ruby, 146 karakter

$><<gets.gsub(/(.{,80})( |$)/){$2>""?(s=$1+$/;(['\.',?,]+(1..80).map{|l|"\\b\\w{#{l}}"}).any?{|x|s.sub! /#{x} (?=\w)/,'\& '}while s.size<81;s):$1}

Verilen metin STDIN'e besleniyorsa, istenen çıktıyı tam olarak yazdırır (aşağıya bakın).

Lorem ipsum dolor sit amet,  consectetur adipisicing elit, sed do eiusmod tempor
incididunt ut  labore et  dolore magna aliqua.  Ut  enim ad  minim veniam,  quis
nostrud exercitation ullamco laboris nisi ut  aliquip ex  ea  commodo consequat.
Duis aute irure dolor in  reprehenderit in voluptate velit esse cillum dolore eu
fugiat nulla pariatur.  Excepteur sint occaecat cupidatat non proident,  sunt in
culpa qui officia deserunt mollit anim id est laborum.

Edit: Hemen benim ilk çözüm gönderdikten sonra yorumlarda herhangi bir giriş dizesinin işlenmesi gerektiğini gördüm. Önceki cevap sadece 95 karakterdi, ancak bu şartı yerine getirmedi:

r=gets.split;l=0;'49231227217b6'.chars{|s|r[l+=s.hex]+=' '};(r*' ').gsub(/(.{,80}) ?/){puts $1}

Yanılmıyorsam, düşündüğümle aynı hileyi kullanıyorsunuz (örnek çıktıdaki çift aralıklı kelimelerin konumlarını kodlama). M42'nin programların diğer girdilerle de başa çıkması gerektiğini açıkladığını unutmayın.
Ilmari Karonen

@Ilmari Karonen Evet, gönderdikten sonra gördüm. Yukarıdaki düzenlememe ve yorumlarıma bakın. Golf sahasına geri dönüyoruz ...
Howard
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.