Çizgileri Hizala!


31

Çizgileri Hizala!

Bir karakter ve çok satırlı bir dize verildiğinde, işiniz dizenin her satırını doldurmaktır, böylece verilen sınırlayıcı arasında sıralanırlar.

Örnekler

Giriş:

,
Programming, Puzzles
And, Code golf

Çıktı:

Programming, Puzzles
        And, Code golf

Giriş

Girdi, çok satırlı bir dize ve bir karakter olacak (aralarında hizalayacağınız), bunları istediğiniz sırada / formatta alabilirsiniz. Karakter tam olarak her satırda bir kez görünecektir. Girişin her satırı uzunluğu farklı olabilir.

Giriş, fonksiyon argümanları veya STDIN yoluyla olabilir.

Çıktı

Çıktı merkezlenmiş aynı dize olmalıdır. Bir izleyen yeni satır girmenize ve izleyen bir boşluk olmamasına izin verilir.

Çıktı, minimum miktarda boşlukla doldurulmalıdır . Girişteki baştaki boşlukları kaldıramazsınız (varsa).

Çıktı, işlev dönüşünden veya STDOUT'dan olabilir.


Tam bir programa giriş komut satırı argümanlarından gelebilir mi, yoksa yasak mı?
DLosc 12:15

@DLosc Evet, elbette
Downgoat

1. Fonksiyon / komut satırı argümanları için tek bir dize okumalı mıyız yoksa argüman başına bir satır kabul edilebilir mi? 2. Hatları minimum miktarda boşlukla doldurmak zorunda mıyız ?
Dennis,

@Dennis Tek bir dize alabilir. Veya bağımsız değişken başına bir satır. "Bunları istediğin sırada alabilirsin" . Evet, çizgileri minimum miktarda boşlukla doldurmanız gerekir. Spesifikasyonu düzenleyeceğim
Downgoat 12:15

@vihan İşlevler argüman başına bir satır alabilir mi?
xnor

Yanıtlar:



13

APL (37)

APL sadece string işlemede çok iyi değildir (veya elbette golf oynamak konusunda iyi değilim).

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

Bu, karakteri sol argümanı, çok satırlı dizeyi de sağ argümanı olarak alır. Çok satırlı dizginin bir satır bitiminde sona erdiği varsayılmaktadır (örneğin;A\nB\nC\n ;A\nB\nC ). "Herhangi bir dili [ ] dileğim" kullanabildiğim için, bu da metin dosyaları için geleneksel biçimdir, bunun makul olduğunu düşünüyorum.

Açıklama:

  • S←⌽⍵: dizgiyi ters çevirir ve saklar S .
  • R←S⊂⍨S=⊃S: Silk karakterine bölün ve dizelerin dizisiniR .
  • ⍺⍳¨⌽¨R: her dizgeyi tersine çevirir R izleyin ve ardından ⍺ (karakter) dizinini bulun.
  • (⌈/-+): İndekslerin her birini en geniş indeksten çıkartın ve gereken boşluk miktarını verin
  • ' '/⍨¨: bu değerlerin her biri için, bu kadar boşluk yaratın
  • R,¨: içindeki her dizeye boşluk bırak R .
  • : tüm karakterleri bir araya getir
  • : ters çevir (orijinal siparişi geri almak için)

Örnek:

      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 bayt

2 bayt kaydettiğiniz için Dennis'e teşekkür ederiz.

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

Bu, komut satırı argümanlarındaki satırları ve STDIN'deki karakteri okur.

Çevrimiçi tercüman, komut satırı argümanlarını desteklemez, ancak burada eşdeğer bir sürümü test edebilirsiniz .

açıklama

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 bayt

Y_@?qMgsX(MXy)-y.g

Dizeleri komut satırı argümanları ve STDIN'den sınırlayıcı olarak alır ( Martin CJam'in cevabından ödünç alınmış fikir ). -nÇıkış değerlerini ayrı satırlara yazdırmak için bayrak kullanır .

                    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)

Ve bir örnek çalışma:

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 bayt

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

