Sözcük listesini biçimlendirme


16

Zorluklarınız, belirli bir karakter sayısından daha uzun olmayan birden fazla satırdaki bir kelime listesini biçimlendirmektir, böylece her satır mümkün olduğunca fazla kelime içerir ve hiçbir kelime gereksiz yere kesilmez.

Giriş

Giriş, boşlukla ayrılmış bir kelime listesi ve ardından en az 4 olan bir sayı olacaktır.

Çıktı

Çıktı satırlar halinde gruplandırılmış giriş kelimeleri olmalıdır, böylece hiçbir satır giriş numarasından daha fazla karakter içermez. Sözcükler, girildikleri sırayla çıkarılmalıdır. Kelimeler, boşluğun gerekli olmadığı her satırın sonunda, bir virgül ve sonra bir boşlukla ayrılmalıdır. Bir kelime bir satıra sığmayacak kadar uzunsa, diğer kurallara uyarak mümkün olduğunca az kesilmeli ve sonuna "..." eklenmelidir.

Test senaryoları

Input:
foo bar baz qux 12

Output:
foo, bar,
baz, qux


Input:
foo bar baz qux 5

Output:
foo,
bar,
baz,
qux


Input:
strength dexterity constitution intelligence wisdom charisma 10

Output:
strength,
dexterity,
consti...,
intell...,
wisdom,
charisma


Input:
quas wex exort 4

Output:
...,
wex,
e...


Yanıtlar:


10

Okunamaz , 2559 bayt

Bu zorluk, Okunamayanlar için uygundur.

Bunun ilk versiyonu 3379 bayttı , sadece bunu ne kadar golf oynadığım hakkında bir fikir vermek için.

Program, girişi tam olarak meydan okumada açıklandığı şekilde kabul eder: boşlukla ayrılmış bir kelime listesi (rakamlar ve noktalama işaretleri de içerebilir), ardından bir boşluk ve en az 4 olan bir tam sayı (düşük sayılar sonsuz döngüler oluşturur) .

