行を揃える!


31

行を揃える!

文字と複数行の文字列が与えられたら、文字列の各行をパディングして、指定された区切り文字の間に並ぶようにします。

入力:

,
Programming, Puzzles
And, Code golf

出力:

Programming, Puzzles
        And, Code golf

入力

入力は、複数行の文字列と文字(これを揃えます)であり、これらを任意の順序/形式で使用できます。文字は1行に1回だけ表示されます。入力の各行の長さは異なる場合があります。

入力は、関数の引数またはSTDINを使用できます。

出力

出力は、中央の同じ文字列である必要があります。1つの末尾の改行が許可され、末尾の空白は許可されません。

出力には、最小限のスペースを埋め込む必要があります。入力内の先頭の空白を削除することはできません(存在する場合)。

出力は、関数戻りまたはSTDOUTからのものです。


完全なプログラムへの入力はコマンドライン引数から取得できますか、それは禁止されていますか?
DLosc

@DLoscはい、もちろん
Downgoat

1.関数/コマンドライン引数の場合、単一の文字列を読み取る必要がありますか、または引数ごとに1行が許容されますか?2. 最小限のスペースで行を埋める必要がありますか?
デニス

@Dennis単一の文字列で取得できます。または、引数ごとに1行。「好きな順番でこれらを服用できます」。はい、最小限のスペースで行を埋める必要があります。仕様を編集します
-Downgoat

@vihan関数は引数ごとに1行を取ることができますか?
xnor

回答:



13

APL(37)

APLは、ストリング処理があまり得意ではありません(または、もちろん、ゴルフは得意ではありません)。

{⌽∊R,¨' '/⍨¨(⌈/-+)⍺⍳⍨¨⌽¨R←S⊂⍨S=⊃S←⌽⍵}

これは、文字を左引数として受け取り、複数行の文字列を右引数として受け取ります。複数行の文字列は改行で終わると想定されます(例:A\nB\nC\nではなくA\nB\nC)。「任意の形式[I] wish」を使用できるため、これもテキストファイルの従来の形式であるため、これは合理的です。

説明:

  • S←⌽⍵:文字列を逆にして、に保存しSます。
  • R←S⊂⍨S=⊃SS最初の文字で分割し、文字列の配列をに保存しRます。
  • ⍺⍳¨⌽¨R:の各文字列を逆にして、各文字列でRindex(文字)のインデックスを見つけます。
  • (⌈/-+):必要なスペースの量を与えて、最大のインデックスから各インデックスを引きます
  • ' '/⍨¨:それらの値ごとに、その数のスペースを生成します
  • R,¨:の各文字列にスペースを追加しますR
  • :すべての文字列を結合します
  • :元に戻す(元の順序に戻す)

例:

      NL←⎕UCS 10 ⍝ newline
      test←'Programming, Puzzles',NL,'And, Code golf',NL
      test ⍝ test string
Programming, Puzzles                
And, Code golf                      

      ⍝ run the function
      +X←','{⌽∊R,¨' '/⍨¨(⌈/-+)⍺⍳⍨¨⌽¨R←S⊂⍨S=⊃S←⌽⍵}test
Programming, Puzzles                        
        And, Code golf                      

      ⍴X ⍝ result is really a string with newlines, not a matrix
44

9

CJam、23 22 20バイト

2バイトを節約してくれたDennisに感謝します。

ea_rf#_:e>\fm.{S*\N}

これは、コマンドライン引数から行を読み取り、STDINから文字を読み取ります。

オンラインインタープリターはコマンドライン引数をサポートしていませんが、同等のバージョンをここでテストできます。

説明

ea    e# Get the lines from ARGV.
_rf#  e# Duplicate input, read the character and find index of character in each line.
_:e>  e# Duplicate indices and find maximum.
\fm   e# Subtract each index from the maximum index.
.{    e# Apply this block to each pair of line and (max_index - index).
  S*  e#   Get a string with the right amount of spaces.
  \N  e#   Swap spaces with line and push a line feed.
}

9

ピップ22 20 18 + 1 = 19バイト

Y_@?qMgsX(MXy)-y.g

コマンドライン引数として文字列を受け取り、STDINの区切り文字(MartinのCJam answerから借用したアイデア)を使用します。-nフラグを使用して、出力値を個別の行に出力します。

                    g is list of cmdline args; s is space (implicit)
    q               Read the delimiter from stdin
 _@?                Construct a lambda function that takes a string and returns
                       the index of the delimiter in it
     Mg             Map that function to each remaining item in g
Y                   Yank the resulting list of indices into the variable y

         (MXy)-y    Take the max of y minus each element in y
       sX           Space, repeated that many times...
                .g  ... concatenated to each item in g
                    Print, newline-separated (implicit, -n flag)

