Javascript左パッドゴルフ


27

前書き

left-pad npmパッケージ falloutをきっかけに、left-padを実装するためのコードゴルフをしましょう。

左パッドの機能は、フォームで、2つのデフォルト引数と1つの追加の引数で構成された文字列長さ、(padchar)。padcharが指定されていない場合、これはスペース文字に標準化されます。2つの引数を持つ例を見てみましょう。

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への挑戦を制限することは強く推奨されません。他の言語がこれに参加できない理由はありません。仕様では、リンクをたどる必要なく、望ましい動作と可能な入力の範囲を記述する必要があります。3番目のパラメーターがどのように処理されているかは明確ではありません。
-xnor

8
「したがって、他の言語でプレイすることは許可されていません」と言うことなく、動機付けのためにJavascript関連の参照を作成できると確信しています。最高のJavascriptエントリの表示に特に関心がある場合は、他の言語でも課題を残したまま、賞金を提供できます。
trichoplax

6
単一言語の質問は禁止されているか、禁止されていません。禁止されている場合は、これを閉じます。許可されている場合は、OPが質問を好きなように制限するようにします。
Sklivvz

10
@Sklivvz(およびm0sa)言語固有の課題が意味を持つまれなケースがあります。特に、その課題が理にかなっている、あるいはそもそも課題であるために言語の非常にユニークな機能を必要とする場合は特にそうです。それがそれらが許可されている主な理由であり、私がそれらを完全に拒否することに反対する理由です。とはいえ、どの言語でも意味のある課題について、1つの言語に制限する正当な理由はありません。それ以外の場合は、「JavaScriptで配列を並べ替える」、「Rubyで配列を並べ替える」、「Pythonで配列を並べ替える」など、何も利益をもたらさない300の課題があります。
マーティンエンダー

8
@Sklivvz trichoplaxが言ったように、これはチャレンジのすばらしい動機ですが、結局のところ、他の言語でも同じくらい理にかなっている非常に単純な文字列処理タスクになります。JavaScriptの課題は、他の言語と比較してJavaScriptで特に難しく、実行可能または興味深いものではありません(特に、誰かが左パッドパッケージについて知らなかった可能性がありますが、言語の制限なしにこの質問をすると、JavaScriptの答えはtはまったく影響を受けておらず、誰も「なぜこのJSだけではないのか?」
マーティンエンダー

回答:


20

Pyth、13 11バイト

+*.xwd-Qlzz

ここで試してみてください

STDINからの入力を、1行目の文字列、2行目の長さ、およびオプションで3行目のパディング文字として入力します。


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ありがとう、修正しました。
ニール

現在、3回目のテストに失敗しています;-)
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
ママファンロール

@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私はOPに、デフォルトで数字を文字列に強制しない言語についての明確化を求めたが、答えを得ていない。この質問には正式な仕様がないため、引数はすべて文字列であると仮定します。

現在、仕様があり、ソリューション1は無効です(Python 2.7.10でテスト済み)
CalculatorFeline

5

05AB1E11 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、2番目はSurd)または以下の組み込み:(35バイト)

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

静かに下票してもいいですか?
edc65

2
...なぜ?これは単なるビルトインだからですか?41バイトのPythonの回答#1(もはや有効ではありません)は、組み込みの単なるラッパーでした。
電卓

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は多分許可されています-クリエイティブなし。私は無効としてフラグこの回答をしませんでしたが、私のdownvoteをmantain
edc65

3

ジュリア、4バイト

lpad

すべてのテストケースに合格します。

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

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

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

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

それはうまくいきますrect 7 corか?
電卓

はい。lpad("rect", 7, "cor") => "correct"
豊陽王

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

+=左オペランドの値を返すため、2番目のバージョンは短くなります。(a,n,c=' ')=>(new Array(++n-(a+='').length).join(c)+a)ただし、マルチ文字パディング文字列を追加すると、長くなります。
電卓

3

Bash、57バイト

パラメーター:文字列幅パドチャー

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

スペースの文字列を作成します。

各スペース文字をpadcharに変換します

padding次にstringを書き込みます。


2

Python、41バイト

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

組み込みのrjustがない場合、43バイト:

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

(期待どおりではありませんが、テストスイートに合格します)


あなたは削除することができますs=strし、交換するsstr、同じバイト数のため。
電卓

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)デフォルトではないのです2032

1
上付き文字3〜9は、引数(存在する場合)またはいくつかの有用なデフォルト値に初期化される定数です。条件?は、デフォルト値が10であるかどうかを確認し、その場合はスペースを生成します。
デニス

2

JavaScript ES7、16バイト

''.padStart.bind

組み込みのftw!Firefox 48以降でのみ動作します。この機能は3月12日に追加されたため有効です。

これは次のような入力を取ります。

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

1

パイク、67バイト

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

ため息。空の文字列はに""評価されtrueます。なぜ!?

パイクスープ...


愚かな真実を持つ別の言語。
電卓

@CatsAreFluffyええ、パイクはちょっと変ですが、素晴らしい文字列処理ユーティリティがあります。

1

パイク、12バイト(非競合)

入力ノードの追加、lenノードのバグ修正、チャレンジが投稿された後のassignノードのデフォルト結果の変更。

\ =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は、言語で回答することで改善できるためです。)
cat

ヘッダーの形式を編集して、読みやすく、ユーザースクリプトなどが解析しやすいようにしました。同意しない場合は、ロールバックします。

なぜ下票なのですか?
ブルー

1
@muddyfishここでのJavascript以外のすべての回答は、投票されていないようです。
アドナン

@AandNそれはちょうどいいことではありません...また、なぜ私はトップ6の答えからパターンを見ることができなかったのですか?
ブルー


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バイト

これは機能です。3番目の引数は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バイト(互換性のない型エラーのために括弧を追加)


このTypeErrors。常に(Javaの7、私は私のボックス上でJava 8でまったく同じエラーが出る)Ideoneをテストすることができideone.com/B7gTA5

0

PHP、54 48バイト

Windows-1252エンコードを使用します。

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

次のように実行します(-deastheticsのみに追加):

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

微調整

  • str_padループの代わりに使用して6バイトを節約しました。ビルトインが眉をひそめているので、参照用に古いものを残します

0

R、50バイト

Late to the party again but here it goes:

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

This simply prints the output to stdout but does not actually return the padded string (wasn't sure if this is a requirement for the challenge). If this is needed, the solution is slightly longer at 61 bytes:

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

-3

C, 64 bytes

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

Try it here.


2
This does not comply with the specification, as it does not default to space when a character is not provided.
Doorknob

This code doesn't run as given. gcc will let undefined reference to function printf pass and include printf itself, but no such luck for memset, asprintf, and strlen. You need to add the #include<string.h>... etc definitions to make this valid.
cat

@tac Hmmm...I wrote and tested my answer completely within ideone. It compiles and runs successfully on that platform, though it states that it uses gcc-5.1. I'm not sure if they're using compiler flags or what-have-you behind the scenes that I'm not aware of. I was initially using this as my justification for it not running in your environment, but now I'm not sure...
Cole Cameron

well, this is gcc 5.2.1 on Linux, so you might be able to get away with saying Ideone C, 64 bytes but if you're gonna claim it's C, make it compile. :p
cat

I'm only a beginner at C: Why does f take four parameters, not 3? Are you requiring the address of the string, or...? either way, f should take at most 3 arguments.
cat
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.