Javascript kiri-pad golf

27

pengantar

Di belakang dari kejatuhan paket npm pad-kiri , mari kita memiliki kode golf untuk mengimplementasikan pad-kiri.

Fungsi kiri-pad terdiri dari 2 argumen default dan 1 argumen tambahan, dalam bentuk string , panjang , ( padchar ). Jika padchar tidak diberikan, ini distandarisasi untuk karakter spasi . Mari kita ambil contoh dengan dua argumen:

left_pad("abc", 6)

Pertama, kita amati panjang tali, yaitu 3 . Setelah ini, kita perlu mengisi string ini di sebelah kiri sampai panjang string penuh telah mencapai panjang yang diberikan dalam fungsi. Dalam hal ini 6 . Karena padchar tidak diberikan , kita perlu menambahkan ini dengan spasi:

   abc

Ini adalah string dengan 3 spasi dan string awal, menghasilkan string dengan panjang 6. Berikut adalah contoh dengan padchar yang diberikan:

left_pad("abc", 6, "-")

Kami hanya melakukan hal yang sama seperti contoh di atas, tetapi ganti spasi dengan padchar. Dalam hal ini, tanda hubung:

---abc

Tugas

Mengingat string , panjang , dan mungkin padchar argumen tambahan , output string empuk kiri. Anda dapat mengasumsikan bahwa jumlah panjangnya sama atau lebih besar dari panjang string. Padchar akan selalu terdiri dari 1 karakter.

Uji kasus

left_pad("string", length, ("padchar")) === "left-padded string"

left_pad("foo", 5) === "  foo"
left_pad("foobar", 6) === "foobar"
left_pad("1", 2, "0") === "01"
left_pad("1", 2, "-") === "-1"

Ini adalah , jadi pengiriman dengan jumlah byte terkecil menang!

m0sa
sumber
13
@ m0sa Masih ada beberapa masalah. Membatasi tantangan untuk javascript sangat tidak disarankan - tidak ada alasan bahasa lain tidak dapat berpartisipasi dalam hal ini. Spesifikasi harus menggambarkan perilaku yang diinginkan dan rentang input yang dimungkinkan tanpa perlu mengikuti tautan. Tidak jelas begitu saja bagaimana parameter ketiga ditangani.
xnor
8
Saya yakin bahwa referensi yang relevan dengan Javascript dapat dibuat untuk motivasi, tanpa harus mengatakan "oleh karena itu tidak ada bahasa lain yang diizinkan untuk dimainkan". Jika Anda sangat tertarik untuk melihat entri Javascript terbaik, Anda bisa menawarkan hadiah untuk itu, sambil tetap membiarkan tantangan terbuka untuk bahasa lain.
trichoplax
6
Entah satu pertanyaan bahasa dilarang atau tidak. Jika mereka dilarang, tutup ini. Jika diizinkan, biarkan OP membatasi pertanyaan sesuka mereka.
Sklivvz
10
@ Sklivvz (dan m0sa) Ada beberapa kasus yang jarang terjadi di mana tantangan spesifik bahasa masuk akal, terutama jika tantangannya memerlukan beberapa fitur yang sangat unik dari suatu bahasa untuk masuk akal atau bahkan menjadi tantangan di tempat pertama. Itulah alasan utama mereka diizinkan dan mengapa saya juga menentang untuk melarang mereka sepenuhnya. Yang mengatakan, untuk setiap tantangan yang tidak masuk akal dalam bahasa apapun, tidak ada alasan yang baik untuk membatasi untuk satu bahasa. Kalau tidak, kita akan memiliki "Urutkan array di JavaScript", "Sortir array di Ruby", "Sortir array dengan Python" ... dan 300 tantangan lainnya tanpa manfaat sama sekali.
Martin Ender
8
@ Klivvz Seperti yang dikatakan trichoplax, ini adalah motivasi yang bagus untuk sebuah tantangan, tetapi ini bermuara pada tugas pemrosesan string yang sangat sederhana yang masuk akal dalam bahasa lain. Tantangannya tidak khusus sulit, bisa dilakukan atau menarik dalam JavaScript dibandingkan dengan bahasa lain (khususnya, seseorang mungkin tidak tahu tentang paket pad kiri, dan masih mengajukan pertanyaan ini tanpa batasan bahasa, dan jawaban dalam JavaScript tidak akan ' t tidak terpengaruh sama sekali, dan tidak ada yang akan berpikir "mengapa ini tidak hanya JS?").
Martin Ender

Jawaban:

20

Pyth, 13 11 byte

+*.xwd-Qlzz

Coba di sini .

Mengambil input dari STDIN sebagai string pada baris pertama, panjang pada baris kedua, dan menambahkan char secara opsional pada baris ketiga.

Gagang pintu
sumber
4
Ini seharusnya hanya javascript
MMM
22
@MMM Pembatasan bahasa dalam tantangan sangat tidak disukai secara universal sehingga saya berharap hal itu diabaikan. Tidak ada yang suka diberi tahu " Anda tidak bisa berpartisipasi."
xnor
2
Tempelkan pada pria itu! Anda pergi Gagang Pintu! Jangan biarkan impian Anda menjadi impian! LAKUKAN SAJA!
Mave
4
Ini adalah masyarakat jahat di mana moderator adalah orang yang melakukan pembangkangan sipil!
Ven
13

JavaScript (ES6), 43 byte

f=(s,n,p=" ",r=p)=>(r+=s+="")[n]?s:f(r,n,p)
Neil
sumber
1
Anda melewatkan parameter ke-3
m0sa
@ m0sa Terima kasih, sudah diperbaiki.
Neil
Gagal tes ketiga, sekarang ;-)
Sklivvz
1
@ Klivvz Ugh, itulah yang saya dapatkan karena tidak membaca persyaratan dengan benar.
Neil
Alih-alih p+=s, Anda dapat menambahkan 2 byte untuk membuatnya p+=[s], dan itu akan berhasil.
Aplet123
7

