Menyelaraskan garis!


31

Menyelaraskan garis!

Diberikan karakter dan string multiline, tugas Anda adalah memberi pad setiap baris string sehingga mereka berbaris di antara pembatas yang diberikan.

Contohnya

Memasukkan:

,
Programming, Puzzles
And, Code golf

Keluaran:

Programming, Puzzles
        And, Code golf

Memasukkan

Input akan berupa string multiline dan karakter (yang akan Anda selaraskan), Anda dapat mengambil ini dalam urutan / format yang Anda inginkan. Karakter akan muncul tepat sekali per baris. Setiap baris input mungkin berbeda panjangnya.

Input bisa melalui argumen fungsi atau STDIN.

Keluaran

Outputnya harus string yang sama berpusat. Anda diizinkan satu trailing baris baru dan tidak ada spasi spasi tambahan.

Keluaran harus diisi dengan jumlah ruang minimum . Anda tidak dapat menghapus spasi putih terkemuka di input (jika ada).

Output bisa dari fungsi return atau STDOUT.


Bisakah input ke program lengkap berasal dari argumen command-line, atau itu dilarang?
DLosc

@Doscosc Ya, tentu saja
Downgoat

1. Untuk argumen fungsi / perintah-baris, haruskah kita membaca satu string atau apakah satu baris per argumen dapat diterima? 2. Apakah kita harus mengisi garis dengan jumlah ruang minimum ?
Dennis

@ Dennis Anda dapat mengambilnya dalam satu string. Atau satu baris per argumen."Anda dapat mengambil ini dalam urutan apa pun yang Anda inginkan" . Ya, Anda harus mengisi garis dengan jumlah ruang minimum. Saya akan mengedit spec
Downgoat

@vihan Bisakah fungsi mengambil dalam satu baris per argumen?
xnor

Jawaban:



13

APL (37)

APL hanya tidak pandai memproses string (atau tentu saja saya tidak pandai bermain golf).

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

Ini mengambil karakter sebagai argumen kiri, dan string multiline sebagai argumen kanannya. Diasumsikan bahwa string multiline diakhiri dengan linefeed (mis. A\nB\nC\nDaripada A\nB\nC.) Karena saya dapat menggunakan "format apa pun yang saya inginkan", dan ini juga merupakan format konvensional untuk file teks, saya pikir ini masuk akal.

Penjelasan:

  • S←⌽⍵: balikkan string, dan simpan di S.
  • R←S⊂⍨S=⊃S: split S pada karakter pertamanya, dan menyimpan array string R.
  • ⍺⍳¨⌽¨R: balikkan setiap string R , dan kemudian menemukan indeks index (karakter) di setiap string.
  • (⌈/-+): kurangi masing-masing indeks dari indeks terbesar, dengan memberikan jumlah ruang yang dibutuhkan
  • ' '/⍨¨: untuk masing-masing nilai tersebut, hasilkan banyak ruang
  • R,¨: tambahkan spasi ke setiap string di R .
  • : gabungkan semua string bersama
  • : balikkan (untuk mendapatkan pesanan asli kembali)

Contoh:

      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 byte

Terima kasih kepada Dennis karena telah menghemat 2 byte.

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

Ini membaca baris dari argumen command-line dan karakter dari STDIN.

Penerjemah online tidak mendukung argumen baris perintah, tetapi Anda dapat menguji versi yang setara di sini.

Penjelasan

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

Pip , 22 20 18 + 1 = 19 byte

Y_@?qMgsX(MXy)-y.g

Mengambil string sebagai argumen baris perintah dan pembatas dari STDIN ( ide dipinjam dari jawaban CJam Martin ). Menggunakan -nflag untuk mencetak nilai output pada baris yang berbeda.

                    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)

Dan contoh dijalankan:

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 byte

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

Tidak sesingkat bahasa golf yang diposting sejauh ini. Mengambil input sebagai dua argumen fungsi, mis f(',','Programming, Puzzles\nAnd, Code golf'). Cuplikan di bawah tidak disunat dan termasuk metode yang mudah untuk diuji.

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