Şu ana kadar yayınlanan golf dilleri kadar kısa değil. Girdiyi iki işlev argümanı olarak alır, örn f(',','Programming, Puzzles\nAnd, Code golf'). Aşağıdaki snippet ungolfed ve test etmek için kolay bir yöntem içerir.

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 bayt

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

Ungolfed:

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)

Oldukça basit. Bu, karakterin dizedeki konumunu iki kez bulur: maks. Bulmak için bir kez (satır başına bir kez) ve ofseti bulmak için bir kez. Bunları birleştirmeyi denedim ama daha uzun oldu.

Python 3, girişin açılması için kullanılır. MYLE, çok satırlı dizeleri girdi olarak alıyor.


@DLosc IDLE yapıştırmada çok satırlı bir dizgede çalışır.
xnor

Hmm. Bunu yaptığımda (IDLE 3.3.4, Windows 7),c sınırlayıcıyı salır ve boş bir liste alır. Sonraki aramaları input(), kalan satırları birer birer döndürmek için kullanılır.
DLosc

@DLosc Garip. Dizeyi doğrudan tarayıcımdan Bekleme istemine kopyalayıp yapıştıracağım. Sen de aynısını mı yapıyorsun? IDLE 3.2.2, önemli olması durumunda Windows 7.
xnor

Aynı. İşte bir ekran görüntüsü ...
DLosc

@DLosc Hala benim için çalışıyor ( ekran görüntüsü ). Neler olup bittiğini anlamadığım halde, bunun derleyici veya çevreye özgü davranış olduğunu söyleyeceğim ve ilgili bilgiyi belirlemeye çalışmak için düzenleme yaptım. İşlev sürümü Python 2'de 3 karakter daha uzundur.
xnor

3

Jöle , 12 bayt

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

Çevrimiçi deneyin!

J elly H yper T yağmuru (JHT) içinde caird coinheringaahing ile tamamlandı ve golf oynadı. , bizim jöle uygulama sohbet odası.

Nasıl çalışır

Üçüncü komut satırı argümanı (ilk giriş) çok satırlı dize olmalı ve karakter dördüncü komut satırı argümanı (ikinci giriş) olmalıdır.

W © w € µạṀ⁶ẋż®Y ~ Tam program.

String ~ Dizeyi yeni satırlara bölün.
 © ~ Sonucu kayıt defterine kopyalayın.
  w € ~ Her satırdaki karakterin ilk oluşumunun dizinini alın.
      Take ~ Maksimum al.
    ạ ~ Ve her bir dizinden çıkarın, mutlak değeri alarak.
       ⁶ẋ ~ Birçok kez (vektörleştiren) bir alanı tekrarlayın.
         ż® ~ Kayıt defterinde saklanan ile araya gir.
           Y ~ Yeni satırlara katıl ve örtük olarak bas.

Bir satır listesi olarak girdi almaya izin verilip verilmediğinden emin değilim, bu da girdi olarak çok satırlı bir dize alır. İzin verildiyse:

10 bayt

w€µạṀ⁶ẋż³Y

Çevrimiçi deneyin!


1
o zaman başarılı bir oda yarattığınızı biliyorsunuz
Ağustos'ta

2

Matlab / Octave, 106 bayt

Karakter, string, string için üç ayrı argüman kullanan işlev; ve stdout'ta sonuç verir:

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'daki örnek:

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

Veya Octave tercümanı ile çevrimiçi olarak deneyin .


2

Julia, 80 bayt

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

Ungolfed:

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

Şablon dizgileri kullanılarak, 2 yeni satır önemli ve sayılır.

