Javascript Left-Pad Golf


27

Введение

Вслед за выпадением пакета левой панели npm , давайте создадим код для реализации левой панели.

Левая колодка функция состоит из 2 -х аргументов по умолчанию и 1 дополнительного аргумента в виде строки , длины , ( padchar ). Если padchar не указан, он стандартизируется до пробела . Давайте рассмотрим пример с двумя аргументами:

left_pad("abc", 6)

Сначала мы наблюдаем длину строки, которая равна 3 . После этого нам нужно заполнить эту строку слева до тех пор, пока длина полной строки не достигнет длины, указанной в функции. В этом случае 6 . Поскольку padchar не задан , нам нужно заполнить это пробелами:

   abc

Это строка с 3 пробелами и исходной строкой, в результате чего получается строка длиной 6. Вот пример с заданным padchar:

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

Мы просто делаем то же самое, что и в примере выше, но заменяем пробелы на padchar. В этом случае дефис:

---abc

Задание

Учитывая строку , длину и, возможно, дополнительный аргумент padchar , выведите строку с левым отступом . Вы можете предположить, что число длины равно или больше, чем длина строки. Padchar всегда будет состоять из 1 символа.

Контрольные примеры

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"

Это , поэтому выигрывает представление с наименьшим количеством байтов!


13
@ m0sa Есть еще несколько проблем. Ограничивать вызов javascript настоятельно не рекомендуется - нет причин, по которым другие языки не могут участвовать в этом. Спецификация должна описывать желаемое поведение и диапазон возможных разрешенных входов без необходимости переходить по ссылке. Непонятно, как обрабатывается третий параметр.
xnor

8
Я уверен, что для мотивации можно сделать ссылку, относящуюся к Javascript, без необходимости говорить «поэтому никакие другие языки не могут играть». Если вы особенно заинтересованы в том, чтобы увидеть лучшие записи Javascript, вы можете предложить вознаграждение за это, но при этом оставить этот вопрос открытым для других языков.
Трихоплакс

6
Либо языковые вопросы запрещены, либо нет. Если они запрещены, закройте это. Если они разрешены, пусть ОП ограничивают вопрос так, как им нравится.
Sklivvz

10
@Sklivvz (и m0sa) Есть редкие случаи, когда специфичные для языка проблемы имеют смысл, особенно если для задачи требуется какая-то очень уникальная особенность языка, чтобы иметь смысл или даже быть проблемой в первую очередь. Это главная причина, по которой это разрешено, и почему я также был бы против полного их запрета. Тем не менее, для любого вызова, который имеет смысл на любом языке, нет веской причины ограничивать его одним языком. В противном случае у нас были бы «Сортировка массива в JavaScript», «Сортировка массива в Ruby», «Сортировка массива в Python» ... и еще 300 задач без всякой выгоды.
Мартин Эндер

8
@Sklivvz Как сказал trichoplax, это хорошая мотивация для задачи, но она сводится к очень простой задаче обработки строк, которая имеет такой же смысл на любом другом языке. Задача не является особенно сложной, выполнимой или интересной в JavaScript по сравнению с любым другим языком (в частности, кто-то, возможно, не знал о пакете левой панели, и все же задал бы этот вопрос без языкового ограничения, и ответы в JavaScript не дали бы ' Это никак не отразилось, и никто бы не подумал: «Почему это не только для JS?»).
Мартин Эндер

Ответы:


20

Pyth, 13 11 байт

+*.xwd-Qlzz

Попробуй это здесь .

Принимает входные данные из STDIN в виде строки в первой строке, длины во второй строке и необязательного дополнения char в третьей строке.


4
Предполагается, что это будет только javascript
МММ

22
@MMM Языковые ограничения в вызовах настолько неприязни, что я ожидаю, что они будут игнорироваться. Никто не любит, когда ему говорят « ты не можешь участвовать».
xnor


2
Приклей это мужчине! Вы идете дверная ручка! Не позволяй своей мечте быть мечтой! ПРОСТО СДЕЛАЙ ЭТО!
Сделано

4
«Это злое общество, где модераторы - это гражданское неповиновение!
Ven

13

JavaScript (ES6), 43 байта

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

1
вам не хватает третьего параметра
m0sa

@ m0sa Спасибо, исправлено.
Нил

Это не проходит третий тест, теперь ;-)
Sklivvz

1
@Sklivvz Тьфу, вот что я получаю за то, что не прочитал требования должным образом.
Нил

Вместо этого p+=sвы можете добавить 2 байта p+=[s], и это сработает.
Aplet123

