JavaScript lewy pad golf

27

Wprowadzenie

W ślad za lewy pad pakietu npm opadu , zjedzmy golf kodu dla wdrożenia lewy-pad.

Funkcja lewego pada składa się z 2 domyślnych argumentów i 1 dodatkowego argumentu w postaci ciągu znaków , długości ( padchar ). Jeśli padchar nie zostanie podany, jest to standaryzowane do znaku spacji . Weźmy przykład z dwoma argumentami:

left_pad("abc", 6)

Najpierw obserwujemy długość łańcucha, która wynosi 3 . Następnie musimy wstawić ten ciąg po lewej stronie, aż długość pełnego ciągu osiągnie długość podaną w funkcji. W tym przypadku 6 . Ponieważ padchar nie jest podany , musimy wypełnić to spacjami:

   abc

Jest to ciąg z 3 spacjami i ciągiem początkowym, w wyniku czego powstaje ciąg o długości 6. Oto przykład z podanym padchar:

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

Po prostu robimy to samo co w powyższym przykładzie, ale zastępujemy spacje przez padchar. W tym przypadku łącznik:

---abc

Zadanie

Biorąc pod uwagę ciąg , długość i być może dodatkowy argument padchar , wypisuje lewy ciąg znaków. Możesz założyć, że liczba długości jest równa lub większa niż długość łańcucha. Padchar zawsze będzie składał się z 1 postaci.

Przypadki testowe

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"

To jest , więc wygrywanie z najmniejszą liczbą bajtów wygrywa!

m0sa
źródło
13
@ m0sa Wciąż jest kilka problemów. Ograniczanie wyzwania dla javascript jest zdecydowanie odradzane - nie ma powodu, dla którego inne języki nie mogłyby w tym uczestniczyć. Specyfikacja powinna opisywać pożądane zachowanie i zakres możliwych dozwolonych danych wejściowych bez konieczności podążania za linkiem. Nie jest jasne, jak obsługiwany jest trzeci parametr.
xnor
8
Jestem pewien, że można znaleźć motywację związaną z Javascriptem w celu motywacji, bez konieczności mówienia „dlatego nie można grać w innych językach”. Jeśli jesteś szczególnie zainteresowany wyświetlaniem najlepszych wpisów w Javascript, możesz zaoferować nagrodę za to, pozostawiając wyzwanie otwarte dla innych języków.
trichoplax
6
Pytania w jednym języku są zabronione lub nie są. Jeśli są zabronione, zamknij to. Jeśli są dozwolone, pozwól PO ograniczyć pytanie, jak im się podoba.
Sklivvz
10
@Sklivvz (i m0sa) Istnieją rzadkie przypadki, w których wyzwania specyficzne dla języka mają sens, szczególnie jeśli wyzwanie wymaga jakiejś wyjątkowej cechy języka, aby miało sens, a nawet było wyzwaniem. To jest główny powód, dla którego są one dozwolone i dlatego też byłbym przeciwny całkowitemu odrzuceniu ich. To powiedziawszy, w przypadku każdego wyzwania, które ma sens w dowolnym języku, nie ma dobrego powodu, aby ograniczać go do jednego języka. W przeciwnym razie mielibyśmy „Sortuj tablicę w JavaScript”, „Sortuj tablicę w Ruby”, „Sortuj tablicę w Pythonie” ... i 300 innych wyzwań bez żadnej korzyści.
Martin Ender
8
@ Sklivvz Jak powiedział trichoplax, jest to świetna motywacja do podjęcia wyzwania, ale sprowadza się do bardzo prostego zadania przetwarzania łańcucha, które ma taki sam sens w każdym innym języku. Wyzwanie nie jest szczególnie trudne, wykonalne ani interesujące w JavaScript w porównaniu z jakimkolwiek innym językiem (w szczególności ktoś mógł nie wiedzieć o pakiecie po lewej stronie i nadal zadawać to pytanie bez ograniczeń językowych, a odpowiedzi w JavaScript nie byłyby „ zostały w ogóle dotknięte i nikt nie pomyślałby „dlaczego nie jest to tylko JS?”).
Martin Ender

Odpowiedzi:

20

Pyth, 13 11 bajtów

+*.xwd-Qlzz

Wypróbuj tutaj .

Pobiera dane wejściowe ze STDIN jako ciąg znaków w pierwszym wierszu, długość w drugim wierszu i znak wypełniający opcjonalnie w trzecim wierszu.

