Căn chỉnh dòng!


31

Căn chỉnh dòng!

Đưa ra một ký tự và một chuỗi nhiều dòng, công việc của bạn là đệm từng dòng của chuỗi để chúng xếp hàng giữa các dấu phân cách đã cho.

Ví dụ

Đầu vào:

,
Programming, Puzzles
And, Code golf

Đầu ra:

Programming, Puzzles
        And, Code golf

Đầu vào

Đầu vào sẽ là một chuỗi nhiều dòng và một ký tự (mà bạn sẽ căn chỉnh giữa), bạn có thể lấy chúng theo bất kỳ thứ tự / định dạng nào bạn muốn. Nhân vật sẽ xuất hiện chính xác một lần trên mỗi dòng. Mỗi dòng của đầu vào có thể khác nhau về chiều dài.

Đầu vào có thể thông qua các đối số chức năng hoặc STDIN.

Đầu ra

Đầu ra phải là cùng một chuỗi trung tâm. Bạn được phép có một dòng mới và không có khoảng trắng ở cuối.

Đầu ra phải được đệm với số lượng không gian tối thiểu . Bạn không thể xóa bất kỳ khoảng trắng hàng đầu nào trong đầu vào (nếu nó tồn tại).

Đầu ra có thể là từ hàm trả về hoặc STDOUT.


Có thể nhập vào một chương trình đầy đủ đến từ các đối số dòng lệnh, hoặc bị cấm?
DLosc

@DLosc Vâng, tất nhiên
Downgoat

1. Đối với các đối số hàm / dòng lệnh, chúng ta có nên đọc một chuỗi đơn hay một dòng trên mỗi đối số có thể được chấp nhận không? 2. Chúng ta có phải đệm các dòng với số lượng không gian tối thiểu không?
Dennis

@Dennis Bạn có thể lấy nó trong một chuỗi. Hoặc một dòng trên mỗi đối số. "Bạn có thể lấy những thứ này theo bất kỳ thứ tự nào bạn muốn" . Có, bạn cần phải đệm các dòng với số lượng không gian tối thiểu. Tôi sẽ chỉnh sửa thông số kỹ thuật
Downgoat

@vihan Các hàm có thể nhận một dòng trên mỗi đối số không?
xnor

Câu trả lời:



13

APL (37)

APL chỉ không giỏi xử lý chuỗi (hoặc dĩ nhiên tôi không giỏi chơi gôn).

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

Điều này lấy ký tự làm đối số bên trái của nó và chuỗi đa dòng làm đối số bên phải của nó. Người ta cho rằng chuỗi multiline kết thúc trong một linefeed (ví dụ A\nB\nC\nchứ không phải là A\nB\nC.) Kể từ khi tôi có thể sử dụng "định dạng bất kỳ [I] mong muốn", và điều này cũng là định dạng thông thường cho các tập tin văn bản, tôi nghĩ rằng đây là hợp lý.

Giải trình:

  • S←⌽⍵: đảo ngược chuỗi và lưu trữ nó trong S.
  • R←S⊂⍨S=⊃S: tách Strên ký tự đầu tiên của nó và lưu trữ chuỗi các chuỗi R.
  • ⍺⍳¨⌽¨R: đảo ngược từng chuỗi trong Rvà sau đó tìm chỉ mục của ⍺ (ký tự) trong mỗi chuỗi.
  • (⌈/-+): trừ từng chỉ số từ chỉ mục lớn nhất, đưa ra số lượng khoảng trống cần thiết
  • ' '/⍨¨: cho mỗi giá trị đó, tạo ra nhiều khoảng trắng
  • R,¨: thêm khoảng trắng vào mỗi chuỗi trong R.
  • : nối tất cả các chuỗi lại với nhau
  • : đảo ngược nó (để lấy lại thứ tự ban đầu)

Thí dụ:

      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

Cảm ơn Dennis vì đã tiết kiệm 2 byte.

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

Điều này đọc các dòng từ các đối số dòng lệnh và ký tự từ STDIN.

Trình thông dịch trực tuyến không hỗ trợ các đối số dòng lệnh, nhưng bạn có thể kiểm tra phiên bản tương đương tại đây.

Giải trình

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

Lấy các chuỗi làm đối số dòng lệnh và dấu phân cách từ STDIN ( ý tưởng mượn từ câu trả lời CJam của Martin ). Sử dụng -ncờ để in các giá trị đầu ra trên các dòng riêng biệt.

                    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)

Và một ví dụ chạy:

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