7

JavaScript (ES6), 37 43 44 байта

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

Тест:

> 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

Не уверен, что если вы хотите посчитать объявление функции, я бы добавил это.


Я думаю, что, как правило, мы не считаем объявление функции, если только вопрос не требует полной программы, а не функции.
Деусови

sliceкороче чем substr.
Mama Fun Roll

@Deusovi верно. Я имею в виду, что я не буду делать console.log(f("whatever",10, "*")), ноconsole.log(("*".repeat(10)+"whatever").substr(-10))
Sklivvz

7

Javascript ES6, 35 байт

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

Попытайся. Я считаю, что это самое короткое возможное значение, которое в настоящее время возможно в Javascript.


Это то, что я собирался сделать, за исключением того, что это не была анонимная функция.
Aplet123

@ Aplet123 Я думаю, что по определению конкурса, что ожидается, это нормально. Это было просто просьба о функции; называть его неуместно в этом контексте или, по крайней мере, так я думаю, основываясь на других ответах.
Дэвид

5

Python 3, 33 31 29 байт

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

Довольно просто. Спасибо @xnor за напоминание мне, str.rjustвещь. :П

Для той же длины (также благодаря xnor):

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

Предыдущее решение:

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

Это немного короче, чтобы сделать (x*b+a)[-b:]или a.rjust(b,x). На самом деле, str.rjustсамо по себе, возможно, работает на все это.
xnor

@xnor Я забыл, rjustбыл встроенным, спасибо!
кот

Ничто из этого не следует спецификации:f(1, 2, 0) === '01';
Валентин Лоренц,

@ValentinLorentz Я попросил у ОП разъяснения по языкам, которые по умолчанию не приводят числа к строкам и не получили ответа. Поскольку этот вопрос не имеет формальной спецификации, я собираюсь предположить, что все аргументы являются строками.
кот

Теперь есть спецификация, и решение 1 недействительно (протестировано на Python 2.7.10)
CalculatorFeline

5

05AB1E , 11 9 байтов

Код:

g-ð³0@×¹«

Объяснение:

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 . Попробуйте онлайн .


1
Все эти символы помещаются в кодовую страницу Jelly (0x672D188330401181FA)
CalculatorFeline

5

JavaScript (ES5), 70 байт

Использование рекурсии ...

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

Мой начальный ход был только 57 байтов:

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

Но только прошли первые 2 теста:

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

Мне все еще нравится более короткий, потому что на практике передача чисел в функцию манипуляции со строками не является необходимой мне функцией.


4

Mathematica, 13 байт

StringPadLeft

Только для встроенного ответа № 3 (первый был Range, второй был Surd) Или менее встроенный: (35 байт)

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

Могу ли я спокойно понизить голос?
edc65

2
...Зачем? Это потому, что это просто встроенный? 41-байтный ответ Python # 1 (который больше не действителен) был просто оберткой для встроенного.
CalculatorFeline

It's common practice to disallow built-ins that exactly implement what the challenge asks if that's a concern.(Обращение к власти: Мартин) (но тоже здравый смысл)
edc65

@ edc65 Похожие мета посты . Я уверен, что это разрешено, поскольку встроенные модули по умолчанию разрешены. Требуется творческий подход и знания со стороны пользователя, чтобы знать соответствующую встроенную функцию.
mbomb007

1
@ mbomb007 разрешено может быть - креатив нет. Я не пометил этот ответ как недействительный, но сохранил свое отрицательное мнение
edc65


3

Javascript (ES6), 55 байт

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

Создайте пустой массив значений и присоедините версию.

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

Это более читабельно, но returnдобавляет еще несколько символов.


Поскольку вопрос отложен, я собираюсь поместить свой ответ под ответом JS, который больше всего похож на мой. 43 байта (s, n, c = '') => (Array (n) .join (c) + s) .slice (-n)
Чарли Уинн

