空白を埋める


18

文字列に特定の関数セットがあるとしましょう。これらの関数は、空白またはmadlibを埋めるようなものですが、入力が1つだけで、それを使用してすべての空白を埋めることが異なります。たとえば、次のような関数があるとします

I went to the ____ store and bought ____ today.

この関数を文字列に適用cheeseすると、結果は次のようになります。

I went to the cheese store and bought cheese today.

これらの関数は、空ではない文字列のリストとして表すことができます。ここで、空白は単に文字列間のギャップです。たとえば、上記の関数は次のようになります。

["I went to the ", " store and bought ", " today."]

この表現では、この種のすべての関数に対して1つの表現しかなく、各表現に対して1つの関数しかありません。

本当にすてきなことは、そのような関数のセットが合成中に閉じられることです。つまり、2つの関数の構成は、常にこれらの関数の別の1つです。たとえば、上記の関数を

["blue ", ""]

blue入力の先頭に追加する関数)関数を取得します:

["I went to the blue ", " store and bought blue ", " today."]

ただし、これらはもう少し複雑になります。たとえば、最初の関数を

["big ", " and ", ""]

結果は

["I went to the big ", " and ", " store and bought big ", "and", " today."]

仕事

あなたの仕事は、文字列の空でないリストとして説明されている2つの関数を取り、文字列の空でないリストとしてその構成を出力することです。

このチャレンジの目的のために、リストは重複を許可する順序付けられたコンテナであり、文字列はネイティブ文字列型、文字のリスト、または整数のリストです。

これは、回答がバイト単位でスコアリングされ、バイト数が少ないほど良いことです。

テストケース

["","xy"] ["ab",""] -> ["ab","xy"]
["x","y","z"] ["a","b"] -> ["xa","bya","bz"]
["xy"] ["ab"] -> ["xy"]
["","",""] ["a",""] -> ["a","a",""]
["x",""] ["","",""] -> ["x","",""]
["x","y","z"] ["a","b","c"] -> ["xa","b","cya","b","cz"]
["x","x","x"] ["a"] -> ["xaxax"]
["w","x","y","z"] ["ab","cd","e"] -> ["wab","cd","exab","cd","eyab","cd","ez"]

1
入力で印刷できないASCII文字を使用すると、3つの既存の回答すべてが現在失敗します(回答に応じてSOH、TAB、またはLF)。したがって、入力を印刷可能なASCIIに制限するかどうかを本当に決定する必要があると思います。
アーナウルド

@Arnauldわかりました。現在は制限がなく、変更する理由が見当たらないので、そのままにしておきます。
ウィートウィザード

2
ゼロは文字ではないため、@ KevinCruijssen鉱山は有効です。幸運な言語機能が役立ちます。
ジョナサンアラン

1
@ SriotchilismO'Zaic私の05AB1Eは、改行で参加/分割していました。JavaScriptとHaskellの回答はタブで結合/分割され、C#の回答は印刷できない文字 ``(SOH)であるため、これらもすべて無効です。ただし、Perl 5の知識も十分ではありません。そのため、1つは有効かもしれません。
ケビンクルーイッセン

3
@Roman入力に文字が表示されないことを想定することはできないため、区切り文字として使用できます。実際に課題を解決する必要があります。
小麦ウィザード

回答:


11

ゼリー、6バイト

j0j@ṣ0

右側の最初の関数表現と左側の2番目の関数表現を受け入れるダイアディックリンクは、結果の関数表現を生成します。各関数表現は、文字のリストのリストです(Jellyには他の文字列はありません)。

オンラインでお試しください!(プログラム全体の引数はPython表記で与えられます。文字列はリストになります。フッターは、リンクの出力のPython表現を示します。)

以下は、入力のようにリンクの出力を再フォーマットするテストスイートです。

どうやって?

Jellyの混合型リストを利用して、整数ゼロをプレースホルダーとして使用することで、表現のドメイン全体(文字のリストのリスト)を許可します。

j0j@ṣ0 - Link: b, a        e.g.    b = [['a','b'],['c','d'],['e']]
       -                   ...and  a = [['w'],['x'],['y'],['z']]
                             (i.e. test-case ["w","x","y","z"] ["ab","cd","e"])
