Nomor spasi


20

Diberikan daftar Nbilangan bulat non-negatif, hasilkan angka-angka tersebut dengan masing-masing diisi oleh spasi hingga panjang N. (Atau, kembalikan daftar karakter / string.) Anda dapat mengasumsikan bahwa Nlebih besar atau sama dengan jumlah digit dari jumlah terbesar dalam daftar. Ruang tambahan diizinkan di output.

Anda juga dapat mengambil string yang berisi angka-angka ini, tetapi Nbukan panjang string, melainkan jumlah elemen dalam daftar; juga, Anda dapat mengambil daftar string misalnya ["1", "2", "3"].

Ini adalah kode-golf, jadi program terpendek dalam byte menang.

Uji kasus

input => 'output'
0 => '0'
1 => '1'
2 3 => ' 2 3'
2 10 => ' 210'
4 5 6 => '  4  5  6'
17 19 20 => ' 17 19 20'
7 8 9 10 => '   7   8   9  10'
100 200 300 0 => ' 100 200 300   0'
1000 400 30 7 => '1000 400  30   7'
1 33 333 7777 => '   1  33 3337777'
0 0 0 0 0 0 => '     0     0     0     0     0     0'

Bisakah angka dicetak satu pada setiap baris (dengan bantalan yang tepat)?
Luis Mendo

@LuisMendo ya.
Conor O'Brien

Jawaban:



16

Python, 32 byte

lambda l:'%%%ds'%len(l)*len(l)%l

Fungsi anonim yang mengambil tuple sebagai input. Baik angka atau string berfungsi.

Contoh:

l=(1,33,333,7777)

'%%%ds'
## A "second-order" format string

'%%%ds'%len(l)           -> '%4s'
## Inserts the length as a number in place of '%d'
## The escaped '%%' becomes '%', ready to take a new format argument
## The result is a format string to pad with that many spaces on the left

'%%%ds'%len(l)*len(l)    -> '%4s%4s%4s%4s'
## Concatenates a copy per element

'%%%ds'%len(l)*len(l)%l  -> '   1  33 3337777'
## Inserts all the tuple elements into the format string 
## So, each one is padded with spaces

7

JavaScript (ES7), 37 byte

a=>a.map(v=>v.padStart(a.length,' '))

Input: Array string
Output: Array string


5

PowerShell v2 +, 36 byte

param($a)$a|%{"{0,$($a.count)}"-f$_}

Mengambil input $asebagai array dari integers. Loop melalui mereka $a|%{...}. Setiap iterasi, gunakan -foperator ormat dengan opsional Alignment Component(berdasarkan pada $a.count) untuk menambahkan jumlah ruang yang sesuai. String yang dihasilkan ditinggalkan di pipa. Pada akhir pelaksanaan program, string yang dihasilkan semuanya ditinggalkan di pipa sebagai array.


Contohnya

Output dipisahkan baris-baru pada setiap proses, karena itulah default Write-Outputpada penyelesaian program untuk sebuah array.

PS C:\Tools\Scripts\golfing> @(0),@(1),@(2,3),@(2,10),@(4,5,6),@(17,19,20),@(7,8,9,10),@(100,200,300,0),@(1000,400,30,7),@(1,33,333,7777),@(0,0,0,0,0,0)|%{""+($_-join',')+" -> ";(.\spaced-out-numbers $_)}
0 -> 
0
1 -> 
1
2,3 -> 
 2
 3
2,10 -> 
 2
10
4,5,6 -> 
  4
  5
  6
17,19,20 -> 
 17
 19
 20
7,8,9,10 -> 
   7
   8
   9
  10
100,200,300,0 -> 
 100
 200
 300
   0
1000,400,30,7 -> 
1000
 400
  30
   7
1,33,333,7777 -> 
   1
  33
 333
7777
0,0,0,0,0,0 -> 
     0
     0
     0
     0
     0
     0

5

JavaScript, 49 byte

a=>a.map(n=>" ".repeat(a.length-n.length)+n)

Mengambil argumen sebagai daftar string dan juga mengembalikan daftar string.

Penjelasan:

a=>                                                   An unnamed function, which takes one argument, a
   a.map(n=>                               )          Do the following to each element n in a:
            " ".repeat(a.length-n.length)             Generate the spaces needed to justify the number
                                         +n           Append the number

1
Array string dapat diterima, jadi .join("")tidak diperlukan.
Conor O'Brien

1
a=>a.map(n=>(" ".repeat(l=a.length)+n).slice(-l))memiliki panjang yang sama tetapi bekerja pada bilangan bulat serta string.
Neil

5

Perl, 26 byte

-4 byte berkat @Ton Hospel

25 byte kode + -abendera.

printf"%*s",~~@F,$_ for@F

Jalankan dengan:

perl -ae 'printf"%*s",~~@F,$_ for@F' <<< "10 11 12"

(Pada beberapa versi Perl yang lama, Anda mungkin perlu menambahkan -n)


1
Menggunakan -aopsi ini akan membuat kode Anda lebih pendek ...
Ton Hospel

@TonHospel hum, itu terdengar cukup jelas, konyol saya .. Terima kasih untuk pengingatnya
Dada

Metode yang sedikit berbeda menghindari loop dan menyimpan byte: Cobalah secara online!
Xcali

5

Bash, 14

printf %$#d $@

Daftar input diberikan pada baris perintah.

Tidak banyak yang bisa dijelaskan di sini. Cukup gunakan fasilitas built-in printfuntuk melakukan padding yang diperlukan, berdasarkan jumlah arg yang lolos:

  • $# adalah jumlah argumen yang dilewati
  • %<n>d adalah specifier format printf yang mencetak integer dengan hingga n spasi terdepan
  • $@ adalah daftar semua arg yang disahkan
  • Penentu format digunakan kembali untuk setiap anggota $@.

Ideone .


4

Vim, 19 byte