JavaScript (ES6), 37 43 44 byte

(a,n,c=' ')=>((c+'').repeat(n)+a).substr(-n)

Uji:

> f=(a,n,c)=>((c?c:" ").repeat(n)+a).substr(-n)
< function (a,n,c)=>((c?c:" ").repeat(n)+a).substr(-n)
> f('foo', 5) === '  foo';
< true
> f('foobar', 6) === 'foobar';
< true
> f(1, 2, 0) === '01';
< true
> f(1, 2, '-') === '-1';
< true

Tidak yakin jika Anda ingin menghitung deklarasi fungsi, saya akan sebaris ini.

Sklivvz
sumber
Saya pikir secara umum, kita tidak menghitung deklarasi fungsi kecuali jika pertanyaannya secara spesifik meminta program lengkap daripada fungsi.
Deusovi
slicelebih pendek dari substr.
Mama Fun Roll
@ Deusovi benar. apa yang saya maksud adalah bahwa saya tidak akan melakukan console.log(f("whatever",10, "*")), tetapiconsole.log(("*".repeat(10)+"whatever").substr(-10))
Sklivvz
7

Javascript ES6, 35 byte

(s,l,c=' ')=>c.repeat(l-s.length)+s

Cobalah. Saya percaya ini adalah penangguhan terpendek yang mungkin saat ini dimungkinkan dalam Javascript.

David
sumber
Inilah yang akan saya lakukan, kecuali itu bukan fungsi anonim.
Aplet123
@ Aplet123 Saya pikir dari definisi kontes tentang apa yang diharapkan, ini ok. Itu hanya meminta fungsinya; menamakannya tidak relevan dalam konteks ini atau setidaknya itulah yang akan saya pikirkan berdasarkan jawaban lain.
David
5

Python 3, 33 31 29 byte

lambda a,b,x=" ":a.rjust(b,x)

Cukup mudah. Terima kasih kepada @xnor karena mengingatkan saya str.rjustadalah suatu hal. : P

Untuk panjang yang sama (juga terima kasih kepada xnor):

lambda a,b,x=" ":(x*b+a)[-b:]

Solusi sebelumnya:

lambda a,b,x=" ":x*(b-len(a))+a
kucing
sumber
Ini sedikit lebih pendek untuk dilakukan (x*b+a)[-b:]atau a.rjust(b,x). Sebenarnya, str.rjustitu sendiri bisa dibilang berfungsi untuk semuanya.
xnor
@ xnor Saya lupa rjustadalah builtin, terima kasih!
kucing
Tak satu pun dari ini mengikuti spec:f(1, 2, 0) === '01';
Valentin Lorentz
@ValentinLorentz Saya meminta OP untuk klarifikasi pada bahasa yang tidak memaksa angka untuk string secara default, dan belum mendapatkan jawaban. Karena pertanyaan ini tidak memiliki spesifikasi formal, saya akan berasumsi bahwa argumennya adalah string.
kucing
Sekarang ada spec, dan solusi 1 tidak valid (diuji pada Python 2.7.10)
CalculatorFeline
5

