重複する文字列ブロック


22

チャレンジ:

複数行の文字列のリストが与えられたら、それらを(左上で)オーバーラップし、結果を出力します。

例:

入力:["aaaa\naaaa\naaaa\naaaa","bb\nbb\nbb","c"]
出力:

cbaa
bbaa
bbaa
aaaa

チャレンジルール:

  • 入力形式は柔軟です。入力を行の2Dリスト(つまり[["aaaa","aaaa","aaaa","aaaa"],["bb","bb","bb"],["c"]])または文字の3Dリスト(つまり)として取得でき[[["a","a","a","a"],["a","a","a","a"],["a","a","a","a"],["a","a","a","a"]],[["b","b"],["b","b"],["b","b"]],[["c"]]]ます。STDINを使用して、すべての入力を1つずつ取得できます。等。
  • 出力形式は厳密です。複数行の文字列を印刷するか返すかを選択できます。(言語に文字列がない場合は、代替として文字の2Dリストとして出力することができます。ただし、言語に文字列がまったくない場合のみです。)
  • 入力リストの順序はもちろん重要です(ただし、必要に応じて入力を逆にすることもできます)。
  • 入力は、ユニコード範囲で印刷可能なASCII文字を含むことになる[33,126]!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~)。
  • 入力は長方形のみです(したがって、奇妙な形はありません)。ただし、出力は必要な長方形ではありません。
  • 末尾のスペースと単一の末尾の改行が許可されます。先行スペースや改行はありません。

一般的なルール:

  • これはであるため、バイト単位の最短回答が優先されます。
    コードゴルフ言語では、コードゴルフ以外の言語で回答を投稿しないようにしないでください。「任意の」プログラミング言語の可能な限り短い答えを考えてみてください。
  • デフォルトのI / Oルールを使用した回答には標準ルールが適用されるため、STDIN / STDOUT、関数/メソッド、適切なパラメーター、戻り値型、完全なプログラムを使用できます。あなたの電話。
  • デフォルトの抜け穴は禁止されています。
  • 可能であれば、コードのテストへのリンク(TIOなど)を追加してください。
  • また、回答の説明を追加することを強くお勧めします。

テストケース:

入力:["aaaa\naaaa\naaaa\naaaa","bb\nbb\nbb","c"]
出力:

cbaa
bbaa
bbaa
aaaa

入力:["12345\n54321","00\n00\n00\n00","001\n011\n012"]
出力:

00145
01121
012
00

入力:["sm\noo\nmr\nee\nt!\nh_\ni_\nn_\ng_","!@#$%^\n&*()_+\nqwerty\nuiopas","this\nis_a\ntest"]
出力:

this%^
is_a_+
testty
uiopas
t!
h_
i_
n_
g_

末尾の改行は許可されますか?より具体的には、任意の量の末尾の改行が許可されていますか?
JAD

@JADうん、そうだな。残りが先行スペース/改行なしで出力される限り。末尾の改行/スペースはあまり重要ではないため、オプションで追加できます。
ケビンクルイッセン

回答:


6

ゼリー、3バイト

a/Y

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

しばらくゼリーを使用していませんでしたが、コメントの難題は打ち負かされると思いました。論理and(a)を非常に直接使用して、入力の各要素間でスタック操作を実行します(/)。Y必要な形式で印刷するために使用されます。


良いね!私はJelly tbhがかなり苦手です。私が用意した解決策はḷ""/Y、入力リストを逆にしたものでした。a.. についてさえ知りませんでした
ケビン・クルーッセン

11

JavaScript(Node.js)、24バイト

@Grimyのおかげで2バイト節約

返された文字列は、ANSIエスケープコードをサポートする端末に出力されると想定しています。以下のようにESCエスケープされた(しゃれを意図していない)印刷できない文字が含まれてい\x1Bます。

a=>`\x1B[2J\x1B[H`+a.join`\x1B[H`

これはTIOでは機能しませんが、オンラインで試すことができます!代わりに生の出力を表示します。

どうやって?