Klamka
źródło
4
To ma być tylko javascript
MMM
22
@MMM Ograniczenia językowe w wyzwaniach są tak bardzo nielubiane, że spodziewam się, że zostanie to zignorowane. Nikt nie lubi mówić „ nie możesz brać udziału”.
xnor
2
Przyklej to do mężczyzny! Idź Klamka! Nie pozwól, aby twoje sny były snami! PO PROSTU TO ZRÓB!
Mave
4
„To nikczemne społeczeństwo, w którym moderatorzy popełniają obywatelskie nieposłuszeństwo!
Ven
13

JavaScript (ES6), 43 bajty

f=(s,n,p=" ",r=p)=>(r+=s+="")[n]?s:f(r,n,p)
Neil
źródło
1
brakuje trzeciego parametru
m0sa
@ m0sa Dzięki, naprawiono.
Neil
Teraz nie udaje się trzeci test ;-)
Sklivvz
1
@ Sklivvz Ugh, to dostaję za to, że nie przeczytałem poprawnie wymagań.
Neil
Zamiast tego p+=smożesz dodać 2 bajty, aby to zrobić p+=[s], i będzie działać.
Aplet123
7

JavaScript (ES6), 37 43 44 bajtów

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

Test:

> 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

Nie jestem pewien, czy chcesz policzyć deklarację funkcji, wstawiłbym to.

Sklivvz
źródło
Myślę, że generalnie nie liczymy deklaracji funkcji, chyba że pytanie dotyczy konkretnie pełnego programu, a nie funkcji.
Deusovi
slicejest krótszy niż substr.
Mama Fun Roll
@Deusovi prawo. mam na myśli to, że nie zrobiłbym tego console.log(f("whatever",10, "*")), aleconsole.log(("*".repeat(10)+"whatever").substr(-10))
Sklivvz
7

JavaScript ES6, 35 bajtów

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

Spróbuj. Uważam, że jest to najkrótsza możliwa implementacja obecnie możliwa w JavaScript.

David
źródło
Właśnie to zamierzałem zrobić, tyle że nie była to anonimowa funkcja.
Aplet123 28.03.16
@ Aplet123 Myślę, że według definicji konkursu tego, czego się spodziewamy, jest w porządku. Po prostu prosiłem o funkcję; nazywanie tego jest nieistotne w tym kontekście, a przynajmniej tak sądzę na podstawie innych odpowiedzi.
David
5

Python 3, 33 31 29 bajtów

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

Dość bezpośredni. Dzięki @xnor za przypomnienie mi str.rjustto rzecz. : P

Dla tej samej długości (także dzięki xnor):

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

Poprzednie rozwiązanie:

lambda a,b,x=" ":x*(b-len(a))+a
kot
źródło
Jest trochę krótszy do zrobienia (x*b+a)[-b:]lub a.rjust(b,x). Właściwie str.rjustsama prawdopodobnie działa na całość.
xnor
@ xnor Zapomniałem rjustbył wbudowany, dziękuję!
kot
Żaden z nich nie jest zgodny ze specyfikacją:f(1, 2, 0) === '01';
Valentin Lorentz
@ValentinLorentz Poprosiłem OP o wyjaśnienie dotyczące języków, które domyślnie nie wymuszają liczb na ciągach, i nie otrzymałem odpowiedzi. Ponieważ to pytanie nie ma formalnej specyfikacji, założę, że wszystkie argumenty są ciągami.
kot
Teraz jest specyfikacja, a rozwiązanie 1 jest nieprawidłowe (testowane w Pythonie 2.7.10)
CalculatorFeline
5

05AB1E , 11 9 bajtów

Kod:

g-ð³0@×¹«

Wyjaśnienie:

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.

Wykorzystuje kodowanie CP-1252 . Wypróbuj online .

Adnan
źródło
1
Wszystkie te znaki pasują do strony kodowej Jelly (0x672D188330401181FA)
CalculatorFeline
5

JavaScript (ES5), 70 bajtów

Korzystanie z rekurencji ...

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

Moje początkowe przejście zajęło tylko 57 bajtów:

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

Ale zdał tylko pierwsze 2 testy:

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

Wciąż podoba mi się ten krótszy, ponieważ w praktyce przekazywanie liczb do funkcji manipulacji ciągiem nie jest funkcją, której potrzebowałbym.

rjmunro
źródło
4

Mathematica, 13 bajtów

StringPadLeft