Julia, 117 byte

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

Tidak Disatukan:

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)

Cukup mudah. Ini menemukan posisi karakter dalam string dua kali: sekali untuk menemukan maks (baik, sekali per baris), dan sekali untuk menemukan offset. Saya mencoba menggabungkan ini tetapi lebih lama.

Python 3 digunakan untuk membongkar input. MY IDLE tampaknya mengambil string multiline sebagai input.


@DLosc Bekerja untuk saya dalam menyisipkan IDLE dalam string multiline.
xnor

Hmm. Ketika saya melakukan itu (IDLE 3.3.4, Windows 7), cdapatkan pembatas dan smendapat daftar kosong. Panggilan selanjutnya untuk input()mengembalikan baris yang tersisa satu per satu.
DLosc

@DLosc Aneh. Saya menyalin-menempelkan string langsung dari browser saya ke prompt Idle. Apakah kamu melakukan hal yang sama? IDLE 3.2.2, Windows 7 jika itu penting.
xnor

Sama. Ini tangkapan layar ...
DLosc

@DLosc Masih bekerja untuk saya ( tangkapan layar ). Meskipun saya tidak mengerti apa yang sedang terjadi, saya akan mengatakan ini adalah kompiler atau perilaku spesifik lingkungan , dan saya diedit untuk mencoba menentukan info yang relevan. Versi fungsinya 3 chars lebih lama dalam Python 2.
xnor

3

Jelly , 12 byte

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

Cobalah online!

Dikerjakan dan golf dengan koindengan caird di J elly H yper T raining (JHT) , ruang obrolan Jelly kami.

Bagaimana itu bekerja

Argumen baris perintah ketiga (input pertama) harus berupa string multi-baris, dan karakter harus menjadi argumen baris perintah keempat (input kedua).

Ỵ © w € µạṀ⁶ẋż®Y ~ Program lengkap.

Ỵ ~ Bagi string dengan baris baru.
 © ~ Salin hasilnya ke register.
  w € ~ Dapatkan indeks kemunculan karakter pertama pada setiap baris.
      Ṁ ~ Ambil yang maksimal.
    μạ ~ Dan kurangi dari setiap indeks, dengan mengambil nilai absolut.
       ⁶ẋ ~ Ulangi spasi yang berkali-kali (vektorisasi).
         ż® ~ Interleave dengan apa yang disimpan dalam register.
           Y ~ Gabung dengan baris baru dan cetak secara implisit.

Saya tidak yakin apakah mengambil input sebagai daftar baris diperbolehkan, jadi ini mengambil string multiline sebagai input. Jika diizinkan:

10 byte

w€µạṀ⁶ẋż³Y

Cobalah online!


1
saat itulah Anda tahu Anda telah menciptakan ruang yang sukses
Erik the Outgolfer

2

Matlab / Oktaf, 106 byte

Fungsi yang menggunakan tiga argumen terpisah untuk karakter, string, string; dan menghasilkan stdout:

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

Contoh di Matlab:

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

Atau coba online dengan penerjemah Octave.


2

Julia, 80 byte

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

Tidak Disatukan:

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

Menggunakan string template, 2 baris baru itu signifikan dan dihitung.

Tes menjalankan cuplikan di peramban apa pun yang kompatibel dengan EcmaScript 6 (yaitu FireFox. Chrome tidak mendukung parameter default)

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 byte

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

Disebut seperti ini:

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

2

C # 4.0, 329 320 307 byte

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

Versi tidak disatukan:

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

Itu menerima maksimum 9999 baris ...


2

Dyalog APL , 22 20 16 byte

-4 Terima kasih kepada ngn.

APL sebenarnya tidak terlalu buruk dalam pemrosesan string, jika diizinkan untuk bekerja dengan array. Dalam tantangan ini, kita dapat memilih format yang paling tepat, yang untuk APL berarti vektor vektor teks sebagai argumen kiri, dan pembatas sebagai argumen skalar kanan. Ini bahkan menangani beberapa pembatas per baris, dan meluruskan yang pertama dari setiap baris.

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