Không hoàn toàn ngắn như các ngôn ngữ chơi golf được đăng cho đến nay. Lấy đầu vào là hai đối số chức năng, ví dụ f(',','Programming, Puzzles\nAnd, Code golf'). Đoạn mã dưới đây không có nội dung và bao gồm một phương pháp dễ kiểm tra.

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

Ung dung:

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)

Khá đơn giản. Điều này tìm vị trí của ký tự trong chuỗi hai lần: một lần để tìm max (tốt, một lần trên mỗi dòng) và một lần để tìm offset. Tôi đã thử kết hợp những thứ này nhưng nó dài hơn.

Python 3 được sử dụng để giải nén đầu vào. IDLE MY dường như lấy chuỗi đa dòng làm đầu vào.


@DLosc Hoạt động với tôi trong IDLE dán trong một chuỗi nhiều dòng.
xnor

Hừm. Khi tôi làm điều đó (IDLE 3.3.4, Windows 7), csẽ có dấu phân cách và snhận được một danh sách trống. Các cuộc gọi tiếp theo để input()trả lại từng dòng còn lại.
DLosc

@DLosc Lạ. Tôi đang sao chép chuỗi trực tiếp từ trình duyệt của mình vào dấu nhắc nhàn rỗi. Bạn đang làm như vậy? IDLE 3.2.2, Windows 7 trong trường hợp có vấn đề.
xnor

Tương tự. Đây là một ảnh chụp màn hình ...
DLosc

@DLosc Vẫn hoạt động với tôi ( ảnh chụp màn hình ). Mặc dù tôi không hiểu chuyện gì đang xảy ra, tôi sẽ nói đây là hành vi cụ thể của trình biên dịch hoặc môi trường và tôi đã chỉnh sửa để cố gắng chỉ định thông tin liên quan. Phiên bản chức năng dài hơn 3 ký tự trong Python 2.
xnor

3

Thạch , 12 byte

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

Hãy thử trực tuyến!

Xong xuôi và chơi golf với caird coinheringaahing trong J elly H yper T rain (JHT) , phòng trò chuyện Jelly của chúng tôi.

Làm thế nào nó hoạt động

Đối số dòng lệnh thứ ba (đầu vào đầu tiên) phải là chuỗi nhiều dòng và ký tự phải là đối số dòng lệnh thứ tư (đầu vào thứ hai).

Ỵ © w € ănạṀ⁶ẋż®Y ~ Chương trình đầy đủ.

~ Tách chuỗi theo dòng mới.
 © ~ Sao chép kết quả vào thanh ghi.
  w € ~ Lấy chỉ số về lần xuất hiện đầu tiên của nhân vật trên mỗi dòng.
      ~ Lấy tối đa.
    Tiếten ~ Và trừ nó khỏi từng chỉ số, lấy giá trị tuyệt đối.
       ~ Lặp lại một không gian nhiều lần (vector hóa).
         ż® ~ Xen kẽ với những gì được lưu trữ trong sổ đăng ký.
           Y ~ Tham gia theo dòng mới và in ngầm.

Tôi không chắc liệu việc lấy đầu vào làm danh sách các dòng có được phép hay không, vì vậy, điều này sẽ lấy một chuỗi nhiều dòng làm đầu vào. Nếu nó được cho phép:

10 byte

w€µạṀ⁶ẋż³Y

Hãy thử trực tuyến!


1
đó là khi bạn biết rằng bạn đã tạo ra một căn phòng thành công
Erik the Outgolfer

2

Matlab / Octave, 106 byte

Hàm sử dụng ba đối số riêng biệt cho ký tự, chuỗi, chuỗi; và đưa ra kết quả trong thiết bị xuất chuẩn:

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

Ví dụ trong Matlab:

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

Hoặc thử trực tuyến với trình thông dịch Octave.


2

Julia, 80 byte

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

Ung dung:

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

Sử dụng chuỗi mẫu, 2 dòng mới là quan trọng và được tính.

Kiểm tra chạy đoạn mã trong bất kỳ trình duyệt tương thích EcmaScript 6 nào (đó là FireFox. Chrome không hỗ trợ các tham số mặc định)

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

Được gọi như vậy:

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

Phiên bản bị đánh cắp:

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

Nó chấp nhận tối đa 9999 dòng ...


2

Thuốc nhuộm APL , 22 20 16 byte

-4 cảm ơn ngn.