' '' '' ''' "" "" "" "" ' '' ' ' '''' ' ' '''' ' ' '''' "' '' "' '' ''"'" " ' '' '' '''" "' '' ' ' '' '' '' '' '''' '' '' ' ' '' '' '''' '' '' ''"' "" " ' '''" "" "" "" ' '' '' '' ''' "" " ' '' '' '' '''" "" "" "" "'""" "" "" " ' '' '' '' '''" "" "" "" " ' '' '' '' '''" "" "" "" " ' '' '' '' "" ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" ' ''""" "" " ' '' '' '' '''" "" "" "" " ' '' '' '' '''" "" "" "" " ' '' '' '' '' ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" ' '' '' '' ' ' '''' ''' "" "" " ' ''"" "" " ' '' '' '''" "" "" "" " ' '' ' ' '' '' '' '''' '' '' '''" "" "" "" "' ''" ' '' "' '' '' "' '' '' '' ' ' '' '' '''' '' '' ''" ' '' ' ' '''' '' "" "" ' '' '' '' ''' "" " ' '' '''" "" " ' '' '' '''" "' ''"' '' '' """ " ' '' '' '' '''" "" "" "" " ' '' '' '' '''" "" "" "" " ' '' '' '' '''" "" "" "" " ' '' '' '' '''" "" "" "" " ' '' '' '' '''" "" "" "" " ' '' '' '' "" ' '' '' '' ''' "" "" "" "" ' '' '' '' ''' "" "" "" "" ' '' "' ''""" ' ''' "" "" "" ' ''' "" ' '' ' ' '' '' '' '''' '' '' ''' "" ' ''' "" "' "" "" "" ' ''' "" " ' '''" " ' '''" " ' '''" " ' '''" " ' '''" " ' '' '' '' " ' '''" "" ' '' '' ''' "" ' ''' "" " ' '' '' ' ' '' '' '''' '' '' '''"""" "" "" ' '' ' ' '' '' '' '''' '' '' ''' "" "" "" " ' '' '' '' '''" "" '" "" "" " ' '''" "" ' ''' "" "" "" " ' '''" "" ' '' '' ' ' '' '' '''' "' ''" ' '' '' '' ''' "" "" "" " ' '''" "" ' '' '' ''' "" "" "" ' '' "' '' ''"" "" ' '' '' '' "' '' ' ' '' ' ' '' '' '''' ' ' '''' ' ' '''' ''''" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" "" "" ' ''' "" ' ''' "" '" "' '' ' ' '''' ' ' '''' ' ' '''' ' ' '''' ' ' '''' ' ' '''' ' ' ''''"' ''' ''' "" ' ''' "" ' ''' "" ' ''' "" "" "" ' ''' "" ' '' ' ' '''' ' ' ''''" "" "" ' '' '' '' ''' "" " ' '''" " ' '''" " ' '''" " ' '' '' '''" "" ' ''" ' '' '' ' ' '' '' '' ' ' '''' '' '' '''' '' '' '' "' '' ' ' '' '''' ''" '"" "" ' '' '' "' '' '' '' ' ' '' '' '''' '' '' ''" ' '' ' ' '''' '' '' ''' "" "" "" "" ' '' ' ' '' '' '''' ''' "" "" "" "" ' '' '' '' "' '' "' '' ''" "" "" ' '' '' ''' "" ' '' ' ' '' '' '' ' ' '''' '' '' '''' '' '' '' "'"" " ' '' '' '''" "" ' '' '' '' ''' "" "" "" "' ''" ' '' "' '' ''"' '' '' "" " ' '' '' '''" "" "" "" " ' '' ' ' '' '' '' '''' '' '' '''" "" "" "" "' "" "' '' ' ' '' '' '''' ' ' ''''" ' '' "' '' '' '' '' "' '' '' ''" '""" "" "" "" ' '' '' '' ' ' '''' ' ' '''' ''' "" "" "" ' '' " ' '' '' '' ''' "" "" "" "' ''" ' '' '' '' "' '' ' ' '' '''' '' "' '' '' '' ''" ' '' '' '' " ' '''" " ' '''" "" ' ' ' '' '' '' ' ' '''' ' ' '''' ' ' '''' '''' '''"" "" " ' '' '' '' ' ' '' '' '''' '' '' '' ' ' '' ' ' '''' '' '' '''' '' '' "" "' ''"' ' ' '''' ' ' '''' ' ' '''' ' ' '''' ' ' '''' ' ' '''' ' ' '''' " ' '''" " ' '''" " ' '''" " ' '''" " ' '''" " ' '''" " ' '''" " ' '''" "'"" ' ''' "" "" "" " ' '' '' '' ' ' '' '' '' '''' '''" "" "" "" "" ' '' ''" "" ' ''' "" "'" ' '' '' '' ' ' '''' ' ' '''' "' '' "' '' ' ' '' '''' ''" ' "" "" "" "" " ' '' '' '' ' ' '''' ' ' '''' '''" "" ' '' ''' "" "" ' ''"" ' '' '''" "" "" ' '' '' '' ''' "" "" "" " ' '' '' '''" "" ' ''' "" "" "" "' ''" ' '' "' '' '' '' '' ' ' '' '' '' ' ' '''' '''' '' ''"' '' ' ' '''' "" "" "" ' '' "' ''" ' '' '' ' ' '''' '' '' ' ' '' ' ' '''' '' '' ''''"" ' ' ' '''' ' ' '''' ' ' '''' ' ' '''' ' ' '''' ' ' '''' ' ' '''' " ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' ''' "" ' '' '' '' ' ' '' '' '''' '' '' '' ' ' '' ' ' '''' '' '' '''' '' '' '' "'""" '"' "'" ' '' ''"' '' '' '' ' ' '' '' '''' '' '' '' "' '' ' ' '''' ''" "" " ' '' '' '' '''" "" ' ''' "" ' '' '' '' ' ' '''' ' ' '''' "' '' "' ''" "" "" "" ' '' '' '' ' ' '''' ''' "' '' '' '' ' ' '''' ' ' ''''" ' '' "'"" "'" ' '' '' '' ' ' '''' "' '' ' ' '' '' '' '''' '' '' "' ''" ' ''"

açıklama

Programın girdiyi nasıl işlediğini göstereceğim thyme horseradish peppermint 10. Beklenen çıktı thyme,\nhorser...,\npeppermint.

İlk olarak # 7 hücresinden başlayıp tüm girdiyi okuyoruz, ancak boşlukların sıfır olması için her karakterden 32 çıkarıyoruz.