⊣,¨⍨ tambahkan setiap baris dengan

' '⍴¨⍨ ruang sebanyak

⌈.⍳ indeks paling kanan dari karakter di antara baris

- minus

⍳¨ indeks karakter di setiap baris

Coba APL online! ( ditambahkan untuk mencetak hasil secara vertikal)

Bonus? Berfungsi untuk sejumlah string, dan pembatas (sejajar dengan paling kiri).


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

Ya tentu saja.
Adem

1

C #, 191

Sebagai fungsi. Kira-kira porting jawaban JS saya.

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

Ruby, 74 byte

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

dan menyebutnya seperti

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

1

R, 68 byte

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

Fungsi tanpa nama yang mengambil 3input; cyang merupakan karakter untuk disejajarkan, xadalah string pertama dan ystring kedua.

Dalam R, fungsi regexprmengembalikan posisi pola yang diberikan dalam string. Solusinya bekerja dengan menerapkan regexprpada kedua string dan mengulangi ruang putih sebesar perbedaan dan selanjutnya hanya mencetak kedua input yang dipisahkan oleh baris baru.


0

Python 2, 67 66 byte

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

Disebut dengan:

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

0

Moonscript, 138 byte

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

Ini mengembalikan fungsi yang membutuhkan 2 argumen. Yang pertama adalah string, yang kedua adalah karakter untuk disejajarkan. Argumen ini adalah argumen implisit @, dan n.

Pertama, saya menambahkan baris baru ke string, untuk mempermudah pemrosesan.

@='
'..@

Sekarang, saya membuat daftar posisi setiap karakter pelurusan, menggunakan gmatch. Selanjutnya, saya mengganti baris baru sebelum setiap baris dengan jumlah spasi yang benar, kemudian memotong baris baru yang saya tambahkan di awal.


0

Lua, 169 byte

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

Tidak sesingkat jawaban lain tetapi ini adalah yang pertama: D


0

Retina , 71 byte

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

Cobalah online! Catatan: Ini meninggalkan karakter penyelarasan di output; itu dapat dihapus dengan biaya 4 byte. Jika hanya dua string yang perlu disejajarkan, maka untuk 52 byte:

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

Penjelasan:

^(.)¶

Ini cocok dengan karakter pelurusan.

((.)*\1.*¶)

Ini cocok dengan baris pertama dan juga melacak berapa banyak karakter yang ada sebelum karakter pelurusan. (.NET menyimpan tumpukan kecocokan untuk setiap variabel, dalam hal ini $3,.)

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

Ini cocok dengan baris kedua, mencoba menghitung sebanyak karakter yang kami temukan di baris pertama. ?<-3>menyebabkan kecocokan untuk mengeluarkan tumpukan untuk setiap karakter, sampai kosong, pada titik mana kecocokan gagal, dan (.)*kemudian cocok dengan karakter yang tersisa sebelum karakter perataan. Pada titik ini kita memiliki variabel berikut:

  • $1 berisi karakter pelurusan
  • $2 berisi baris pertama
  • $3 berisi tumpukan yang panjangnya adalah awalan baris pertama dikurangi awalan baris kedua
  • $4 berisi baris kedua
  • $5 berisi tumpukan yang panjangnya adalah awalan baris kedua minus awalan baris pertama

$#5$*lalu awali jumlah spasi yang diperlukan untuk membuat baris pertama sejajar dengan yang kedua, dan sebaliknya untuk $#3$*.

Logika yang sama berlaku untuk jawaban utama, kecuali di sini kita harus menemukan dua baris yang tidak sejajar sehingga kita dapat menyelaraskannya (ini adalah di mana yang ?(5)datang) dan kemudian ulangi perataan di semua baris sampai semuanya sama rata .


0

Gangguan Umum, 101 byte

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

Parameter pertama adalah karakter, yang kedua adalah daftar string yang akan disejajarkan.

Cobalah online!

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.