CSIシーケンスを使用は、次のとおりです。

  • ED(ディスプレイの消去):

    ESC[2J

    どこ2の手段「クリアスクリーン全体」

  • CUP(カーソル位置):

    ESC[H

    これは、「カーソルを行n、列m移動します」を意味しますここで、nmは両方とも省略され、暗黙的に1(画面の左上隅)に設定されます。

出力例

output


ECMA-48準拠の端末を想定して、両方を省略できます;。また、これは「JavaScript +ターミナル」または純粋なJavaScriptと競合しない類似のものでなければならないと思います。
グリムミー

@Grimyありがとう!(興味のある人のために、ここではECMA-48仕様がある -しかし、セミコロンを省略することができることを述べていますどこで見つけることができませんでした- 。それが全てで言及したの場合)
アルノー

1
5.4.2.hはやや紛らわしい言い回しですが、興味深い部分は次のとおりif the last parameter sub-string(s) is empty, the separator preceding it may be omittedです。部分文字列は2つしかないため、最後の部分文字列の前の区切り記号は1つだけであり、省略できます。
グリムミー

私はANSIを知りませんが、最初の\x1B[H+は必要ですか?デフォルトでは左上から開始するのではなく、各入力後にリセットするだけで済みます(これは結合の機能です)。または、最初はデフォルトで別の場所から開始されますが、結合のその位置に正常にリセットするには、そのカーソル位置から明示的に開始する必要がありますか?
ケビンクルイッセン

1
@Arnauldこの関数を実行するとき、おそらく端末には常に何か他のものがあるので、結局は初期リセットが必要だと思います。印刷をommittingについては、私は推測f=a=>print(`\x1B[H`+a.join`\x1B[H`)してf(input_here)同じ出力を生成するでしょうかprint(f(input_here))?ですから、を省略しprintて単純に文字列を返すことが許可されない理由はわかりません。
ケビンクルーッセン

7

R120111の 110 107バイト

function(x,`!`=ncol,M=array('',Reduce(pmax,Map(dim,x)))){for(m in x)M[1:!t(m),1:!m]=m
write(t(M),1,!M,,'')}

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

文字のマトリックスのリストを受け入れる関数(3D入力が受け入れられます)。

(バイトカウントからわかるように、Rでこれを行うのはそれほど簡単ではありません...)

  • @Giuseppeのおかげで-9バイト
  • @RobinRyderのおかげで-4バイト

4
私は本当に200バイト以上のソリューションを期待していました!この質問が報奨金になると、私はこれにいい報奨金を与えます
ジュゼッペ

@Giuseppe:他の言語よりもずっと長い... :(
digEmAll

2
!のarray代わりに使用する111バイト matrix
ジュゼッペ

@ジュゼッペ:すてき!
digEmAll

3
エイリアスを持つ107ncol(転置して取得できますnrow)。
ロビンライダー

5

Python 2、88バイト

n,f=None,filter
for l in map(n,*input()):print''.join(f(n,x)[-1]for x in map(n,*f(n,l)))

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


説明(例付き):

2Dリストを入力として受け取ります。

Input: [["12345","54321"],["00","00","00","00"],["001","011","012"]]

最初に、各入力長方形の行を取得するために、入力リストが圧縮されます(map(None,l)最長のzipと同じです)。

map(n,*input())   gives:

('12345', '00', '001')
('54321', '00', '011')
(None, '00', '012')
(None, '00', None)

これらの各行は、Nones を削除するためにフィルターされ、再び圧縮されます。

map(None,*filter(None,l))

filter(None,l) for each l gives:

('12345', '00', '001')
('54321', '00', '011')
('00', '012')
('00',)

map*... gives:

[('1', '0', '0'), ('2', '0', '0'), ('3', None, '1'), ('4', None, None), ('5', None, None)]
[('5', '0', '0'), ('4', '0', '1'), ('3', None, '1'), ('2', None, None), ('1', None, None)]
[('0', '0'), ('0', '1'), (None, '2')]
['0', '0']

これは、目的の結果の各位置の文字のリストです。これらのリストは再びフィルタリングされ、最後のリストが取得されます。

filter(None,x)   gives:

[('1', '0', '0'), ('2', '0', '0'), ('3', '1'), ('4',), ('5',)]
[('5', '0', '0'), ('4', '0', '1'), ('3', '1'), ('2',), ('1',)]
[('0', '0'), ('0', '1'), ('2',)]
['0', '0']

and with [-1]:

['0', '0', '1', '4', '5']
['0', '1', '1', '2', '1']
['0', '1', '2']
['0', '0']

最後に、結果のリストが結合されて印刷されます。

print''.join(..)

00145
01121
012
00

RE「文字列のリストを返す」、ルールは「出力形式は厳密です。複数行の文字列を印刷するか返すかを選択できます。出力は許可されないため、2Dまたは3Dリストを選択できます。」88バイトのフルプログラムは問題ないようです
ジョナサンアラン

@ JonathanAllan、welp、私は厳密な出力を読み違えました(または忘れましたか?:p)
TFeld

5

R、107 97バイト

function(x)for(i in 1:max(lengths(x))){for(m in x)if(i<=length(m))cat(m[i],'\r',sep='');cat('
')}

TIOでは動作しないようです。これは、 \rです。これキャリッジリターン文字の。Rのローカルインストールで動作します。

行のベクトルを含むリストとして入力を受け取ります。

x <- list(c("aaaa","aaaa","aaaa","aaaa"),c("bb","bb","bb"),c("c"))

各長方形の行をループし、それぞれの後にキャリッジリターンを出力して、行を再開します。

ルールを少し引き伸ばすと、入力の長さをチェックする必要がなくなり、無限ループだけで大量の改行を出力できます。

R、85バイト

function(x)for(i in 1:8e8){for(m in x)if(i<=length(m))cat(m[i],'\r',sep='');cat('
')}

バイト106ニースは、あなたがここにあるゴルフをやって参照してください!
ジュゼッペ

おそらく97バイト。TIOでテストしているだけなので、これが実際に機能するかどうかは不明です
ジュゼッペ

@ジュゼッペこんにちは!あなたの提案は私のために働く。末尾の改行を出力できる場合、代わりに任意の大きなforループを使用することもできますが、それが課題の限界を押し上げていると思います。
JAD

@JAD:を使用した素晴らしいアイデア\r、おかえりなさい!ちょっと注意してください、これはインタラクティブなRセッションでのみ機能すると思います(interactive()trueを返す場合)
digEmAll

@digEmAll rscriptコマンドラインから使用して、私のマシンで動作します。Windowsは\r\n改行とLinuxに使用するため、Windows / Linuxの問題だと思い\nます。
JAD

4

APL(Dyalog Unicode)、22 バイトSBCS

2D文字配列のリストを引数として取る匿名の暗黙の接頭辞関数。プリント。

(⊃{⍺@(⍳⍴⍺)⊢⍵}/)⌽,∘⊂1⌷↑

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

これは、キャンバスを作成し、それをブロックのリストに追加し、コーナーにブロックを配置する関数で縮小(折りたたみ)することで機能します。

 2Dブロックを混合して直交3Dブロックを作成し、必要に応じてスペースを埋めます

1⌷ 最初の層を取る

 それを囲み
 、その後
⌽,  のブロックの逆のリストを付加します

()  次の暗黙関数を適用します。

{}/  次の匿名ラムダの使用を減らします。

  ⊢⍵ キャンバスとして正しい引数で…

  ⍺@() に配置さた左引数の要素で修正する次のインデックスにたます。

   ⍴⍺ 左引数の形状

   ɩその形状のアレイのndices

 開示する(ランクを下げるために削減が含まれているため)


4

Haskell、66バイト

unlines.foldl((const?)?)[]
(g?(a:b))(c:d)=g a c:(g?b)d;(_?a)b=a++b

入力は、たとえば最初のテストケースの場合、逆の順序で文字列のリストのリストとして取得されます[["c"],["bb","bb","bb"],["aaaa","aaaa","aaaa","aaaa"]]

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


3

05AB1E、12バイト

TFeldのpythonのソリューション
2バイトのおかげで保存された汚れを

ζεðKζðδK€θJ,

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

説明

ζ             # transpose input with space as filler
 ε            # apply to each
  ðK          # remove spaces
    ζ         # transpose with space as filler
     ðδK      # deep remove spaces
        €θ    # get the tail of each
          J   # join each
           ,  # print

代替の14バイトバージョン

õζεÅ»DŠg.$J}θ,

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

説明

õζ              # zip with empty string as filler
  ε             # apply to each
   Å»      }    # cumulative reduce by
     D          # duplicate second input
      Š         # move down twice on stack
       g.$      # remove len(other_copy) elements from the other input
          J     # join with other copy
            θ,  # print the last element

1
ああ、覚えておく必要があるの--no-lazyは、暗黙の印刷でマップ/フィルターを使用してy、次と比較してバイトを保存する修正ですvy...,:)レガシーバージョンで動作することは知っていましたが、新しいバージョンでは[...]。それが不足していたことを知りませんでした--no-lazy。;)答え自体に関しては、とてもいいです!累積的な削減が必要であることは知っていましたが、自分で試してみると実際には解決できませんでした。あなたはそれをとても簡単に見せる..
ケビン・クルーッセン

ルールで言及しましたが、テストケースに適用するのを忘れましたが、入力にスペースは含まれません。zip-fillerはデフォルトではスペースなので、おそらくそこにいくつかのバイトを保存できます。(最初の回答で何かが保存されるかどうかは
わかり

2
õζεõKすることができますζεðKõζõδKすることができますζðδK
グリムミー

@Grimy:そうそう、スペースを入力に含めることはできません。ありがとう!
エミグナ



2

PowerShell 6、コンソールのみ、20バイト

Arnauldの回答に基づきます。これはコンソールのみで機能し、TIOでは機能しません。

cls
$args-join"`e[H"

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


PowerShell、103バイト

$args|%{$l=$_-split'
';$r=&{$r+($l|%{''})|%{($x=$l[$j++])+($_-replace"^.{0,$("$x"|% Le*)}")}|?{$_}}}
$r

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

展開:

$args|%{
    $l=$_-split"`n"
    $r=&{                           # run this scriptblock in a new scope
        $r+($l|%{''})|%{
            $x=$l[$j++]             # a new line or $null
            $w="$x"|% Length
            $y=$_-replace"^.{0,$w}" # remove first chars from the current line
            $x+$y                   # output the new line plus tail of the overlapped line
        }|?{$_}                     # filter out not empty lines only
    }                               # close the scope and remove all variables created in the scope
}
$r



1

C(GCC、MinGW)138バイト

CRがカーソルを現在の行の先頭に置くと仮定します。

d,i,l;f(S,n,p,t)char**S,*p,*t;{for(d=i=0;i<n;d+=l)p=strchr(t=S[i],10),printf("\n%.*s\r"+!!i,l=p?p-t:strlen(t),t),S[i++]+=l+!!p;d&&f(S,n);}

テスト済み:

int main()
{
    char *test1[] = {"aaaa\naaaa\naaaa\naaaa","bb\nbb\nbb","c"};
    char *test2[] = {"12345\n54321","00\n00\n00\n00","001\n011\n012"};
    char *test3[] = {"sm\noo\nmr\nee\nt!\nh_\ni_\nn_\ng_","!@#$%^\n&*()_+\nqwerty\nuiopas","this\nis_a\ntest"};

    f(test1, 3);
    f(test2, 3);
    f(test3, 3);
}


1

ジャバスクリプト(ブラウザ)216の 208 204バイト

これで私の試み。私はサイズに満足しておらず、確かに改善のためにもっとあるはずですが、ゴルフで経験したことはありません。

var n='\n',x=s=>s.split``.reverse().join``,i,j,f=a=>a.map(s=>s.split(n).map(y=>x(y))).reduce((a,b)=>{for(i=0;i<b.length;i++){j=a[i];if(!j)j=b[i];a[i]=b[i].padStart(j.length,j)}return a}).map(s=>x(s)).join(n)

とにかく、それは最初にすべての文字列を分割し、次にすべての文字列を逆にし、次にreduce操作でループしながらpadStartすべての文字列を一緒に開始します。次に、すべての文字列を再び逆にして、改行で結合します。

forループの最後の部分が最後に発生し、合計8バイトのバイト節約になることを思い出させてくれたKevin Cruijssenに感謝します。

var n='\n',x=s=>s.split``.reverse().join``,i,j,f=a=>a.map(s=>s.split(n).map(y=>x(y))).reduce((a,b)=>{for(i=0;i<b.length;a[i]=b[i++].padStart(j.length,j))if(!(j=a[i]))j=b[i];return a}).map(s=>x(s)).join(n)

console.log(f(["aaaa\naaaa\naaaa\naaaa","bb\nbb\nbb","c"]));
console.log(f(["12345\n54321","00\n00\n00\n00","001\n011\n012"]));
console.log(f(["sm\noo\nmr\nee\nt!\nh_\ni_\nn_\ng_","!@#$%^\n&*()_+\nqwerty\nuiopas","this\nis_a\ntest"]));


1
両方とも('')2つの `で4バイトを節約できます:)
ケビンクルーイッセン

1
また、あなたは置き換えることができfor(i=0;i<b.length;i++){j=a[i];if(!j)j=b[i];a[i]=b[i].padStart(j.length,j)}for(i=0;i<b.length;a[i]=b[i++].padStart(j.length,j))if(!(j=a[i]))j=b[i];
ケビンクルーッセン

1
j最初に割り当てられている(j=a[i])文があれば-で行われ、その後、if(!...)j=b[i];(ここ...(j=a[i])、それほどの更新値j)、その後、;a[i]=b[i++].padStart(j.length,j))問題があることを確認どこ..ないためのループ反復の終了時に行われ、それはうまくいくようですか?
ケビンクルーッセン

1
ooohhh .... *大きな目*何かのロックを解除
Tschallacka

1
あなたがそれらをまだ見ていない場合はところで、内ゴルフ<すべての言語>のためのヒントJavaScriptでのゴルフのためのヒントは、両方をお読み面白いかもしれません。:)
ケビンクルーッセン

1

C(gcc)51 47バイト

f(char**s){for(;*s;printf("\e[s%s\e[u",*s++));}

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

ceilingcatのおかげで-4バイト。

カーソル位置の保存/復元にCSIシーケンスを使用します。渡された文字列配列を(と同じ形式でargv)繰り返し、出力します<save position>string<restore position>、それぞれについてします。

これはカーソルを左上に残すので、ターミナルで実行するときは、プロンプトが入力を上書きしないように、十分な改行を後で残すことが重要です。


1

Japt -P、7バイト

入力を複数行の文字列の配列として受け取り、単一の複数行の文字列を出力します。

ú y_¸¬Ì

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

ú y_¸¬Ì     :Implicit input of array
ú           :Right pad each line of each element with spaces to the length of the longest
  y         :Transpose
   _        :Map
    ¸       :  Split on spaces
     ¬      :  Join
      Ì     :  Last character
            :Implicitly join and output

1

T-SQLクエリ、297 295バイト

¶をセパレータとして使用し、テーブル変数を入力として使用します。

DECLARE @ table(a varchar(max),k int identity(1,1))
INSERT @ values('aaaa¶aaaa¶aaaa¶aaaa'),('bb¶bv¶bb'),('c');

WITH c as(SELECT k,row_number()over(partition
by k order by k)s,value v FROM @ CROSS APPLY
string_split(a,'¶')s),m(i,l,e)as(SELECT*FROM c
WHERE k=1UNION ALL
SELECT k,s,STUFF(e,1,len(v),v)FROM m
JOIN c ON-~i=k and s=l)SELECT
top 1with ties e FROM m
ORDER BY rank()over(partition by l order by-i)

オンラインで試す


1

Javascript(ブラウザ)、129 124バイト

コードゴルフの私の最初の試み。ルール(抜け穴、標準ルールなど)に記載されているリンクを読んでいるので、何か間違ったことをしたいと思います!


入力は最初の投稿(フラットアレイ形式)のままにしておきました。

_=o=>{o=o.map(i=>i.split`\n`),r=o.shift();for(a of o)for(l in a)b=a[l],r[l]=r[l]?b+r[l].slice(b.length):b;return r.join`\n`}

5バイトを節約してくれたKevin Cruijssenに感謝します。


テスト:


1
PPCGへようこそ!素敵な最初の答え、私からの+1。ゴルフにいくつかの小さなもの:for(a of o){for(l in a){b=a[l],r[l]=(r[l])?b+r[l].slice(b.length):b}}することができfor(a of o)for(l in a)b=a[l],r[l]=r[l]?b+r[l].slice(b.length):b;:)
ケビンCruijssen

1
@KevinCruijssen-ありがとう、投稿を更新しました!投稿する前にこれら2つのガイドを読みましたが、どちらも有用でした。しかし、私の試みをさらに改善することができるいくつかのトリックを見逃す可能性があります!
ケビンビボレット

1
あなたが逃した私の最初のコメントから、もうひとつは、周りの括弧ある=(r[l])?まで除去することができます=r[l]?:)
ケビンCruijssen

1
@KévinBibollet、の最終結果を返すために必要ですr。これがないと、代わりにマッピングの結果が返されます。
シャギー

1
あなたがいる場合したいけれども、テストケースで使用されるI / Oの書式を保持するために、あなたはまだに取り掛かることができます85のバイトができますが、I / Oが柔軟であることに注意してください。
シャギー

1

Pyth、18バイト

L.tb0VyQsme #dy #N

オンラインでお試しください!(注:コード自体は1ブロックのみを評価し、インタープリターのテストスイートモードは入力の各行に対してプログラムを1回実行します)

TFeldのPython 2ソリューションに基づく

説明:

L.tb0         # define a lambda function called y which does a transpose, padding with integer 0's
VyQ           # loop over transposed first input line (Q = eval(input()) ) (loop index = N)
   s          # concatenate array of strings (implicitly printed)
    m         # map over
         y #N # transpose of non-falsy values of N
     e        # for each item: last element of array
       #d     # relevant space at the start! filter with identity function, removes falsy values

アルゴリズム自体が機能する理由の説明については、TFeldの回答を参照してください。


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