Javascript left-pad golf


27

Giriş

Sol ped npm paketi serpinti sonrasında, sol-pad'i uygulamak için bir kod golfü alalım.

Sol-ped fonksiyonunun içinde, 2 varsayılan argümanları ve 1 ek bağımsız değişken oluşur dizi , uzunluk ( padchar ). Eğer padchar verilmezse, bu bir boşluk karakterine standart hale getirilir . İki argüman ile bir örnek verelim:

left_pad("abc", 6)

İlk önce, dize uzunluğunu 3 olan gözlemleriz . Bundan sonra, tam dizginin uzunluğu işlevinde verilen uzunluğa erişinceye kadar bu dizgiyi sola kaydırmamız gerekir. Bu durumda 6 . Padchar verilmediğinden , bunu boşluklarla doldurmamız gerekir:

   abc

Bu, 3 boşluklu bir dize ve ilk dizedir ve 6 uzunluğunda bir dize oluşturur. İşte verilen padchar örneği:

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

Sadece yukarıdaki örnekle aynı şeyi yapıyoruz, ancak boşlukları padchar ile değiştiriyoruz. Bu durumda, kısa çizgi:

---abc

Görev

Verilen dize , uzunluk ve belki ek argüman padchar , çıkış sol yastıklı dize. Uzunluk sayısının dizenin uzunluğuna eşit veya daha büyük olduğunu varsayabilirsiniz. Padchar her zaman 1 karakterden oluşacaktır.

Test durumları

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"

Bu , bu yüzden en küçük bayt sayısına sahip olan gönderim kazanıyor!


13
@ m0sa Hala birkaç sorun var. Mücadeleyi javascript ile sınırlandırmak kesinlikle önerilmez - diğer dillerin buna katılamamasının bir nedeni yoktur. Teknik özellik, bir bağlantıyı izlemeye gerek duymadan istenen davranışı ve izin verilen olası girişleri tanımlamalıdır. Üçüncü parametrenin nasıl işlendiğine dair kesin bir şey yok.
xnor

8
Motivasyon için Javascript ile ilgili bir referansın “bu nedenle başka dillerin oynamasına izin verilmemesi” demeksizin yapılabileceğinden eminim. En iyi Javascript girişlerini görmek özellikle ilginizi çekiyorsa, bunun için bir ödül sunabilir ve diğer diller için mücadeleyi açık bırakabilirsiniz.
trichoplax

6
Tek dilli sorular ya yasaklanmıştır ya da değildir. Yasaklıysa, bunu kapatın. İzin verilirse, OP'nin soruyu istedikleri gibi sınırlamasına izin verin.
Sklivvz

10
@Sklivvz (ve m0sa) Dile özgü zorlukların bir anlam ifade ettiği nadir durumlar vardır, özellikle de zorluk bir dilin kendine özgü bazı özgün özellikleri gerektiriyorsa veya hatta bir meydan okuma olması gerekiyorsa. Bunlara izin verilmesinin ana nedeni ve neden onları tamamen reddetmeye karşı da karşı çıkmamın nedeni bu. Bununla birlikte, herhangi bir dilde anlam ifade eden herhangi bir zorluk için , onu bir dille sınırlamak için iyi bir neden yoktur. Aksi takdirde, "JavaScript'te bir diziyi sırala", "Ruby'de bir diziyi sırala", "Python'da bir diziyi sırala" ... ve fayda elde etmemeniz için 300 zorluk daha elde edebilirdik.
Martin Ender

8
@Sklivvz Trichoplax'ın dediği gibi, bu bir meydan okuma için iyi bir motivasyondur, ancak başka herhangi bir dilde olduğu kadar anlam ifade eden çok basit bir string-işlem görevine de yol açar. Mücadele, JavaScript’te diğer dillerle karşılaştırıldığında özellikle zor, uygulanabilir veya ilginç değildir (özellikle birileri sol paket hakkında bilgi sahibi olmayabilir ve bu soruyu dil kısıtlaması olmadan sormaya devam edebilirsiniz; hiç etkilenmedi ve hiç kimse "neden bu sadece JS değil?" diye düşünemezdi.
Martin Ender

Yanıtlar:


20

Pyth, 13 11 bayt