Tylko wbudowana odpowiedź nr 3 (pierwsza była Range, druga była Surd) Lub mniej wbudowana: (35 bajtów)

##2~StringRepeat~(#3-Length@#2)<>#&
CalculatorFeline
źródło
Czy mogę spokojnie głosować?
edc65
2
...Czemu? Czy to dlatego, że jest to tylko wbudowane? 41-bajtowa odpowiedź nr 1 w Pythonie (która nie jest już poprawna) była tylko opakowaniem dla wbudowanego.
CalculatorFeline
It's common practice to disallow built-ins that exactly implement what the challenge asks if that's a concern.(Apel do władzy: Martin) (ale także zdrowy rozsądek)
edc65
@ edc65 Powiązany meta post . Jestem prawie pewien, że jest to dozwolone, ponieważ wbudowane są zwykle domyślnie dozwolone. Wymaga kreatywności i wiedzy ze strony użytkownika, aby poznać odpowiednią wbudowaną funkcję.
mbomb007
1
@ mbomb007 jest dozwolone - może nie. Nie oznaczyłem tej odpowiedzi jako nieważną, ale utrzymuję moją opinię
edc65
3

Julia, 4 bajty

lpad

Przechodzi wszystkie przypadki testowe:

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

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

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

julia> lpad(1, 2, '-')
"-1"
Fengyang Wang
źródło
Czy to działa rect 7 cor?
CalculatorFeline
Tak. lpad("rect", 7, "cor") => "correct"
Fengyang Wang
3

JavaScript (ES6), 55 bajtów

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

Utwórz pustą tablicę wartości i dołącz wersję.

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

Jest bardziej czytelny, ale returndodaje kilka dodatkowych znaków.