実行例:

C:\Users\dlosc> pip.py -ne Y_@?qMgsX(MXy)-y.g "Programming, Puzzles" "And, Code golf"
,
Programming, Puzzles
        And, Code golf

7

JavaScript ES 2015、113バイト

f=(c,s)=>s.split`
`.map((e,_,a)=>' '.repeat(a.map(j=>j.indexOf(c)).reduce((g,h)=>g>h?g:h)-e.indexOf(c))+e).join`
`

これまでに投稿されたゴルフ言語ほど短くはありません。たとえば、入力を2つの関数引数として受け取りますf(',','Programming, Puzzles\nAnd, Code golf')。以下のスニペットは、未公開であり、簡単なテスト方法が含まれています。

f=function(c,s){
  return s
    .split('\n')
    .map(function(e,_,a){
      return ' '.repeat(
        a.map(function(f){
          return f.indexOf(c)
        }).reduce(function(g,h){
          return g>h?g:h
        })-e.indexOf(c)
      )+e
    })
    .join('\n')
}

run=function(){document.getElementById('output').innerHTML=f(document.getElementById('char').value,document.getElementById('string').value)};document.getElementById('run').onclick=run;run()
<label>Character: <input type="text" id="char" value="," maxlength="1" /></label>
<textarea id="string" rows="4" cols="30" style="display:block">
Programming, Puzzles
And, Code Golf</textarea><button id="run">Run</button><br />
<pre id="output"></pre>



5

ジュリア、117バイト

f(c,t)=(s=[split(l,c)for l=split(t,"\n")];join(map(i->lpad(i[1],maximum(map(i->length(i[1]),s))," ")*c*i[2],s),"\n"))

ゴルフをしていない:

function f(c::String, t::String)
    # Create an array of arrays by splitting on newlines and
    # then on the given delimiter
    s = [split(l, c) for l in split(t, "\n")]

    # Find the maximum length on the left side of the delimiter
    m = maximum(map(i -> length(i[1]), s))

    # Rejoin on the delimiter and pad each line with spaces,
    # and rejoin this with newlines
    join(map(i -> lpad(i[1], m, " ") * d * i[2], s), "\n")
end

5

Python 3、85(IDLE 3.2.2、Windows)

c,*s=input().split('\n')
for x in s:print(' '*(max(z.find(c)for z in s)-x.find(c))+x)

とても簡単です。これにより、文字列内の文字の位置が2回検出されます。1回は最大値(行ごとに1回)を検出し、1回はオフセットを検出します。これらを組み合わせてみましたが、長かったです。

入力の解凍にはPython 3が使用されます。私のアイドルは、入力として複数行の文字列を受け取るようです。


@DLoscは、複数行の文字列でのIDLE貼り付けで機能します。
xnor

うーん それを行うと(IDLE 3.3.4、Windows 7)、c区切り文字をs取得し、空のリストを取得します。input()残りの行を1つずつ返すための後続の呼び出し。
DLosc

@DLoscストレンジ。ブラウザから直接、アイドルプロンプトに文字列をコピーアンドペーストしています。同じことをしていますか?IDLE 3.2.2、それが重要な場合のWindows 7。
xnor

同じ。ここだスクリーンショットは ...
DLosc

@DLoscはまだ動作します(スクリーンショット)。私は何が起こっているのか理解できませんが、これはコンパイラーまたは環境固有の動作であると言い、関連する情報を指定するように編集しました。関数バージョンは、Python 2では3文字長くなります。
xnor15年

3

ゼリー、12 バイト

Ỵ©w€µạṀ⁶ẋż®Y

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

ジェリー練習チャットルームJ elly H yper T raining(JHT)でケアードコイナーリンガーでゴルフを行いました

使い方

3番目のコマンドライン引数(最初の入力)は複数行の文字列で、文字は4番目のコマンドライン引数(2番目の入力)でなければなりません。

w©w€µạṀ⁶ẋż®Y〜完全なプログラム。

Ỵ〜改行で文字列を分割します。
 ©〜結果をレジスタにコピーします。
  w€〜各行で最初に出現する文字のインデックスを取得します。
      Ṁ〜最大を取る。
    µạ〜そして、各インデックスからそれを減算し、絶対値を取得します。
       ⁶ẋ〜スペースを何回も繰り返します(ベクトル化します)。
         ż®〜レジスタに保存されたものとインターリーブします。
           Y〜改行で結合し、暗黙的に印刷します。

入力を行のリストとして取得することが許可されているかどうかわからないため、これは入力として複数行の文字列を取得します。許可された場合:

10バイト

w€µạṀ⁶ẋż³Y

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


