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!


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.


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)

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.


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.


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

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 .


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.


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)<>#&

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"

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.


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 .


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)


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

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)

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


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

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


1

JavaScript (ES6), 34 bajty

Użyłem rozwiązania rekurencyjnego.

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

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"

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)


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

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

-3

C, 64 bajty

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

Wypróbuj tutaj .


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.