j0     - join b with zeros         ['a','b',0,'c','d',0,'e']    
  j@   - join a with that          ['w','a','b',0,'c','d',0,'e','x','a','b',0,'c','d',0,'e','y','a','b',0,'c','d',0,'e','z']
    ṣ0 - split at zeros            [['w','a','b'],['c','d'],['e','x','a','b'],['c','d'],['e','y','a','b'],['c','d'],['e','z']
                             (i.e.: ["wab","cd","exab","cd","eyab","cd","ez"])

Jellyの混合リスト(深さや形状のリストを含む)を処理する必要がある場合、この8バイトを使用できます。j,©⁹jœṣ®これは、ペアの引数をプレースホルダーとして使用します。



5

Python 3.8(プレリリース) 60  58バイト

lambda a,b:(v:='&'.join(a+b)+'$').join(b).join(a).split(v)

文字列の2つのリストを受け入れる名前のない関数ab、文字列のリストを返す。

オンラインでお試しください!または、テストスイートを参照してください。

どうやって?

第一の形態のセパレータ文字列vの中に発見することができない、aまたはb。次に、文字列bをのコピーで結合して文字列を形成しますv。次に、文字列aとそのコピーを結合して文字列を形成します。最後にのインスタンスでその文字列を分割して、文字列vのリストを提供します。

確保しながらvではありませんaか、b我々はまた、それが確認する必要がありv、私たちは早期にすべての文字列の場合とで分け作る習慣ab同じです。そのためにはv、両方のリストのすべての文字列を文字列のインスタンスに結合し(ここ'&')、余分な異なる文字を追加します(ここに)'$'ます。入力のすべての文字列が選択した文字と等しくなる可能性があるため、どちらかを単独で実行するだけでは不十分であることに注意してください。


&必要な場所に入力例を教えてください。使用''.join(a+b)+'$'するだけでは不十分ですか?
ウィートウィザード

しばらくかかりました['$','$'] ['$','$']が、1つになります。
ウィートウィザード

ええ、すべての文字列が選択した文字に等しく、'$'結果が複数の文字列になる場合、早期の分割を避けるために別の文字が必要です。
ジョナサンアラン

2

05AB1E4 15 19 9 11 バイト

«TýR©ý¹sý®¡

Jellyの回答とは異なり、05AB1Eのstring "0"、integer 0、およびfloat 0.0はすべて(ある程度)等しいため、整数で分割/結合することはできません。これが回避策として+15バイトを使用した理由ですが、今では9バイトに戻しました。2個のバグを発見してくれた@JonathanAllanに感謝します。

オンラインそれを試してみたり、すべてのテストケースを確認してください

説明:

«            # Merge the two (implicit) input-lists together
 Tý          # Then using a "10" delimiter join all strings together
   R         # Reverse this string
    ©        # Store this string in variable `®` (without popping)
     ý       # Use this string as delimiter to join the second (implicit) input-list
      ¹sý    # Then join the first input-list by this entire string
         ®¡  # And split it back on variable `®` so it's the expected list of strings
             # (after which this result is output implicitly)

2
入力に改行がある場合、これは失敗します(OPは入力が現在制限されていないと言っています)。
エリック・ザ・アウトゴルファー

@EriktheOutgolfer他のすべての答えには同じ問題があります。
ケビンクルーイッセン

@EriktheOutgolfer間違いなくもう少しゴルフをすることはできますが、今のところ迅速で汚れた修正を行いました。
ケビンクルイッセン

1
ええと、申し訳ありません。この程度...それ文句を言わない作業入力リストは、改行だけを含む文字列が含まれている場合:((それが早期に分割します)
ジョナサン・アラン

1
笑@JonathanAllan ..よくああ、私は..私はあなたがかもしれない気持ちを持っていますが..私はそれが今で固定だ願って、あなたが何かを見つけることができません..私はこれらのバグを見つけるためにあなたにだけ感謝ことができますね
ケビンCruijssen


2

Japt、8バイト

ジョナサンのアプローチを適応させます。

qVqN²)qN

それを試してみてください

qVqN²)qN     :Implicit input of arrays U & V (N=[U,V])
q            :Join U with
 Vq          :  V joined with
   N²        :    Push 2 to N (modifying the original), which gets coerced to a string
             >     e.g., N=[["a","b"],["c","d"]] -> N=[["a","b"],["c","d"],2] -> "a,b,c,d,2"
     )       :End join
      qN     :Split on the modified N, which, again, gets coerced to a string
             > e.g., N=[["a","b"],["c","d"],2] -> "a,b,c,d,2"