APL thực sự không quá tệ trong việc xử lý chuỗi, nếu được phép làm việc với các mảng. Trong thử thách này, chúng tôi có thể chọn định dạng phù hợp nhất, với APL có nghĩa là một vectơ của vectơ văn bản làm đối số bên trái và dấu phân cách làm đối số bên phải vô hướng. Điều này thậm chí xử lý nhiều dấu phân cách trên mỗi dòng và căn chỉnh đầu tiên của mỗi dòng.

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

⊣,¨⍨ trả trước mỗi dòng với

' '⍴¨⍨ nhiều không gian như

⌈.⍳ chỉ số ngoài cùng bên phải của nhân vật trong số các dòng

- dấu trừ

⍳¨ chỉ số của nhân vật trong mỗi dòng

Hãy thử APL trực tuyến! ( được thêm vào đầu ra in theo chiều dọc)

Tiền thưởng? Hoạt động cho bất kỳ số lượng chuỗi và dấu phân cách (căn chỉnh theo hầu hết bên trái).


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

Phải, tất nhiên.
Adám

1

C #, 191

Là một chức năng. Gần như là một phần của câu trả lời JS của tôi.

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

và gọi nó như

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

Hàm không tên có 3đầu vào; cđó là ký tự để căn chỉnh, xlà chuỗi đầu tiên vày chuỗi thứ hai.

Trong R, hàm regexprtrả về vị trí của một mẫu đã cho trong một chuỗi. Giải pháp hoạt động bằng cách áp dụng regexprtrên cả hai chuỗi và lặp lại khoảng trắng với số tiền chênh lệch và sau đó chỉ cần in cả hai đầu vào được phân tách bằng một dòng mới.


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

Được gọi với:

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)

Điều này trả về một hàm có 2 đối số. Đầu tiên là chuỗi, thứ hai là ký tự để căn chỉnh. Các đối số này là đối số ngầm @ và n.

Đầu tiên, tôi nối một dòng mới vào chuỗi, để giúp xử lý dễ dàng hơn.

@='
'..@

Bây giờ, tôi tạo một danh sách các vị trí của mỗi ký tự căn chỉnh, sử dụng gmatch. Tiếp theo, tôi thay thế dòng mới trước mỗi dòng bằng số khoảng trắng chính xác, sau đó cắt bớt dòng mới tôi đã thêm vào đầu.


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

Không ngắn như những câu trả lời khác nhưng đây là câu trả lời đầu tiên của tôi: D


0

Võng mạc , 71 byte

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

Hãy thử trực tuyến! Lưu ý: Điều này để lại ký tự căn chỉnh trong đầu ra; nó có thể bị xóa với chi phí 4 byte. Nếu chỉ có hai chuỗi cần được căn chỉnh, thì với 52 byte:

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

Giải trình:

^(.)¶

Điều này phù hợp với các nhân vật liên kết.

((.)*\1.*¶)

Điều này khớp với dòng đầu tiên và cũng theo dõi xem có bao nhiêu ký tự trước ký tự căn chỉnh. (.NET giữ một ngăn xếp khớp cho mỗi biến, trong trường hợp này , $3.)

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

Điều này khớp với dòng thứ hai, cố gắng chiếm nhiều ký tự như chúng ta đã tìm thấy trên dòng đầu tiên. ?<-3>làm cho trận đấu bật ngăn xếp cho mỗi ký tự, cho đến khi nó trống, tại thời điểm đó, trận đấu không thành công và (.)*sau đó khớp với các ký tự còn lại trước ký tự căn chỉnh. Tại thời điểm này, chúng ta có các biến sau:

  • $1 chứa ký tự căn chỉnh
  • $2 chứa dòng đầu tiên
  • $3 chứa một ngăn xếp có độ dài là tiền tố dòng đầu tiên trừ tiền tố dòng thứ hai
  • $4 chứa dòng thứ hai
  • $5 chứa một ngăn xếp có độ dài là tiền tố dòng thứ hai trừ tiền tố dòng đầu tiên

$#5$*sau đó tiền tố số lượng không gian cần thiết để làm cho dòng đầu tiên thẳng hàng với thứ hai và ngược lại cho $#3$*.

Logic tương tự áp dụng cho câu trả lời chính, ngoại trừ ở đây, chúng ta phải tìm hai dòng không thẳng hàng để chúng ta có thể căn chỉnh chúng (đây là nơi ?(5)xuất hiện) và sau đó lặp lại căn chỉnh trên tất cả các dòng cho đến khi tất cả chúng đều thẳng hàng .


0

Lisp thông thường, 101 byte

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

Tham số đầu tiên là ký tự, thứ hai là danh sách các chuỗi được căn chỉnh.

Hãy thử trực tuyến!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.