Açık nedenlerden dolayı, bu işlem sonunda ( burada p olarak adlandırılan , # 0 hücresinde saklanan) işaretçi bırakılır . Çıktının genişliğini tanımlayan sayının başlangıcı olan (bu örnekte # 36 hücresi) son boşluğu bulmak için bir while döngüsü kullanıyoruz.

Şimdi sayının kodunu çözmek istiyoruz (yani ondalık sayıdan dönüştürmek). Nihai sonuç, hücreler hem olacak t ve r . Sıfırdan başladıklarına güveniyoruz.

Sayıdaki her rakam için aşağıdakileri yapın:

  • Set t -15.
  • Bir while döngüsünde, r'yi (şimdiye kadar sonucu içeren) −1'e düşürün (tam olarak r yinelemelerine ihtiyacımız olduğu için , ancak azalma while döngüsünün durumu olarak kontrol edilmeden önce gerçekleştiği için, 0'a düşürmek daha az yineleme sağlar) ve her yineleme için t'ye 10 ekleyin . Şimdi t , önceki sonucun eksi 15'inin 10 katı içerir.
  • Yine bir while döngüsünde * p değerini 0'a düşürün ve her yineleme için t'ye 1 ekleyin . Bundan sonra t karakterler: Şimdiye kadar doğru ara sonuç içeriyor '0'için '9'biz aslında hiç 15-24 eklemek böylece, bu yüzden 16-25 olan 32 erken çıkarma sonra, 48-57 ASCII kodları var t -15 ile iptal eder daha önce ayarladık. Bunun, sonraki kodun kelime listesinin sonunu tanıması için basamaklı karakterleri içeren hücreleri sıfırlaması da önemlidir.
  • Set r yeni ara sonucun çok sonraki yineleme bunu bulduğu r . ( T'den tekrar okumamız gerekmediğini unutmayın , sadece bir önceki while döngüsündeki son değeri kullanabiliriz, çünkü * p'nin sıfır olamayacağını biliyoruz , bu yüzden en az bir kez çalışmıştır.)

Son olarak, yeni hesapladığımız sayıyı tekil hale dönüştürmek için başka bir basit while döngüsü ( sayaç olarak azalan t ) kullanırız. 0 numaralı hücreden sola doğru 1'lerin dizesini saklıyoruz. Bu, ( q ) için çalışan göstergemiz olan # 1 hücresinin 0'dan başlamasına dayanır. Bir tane daha az 1s alırız, çünkü Okunamaz durumdaki döngüler şöyle:

Bundan sonra, artık değer ihtiyacımız r biz yeniden kullanım, yani o başka bir şey için hücresi. İşaretçileri p ve q sıfırlar ve bazı hücreleri daha sonra ihtiyacımız olan ASCII karakter kodlarıyla başlatırız. Ben de etiketlediğinize c ve s daha sonra kullanacağız ve biz aslında itimat edecektir s sıfırda dışarı başlar:

Hey, bir dakika. Hücre # 0 neden kırmızı renkte? ... Şey, sinsi bir numarayı vurgulamak için. Bir tane çok az çıktı verdiğimizi hatırlıyor musunuz? İşin püf noktası, bunu düzeltmek için # hücresini bir “uzantı” olarak kullanmamızdır. Bu işe yarar çünkü p'nin asla 0 olmayacağını biliyoruz. Bu şekilde, kırmızı blok şimdi 10 hücre genişliğinde, tam olarak istediğimiz sayı. Ayrıca, q yerine 0 yerine 1 karakteri başlatabilmek için 9 karakter kaydeder .

Şimdi kelimelerden geçen ve hepsini çıktı alan while döngüsüne giriyoruz.

Adım 1: Bir sonraki kelimenin geçerli satıra sığmayacağını öğrenin. Biz sadece hareket ettirerek bunu p sağa ve q kadar bir süre döngü sol p sonraki boşluğu vurur:

Şimdi bu p üzerindedir sağ kelimenin, bu takdirde kontrol ederek listedeki son sözü olup olmadığını kontrol edebilirsiniz * (p + 1) sıfırdır. Ayrıca bu değeri (örneğimizde 72 olduğu için “yaban turpu” eksi 32'den “h”) c'de saklıyoruz, çünkü daha sonra tekrar ihtiyacımız olacak. Bu durumda, sıfır değil, bu yüzden kelimeyle birlikte bir virgül çıkarmamız gerekecek, bu yüzden kelime bir karakter daha uzun. Bunu q bir kez daha azaltarak dikkate alın . Son olarak, p sözcüğün başına gitmek için başka bir while döngüsü kullanın .

Artık kelimenin geçerli satıra sığacağını biliyoruz çünkü q sıfır olmayan bir değere işaret ediyor, bu yüzden tek yapmamız gereken:

  • Taşı p (tüm ASCII kodları 32 olarak kapalıdır, çünkü artı 32) her bir karakteri baskı, yine kelimenin ileriye doğru.
  • C sıfırdan farklıysa , virgül yazdırın (# 5 hücresindeki değeri kullanarak).
  • Bir sonraki yinelemeye artık bir satırın başında olmadığımızı ve bu nedenle bir sonraki sözcükten önce bir boşluk karakteri çıkarmamız gerektiğini göstermek için s'yi sıfırdan farklı bir değere ayarlayın . (Bunun için yukarıdaki baskı ifadesinin dönüş değerini virgül için 44 olan yeniden kullanırız.)

Çıktı şimdiye kadar: thyme,

Sonra büyük döngünün bir sonraki yinelemesi başlar. Daha önce olduğu gibi, soldan sağa doğru ilerlerken q kelimesini azaltarak bir sonraki kelimenin satırın geri kalanına uyup uymadığını kontrol ederiz. Geçerli satırda zaten kaç karakter yazdırdığımızı takip ederek q'nun önceki yinelemeden hala −5 olduğunu unutmayın . Karakterleri "yaban turpu", artı virgül için bir tane artı bir s de sıfırdan farklı olduğu için bir boşluk çıkarmamız gerektiğini belirttikten sonra , q , 1s bloğunun sonunu aşmış olacaktır:

Şimdi q sıfır hücreye işaret ediyor, yani “yaban turpu” mevcut çizgiye sığmayacak. Şimdi yaptığımız şey, s'nin sıfır olmadığına bağlıdır . Bizim durumumuzda, yani bir sonraki satıra sarmamız gerekiyor. Bunun için tek yapmamız gereken:

  • Yeni satır yazdırma (# 3 hücresini kullanarak)
  • Q ayarını 1 olarak ayarlayın
  • S değerini 0 olarak ayarla

Çıktı şimdiye kadar: thyme,\n

Bir sonraki yineleme için p , öncekiyle aynı yerdedir, bu yüzden tekrar aynı kelimeye bakacağız. Daha önce olduğu gibi, karakterleri "yaban turpu" olarak sayıyoruz, bundan sonra başka bir kelime olduğunu fark ettiğimizde c'yi 80'e ayarlıyoruz , virgül için q değerini azaltıyor ve p'yi kelimenin başına geri sarıyoruz:

Önceki yinelemede olduğu gibi, “yaban turpu” nun hala uymadığını görüyoruz, çünkü q sıfır olan bir hücreye bitiyor. Bununla birlikte, bu zaman s sıfırdır, yani geçen zamandan farklı bir şey yaparız. Kelimenin bir kısmını, üç noktayı ve bir virgül çıkarmalıyız. Genişliğimiz 10, bu yüzden kelimenin 6 karakterini çıkarmamız gerekiyor. Bakalım nereye gidersek:

  • 1'lerin kırmızı bloğunun başlangıcını bulun. Bunu sağa doğru yapabiliriz çünkü q'nun ondan ayrılması gerektiğini biliriz .
  • Arttırma q de çıkışa virgül gerekirse daha sonra ( c ≠ 0).

Kaset şimdi şöyle görünüyor:

Burada 6 hücrelik bir boşluk işaretledim. Gördüğünüz gibi q = −1 olana kadar karakterler çıkarmamız gerekiyor. Bu kontrol etmek için çok kod verimlidir (temel olarak while ((++q)+1) { ... }). Yani:

  • Bu karakterleri yazdırın (artı 32, çünkü tüm ASCII kodları 32'ye kadar kapalı) Q −1 değerine ulaşana . p daha sonra "horseradish" kelimesinin ortasında 19 hücresinde olacaktır.
  • Üç nokta yazdırın. Print komutu kendi argümanını döndürdüğünden, kodu verimli bir şekilde iç içe geçirebiliriz (esasen print(print(print('.')))). ASCII değerini # 5 hücresinden alıyoruz ve noktanın ASCII kodunu almak için 2 değerini ekliyoruz.
  • Hareket s kelimenin sonuna. Kelimenin sonuna ulaşamadığımızı bildiğimiz için (kelime çok uzun olduğu ve noktalara uyacak şekilde en az 3 karakteri kaldırmak zorunda kaldığımız için), bu döngü kesinlikle en az bir yinelemeye sahip, bu yüzden while döngüsünün gövdesinin nokta için ASCII değerini hesaplaması ve while döngüsünün dönüş değerini yazdırma işlevlerine geçirmesi kod olarak daha kısadır.
  • C ise virgül yazdırın sıfırdan .

Tüm bunlardan sonra, bir satırsonu yazıyoruz (# 3 hücresini kullanarak) ve q değerini 1 olarak ayarlıyoruz. Ayrıca , zaten 0 olmasına rağmen s'yi 0 olarak ayarlayabiliriz . sonraki satır ( s sıfır olmadığında), bu nedenle kodu tekrarlamaktan kaçınmak için, bunu, s'yi .

Çıktı şimdiye kadar: thyme,\nhorser...,\n

Tek bir yineleme kaldı. Bu kez, kelimenin harflerini saydıktan sonra, bunu elde ederiz:

Bu kez, p'den sonra hiçbir şey yoktur , bu yüzden “virgül yok” u belirtmek için c'yi 0'a ayarladık ve buna göre q'yu bir daha azaltmıyoruz . Yana q aynı kod bu kez dışında birinci tekrarda olarak yürütülür, böylece sıfır olmayan bir hücreye şimdi noktaları, biz, kelime uyacak biliyorum c sadece virgül baskı yapmaz, böylece sıfırdır.

Çıktı: thyme,\nhorser...,\npeppermint

Bu adımda, kodun gerçekten bir boşluk basacağı bir durum dahil etmedim, ancak şimdi oldukça açık olması gerektiğini düşünüyorum. Kod, ( * q ≠ 0) sözcüğünün uygun olduğunu ve s'nin sıfır olmadığını bulursa, sözcükten önce bir boşluk çıkarır.


3

JavaScript (ES6), 171

Çıktıyı dizi olarak döndüren anonim bir işlev olarak

(açıkça yasaklanmadığı sürece buna genellikle izin verilir: meta meta )

s=>(s=s.split` `,n=s.pop()-1,t='',o=[],s.map((w,i)=>(w=w[n+=!s[i+1]]?w.slice(0,n-3)+'...':w,(t+w)[n-2]&&(t&&o.push(t.slice(1)),t=''),t+=` ${w},`)),o.push(t.slice(1,-1)),o)

f=s=>(s=s.split` `,n=s.pop()-1,t='',o=[],s.map((w,i)=>(w=w[n+=!s[i+1]]?w.slice(0,n-3)+'...':w,(t+w)[n-2]&&(t&&o.push(t.slice(1)),t=''),t+=` ${w},`)),o.push(t.slice(1,-1)),o)

// Less golfed
U=s=>(
  s=s.split` `,
  n=s.pop()-1,
  t='', // current line
  o=[], // output
  s.map( (w,i)=>(
    w=w[
      n+=!s[i+1] // space for 1 more char on the last line
    ]?w.slice(0,n-3)+'...':w, // change w if it is too long
    (t+w)[n-2]&& ( // if current line + w is too long, ouput t and reset current line
      t&&o.push(t.slice(1)),t=''
    ),
    t+=` ${w},`
  )),
  o.push(t.slice(1,-1)), // remove tailing comma on last line
  o
)

console.log=x=>O.textContent+=x+'\n\n';
  
console.log(f("foo bar baz qux 12").join`\n`)
console.log(f("foo bar baz qux 5").join`\n`)
console.log(f("strength dexterity constitution intelligence wisdom charisma 10").join`\n`)
console.log(f("quas wex exort 4").join`\n`)
<pre id=O></pre>


1

Python 2, 206 bayt

i=input().split()
l=int(i.pop())
i=[[w[:l-4]+'...',w][len(w)<l]+','for w in i][:-1]+[[w,w[:l-3]+'...'][len(w)>l]]
r=[i.pop(0)]
for w in i:
 if len(r[-1])+len(w)<l:r[-1]+=' '+w
 else:r+=[w]
print'\n'.join(r)
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.