Nこの場合は何ですか?(TryIt-linkの検索機能を使用して)正しく理解している場合、N2回繰り返されます()。次に、それを使用して2番目の入力VVqN²)を結合し、その文字列全体を使用して最初の(暗黙の)入力を結合しますUq...))。最後に、結果の文字列をNqN)で分割します。しかしN、この場合はどうなりますか?
ケビンクルーッセン

待って、p(...)検索で間違った方法を見たと思う。2ペアになった両方の入力にを追加しません。結果はのみ[["w","x","y","z"],["ab","cd","e"],2]となり、そのリスト全体を使用して参加します。その場合、なぜファイナルは結果リストにqN残さないの2ですか?または、オリジナルを変更しNますか?
ケビンクルーッセン

1
@KevinCruijssen、説明を追加しましたが、あなたはほとんどそれを理解しています。そして、はい、pushJSの配列に要素を入力すると、元の配列が変更されます。
シャギー


1

J44 43 42 29バイト

_<;._1@,(;@}:@,@,.(,_&,)&.>/)

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

マイルのおかげで-13バイト!

このアプローチは整数を使用し、マイルによるものです。

文字列を使用した独自のアプローチ

g=.[:}.@,,.
f=.(<@0<@;;._1@,];@g<"0@[)<@0<@g]

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

注:TIOから-3を調整して、 f=.

Jに適合したJonathan Allenの方法を使用します。

Jには組み込みの「結合」メソッドがないため、これはゴルフにとって驚くほど困難でした。

g 「結合」するヘルパー動詞


入力として整数のリストでの作業、私は29のcharたソリューションを_<;._1@,(;@}:@,@,.(,_&,)&.>/)無限大を使用しています_どこに分割するために知ってセンチネル値として<;._1。結合は、まずreduce /を使用して1つの大きなボックスを形成し、次に配列の整形のみを行います。
マイル

それが印象的です。ありがとう@miles。これは間違いなく改善の余地があるように感じましたが、どのように見えるかわかりませんでした。
ジョナ

@miles g&.:(a.&i.&.>)バイトにカウントすべきではないのですか、それとも何かが足りないのですか?
ジョナ

OPは、入力は文字のリストまたは整数のリストである可能性があると述べたため、ヘルパー関数は、表示しやすいようにchar配列のボックスからint配列のボックスに変換するだけです
マイル

ああ、忘れてた、ありがとう
ジョナ



0

Perl 5(-lp)、20バイト

@JonathanAllanがコメントしているように、これはIOに対してリスト区切り文字としてタブを使用し、2つのリストを区切るために改行を使用する完全なプログラムです。

chop($n=<>);s/  /$n/g

TIO

タブと改行は、そうでない場合は非印字可能文字に変更することができ、テストケースをチェックする方が便利ので選ばれた\1\2

-02l012p

chop($n=<>);s//$n/g

TIO

使い方、

  • -02 :入力レコード区切り文字を設定するには \2
  • -l:デフォルト引数から入力セパレーターを削除$_し、出力レコードセパレーターをデフォルト出力に追加します
  • -012:出力を簡単に確認できるように、出力レコードの区切り文字を\012\n)に設定する
  • -p :デフォルトの引数を出力する

  • $n=<>; :次のレコードを読み取り、割り当てる $n

  • chop$n; :セパレーターを削除する $n
  • s/\x1/$n/g:すべての出現箇所交換する\1とし$n

2
私のPerlはほとんど存在しません、これはIOのためにリストセパレータとしてタブを使用し、2つのリストを区切る改行を使用するフルプログラムだと思います。これらの文字による入力をどのように受け入れることができますか?
ジョナサンアラン

@ジョナサンアラン、あなたは正しい、私はしようとする提出するときに説明を追加する時間がありませんでした
ナウエル・フイユル

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