+*.xwd-Qlzz

Burada dene .

STDIN'den ilk satırdaki dize, ikinci satırdaki uzunluk ve isteğe bağlı olarak üçüncü satırdaki dolgu karakterinden girdi alır.


4
Bunun sadece javascript olması gerekiyor
MMM

22
@ MMM Mücadelelerdeki dil kısıtlamaları öylesine beğenilmez ki, tamamen görmezden gelinmesini bekliyorum. Kimse söylenmesi sever " sen katılamaz."
xnor


2
Onu adama yapıştır! Sen Doorknob'a git! Hayallerinin rüya olmasına izin verme! SADECE YAP!
Mave

4
“Moderatörlerin sivil itaatsizlik yapan kişi olduğu kötü bir toplum!
Ven

13

JavaScript (ES6), 43 bayt

f=(s,n,p=" ",r=p)=>(r+=s+="")[n]?s:f(r,n,p)

1
3. parametreyi kaçırıyorsunuz
m0sa

@ m0sa Teşekkürler, düzeltildi.
Neil

Şimdi üçüncü testte başarısız olur ;-)
Sklivvz

1
@Sklivvz Ugh, gereklilikleri düzgün bir şekilde okumadığım için bu benim.
Neil

Bunun yerine p+=s, bunu yapmak için 2 bayt ekleyebilirsiniz p+=[s]ve çalışacaktır.
Aplet123

7

JavaScript (ES6), 37 43 44 bayt

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

Ölçek:

> 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

İşlev bildirimini saymak isteyip istemediğinizden emin değilim, bunun satırını yazarım.


Genelde, soru özellikle bir işlevden ziyade tam bir program istemediği sürece işlev bildirimini saymıyoruz.
Deusovi

slicedaha kısa substr.
Mama Fun Roll

@Deusovi doğru. ne demek istediğimi yapmam console.log(f("whatever",10, "*")), amaconsole.log(("*".repeat(10)+"whatever").substr(-10))
Sklivvz

7

Javascript ES6, 35 bayt

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

Dene. Javascript'te şu anda mümkün olan en kısa sınırlama olduğuna inanıyorum.


Bu benim yapacağım şeydi, ama isimsiz bir işlev değildi.
Aplet123

@ Aplet123 Yarışmanın bu beklenenleri tanımlaması gereği olduğunu düşünüyorum. Sadece işlevi soruyordu; adlandırmak bu bağlamda önemsiz ya da en azından diğer cevaplara dayanarak düşündüğüm şey bu.
David,

5

Python 3, 33 31 29 bayt

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

Yeterince açıksözlü. Beni hatırlattığı için @xnor'a teşekkürlerstr.rjust . : P

Aynı uzunluk için (ayrıca xnor sayesinde):

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

Önceki çözüm:

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

Biraz yapmak daha kısa (x*b+a)[-b:]ya a.rjust(b,x). Aslında, str.rjusttartışmalı olarak her şey için çalışıyor.
Xnor

@xnor unuttuğum rjustbir yerleşikti, teşekkür ederim!
kedi

Bunların hiçbiri teknik özelliklere uymuyor:f(1, 2, 0) === '01';
Valentin Lorentz

@ValentinLorentz OP'den varsayılan olarak sayıları dizgelere zorlamayan ve cevap alamayan diller hakkında netleştirme talebinde bulundum. Bu sorunun resmi bir belirtimi olmadığı için, iddiaların hepsinin dizge olduğunu varsayacağım.
kedi