1
それはあなたが成功した部屋を作成したことを知っているときです
エリックアウトゴルファー

2

Matlab / Octave、106バイト

文字、文字列、文字列に3つの個別の引数を使用する関数。結果は標準出力になります:

function f(c,s,t)
p=find(s==c)-find(t==c);disp([repmat(32,1,max(-p,0)) s]),disp([repmat(32,1,max(p,0)) t])

Matlabの例:

>> f(',', 'Programming, Puzzles', 'And, Code golf')
Programming, Puzzles
        And, Code golf

または、Octaveインタープリターでオンライン試してください


2

ジュリア、80バイト

f(c,s)=(t=split(s,'
');u=[search(i,c)for i=t];join([" "].^(maxabs(u)-u).*t,'
'))

ゴルフをしていない:

function f(c,s)
  # converts multiline string to array of single-line strings
  t=split(s,'\n')

  # creates array of positions of delimiter
  u=[search(i,c)for i=t]

  # Appends appropriate number of spaces to each line
  # (uses elementwise operations to achieve this result)
  v=[" "].^(maxabs(u)-u).*t

  # Recombines array of strings to multiline string and returns
  return join(v,'\n')
end

2

JavaScript(ES6)、105

テンプレート文字列を使用すると、2つの改行が重要でカウントされます。

EcmaScript 6互換ブラウザー(つまり、FireFox。Chromeはデフォルトのパラメーターをサポートしていません)でスニペットの実行をテストします

f=(s,c,p=(s=s.split`
`).map(r=>m<(v=r.indexOf(c))?m=v:v,m=0))=>s.map((r,i)=>' '.repeat(m-p[i])+r).join`
`

// Ungolfed
f=(s,c)=>{
  s=s.split('\n')
  p=s.map(r=>r.indexOf(c))
  m=Math.max(...p)
  s=s.map((r,i)=>' '.repeat(m-p[i])+r)
  return s.join('\n')
}  

// TEST
out=x=>O.innerHTML+=x+'\n'

out(f(`Programming, Puzzles
And, Code golf`,','))
<pre id=O></pre>


2

Python 2、93バイト

def f(x,y,z):
 p=y.index(x)-z.index(x)
 if p<0:y=" "*abs(p)+y
 else:z=" "*p+z
 print y+'\n'+z

そう呼ばれます:

f(',','Programming, Puzzles','And, Code Golf')

2

C#4.0、329 320 307バイト

using System;class P{static void Main(){Func<char,dynamic>f=(d)=>Console.ReadLine().Split(d);var c=f(' ')[0][0];var m=0;var l=new string[9999][];var z=0;for (l[z]=f(c);l[z].Length==2;l[z]=f(c)){m=Math.Max(l[z][0].Length,m);z++;}for(var i=0;i<z;i++){Console.WriteLine("{0,"+m+"}"+c+"{1}",l[i][0],l[i][1]);}}}

非ゴルフバージョン:

using System;
class P
{
    static void Main()
    {
        // lamba to to read a line and split on a char, returns an array of 
        Func<char,dynamic>f=(d)=>Console.ReadLine().Split(d); 
        // read the separator char by taking the first char of the first string 
        // in the array
        // use our lambda
        var c=f(' ')[0][0];
        var m=0; // max position where char is found
        var l=new string[9999][]; // hold all input
        var z=0; // count valid entries in l
        // loop until the input doesn't contain an
        // array with 2 elements
        // here we use our lambda agian, twice
        for (l[z]= f(c);l[z].Length==2;l[z] = f(c))
        {
            // calculate max, based on length 
            // of first element from the string array
            m=Math.Max(l[z][0].Length,m);
            z++; // increase valid items
        }
        // loop over all valid items
        for(var i=0;i<z;i++)
        {
        // use composite formatting with the padding option
        // use the max to create a format string, when max =4 
        // and seperator char is , this will give
        // "{0,4},{1}"
            Console.WriteLine("{0,"+ m +"}"+c+"{1}",l[i][0],l[i][1]);
        }
    }
}

最大9999行を受け入れます...


2

Dyalog APL22 20 16 バイト

-4 ngnに感謝します。

APLは、配列を扱うことが許可されている場合、実際には文字列処理がそれほど悪くありません。この課題では、最も適切な形式を選択できます。これは、APLの場合、左引数としてテキストベクトルのベクトルを意味し、区切り文字をスカラー右引数として意味します。これは、行ごとに複数の区切り文字も処理し、各行の最初の区切り文字を揃えます。

⊣,¨⍨' '⍴¨⍨⌈.⍳-⍳¨

⊣,¨⍨ 各行の先頭に

' '⍴¨⍨ 同じくらいのスペース

⌈.⍳ 行の中で文字の右端のインデックス

- マイナス

⍳¨ 各行の文字のインデックス

オンラインでAPLをお試しください!出力を垂直に印刷するために追加されました)

ボーナス? 作品の文字列の任意の数のため、および区切り文字(で整列一番左)。


⊣,¨⍨' '⍴¨⍨⌈.⍳-⍳¨
ngn

はい、もちろん。
アダム

1

C#、191

機能として。大体、私のJS回答の移植です。

using System.Linq;string f(string s,char c){var q=s.Split('\n');int m=0,v;Array.ForEach(q,x=>m=m<(v=x.IndexOf(c))?v:m);return String.Join("\n",q.Select(x=>new String(' ',m-x.IndexOf(c))+x));}

1

ルビー、74バイト

l=lambda{|d,s|s.each{|e|puts ' '*(s.map{|f|f.index(d)}.max-e.index(d))+e}}

そしてそれを

l.call ',',['Programming, Puzzles','And, Code golf']

1

R、68バイト

function(c,x,y,r=regexpr)cat(x,"\n",rep(" ",r(c,x)-r(c,y)),y,sep="")

3入力を受け取る名前のない関数。cこれは整列する文字xで、最初の文字列とy2番目の文字列です。

Rでは、関数regexprは文字列内の特定のパターンの位置を返します。解決策はregexpr、両方の文字列に適用し、差に相当する空白を繰り返し、続いて改行で区切られた両方の入力を印刷することで機能します。


0

Python 2、67 66バイト

def a(d,l):
 i=l[0].index(d)
 for e in l:print' '*(i-e.index(d))+e

と呼ばれる:

a(',', ['Programming, Puzzles', 'And, Code golf'])

0

Moonscript、138バイト

(n)=>
 i=0
 @='
'..@
 l=[b-a for a,b in @gmatch "
().-()"..n]
 m=math.max unpack l
 (@gsub '
',(a)->
  i=i+1
  a..(' ')\rep m-l[i])\sub(2)

これは、2つの引数を取る関数を返します。最初は文字列、2番目は整列する文字です。これらの引数は、暗黙的な引数@およびnです。

まず、処理を容易にするために、文字列に新しい行を追加します。

@='
'..@

次に、を使用して、すべての位置合わせ文字の位置のリストを生成しgmatchます。次に、すべての行の前の改行を正しい数のスペースに置き換え、最初に追加した改行を削除します。


0

Lua、169バイト

function a(d,t)m={}for k,v in pairs(t)do m[#m+1]=string.find(v,d)end o=math.max(unpack(m))for k,v in pairs(t)do print(string.rep(" ",o-(string.find(v,d)or 0))..v)end end

他の答えほど短くはありませんが、これが私の最初の答えです:D


0

網膜、71バイト

+`^((.)(.*¶)*)((.)*\2.*¶)((?<-5>.)*(?(5)\2|(.)\2).*)
$1$#7$* $4$#5$* $6

オンラインでお試しください!注:これにより、出力に位置合わせ文字が残ります。4バイトのコストで削除できます。2つの文字列のみを整列する必要がある場合、52バイトの場合:

^(.)¶((.)*\1.*¶)((?<-3>.)*(.)*\1.*)
$#5$* $2$#3$* $4

説明:

^(.)¶

これは、配置文字と一致します。

((.)*\1.*¶)

これは最初の行に一致し、また、整列文字の前にあった文字数を追跡します。(.NETは各変数のマッチスタックを保持します$3。この場合、。)

((?<-3>.)*(.)*\1.*)

これは2行目と一致し、1行目で見つかった文字数を考慮しようとします。?<-3>一致が空になるまで各文字のスタックをポップします。空になると、一致は失敗し、(.)*整列文字の前の残りの文字と一致します。この時点で、次の変数があります。

  • $1 アライメント文字が含まれています
  • $2 最初の行が含まれています
  • $3 最初の行のプレフィックスから2番目の行のプレフィックスを引いた長さのスタックが含まれます
  • $4 2行目が含まれています
  • $5 長さが2行目のプレフィックスから1行目のプレフィックスを引いたものであるスタックを含む

$#5$*次に、必要な数のスペースにプレフィックスを付けて、最初の行を2番目の行に揃えます$#3$*

メインの答えにも同様のロジックが適用されますが、ここでは、整列しないように2つの行を見つけて(これがどこに?(5)来るか)、すべての行が均等に整列するまですべての行で整列を繰り返す必要があります。 。


0

Common Lisp、101バイト

(lambda(c l)(dolist(x l)(format t"~,,v@a~%"(-(apply'max(mapcar(lambda(x)#1=(position c x))l))#1#)x)))

最初のパラメーターは文字で、2番目は位置合わせされるストリングのリストです。

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

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