Boşlukları karşılıklı olarak doldurun


11

Karşılık gelen kelimeleri temsil eden alt çizgi dizileri içeren iki dizeden oluşan bir girdi verildiğinde, cümleleri "boşluklar" ile doldurun.

Bu zorluğu açıklamanın en iyi yolu örnek olarak verilebilir. İşte bir örnek giriş:

programming _____________ and code golf
programming puzzles ______ code ____

Ve karşılık gelen çıktı:

programming ___puzzles___ and code golf
programming puzzles _and__ code golf

Bu zorluğun amaçları doğrultusunda, bir "kelime" bir veya daha fazla küçük harf dizisi olarak tanımlanır ve "boş" bir veya daha fazla alt çizgi olarak tanımlanır (giriş her zaman yalnızca küçük harf, boşluk ve alt çizgi içerecektir) . Giriş dizelerindeki kelimeler ve boşluklar tek boşluklarla ayrılır ve cümlelerdeki kelime ve boşluk sayısının toplamı her zaman eşit olacaktır.

Zorluğun amacı tüm boşlukları , boşluklarla bölündüğünde diğer dizede aynı dizini işgal eden kelimeler olan doğru sözcüklerle doldurmaktır.

  • Yukarıdaki örnekte "bulmaca" kelimesi ile gösterildiği gibi kelime boşlukta ortalanmalıdır - her iki tarafta da eşit sayıda alt çizgi kalmaktadır.

  • Sözcük tam olarak ortalanamıyorsa, fazladan alt çizgi sola veya sağa gidebilir (örn. Yukarıdaki örnekte "ve" sözcüğü).

  • Kelimenin sığması için her zaman yeterli alt çizgi olacaktır, ancak kelimenin uzunluğu kadar olabilir (ör. Yukarıdaki örnekte "golf" sözcüğü).

  • Her iki dizede de aynı konumda asla boşluk kalmaz.

Giriş / çıkış aşağıdakilerden herhangi biri olabilir (giriş / çıkış mutlaka aynı yöntemle olmak zorunda değildir):

  • alfabetik olmayan bir karakter, boşluk veya alt çizgi ile ayrılmış tek dize (örneğin, satırsonu veya virgülle ayrılmış dize)

  • bir dizi / liste / vb. iki dizeden

  • iki işlev / komut satırı argümanı (yalnızca giriş)

Bu , bayt cinsinden en kısa kod kazanacaktır.

Yukarıdaki örnek bir test senaryosu olarak kullanılabilir. İşte daha büyük bir test durumu (çıktıdaki ikinci dize, farklı merkezleme davranışları nedeniyle biraz değişebilir):

lorem _____ dolor _____ amet _______________ adipiscing elit mauris dapibus tincidunt _____________________________ accumsan fringilla proin vulputate viverra lorem fermentum dictum
lorem ipsum ______ sit _______ consectetur _______________ elit mauris dapibus tincidunt metus accumsan fringilla proin vulputate viverra lorem ____________________________ dictum

lorem ipsum dolor _sit_ amet __consectetur__ adipiscing elit mauris dapibus tincidunt ____________metus____________ accumsan fringilla proin vulputate viverra lorem fermentum dictum
lorem ipsum dolor_ sit _amet__ consectetur __adipiscing___ elit mauris dapibus tincidunt metus accumsan fringilla proin vulputate viverra lorem _________fermentum__________ dictum

Güzel iki yönlü meydan okuma.
Rɪᴋᴇʀ

Yanıtlar:


5

Pyth, 30

