空白を相互に埋める


11

対応する単語を表す下線のシーケンスを持つ2つの文字列の入力が与えられた場合、「空白」が埋められた文を出力します。

この課題を説明する最良の方法は、例です。入力例を次に示します。

programming _____________ and code golf
programming puzzles ______ code ____

次に、対応する出力を示します。

programming ___puzzles___ and code golf
programming puzzles _and__ code golf

このチャレンジでは、「単語」は1つ以上の小文字のシーケンスとして定義され、「空白」は1つ以上のアンダースコアとして定義されます(入力には常に小文字、スペース、アンダースコアのみが含まれます) 。入力文字列の単語空白は単一のスペースで区切られ、文の単語空白の数の合計は常に等しくなります。

チャレンジの目的は、すべての空白を正しい 単語で埋めることです。これは、スペースで分割したときに他の文字列の同じインデックスを占める単語です。

  • 上記の例で「パズル」という単語で示されているように、単語は空白の中央に配置する必要があります。どちらの側にも同じ数の下線が残ります。

  • 単語を正確に中央に配置できない場合は、余分なアンダースコアを左または右に配置できます(上記の例では「and」という単語)。

  • 単語が収まるのに十分なアンダースコアが常に存在しますが、単語の長さと正確に同じ長さになる場合があります(上記の例では単語 "ゴルフ")。

  • 両方の文字列の同じ位置に空白が存在することはありません。

入力/出力は次のいずれかになります(入力/出力は必ずしも同じメソッド経由である必要はありません)。

  • アルファベット、スペース、またはアンダースコア以外の文字で区切られた単一の文字列(改行またはコンマ区切りの文字列など)

  • 配列/リスト/など。2つの文字列の

  • 2つの関数/コマンドライン引数(入力のみ)

これはであるため、バイト単位の最短コードが優先されます。

上記の例をテストケースとして使用できます。次に、より大きなテストケースを示します(出力の2番目の文字列は、センタリング動作が異なるために若干異なる場合があります)。

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

素敵な双方向チャレンジ。
Rɪᴋᴇʀ

回答:


5

Pyth、30

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

入力と出力を2つの文字列のリストとして受け取ります。非常に基本的な分割-zip-二重マップ-中心-zip-結合アプローチを使用します。

ここで試してみてください

拡張:

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

これ以上ゴルフできないことに本当に満足したら、詳細を説明しますが、分割-zip-二重マップ-中心-zip-結合のアプローチおよびすべての遍在を考えると、それはかなり明確でなければなりません。


8
ああ、古典的なsplit-zip-double map-centre-zip-joinアプローチ。Algorithms 101講義の入門例として使用されたことを心から覚えています。
マーティンエンダー

3
@MartinBüttnerええ、私はそのクラスで寝ていたので、いくつかの悪い思い出があります。代わりに重複-追加-ルックバック-マッチ-追加-センターのアプローチを使用して試験の問題を解決しなければなりませんでした。
FryAmTheEggman

4
火傷に冷たい水をかけます。
マーティンエンダー

7

網膜102の 100 93 88バイト

バイトカウントはISO 8859-1エンコードを前提としています。

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

文字列は改行で区切られます。奇数のアンダースコアが残っている場合、余分なアンダースコアは単語の後になります。

オンラインでお試しください!

説明

これは「重複-追加-ルックバック-マッチ-追加-中心アプローチ」、またはそれに近いものだと思います...

$
!¶$`

入力を複製することから始めます(a !と改行で区切られます)。これの目的は、次の行から単語をフェッチすることで、2行目を個別に処理する代わりに両方の行を処理できることです。

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

これにより、各ギャップに正しい単語が追加されます。現在の単語の位置を後読みでカウントすることから始めます(?<=^(\w+ )*)(位置はグループの深さとして保存され1ます)。次に、先読みa)は、一致すること_でギャップの先頭にあることを確認し、次の行にスキップして.*¶、正しい(?<-1>\w+ )*位置に到達するために正しい単語数に一致し、そこで見つかった単語に一致(\w+)しますグループ2

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

このステージでは、次の3つのことを行います。

  • 各語長に対応するアンダースコアが削除されます。これは、単語の長さをgroup 2withにカウントし、([a-z])+その数のアンダースコア(書き戻されない)に一致させることで行われます。
  • 残りのアンダースコアの半分をキャプチャし(_*)\3て書き$3$1$3戻すことで、単語をギャップの中心に移動します。
  • 一致!\D+して何も置き換えないことで、重複した入力を削除します。

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

この関数は引数として2つの文字列を受け取り、例のように出力を出力します。str.center(width, fillchar)ほとんどの作業を行うという、退屈なアプローチを使用します。

オンラインでお試しください


1
私はあなたが必要とは思わzない、私があなたが印刷とインラインの後にちょうどスワップをすることができる何かを逃さない限りz
FryAmTheEggman

@FryAmTheEggmanそう、あなたは正しい。ありがとう:)
grc

2

ルビー、111 109文字

->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つの文字列の配列。出力:2つの文字列の配列。

サンプル実行:

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、194 185バイト

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)])

2つの文字列をパラメーターとして受け取り、2つの文字列を配列/リストとして出力します


1

Mathematica 223

これを行うには、より短い方法が必要です。

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]}

サンプル実行

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

ここに画像の説明を入力してください


0

ジェマ、208の 203文字

\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がこのタスクに最適な機能を備えているからです。@fill-center{background;value}

入力:改行で区切られた2行(最終改行なし)。出力:改行で区切られた2行(末尾にスペースがある-禁止されていないようです)。

サンプル実行:

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バイト

#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]);}

出力

$ ./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バイト

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` `)

2つの文字列の配列を単一のパラメーターとして受け取り、2つの文字列の別の配列を返します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.