Javascript із лівого майданчика для гольфу


27

Вступ

У результаті випадіння пакету npm з лівої колодки , давайте маємо гольф коду для реалізації лівої панелі.

Ліва колодка функція складається з 2 -х аргументів по замовчуванням і 1 додатковий аргумент у вигляді рядка , довжини , ( padchar ). Якщо padchar не задано, це стандартизується на пробіл . Візьмемо приклад з двома аргументами:

left_pad("abc", 6)

Спочатку спостерігаємо довжину струни, яка дорівнює 3 . Після цього нам потрібно прокласти цей рядок зліва, поки довжина повної рядки не досягне довжини, заданої у функції. У цьому випадку 6 . Оскільки padchar не задано , нам потрібно прокласти це пробілами:

   abc

Це рядок з 3 пробілами та початковим рядком, в результаті чого стає рядок довжиною 6. Ось приклад із наведеним padchar:

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

Ми робимо так само, як у наведеному вище прикладі, але замінюємо пробіли на padchar. У цьому випадку дефіс:

---abc

Завдання

З огляду на рядок , довжину та, можливо, додатковий аргумент 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 не будуть ' t взагалі не постраждало, і ніхто не подумав би "чому це не лише JS?").
Мартін Ендер

Відповіді:


20

Pyth, 13 11 байт

+*.xwd-Qlzz

Спробуйте тут .

Приймає вхід з STDIN як рядок у першому рядку, довжина у другому рядку та додавання символів необов'язково на третьому рядку.


4
Це, мабуть, лише javascript
MMM

22
@MMM Мовні обмеження у викликах настільки не подобаються, що, напевно, я їх ігнорую. Ніхто не любить, щоб йому казали " ти не можеш брати участь".
xnor


2
Приклейте його до чоловіка! Ви йдете Дверної ручки! Не дозволяйте вашим мріям бути мріями! ПРОСТО ЗРОБИ ЦЕ!
Mave

4
«Це зле суспільство, де модератори - це громадянські непокори!
Вень

13

JavaScript (ES6), 43 байти

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

1
вам не вистачає 3-го параметра
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

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


Я думаю, що в цілому ми не рахуємо декларацію функції, якщо питання конкретно не вимагає повної програми, а не функції.
Deusovi

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, це річ. : P

Для однакової довжини (також завдяки 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

Математика, 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)
Charlie Wynn

Порада: `для 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

Пітон, 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, оскільки відповідь мовою допомагає вам уточнити :)
кіт

Я відредагував формат вашого заголовка, щоб полегшити його читання та полегшення для користувацьких скриптів тощо для розбору - поверніть його назад, якщо ви не згодні.
кіт

Чому потік?
Блакитний

1
@muddyfish Схоже, що тут відповідь, що не відповідає JavaScript, не викликає.
Аднан

@AandN це просто не приємно ... Крім того, чому я не міг побачити візерунок з перших шести відповідей
Синій


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

Параметри: рядок, розмір, padchar.

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

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 (за замовчуванням ' ')

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

Рекурсія! +2 байти (додані дужки через несумісну тип помилки)


Це TypeErrors. Завжди можна протестувати Ideone (Java 7, але я отримую однакову точну помилку в Java 8 у своєму вікні) ideone.com/B7gTA5
кіт

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;};

Налаштування

  • Збережено 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 Hmmm ... Я написав і перевірив свою відповідь повністю в 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.