05AB1E , 11 9 byte

Kode:

g-ð³0@×¹«

Penjelasan:

g          # Implicit first input, take the length.
 -         # Substract the length with the second input.
  ð³       # Push a space and if the third input exists, also the third input.         
    0@     # Reposition the first element of the stack to the top (zero-indexed).
      ×    # Multiply the character with the difference in length.
       ¹«  # Concatenate the first input to the string.

Menggunakan pengodean CP-1252 . Cobalah online .

Adnan
sumber
1
Semua karakter ini masuk ke dalam codepage Jelly (0x672D188330401181FA)
CalculatorFeline
5

JavaScript (ES5), 70 byte

Menggunakan rekursi ...

function f(s,c,p,u){return(s+'').length<c?f((p==u?' ':p+'')+s,c,p):s}

Perjalanan awal saya hanya 57 byte:

function f(s,c,p){return s.length<c?f((p||" ")+s,c,p):s}

Tetapi hanya melewati 2 tes pertama:

> f('foo', 5) === '  foo';
true
> f('foobar', 6) === 'foobar';
true
> f(1, 2, 0) === '01';
false
> f(1, 2, '-') === '-1';
false

Saya masih suka yang lebih pendek, karena dalam praktiknya, meneruskan angka ke fungsi manipulasi string bukanlah fitur yang saya perlukan.

rjmunro
sumber
4

Mathematica, 13 byte

StringPadLeft

Hanya jawaban builtin # 3 (pertama adalah Range, kedua adalah Surd) Atau kurang builtin: (35 byte)

##2~StringRepeat~(#3-Length@#2)<>#&
CalculatorFeline
sumber
Bolehkah saya diam-diam menurunkan suara?
edc65
2
...Mengapa? Apakah karena ini hanya builtin? Jawaban 41byte Python # 1 (yang tidak lagi valid) hanyalah pembungkus untuk builtin.
CalculatorFeline
It's common practice to disallow built-ins that exactly implement what the challenge asks if that's a concern. (Banding ke otoritas: Martin) (tapi akal sehat juga)
edc65
@ edc65 Kiriman meta terkait . Saya cukup yakin itu diizinkan, karena built-in umumnya diizinkan secara default. Dibutuhkan kreativitas dan pengetahuan di pihak pengguna untuk mengetahui fungsi bawaan yang relevan.
mbomb007
1
@ mbomb007 diizinkan mungkin - no. kreatif Saya tidak menandai jawaban ini sebagai tidak valid tetapi mempertahankan downvote saya
edc65
3

Julia, 4 byte

lpad

Lulus semua kasus uji:

julia> lpad("foo", 5)
"  foo"

julia> lpad("foobar", 6)
"foobar"

julia> lpad(1, 2, 0)
"01"

julia> lpad(1, 2, '-')
"-1"
Fengyang Wang
sumber
Apakah ini berhasil rect 7 cor?
CalculatorFeline
Iya nih. lpad("rect", 7, "cor") => "correct"
Fengyang Wang
3

Javascript (ES6), 55 byte

(a,n,c=' ',s=a+'')=>(new Array(++n-s.length).join(c)+s)

Buat array nilai kosong dan gabung versi.

(a,n,c=' ')=>{a+=''; return new Array(++n-a.length).join(c)+a}

Lebih mudah dibaca tetapi returnmenambahkan beberapa karakter lagi.

