Metni bir bloğa hizalama


10

Görev

Göreviniz, verilen girdiyi belirli bir boyuttaki bir bloğa hizalayacak tüm programı yazmaktır.

Giriş:

40
Lorem ipsum dolor sit amet, consectetur adipiscing 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.

Çıktı:

Lorem  ipsum dolor sit amet, consectetur
adipiscing  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.
                <-- note the linebreak

Giriş Ayrıntıları

  • Tüm yürütülebilir / yorumlanabilir bir program yazmalısınız.
  • Girişin yalnızca yazdırılabilir ASCII karakterleri içerdiğini ve sekme içermediğini varsayabilirsiniz \t.
  • Giriş satır sonları içerebilir. O kadar, bunlar da verilir yoksa \n, \rya \r\nbağlı beklediğiniz. Bununla birlikte, tüm girdi boyunca birleşirler.
  • Giriş STDIN'de veya komut satırı bağımsız değişkenleri olarak verilebilir. İhtiyaçlarınıza uygunsa her ikisini de kullanabilirsiniz (örneğin, komut boyutlarından komut boyutunu oku ve stdin olarak gir). Ancak, girdinin herhangi bir bölümünü programınıza sabit olarak kodlayamazsınız.
  • Blok boyutunun geçerli pozitif ( > 0) sayı olarak verildiğini varsayabilirsiniz .
  • Girişteki satır kesmesi boşlukla aynı şekilde ele alınır (böylece kelime ayırıcıdır)
  • Girdi birden fazla eşzamanlı boşluk içeriyorsa, bunlar tek sayı olarak değerlendirilir.

Çıktı ayrıntıları

  • Çıktı, belirli boyutta bir blok halinde biçimlendirilmelidir. Biçimlendirme, kelimeler arasına boşluk ekleyerek yapılır.
  • Bir satırdaki kelimeler arasındaki boşluk sayısı, o satır için eşit olmalıdır. Mümkün değilse, soldan başlayarak kelimelerden sonra tek tek ek boşluklar eklenmelidir.
  • Sözcük verilen blok boyutundan daha uzunsa, tek bir satırda tek başına duracaktır (ve blok boyutunu aşacaktır).
  • Çıktıda yalnızca bir kelime olması gerekiyorsa, sola hizalanır.
  • Çıktının son satırı, kelimeler arasında yalnızca bir boşluk olacak şekilde sola hizalanmalıdır. Çıktının son satırı, sondaki satır sonu ile bitmelidir.

Bir süre sonra en az bayt ile cevap kazanır.
Ek bilgiye ihtiyacınız varsa, bir yorum bırakın.

Test senaryoları

Input:
10
Lorem ipsum dolor sit amet,
consectetur adipiscing elit, sed do eiusmod tempor

Output:
Lorem
ipsum
dolor  sit
amet,
consectetur
adipiscing
elit,  sed
do eiusmod
tempor

Input:
20
Lorem     ipsum

dolor  sit amet,

Output:
Lorem   ipsum  dolor
sit amet,

Input:
1
Lorem ipsum dolor sit amet

Output:
Lorem
ipsum
dolor
sit
amet

İlişkili. (Sonunda , otomatik olarak silinen tipografi etiketim için ikinci bir zorluk .))
Martin Ender

@ MartinBüttner Böyle bir etiketin var olduğunu bilmiyordum.
Zereges

@ Vɪʜᴀɴ Tüm yürütülebilir / yorumlanabilir bir program yazmanız gerekir.
Dennis


@ppperry İlginç, bazı nedenlerden dolayı arama becerilerimden kaçınıldı
Zereges

Yanıtlar:



1

Yakut, 179 karakter

n=gets.to_i
s=t=''
$<.read.split.map{|w|if(t+w).size>=n
0while t.size<n&&(1..n).any?{|i|t.sub!(/[^ ]#{' '*i}(?=[^ ])/){|x|x+' '}}
s+=t+?\n
t=w
else
t+=' '+w
t.strip!
end}
puts s,t

Çok uzun ...

Yarı ayaksız versiyon:

n = gets.to_i
s = t = ''
$<.read.split.map{|w|
    if (t + w).size >= n
        0 while t.size < n && (1..n).any?{|i|t.sub!(/[^ ]#{' '*i}(?=[^ ])/){|x|x+' '}}
        s += t + ?\n
        t = w
    else
        t += ' ' + w
        t.strip!  # this is only necessary because of the very first word >:(
    end
}
puts s,t

0

CJam, 87 bayt

l~:LS*qNSerS%{(2$1$a+_S*,L>{;a\}{\;@;\}?}h;S*a]1>{I1>{LIs,-I,(md1b\aI,(*.+Sf*I.\}I?N}fI

Bu yine de golf edilebilir olmalıdır. CJam yorumlayıcısında çevrimiçi deneyin .


0

Retina , 133 bayt

\s+

+`((1)*1 )((?<-2>.)*\S|\S+) 
:$3<LF>$1
m+`^(?=.(.)+$[^<TB>]*^(?>(?<-1>1)+)1)((.*):(\S+ +)|(\S+ +)(.*):)
$3$4$5 :$6
+`:|<LF>1+| (?= .*$)
<empty>

Bu <empty>, boş bir takip çizgisini temsil eder. Kodu çalıştırmak için, her satırı ayrı bir dosyaya koyun, <LF>satır besleme karakterleriyle (0x0A) ve <TB>bir sekme (0x09) ile değiştirin. Golf yaptığım zaman bir açıklama ekleyeceğim.

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.