pllee
źródło
Ponieważ pytanie jest zawieszone, umieszczę swoją odpowiedź pod odpowiedzią JS, która najbardziej przypomina moją. 43 bajty (s, n, c = '') => (Array (n) .join (c) + s) .slice (-n)
Charlie Wynn
Wskazówka: `dla inline code blocks..
CalculatorFeline
+=zwraca wartość swojego lewego operandu, więc druga wersja staje się krótsza: (a,n,c=' ')=>(new Array(++n-(a+='').length).join(c)+a)Ale staje się dłuższa, gdy dodasz łańcuchy wypełniające wielu znaków.
CalculatorFeline
3

Bash, 57 bajtów

Parametry: padchar szerokość struny

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

Zrób ciąg spacji szerokości .

Przekształć każdy znak spacji w padchar .

Napisz padding, a następnie string .

philcolbourn
źródło
2

Python, 41 bajtów

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

Bez wbudowanego rjust 43 bajty:

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

(nie to, czego się oczekuje, ale przejdzie pakiet testowy)

Valentin Lorentz
źródło
Można usunąć s=stri zastąpić sz strdo tej samej liczby bajtów.
CalculatorFeline
2

Galaretka , 12 bajtów

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

Tyle odniesień do zmiennych. Czyż Jelly nie miał być językiem milczącym ?

Wypróbuj online!

Jak to działa

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
źródło
padchar (⁵, defaults to 10)czy nie powinien to być domyślnie 20lub 32?
kot
1
Indeks górny od 3 do 9 to stałe, które są inicjowane na argumenty (jeśli występują) lub niektóre przydatne wartości domyślne. Warunkowe ?sprawdza, czy ma wartość domyślną 10 i w tym przypadku zwraca spację.
Dennis,
2

JavaScript ES7, 16 bajtów

''.padStart.bind

wbudowane ftw! Działa tylko w przeglądarce Firefox 48 i nowszych. Ważne, ponieważ ta funkcja została dodana 12 marca.

Wymaga to danych wejściowych takich jak:

(''.padStart.bind)(arg1)(arg2,arg3)
Downgoat
źródło
1

Szczupak , 67 bajtów

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

westchnienie . Pusty ciąg zwraca ""wartość true. Czemu!?

mieszana mieszana mieszana mieszana Zupa Szczupakowa ...

kot
źródło
Kolejny język z głupimi prawicami.
CalculatorFeline
@CatsAreFluffy tak, Pike jest trochę dziwny, ale ma ładne narzędzia do przetwarzania ciągów.
kot
1

Pyke , 12 bajtów (niekonkurencyjny)

dodany węzeł wejściowy, poprawka błędu w węźle Len, zmiana domyślnych wyników w węźle przypisania po wysłaniu wyzwania.

\ =zzjl-z*j+

Wyjaśnienie:

\ =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
niebieski
źródło
+1, ponieważ udzielenie odpowiedzi w tym języku pomaga ci to udoskonalić :)
cat
Zmodyfikowałem format nagłówka, aby ułatwić czytanie i skrypty dla użytkowników itp., Aby je przeanalizować - jeśli nie zgadzasz się, wycofaj go.
kot
Dlaczego głosowanie negatywne?
Blue
1
@muddyfish Wygląda na to, że każda odpowiedź w języku innym niż Javascript jest tutaj odrzucona.
Adnan
@AndN to po prostu nie jest miłe ... Również dlaczego nie widziałem wzoru z 6 najlepszych odpowiedzi
Blue
1

JavaScript ES6, 38 bajtów

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

Alternatywne rozwiązanie.

Conor O'Brien
źródło
1

JavaScript (ES6), 34 bajty

Użyłem rozwiązania rekurencyjnego.

f=(s,l,c=' ')=>s[l-1]?s:f(c+s,l,c)
Huntro
źródło
0

Rubin, 42 bajty

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

Parametry: ciąg, rozmiar, padchar.

Zestaw testowy poniżej; powinien wypisać wszystkie „prawdziwe”, po prostu umieścić wszystko w tym samym pliku.

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
źródło
Nie musisz używać tej nazwy metody ... i prawdopodobnie możesz też uczynić ją lambda. (Wszystkie pozostałe przykłady są podobne)
Nie to, że Karol
0

Java 8, 86 88 bajtów

To jest funkcja. Trzecim argumentem jest varargsdopuszczenie opcjonalnego znaku pada (domyślnie to ' ')

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

Rekurencja! +2 bajty (dodane nawiasy kwadratowe z powodu błędu niezgodnego typu)

HyperNeutrino
źródło
Ten typ błędów. Zawsze mogę przetestować Ideone (Java 7, ale otrzymuję ten sam dokładny błąd w Javie 8 na moim urządzeniu) ideone.com/B7gTA5
kot
0

PHP, 54 48 bajtów

Używa kodowania Windows-1252.

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

Działaj w ten sposób ( -ddodany tylko do Easthetics):

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

Stara wersja (bez wbudowanego):

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

Poprawki

  • Zapisano 6 bajtów, używając str_padzamiast pętli. Pozostawienie starego w celach informacyjnych, ponieważ wbudowane elementy są niezadowolone
aross
źródło
0

R, 50 bajtów

Znowu spóźniam się na przyjęcie, ale oto:

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

To po prostu wypisuje wyjście na standardowe wyjście, ale tak naprawdę nie zwraca wyściełanego łańcucha (nie byłem pewien, czy jest to wymaganie dla wyzwania). Jeśli jest to potrzebne, rozwiązanie jest nieco dłuższe i ma 61 bajtów:

function(s,n,p=" ")paste0(c(rep(p,n-nchar(s)),s),collapse="")
Billywob
źródło
-3

C, 64 bajty

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

Wypróbuj tutaj .

Cole Cameron
źródło
2
Nie jest to zgodne ze specyfikacją, ponieważ domyślnie nie jest spacją, gdy znak nie zostanie podany.
Klamka
Ten kod nie działa tak, jak podano. gccpozwoli undefined reference to function printfprzepustkę i obejmują printfsię, ale nie ma takiego szczęścia do memset, asprintfi strlen. Aby dodać #include<string.h>poprawność, musisz dodać definicje ... itd.
kot
@tac Hmmm ... Napisałem i przetestowałem moją odpowiedź całkowicie w ideone. Kompiluje się i działa z powodzeniem na tej platformie, choć stwierdza, że ​​używa gcc-5.1. Nie jestem pewien, czy używają flag kompilatora lub tego, co masz za kulisami, których nie jestem świadomy. Początkowo używałem tego jako uzasadnienia dla tego, że nie działa w twoim środowisku, ale teraz nie jestem pewien ...
Cole Cameron
Cóż, to jest gcc 5.2.1na Linuksie, więc możesz uciec od powiedzenia, Ideone C, 64 bytesale jeśli chcesz twierdzić, że to C, zmuś go do kompilacji. : p
cat
Jestem dopiero początkującym w C: Dlaczego fbierze cztery parametry, a nie 3? Czy potrzebujesz adresu ciągu, czy ...? w obu przypadkach fpowinno przyjąć maksymalnie 3 argumenty.
kot