pamit
sumber
Karena pertanyaan sedang ditunda saya akan meletakkan jawaban saya di bawah jawaban JS yang paling seperti milik saya. 43 byte (s, n, c = '') => (Array (n) .join (c) + s) .slice (-n)
Charlie Wynn
Kiat: `untuk inline code blocks..
CalculatorFeline
+=mengembalikan nilai operan kirinya, sehingga versi kedua menjadi lebih pendek: (a,n,c=' ')=>(new Array(++n-(a+='').length).join(c)+a)Tapi itu menjadi lebih lama ketika Anda menambahkan string padding multichar.
CalculatorFeline
3

Bash, 57 Bytes

Parameter: lebar string padchar

printf -vX %$2s;Y="${X// /${3- }}$1";echo -n "${Y:${#1}}"

Buat untaian lebar ruang .

Ubah setiap karakter spasi menjadi padchar .

Tulis padding lalu string .

philcolbourn
sumber
2

Python, 41 byte

lambda a,b,x=' ':str(a).rjust(b,str(x))

Tanpa builtin rjust, 43 byte:

lambda a,b,x=' ':str(x)*int(b/2%3)+str(a)

(bukan apa yang diharapkan seseorang untuk dilakukan, tetapi ia melewati test suite)

Valentin Lorentz
sumber
Anda dapat menghapus s=strdan mengganti sdengan struntuk jumlah byte yang sama.
CalculatorFeline
2

Jelly , 12 byte

L⁴_ẋ@⁵⁵⁶<?¤³

Begitu banyak referensi variabel. Bukankah Jelly seharusnya menjadi bahasa diam - diam ?

Cobalah online!

Bagaimana itu bekerja

L⁴_ẋ@⁵⁵⁶<?¤³  Main link
              Arguments: string (³), length (⁴), padchar (⁵, defaults to 10)

L             Compute the length of ³.
 ⁴_           Subtract the length from ⁴.
          ¤   Combine the two links to the left into a niladic chain:
     ⁵          Yield ⁵.
      ⁵⁶<?      Yield ⁵ if ⁵ < ⁵, else ⁶.
              Comparing a number with itself gives 0 (falsy), but comparing a
              string / character list with itself gives [0] (truthy).
   ẋ@         Repeat the result to the right as many times as specified in the
              result to the left.
           ³  Print the previous return value and return ³.
Dennis
sumber
padchar (⁵, defaults to 10)bukankah seharusnya default 20atau 32?
kucing
1
Superscript 3 hingga 9 adalah konstanta yang diinisialisasi ke argumen (jika ada) atau beberapa nilai default yang berguna. Conditional ?memeriksa apakah ia memiliki nilai default 10 dan menghasilkan spasi dalam kasus itu.
Dennis
2

JavaScript ES7, 16 byte

''.padStart.bind

built-in ftw! Hanya berfungsi di Firefox 48 ke atas. Berlaku karena fitur ini ditambahkan 12 Maret.

Ini membutuhkan input seperti:

(''.padStart.bind)(arg1)(arg2,arg3)
Downgoat
sumber
1

Pike , 67 byte

mixed n(mixed a,int b,mixed x){return x!=""?x:" "*(b-strlen(a))+a;}

desah . String kosong ""dievaluasi menjadi true. Mengapa!?

campuran campuran campuran campuran campuran ...

kucing
sumber
Bahasa lain dengan kebenaran bodoh.
CalculatorFeline
@CatsAreFluffy ya, Pike agak aneh, tetapi memiliki utilitas pemrosesan string yang bagus.
kucing
1

Pyke , 12 byte (tidak bersaing)

menambahkan input node, perbaikan bug pada len node, ubah hasil default pada assign node setelah tantangan diposting.

\ =zzjl-z*j+

Penjelasan:

\ =z         - assign default input for `z` to be " " (Will still prompt but no input will return a space instead)
    zj       -     j = input()
      l      -    len(j)
       -     -   eval_or_not_input() - ^
        z*   -  ^*input()
          j+ - ^+j
Biru
sumber
+1 karena menjawab dalam bahasa ini membantu Anda memperbaikinya :)
cat
Saya telah mengedit format tajuk Anda untuk membuatnya lebih mudah dibaca & lebih mudah untuk skrip pengguna, dll untuk mengurai - gulung kembali jika Anda tidak setuju.
kucing
Mengapa downvote?
Biru
1
@muddyfish Tampaknya setiap jawaban non-Javascript di sini diturunkan.
Adnan
@AndN itu tidak baik ... Juga mengapa saya tidak bisa melihat pola dari 6 jawaban teratas
Blue
1

JavaScript ES6, 38 byte

(s,l,c=" ")=>(c.repeat(l)+s).slice(-l)

Solusi alternatif.

Conor O'Brien
sumber
1

JavaScript (ES6), 34 byte

Saya menggunakan solusi rekursif.

f=(s,l,c=' ')=>s[l-1]?s:f(c+s,l,c)
Huntro
sumber
0

Ruby, 42 byte

def left_pad(s,t,p=" ");p*(t-s.size)+s;end

Parameter: string, ukuran, padchar.

Test suite di bawah ini; harus mencetak semua "benar", cukup masukkan semuanya dalam file yang sama.

puts left_pad("foo", 5) == "  foo"
puts left_pad("foobar", 6) == "foobar"
puts left_pad("1", 2, "0") == "01"
puts left_pad("1", 2, "-") == "-1"
jose_castro_arnaud
sumber
Anda tidak perlu menggunakan nama metode itu ... dan Anda mungkin bisa menjadikannya lambda juga. (Semua contoh lain melakukan hal serupa)
Bukan berarti Charles
0

Java 8, 86 88 byte

Ini sebuah fungsi. Argumen ketiga adalah varargsuntuk mengizinkan char pad opsional (default ke ' ')

String p(String s,int l,char...p){return s.length()<l?p((p.length>0?p[0]:' ')+s,l,p):s;}

Rekursi! +2 byte (tanda kurung ditambahkan karena kesalahan jenis tidak kompatibel)

HyperNeutrino
sumber
TypeErrors ini. Selalu dapat menguji Ideone (Java 7, tapi saya mendapatkan kesalahan yang sama persis di Java 8 pada kotak saya) ideone.com/B7gTA5
cat
0

PHP, 54 48 byte

Menggunakan penyandian Windows-1252.

function(&$s,$l,$p=~ß){$s=str_pad($s,$l,$p,0);};

Jalankan seperti ini ( -dditambahkan untuk easthetics saja):

php -r '$f = function(&$s,$l,$p=~ß){$s=str_pad($s,$l,$p,0);}; $s="foo";$f($s,5);echo"$s\n";' 2>/dev/null

Versi lama (tanpa builtin):

function(&$s,$l,$p=~ß){for(;strlen($s)<$l;)$s=$p.$s;};

Tweaks

  • Disimpan 6 byte dengan menggunakan str_padbukan loop. Meninggalkan yang lama untuk referensi, karena builtin disukai
aross
sumber
0

R, 50 byte

Terlambat ke pesta lagi tapi ini dia:

function(s,n,p=" ")cat(rep(p,n-nchar(s)),s,sep="")

Ini hanya mencetak output ke stdout tetapi tidak benar-benar mengembalikan string empuk (tidak yakin apakah ini merupakan persyaratan untuk tantangan). Jika ini diperlukan, solusinya sedikit lebih lama pada 61 byte:

function(s,n,p=" ")paste0(c(rep(p,n-nchar(s)),s),collapse="")
Billywob
sumber
-3

C, 64 byte

f(s,n,c,p){return memset(p,c,asprintf(&p,"%*s",n,s)-strlen(s));}

Coba di sini .

Cole Cameron
sumber
2
Ini tidak sesuai dengan spesifikasi, karena tidak default ke spasi ketika karakter tidak disediakan.
Gagang Pintu
Kode ini tidak berjalan seperti yang diberikan. gccakan membiarkan undefined reference to function printflulus dan termasuk printfdirinya sendiri, tapi tidak beruntung untuk memset, asprintf, dan strlen. Anda perlu menambahkan #include<string.h>... dll definisi untuk membuat ini valid.
kucing
@tac Hmmm ... Saya menulis dan menguji jawaban saya sepenuhnya di dalam ideone. Ini mengkompilasi dan berjalan dengan sukses pada platform itu, meskipun menyatakan bahwa ia menggunakan gcc-5.1. Saya tidak yakin apakah mereka menggunakan flag compiler atau apa-apa-Anda di belakang layar yang tidak saya sadari. Saya awalnya menggunakan ini sebagai pembenaran saya untuk itu tidak berjalan di lingkungan Anda, tapi sekarang saya tidak yakin ...
Cole Cameron
baik, ini gcc 5.2.1di Linux, jadi Anda mungkin bisa lolos dengan mengatakan Ideone C, 64 bytestetapi jika Anda akan mengklaim itu C, buatlah kompilasi. : p
cat
Saya hanya pemula di C: Mengapa fmengambil empat parameter, bukan 3? Apakah Anda memerlukan alamat string, atau ...? bagaimanapun, fharus mengambil paling banyak 3 argumen.
kucing