YPPG!{<C-F>|R%ri<CR>djVGgJ

Mengambil daftar angka satu per baris. Bergantung pada :set expandtab, yang populer, tetapi tidak universal.

Anda jelas ingin menggunakannya :rightuntuk ini. Pertanyaannya adalah bagaimana cara mendapatkan jumlah baris ke baris perintah. Cara tradisionalnya adalah :%ri<C-R>=line('$'), tetapi semua teks itu panjang.

Pendekatan yang lebih pendek, lebih giat adalah untuk membentuk baris perintah menggunakan !perintah mode normal . Ini melibatkan beberapa solusi aneh, memperluas file dengan 2 baris kemudian menghapusnya lagi, tetapi keluar 2 byte lebih pendek. Dan saya agak kaget baris perintah yang saya dapatkan (seperti :%ri+4!) benar-benar berfungsi, tetapi ternyata berhasil.


Saya tidak berpikir Anda dapat mengandalkan fitur yang mati secara default.
DJMcMayhem

@DJMcMayhem Saya telah menghabiskan terlalu banyak waktu hidup saya melawan pengaturan indent yang buruk di vimgolf. Pengaturan secara eksplisit expandtabmenambahkan 7 goresan ke solusi ini. Alasan yang menjadi masalah adalah bahwa saya harus memeriksa pendekatan lain untuk menghindari / menghapus tab yang sekarang mungkin menang. Ini banyak waktu, sama sekali tidak menyenangkan, membuat kualitas solusi saya lebih buruk, dan bahkan tidak mempengaruhi salah satu kasus uji yang disediakan (tidak ada yang memiliki 8+ angka). Jika itu aturannya, itu aturannya, tapi saya lebih suka menandai non-bersaing daripada melakukan ini tanpa expandtab.
udioica

@DJMcMayhem Tentang Ypp!{. Memang lebih pendek. Itu juga tidak bekerja. Itu akan selalu membawa nomor 1 ke dalam baris perintah, terlepas dari panjang file.
udioica

4

Ruby, 40 36 34 byte

->m{m.map{|i|$><<i.rjust(m.size)}}

Dapat dikerjakan lebih banyak.

Sebut sebagai lambda.

Penjelasan:

->m{m.map{|i|$><<i.rjust(m.size)}}
->m{                             } # lambda taking array m
    m.map{|i|                   }  # map over array using variable i
             $><<                  # output to $> (stdout)
                 i.rjust(m.size)   # right justify i to m's length

2

Jelly , 7 6 byte

L⁶xaUU

Input adalah larik string. Cobalah online! atau verifikasi semua kasus uji .

Bagaimana itu bekerja

L⁶xaUU  Main link. Argument: A (array of strings)

L       Yield the l, the length of A.
 ⁶x     Repeat ' ' l times.

    U   Upend; reverse all strings in A.
   a    Perform vectorizing logical AND, replacing spaces with their corresponding
        digits and leaving spaces without corresponding digits untouched.
     U  Upend; reverse the strings in the result to restore the original order of
        its digits, moving the spaces to the left.

2

Mathematica, 25 byte

#~StringPadLeft~Length@#&

Baik input maupun output adalah daftar string.

Penjelasan

Length@#

Dapatkan panjang input (jumlah elemen).

#~StringPadLeft~...

Pad kiri setiap elemen di input sehingga panjangnya cocok dengan panjang input.


2

JavaScript (ES6), 47

Fungsi anonim, input: array string, output: array string
Menggunakan fungsi padding rekursif

a=>a.map(x=>p(x),p=x=>x[a.length-1]?x:p(' '+x))

Untuk array integer / string sebagai input, 49 byte:

a=>a.map(x=>p(x),p=x=>(y=' '+x)[a.length]?x:p(y))

Uji

f=
a=>a.map(x=>p(x),p=x=>x[a.length-1]?x:p(' '+x))

function update() {
  var l=I.value.match(/\d+/g)||[]
  O.textContent = f(l)
}

update()
 
<input id=I oninput='update()' value='1000,400,30,7'>
<pre id=O></pre>


2

PHP, 55 Bytes

<?foreach($a=$_GET[a]as$i)printf("%".count($a)."s",$i);

Versi sebelumnya 59 Bytes

<?foreach($a=$_GET[a]as$i)echo str_pad($i,count($a)," ",0);

1
Mengapa menggunakan str_pad, ketika printf sudah cukup? foreach($a=$_GET[a]as$i)printf("%".count($a)."s",$i);
Crypto

2

J, 4 byte

":~#

Cobalah online!

Fungsi unary mengambil daftar angka di sebelah kanan sebagai larik dan mengembalikan string yang diisi.

Ini sedang digunakan di REPL. Perhatikan bahwa jalur input diberi indentasi tiga spasi.

   f=: ":~#
   f 2 3
 2 3
   f 2 10
 210
   f 1111 222 33 4
1111 222  33   4

Wow. Anda mengalahkan solusi referensi saya di J! Sangat bagus.
Conor O'Brien

1

CJam , 11 byte

lS%_,f{Se[}

Cobalah online! (Sebagai suite uji.)

Penjelasan

l      e# Read input.
S%     e# Split around spaces.
_,     e# Copy and get length.
f{     e# Map this block over the list, passing in the length on each iteration.
  Se[  e#   Left-pad to the given length with spaces.
}

1

Kotlin, 90 byte

Golf:

fun main(a:Array<String>){a.forEach{b->for(i in 1..a.size-b.length){print(" ")};print(b)}}

Tidak Terkumpul:

fun main(a: Array<String>) {
    a.forEach { b ->
        for (i in 1..a.size - b.length) {
            print(" ")
        }
        print(b)
    }
}

1

Haskell, 47 byte

k=length
f l=map(\s->replicate(k l-k s)' '++s)l

Itu adalah fungsi dari daftar string ke daftar string, seperti jawaban JavaScript. replicatememungkinkan seseorang untuk mendapatkan daftar (string Haskell adalah daftar karakter) dari ukuran tertentu, jadi saya menggunakannya - dan asumsi tebal dalam masalah - untuk menghasilkan bantalan (panjangnya adalahN - <panjang elemen>, untuk setiap elemen dari daftar input). Saya lebih suka menggunakan printfsolusi berbasis daripada yang ini dengan replicate(itu akan lebih pendek, untuk satu hal) tetapi pernyataan impor membunuh penghematan yang dilakukan pada fungsi itu sendiri.


1

Jawa, 83 82 byte

a->{String s="";for(int i=a.length,j=i;i-->0;)s+="%"+j+"s";return s.format(s,a);};

Membangun string format yang dirancang untuk melapisi argumen yang diberikan oleh sejumlah spasi yang sama dengan panjang array. String format digunakan sebagai argumen untukString.format , dan hasilnya kemudian dikembalikan. Antarmuka fungsional dapat menerima salah satu String[]atau yang Integer[]serupa.

Kelas penuh:

public class Test {
    public static void main(String[] args) {
        java.util.function.Function<Integer[], String> f = a -> {
            String s = "";
            for (int i = a.length, j = i; i-- > 0;)
                s += "%" + j + "s";
            return s.format(s, a);
        };

        System.out.println(f.apply(new Integer[] {0}));
        System.out.println(f.apply(new Integer[] {2, 10}));
        System.out.println(f.apply(new Integer[] {7, 8, 9, 10}));
        System.out.println(f.apply(new Integer[] {1, 33, 333, 7777}));
        System.out.println(f.apply(new Integer[] {0, 0, 0, 0, 0, 0}));
    }
}

Cobalah di Ideone.

-1 byte terima kasih kepada @KevinCruijssen.


Pendekatan yang bagus, +1. Anda dapat golf dengan 1 byte dengan meletakkan int ...dan s+=...di dalam ifseperti ini:for(int i=a.length,j=i;i-->0;s+="%"+j+"s");
Kevin Cruijssen

1

Groovy, 36 Bytes

{a->a.collect{it.padLeft(a.size())}}

Hanya mengambil array string, menghasilkan array string berlapis.


1

MATL, 14 byte

'%%%dd'inYDGYD

Cobalah MATL Online

Ini menggunakan pembuatan string yang diformat dengan terlebih dahulu membangun string format: %(NUM)ddan kemudian menerapkan format string lagi menggunakan string format ini dan input.


1

JavaScript 33 byte

mirip dengan @Hedi - tetapi padding default adalah '', jadi 4 karakternya kurang

a=>a.map(s=>s.padStart(a.length))

f=a=>a.map(s=>s.padStart(a.length))

console.log(f(["0"]))
console.log(f(["1"]))
console.log(f(["2","3"]))
console.log(f(["2","10"]))
console.log(f(["17" ,"19" ,"2"]))
console.log(f(["1000" ,"400" ,"30" ,"7"]))


1

K (oK) , 11 byte

Larutan:

,/(-#x)$$x:

Cobalah online!

Penjelasan:

Diinterpretasikan dari kanan ke kiri. Konversikan ke string, dan pad kiri dengan daftar panjang, lalu ratakan:

,/(-#x)$$x: / the solution                      | example:
         x: / save as 'x'                       |
        $   / string                            | $10 20 30 -> "10","20","30"
       $    / pad right by left                 | 5$"abc" -> "abc  "
  (   )     / do the stuff in brackets together |
    #x      / count x                           | #10 20 30 -> 3
   -        / negate                            |
,/          / flatten (concatenate-over)        | ,/" a"," b"," c" -> " a b c"


0

C #, 39 byte

s=>s.ConvertAll(c=>c.PadLeft(s.Count));

Mengambil List<string>dan mengeluarkan aList<string> .

Penjelasan:

/*Func<List<string>, List<string>> Lambda =*/ s =>
    s.ConvertAll(c =>                                // Create a new List<string> by...
        c.PadLeft(s.Count)                           // ...padding each element by 'N'
    )
;

Sudah beberapa byte lebih pendek untuk menggunakan LINQ jika impor tidak dihitung dan kemudian kembali IEnumerable<string> bukannya daftar lengkap:

C #, 35 + 18 = 53 byte

using System.Linq;s=>s.Select(c=>c.PadLeft(s.Count));

0

R, 47 byte

cat(sprintf("%*.f",length(n<-scan()),n),sep="")

Membaca input dari stdin dan menggunakan format C-style with sprintf. Seharusnya ada beberapa cara catfungsi tidak diperlukan tetapi tidak bisa menemukan cara untuk menekan tanda kutip pada setiap elemen tanpa itu. Jika kami hanya ingin memulai dan mengakhiri penawaran, kami dapat menggunakan opsi yang sedikit lebih panjang:

paste0(sprintf("%*.f",length(n<-scan()),n),collapse="")
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.