jL;Cmm|*}J\_k.[lkhx#JdJkdCcR;Q

Girdileri ve çıktıları iki dizginin bir listesi olarak alır. Oldukça basit bir bölünmüş - zip - çift harita - orta - zip - birleştirme yaklaşımı kullanır.

Burada deneyin

Expanded:

jL;Cmm|*}J\_k.[lkhx#JdJkdCcR;Q   ##
                          cR;Q   ##  split
                         C       ##  zip
    mm                           ##  double map
      |*}J\_k.[lkhx#JdJkd        ##  centre
   C                             ##  zip
jL;                              ##  join

Bölünmüş-zip-çift harita-orta-zip-birleştirme yaklaşımının ve hepsinin yaygınlığı göz önüne alındığında, oldukça net olmasına rağmen, bunu daha fazla golf oynayamayacağımdan gerçekten memnun olduğumda daha fazla açıklayacağım.


8
Ahhh, klasik split-zip-double harita-center-zip-join yaklaşımı. Algoritmalar 101 dersimde tanıtım örneği olarak kullanıldığını sevgiyle hatırlıyorum.
Martin Ender

3
@ MartinBüttner Evet, bazı kötü anılarım var, çünkü o sınıfta uyudum, bunun yerine çift-ekleme-yeniden inceleme-maç-ekleme-merkezi yaklaşımını kullanarak sınavdaki sorunları çözmek zorunda kaldım.
FryAmTheEggman

4
Yanmaya biraz soğuk su uygulayacağım.
Martin Ender

7

Retina , 102 , 100 93 88 bayt

Bayt sayımı ISO 8859-1 kodlamasını varsayar.

$
!¶$`
m`(?<=^(\w+ )*)(?=_.*¶(?<-1>\w+ )*(\w+))
$2
(([a-z])+)(?<-2>_)*(_*)\3|!\D+
$3$1$3

Dizeler bir satır besleme ile ayrılır. Tek sayıda alt çizgi kalıyorsa, yabancı olan sözcükten sonra olacaktır.

Çevrimiçi deneyin!

açıklama

Sanırım bu "yinelenen-ekleme-lookback-match-add-center yaklaşımı" ya da yakın bir şey ...

$
!¶$`

Girişi çoğaltarak başlıyoruz (a !ve satır besleme ile ayrılmış ). Bunun amacı, her iki satırı bir sonraki satırdan kelimeleri getirerek (ikinci satırı ayrı ayrı ele almak yerine) işleyebilmemizdir .

m`(?<=^(\w+ )*)(?=_.*¶(?<-1>\w+ )*(\w+))
$2

Bu, her boşluğa doğru sözcüğü ekler. Geçerli kelime konumunu gözetleme ile sayarız (?<=^(\w+ )*)(konum, grubun derinliği olarak saklanır 1). Sonra eşleme tarafından bir boşluk başında olduğumuzu ileri yönlü a) olmasını sağlar _daha sonra sonraki satıra atlar, .*¶, kelimelerin doğru sayıda eşleşen (?<-1>\w+ )*doğru pozisyona ulaşmak için, ve sonra kelime maçları orada bulunabilir (\w+)içine grubu 2.

(([a-z])+)(?<-2>_)*(_*)\3|!\D+
$3$1$3

Bu aşama üç şey yapar:

  • Her kelime uzunluğuna karşılık gelen alt çizgileri kaldırır. Bu gruba kelime uzunluğunu sayarak yapılır 2ile ([a-z])+birçok çizgi (geri yazmadım hangi) ve daha sonra eşleştirme.
  • Kalan alt çizgilerin yarısını yakalayıp geri (_*)\3yazarak sözcüğü boşluğun merkezine kaydırır $3$1$3.
  • Çoğaltılan girdiyi !\D+hiçbir şeyle eşleştirip değiştirerek kaldırır .

4

Python 2, 109

def f(a,b):exec"print' '.join([x,y][x<'`'].center(len(x),'_')for x,y in zip(a.split(),b.split()));a,b=b,a;"*2

İşlev, bağımsız değişken olarak iki dizeyi alır ve çıktıyı örneklerde olduğu gibi yazdırır. str.center(width, fillchar)İşin çoğunu yaparken sıkıcı bir yaklaşım kullanır .

Çevrimiçi deneyin .


1
İhtiyacınız olduğunu düşünmüyorum z, bir şey eksik olmadıkça, sadece baskı ve satır içi işlemden sonra takas yapabilirsiniz z.
FryAmTheEggman

@FryAmTheEggman evet, haklısın. Teşekkürler :)
grc

2

Yakut, 111 109 karakter

->l{l.map(&:split).transpose.map{|c|c[m=c[0]<c[1]?0:1]=c[1-m].center c[m].size,?_
c}.transpose.map{|s|s*' '}}

Girdi: 2 dizeden oluşan dizi; output: 2 dizeden oluşan dizi.

Örnek çalışma:

2.1.5 :001 > puts ->l{l.map(&:split).transpose.map{|c|c[m=c[0]<c[1]?0:1]=c[1-m].center c[m].size,?_;c}.transpose.map{|s|s*' '}}[[
2.1.5 :002 >       'programming _____________ and code golf',
2.1.5 :003 >       'programming puzzles ______ code ____',
2.1.5 :004 >       ]]
programming ___puzzles___ and code golf
programming puzzles _and__ code golf