Совет: `для inline code blocks..
CalculatorFeline

+=возвращает значение своего левого операнда, поэтому вторая версия становится короче: (a,n,c=' ')=>(new Array(++n-(a+='').length).join(c)+a)но она становится длиннее, когда вы добавляете многоэлементные строки заполнения.
CalculatorFeline

3

Баш, 57 байт

Параметры: ширина строки padchar

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

Сделайте строку из пробелов ширины .

Преобразуйте каждый пробел в padchar .

Напишите отступы затем строку .


2

Python, 41 байт

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

Без встроенной настройки, 43 байта:

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

(не то, что от него ожидают, но он проходит тестовый набор)


Вы можете удалить s=strи заменить sс strна тот же счетчику байтов.
CalculatorFeline

2

Желе , 12 байт

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

Так много ссылок на переменные. Разве желе не должно было быть молчаливым языком?

Попробуйте онлайн!

Как это работает

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)не должно по умолчанию 20или 32?
кот

1
Верхний индекс от 3 до 9 - это константы, которые инициализируются аргументами (если есть) или некоторыми полезными значениями по умолчанию. Условный ?проверяет, имеет ли он значение по умолчанию 10 и в этом случае дает пробел.
Деннис

2

JavaScript ES7, 16 байт

''.padStart.bind

встроенные модули ftw! Работает только на Firefox 48 и выше. Действительно, эта функция была добавлена ​​12 марта.

Это требует ввода, как:

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

1

Щука , 67 байт

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

Вздох . Пустая строка ""оценивается как true. Зачем!?

смешанный смешанный смешанный смешанный щучий суп ...


Другой язык с глупыми истинами.
CalculatorFeline

@CatsAreFluffy Да, Пайк немного странный, но у него есть хорошие утилиты для обработки строк.
кот

1

Пайк , 12 байт (неконкурентный)

добавлен узел ввода, исправление ошибки на узле len, изменение результатов по умолчанию на узле назначения после публикации запроса.

\ =zzjl-z*j+

Объяснение:

\ =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, потому что ответы на языке помогают вам уточнить это :)
кошка,

Я отредактировал формат вашего заголовка, чтобы его было легче читать, а пользовательские скрипты и т. Д. Анализировать - откатите его, если вы не согласны.
кот

Почему отрицательный голос?
Blue

1
@muddyfish Кажется, что каждый не-Javascript ответ здесь опущен.
Аднан

@AnN это просто нехорошо ... Кроме того, почему я не смог увидеть шаблон из 6 лучших ответов
Blue


1

JavaScript (ES6), 34 байта

Я использовал рекурсивное решение.

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

0

Рубин, 42 байта

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

Параметры: строка, размер, падчар.

Тестовый набор ниже; следует напечатать все "true", просто поместите все в один файл.

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"

Вам не нужно использовать это имя метода ... и вы, вероятно, тоже можете сделать его лямбда-выражением. (Все остальные примеры похожи)
Чарльз

0

Java 8, 86 88 байт

Это функция. Третий аргумент - это varargsразрешение необязательного pad char (по умолчанию ' ')

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

Рекурсия! +2 байта (добавлены скобки из-за несовместимой ошибки типа)


Это ошибки типа. Всегда могу протестировать Ideone (Java 7, но я получаю точно такую ​​же ошибку в Java 8 на моем устройстве) ideone.com/B7gTA5
cat

0

PHP, 54 48 байт

Использует кодировку Windows-1252.

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

Запустите так ( -dдобавлено только для 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

Старая версия (без встроенной):

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

Tweaks

  • Сохранено 6 байт с использованием str_padвместо цикла. Оставляя старую для справки, так как встроенные не одобряются

0

R, 50 байтов

Опоздал на вечеринку снова, но здесь идет:

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

Это просто печатает вывод в stdout, но фактически не возвращает заполненную строку (не был уверен, является ли это требованием для вызова). Если это необходимо, решение немного длиннее - 61 байт:

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

-3

C, 64 байта

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

Попробуй это здесь .


2
Это не соответствует спецификации, так как по умолчанию не используется пробел, если символ не указан.
Дверная ручка

Этот код не работает как дано. gccне позволит undefined reference to function printfпройти и включать в printfсебя, но не тут -то для memset, asprintfи strlen. Вам нужно добавить определения #include<string.h>... и т.д., чтобы сделать это действительным.
кот

@tac Хммм ... я написал и проверил мой ответ полностью в пределах ideone. Он компилируется и успешно работает на этой платформе, хотя и утверждает, что использует gcc-5.1. Я не уверен, используют ли они флаги компилятора или что-то еще за кулисами, о которых я не знаю. Сначала я использовал это в качестве оправдания тому, что он не работает в вашей среде, но теперь я не уверен ...
Коул Кэмерон,

ну, это gcc 5.2.1на Linux, так что вы можете сойти с ума, говоря, Ideone C, 64 bytesно если вы хотите утверждать, что это C, сделайте его компиляцией. : p
кошка

Я только новичок в C: почему fберу четыре параметра, а не 3? Вам нужен адрес строки или ...? В любом случае, fследует принять не более 3 аргументов.
кот
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.