Şimdi bir özellik var ve çözüm 1 geçersiz (Python 2.7.10'da test edildi)
CalculatorFeline

5

05AB1E , 11 9 bayt

Kod:

g-ð³0@×¹«

Açıklama:

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.

CP-1252 kodlamasını kullanır . Çevrimiçi deneyin .


1
Tüm bu karakterler Jelly kod sayfasına uyuyor (0x672D188330401181FA)
CalculatorFeline

5

JavaScript (ES5), 70 bayt

Özyinelemeyi kullanarak ...

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

İlk seferim sadece 57 bayttı:

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

Ancak sadece ilk 2 testi geçti:

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

Ben hala kısa olanı seviyorum, çünkü pratikte sayıları bir string manipülasyon fonksiyonuna geçirmek ihtiyacım olan bir özellik değil.


4

Mathematica, 13 bayt

StringPadLeft

Yalnızca yerleşik yanıt # 3 (ilk Range, ikinci oldu Surd) Veya daha az yerleşik: (35 bayt)

##2~StringRepeat~(#3-Length@#2)<>#&

Sessizce oy kullanabilir miyim?
edc65

2
...Niye ya? Bu sadece bir yerleşik olduğu için mi? 41 byte Python cevap # 1 (artık geçerli değil) bir yerleşik için yalnızca bir sarıcıydı.
Hesap MakinesiFeline

It's common practice to disallow built-ins that exactly implement what the challenge asks if that's a concern.(Otoriteye itiraz: Martin) (ancak sağduyu da)
edc65

@ edc65 İlgili meta gönderi . Yerleşiklere genellikle varsayılan olarak izin verildiğinden izin verildiğinden oldukça eminim. İlgili yerleşik işlevi bilmek, kullanıcının tarafındaki yaratıcılık ve bilgiyi gerektirir.
mbomb007

1
@ mbomb007 belki izin verebilir - yaratıcı hayır. Bu cevabı geçersiz olarak işaretlemedim ama olumsuz oyu aldım
edc65

3

Julia, 4 bayt

lpad

Tüm test durumlarını geçiyor:

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

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

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

julia> lpad(1, 2, '-')
"-1"

İçin çalışıyor mu rect 7 cor?
Hesap MakinesiFeline

Evet. lpad("rect", 7, "cor") => "correct"
Fengyang Wang

3

Javascript (ES6), 55 bayt

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

Boş bir değer dizisi oluşturun ve sürüme katılın.

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

Daha okunaklıdır, ancak returnbirkaç karakter daha ekler.


Soru bekletildiği için cevabımı benimkine benzeyen JS cevabının altına yazacağım. 43 bayt (s, n, c = '') => (Dizi (n) .join (c) + s) .slice (-n)
Charlie Wynn

İpucu: `için inline code blocks..
Hesap MakinesiFeline

+=sol işlenenin değerini döndürür, bu nedenle ikinci sürüm daha kısa olur: (a,n,c=' ')=>(new Array(++n-(a+='').length).join(c)+a)Ancak, çok hücreli dolgu dizeleri eklediğinizde daha uzun olur.
Hesap MakinesiFeline

3

Bash, 57 Bayt

Parametreler: string width padchar

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

Bir genişlik alanı dizisi yapın .

Her boşluk karakterini padchar'a dönüştürün .

Doldurma sonra dize yazın .


2

Python, 41 bayt

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

Yerleşik rjust olmadan, 43 bayt:

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

(birisinin yapmasını beklediği şey değil, ama test odasından geçiyor)


Sen kaldırabilir s=strve değiştirme sile straynı bayt sayım için.
Hesap MakinesiFeline

2

Jöle , 12 bayt

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

Çok fazla değişken referansı var. Jelly'in yapışkan bir dil olması gerekmiyor mu?

Çevrimiçi deneyin!

Nasıl çalışır

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 ³.

padchar (⁵, defaults to 10)varsayılan mı 20yoksa değil 32mi?
kedi,

1
Üst simge 3 ila 9, bağımsız değişkenlere (varsa) veya bazı yararlı varsayılan değerlere ilklendirilen sabitlerdir. Koşullu ?, varsayılan değeri 10 olup olmadığını kontrol eder ve bu durumda bir boşluk sağlar.
Dennis,

2

JavaScript ES7, 16 bayt

''.padStart.bind

yerleşik ftw! Sadece Firefox 48 ve üzeri sürümlerde çalışır. Bu özellik 12 Mart tarihinde eklenmiş olarak geçerlidir.

Bu gibi giriş alır:

(''.padStart.bind)(arg1)(arg2,arg3)

1

Pike , 67 bayt

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

nefes . Boş dize ""değerlendirirtrue . Niye ya!?

karışık karışık karışık karışık karışık Pike çorbası ...


Aptal gerçeği olan başka bir dil.
Hesap MakinesiFeline

@CatsAreFluffy evet, Pike biraz garip, ama güzel string işleme araçlarına sahip.
kedi,

1

Pyke , 12 bayt (rekabetçi olmayan)

giriş düğümü eklendi, len düğümü üzerinde hata düzeltmesi, görev gönderildikten sonra atanan düğüme varsayılan sonuçları değiştirdi.

\ =zzjl-z*j+

Açıklama:

\ =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

+1, çünkü dili yanıtlamak, onu hassaslaştırmanıza yardımcı oluyor :)
Cat

Okumayı kolaylaştıracak ve kullanıcı kodları için kolaylaştıracak vb. Ayrıştırma için başlığınızın biçimini değiştirdim.
kedi,

Neden aşağı oy?
Mavi,

1
@muddyfish Görünüşe göre her Javascript olmayan cevap burada reddedildi.
Adnan

@AandN bu sadece hoş değil ... Ayrıca neden ilk 6 cevaptan bir kalıp göremedim
Blue

1

JavaScript ES6, 38 bayt

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

Alternatif bir çözüm.


1

JavaScript (ES6), 34 bayt

Özyinelemeli bir çözüm kullandım.

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

0

Ruby, 42 bayt

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

Parametreler: string, size, padchar.

Aşağıdaki test paketi; tüm "true" ları yazmalı, her şeyi aynı dosyaya koymalısınız.

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"

Bu yöntem adını kullanmanıza gerek yok ... ve muhtemelen bir lambda da yapabilirsiniz. (Diğer tüm örnekler benzerdir)
Charles,

0

Java 8, 86 88 bayt

Bu bir fonksiyondur. Üçüncü argüman varargsisteğe bağlı ped karakterine izin vermek içindir (varsayılan olarak ' ')

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

Özyineleme! +2 bayt (uyumsuz tür hatası nedeniyle parantez eklendi)


Bu TypeErrors. Her zaman Ideone test edebilir (Java 7, ancak kutumdaki Java 8'de de aynı hatayı alıyorum) ideone.com/B7gTA5
kedi

0

PHP, 54 48 bayt

Windows-1252 kodlamasını kullanır.

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

Böyle koş ( -dyalnızca easthetics için eklendi):

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

Eski versiyon (yerleşik değil):

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

Düzenlemeler

  • str_padBir döngü yerine kullanarak 6 bayt kaydedildi . Yerleşikler kaşlarını çattığında eskisini referans için bırakmak

0

R, 50 bayt

Yine partiye geç kaldı ama işte başlıyor:

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

Bu basitçe çıktıyı stdout'a yazdırır ancak gerçekte yastıklı dizgiyi döndürmez (bunun meydan okuma için bir gereklilik olup olmadığından emin değildi). Bu gerekliyse, çözüm 61 byte'ta biraz daha uzundur:

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

-3

C, 64 bayt

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

Burada dene .


2
Bu, bir karakter sağlanmadığında boşluğa varsayılan olmadığı için şartnameye uymuyor.
Doorknob

Bu kod verilen şekilde çalışmıyor. gccsağlayacak undefined reference to function printfgeçmek ve dahil printfkendisi, ama için böyle bir şans memset, asprintfve strlen. Bunu #include<string.h>geçerli kılmak için ... etc tanımlarını eklemeniz gerekir .
kedi,

@tac Hmmm ... Cevabımı tamamen ideone içinde yazdım ve test ettim. Kullandığını ifade etmesine rağmen bu platform üzerinde başarılı bir şekilde derlenir ve çalışır gcc-5.1. Derleyici bayrakları kullanıp kullanmadıklarından veya bilmediğim sahnelerin ardında ne olduğundan emin değilim. Başlangıçta kullanıyordum bu sizin ortamında çalışmıyorsa benim gerekçesi olarak, ama şimdi ... Emin değilim
Cole Cameron

peki, bu gcc 5.2.1Linux'ta, bu yüzden söyleyerek kurtulmak mümkün olabilir Ideone C, 64 bytesama C olduğunu iddia edecekseniz, derleyin. : p
kedi

Ben sadece C'ye yeni başlayan biriyim: Neden f3 değil de dört parametre alıyor? Dizenin adresini mi istiyorsun yoksa ...? Her iki durumda da fen fazla 3 argüman almalısınız.
kedi,
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.