1

JavaScript, 194185 bayt

f=(m,n)=>(m=m.split` `,n=n.split` `,G=(x,i,a)=>x[0]!='_'?x:(b=(a?n:m)[i],s=x.length-b.length,(k='_'.repeat(s/2))+b+k+(s%2?'_':'')),H=(e,y)=>e.map((x,i)=>G(x,i,y)).join` `,[H(m,1),H(n)])

İki dizeyi parametre olarak alır ve iki dizeyi dizi / liste olarak verir


1

Mathematica 223

Bunu yapmanın daha kısa bir yolu olmalı.

k=StringLength;m=StringSplit;
g=Partition[Riffle[m@#,m@#2],2]/.{{a_,a_}:> a<>" ",{a_,b_/; StringTake[b,1]=="_"}:> a<>" ",
{a_,b_}:>Table["_",Ceiling[z=(k@a-k@b)/2]]<>b<>""<>Table["_",Floor@z]<>" "}&;
s_~h~t_:={""<>g[s,t],""<>g[t,s]}

Örnek çalışma

h["programming _____________ and code golf", "programming puzzles ______ code ____"]

resim açıklamasını buraya girin


0

Gema, 208 203 karakter

\B=@set{i;0}
<I>=@push{${v;f};$0}@incr{i}
\n=@set{v;s}@set{i;0}
 =
\E=@repeat{$i;@cmps{$f;$s;@set{f;@fill-center{$f;$s}};;@set{s;@fill-center{$s;$f}}}@set{F;$f ${F;}}@set{S;$s ${S;}}@pop{f}@pop{s}}$F\n$S

Gema bu görev için mükemmel bir işlevi vardır, çünkü: .@fill-center{background;value}

Girdi: 2 satırsonu ayrılmış satır (son satırsonu yok); çıktı: 2 satır satır ayrılmış (sondaki boşluklarla - yasak görünmüyor).

Örnek çalışma:

bash-4.3$ echo -ne 'programming _____________ and code golf\nprogramming puzzles ______ code ____' |
> gema '\B=@set{i;0};<I>=@push{${v;f};$0}@incr{i};\n=@set{v;s}@set{i;0}; =;\E=@repeat{$i;@cmps{$f;$s;@set{f;@fill-center{$f;$s}};;@set{s;@fill-center{$s;$f}}}@set{F;$f ${F;}}@set{S;$s ${S;}}@pop{f}@pop{s}}$F\n$S'
programming ___puzzles___ and code golf 
programming puzzles _and__ code golf 

0

C, 197 bayt

#define c(w,y)l=strspn(w,"_"),r=strcspn(y," "),memcpy(w+(l-r)/2,y,r),w+=l,y+=r;
main(l,v,w,y,r)char**v,*w,*y;{for(w=v[1],y=v[2];*w;w++,y++)if(*w^*y)if(*w^95)c(y,w)else c(w,y)puts(v[1]);puts(v[2]);}

Çıktı

$ ./a.out "lorem _____ dolor _____ amet _______________ adipiscing elit mauris dapibus tincidunt _____________________________ accumsan fringilla proin vulputate viverra lorem fermentum dictum" "lorem ipsum ______ sit _______ consectetur _______________ elit mauris dapibus tincidunt metus accumsan fringilla proin vulputate viverra lorem ____________________________ dictum"
lorem ipsum dolor _sit_ amet __consectetur__ adipiscing elit mauris dapibus tincidunt ____________metus____________ accumsan fringilla proin vulputate viverra lorem fermentum dictum
lorem ipsum dolor_ sit _amet__ consectetur __adipiscing___ elit mauris dapibus tincidunt metus accumsan fringilla proin vulputate viverra lorem _________fermentum__________ dictum

0

ES6, 122 bayt

a=>a.map(s=>s.split` `).map((s,n,a)=>s.map((w,i)=>w<'a'?(l=w.length,t=w+a[n^1][i]+w,t.substr(t.length-l>>1,l)):w).join` `)

İki dizeden oluşan bir diziyi tek bir parametre olarak alır ve iki dizeden oluşan başka bir dizi döndürü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.