Parçacığı EcmaScript 6 uyumlu bir tarayıcıda çalıştırmayı test edin (FireFox'tur. Chrome varsayılan parametreleri desteklemez)

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 bayt

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

Öyle denir:

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

2

C # 4.0, 329 320 307 bayt

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

Ungolfed versiyonu:

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

Maksimum 9999 hat kabul eder ...


2

Dyalog APL , 22 20 16 bayt

-4 sayesinde ngn.

APL aslında dizelerle işlemeye izin verilirse string işlemede o kadar da kötü değildir. Bu zorlukta, APL için sol argüman olarak bir metin vektörü vektörü ve skaler sağ argüman olarak sınırlayıcı olan en uygun formatı seçebiliriz. Bu, satır başına birden fazla sınırlayıcıyı bile kullanır ve her satırın ilkini hizalar.

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

⊣,¨⍨ ile her satırı hazırla

' '⍴¨⍨ kadar boşluk

⌈.⍳ Satırlar arasında karakterin en sağ indeksi

- eksi

⍳¨ her satırdaki karakterin dizini

APL'yi çevrimiçi olarak deneyin! ( dikey olarak çıktı almak için eklenir)

Bonus? İşleri dizeleri herhangi bir sayı için, ve sınırlayıcı (tarafından hizalar en soldaki).


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

Evet tabi ki.
Adám

1

C #, 191

İşlev olarak. Kabaca JS cevabımın bir tasviri.

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 bayt

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

ve buna benziyor

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

1

R, 68 bayt

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

3Girdileri alan adsız fonksiyon ; chizalanacak karakter x, ilk dize vey ikinci dizedir.

R'de, işlev regexprbelirli bir desenin konumunu bir dizgede döndürür. Çözüm regexpr, her iki dizeye de uygulayarak ve farkı belirleyen beyaz boşlukları tekrarlayarak çalışır ve daha sonra her iki girişi de yeni satır ile ayrılmış olarak yazdırır.


0

Python 2, 67 66 bayt

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

Denilen:

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

0

Metin Metni, 138 bayt

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

Bu 2 argüman alan bir işlev döndürür. Birincisi, dize, ikincisi ise hizalanacak karakter. Bu argümanlar örtük argümanlardır @ ve n.

İlk olarak, işlemeyi kolaylaştırmak için dizeye yeni bir satır ekliyorum.

@='
'..@

Şimdi, kullanarak her hizalama karakterinin pozisyonlarının bir listesini hazırlıyorum gmatch. Sonra, her satırdan önce yeni satırı doğru boşluk sayısıyla değiştiririm, daha sonra başlangıçta eklediğim yeni satırı keserim.


0

Lua, 169 bayt

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

Diğer cevaplar kadar kısa değil ama bu benim ilk cevap: D


0

Retina , 71 bayt

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

Çevrimiçi deneyin!Not: Bu, çıktı karakterindeki hizalama karakterini bırakır; 4 baytlık bir maliyetle silinebilir. Yalnızca iki dizenin hizalanması gerekiyorsa, 52 bayt için:

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

Açıklama:

^(.)¶

Bu hizalama karakteriyle eşleşir.

((.)*\1.*¶)

Bu, ilk satırla eşleşir ve aynı zamanda hizalama karakterinden önce kaç karakterin bulunduğunu da izler. (.NET her değişken için bir eşleştirme yığını tutar, bu durumda,$3 .)

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

Bu, ikinci satırla eşleşir ve ilk satırda bulduğumuz karakterleri hesaba katar. ?<-3>eşleşmenin her karakter için yığını boşalmasına, eşlemenin başarısız olduğu noktada açmasına neden olur ve(.)* ardından hizalama karakterinden önceki kalan karakterlerle . Bu noktada aşağıdaki değişkenlere sahibiz:

  • $1 hizalama karakteri içeriyor
  • $2 ilk satırı içerir
  • $3 uzunluğu ilk satır ön eksi ikinci satır ön eki olan bir yığın içerir
  • $4 ikinci satırı içerir
  • $5 uzunluğu ikinci satır ön eksi ilk satır ön eki olan bir yığın içerir

$#5$* daha sonra, ilk satırı ikinciyle aynı hizaya getirmek için gerekli boşluk sayısını önler ve $#3$* .

Benzer mantık biz (bu nerede onları hizaya böylece hizalamazsanız iki satır bulmak zorunda buraya hariç, ana cevap için de geçerlidir ?(5)hepsi eşit hizalanmış kadar çizgi geliyor) ve daha sonra baştan hizalamayı tekrar .


0

Ortak Lisp, 101 bayt

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

İlk parametre karakter, ikincisi ise hizalanacak dizgenin bir listesi.

Çevrimiçi deneyin!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.