JavaScriptでアルファベットを生成する


21

私はこれを行うためのより良い方法はないと確信していますが、尋ねることを傷つけることはできないと考えました。

入力するのはうんざりですa='abcdefghijklmnopqrstuvwxyz'

クールな言語が持っているRange('a'..'z')か類似

できるだけ短いJSを考え出すにはどうすればよいですか?

for(i=97,a='';i<123;){a+=String.fromCharCode(i++)}

アルファベットよりも長いですが、どこかでめちゃくちゃにしないことを保証します。

私は、50文字未満でazを生成する厄介なビットシフトの方法があることを望んでいます。

私はいじりました i=97;Array(26).map(x=>String.fromChar....i++

しかし、それは私が参加したときまでずっとずっと長く、その後使用可能になるように配列(26)を分割しました


編集:私はそれを得た

[...Array(26)].reduce(a=>a+String.fromCharCode(i++),'',i=97)

60バイト


11
@ muddyfish、LuisMendo:これはメタごとのトピックです。
ドアノブ

1
[...Array(26)].map((q,w)=>String.fromCharCode(w+97))は52バイトであり、さらに.join``
andlrc


@ dev-null a = ''; i = 97; [... Array(26)]。map(b => a + = String.fromCharCode(i ++))は60ですが、結合はどのように行われますか結果にコンマを取得せずに7で?
チャーリーウィン

1
@CharlieWynn[...Array(26)].map((q,w)=>String.fromCharCode(w+97)).join``
andlrc

回答:


12

String.fromCharCodeの代替

...小文字のみのアルファベットに満足している場合。

for(i=9,a='';++i<36;)a+=i.toString(36) // 38, cannot be used in an expression
[...Array(26)].map(_=>(++i).toString(36),i=9).join`` // 52 directly returnig the string desired
[...Array(26)].map(_=>a+=(++i).toString(36),a='',i=9) // 53 assign to a variable
(i=9,[for(_ of Array(26))(++i).toString(36)].join``) // 52 ES7 direct return
i=9,a='',[for(_ of Array(26))a+=(++i).toString(36)] // 51 ES7 assign to a variable

1
ああ、それは賢い。だから、10から始まり、ベース36に変換して印刷しますか?ああああ!
チャーリーウィン

map関数呼び出しのこれらのa = ''およびi = 9引数はありますか?MDNにArray.prototype.map()をチェックし、それはマップのサポートなどの引数のようには見えません...
ジェイSomedon

@JaySomedonは、マップ関数呼び出しの引数です。ある意味では、Javascript関数は通常、予期しないパラメーターを気にせず、破棄します。したがって、必要な変数を初期化し、呼び出された関数には使用できないパラメーターを追加します
edc65

@JaySomedonもこの回答と関連するコメントを参照してくださいcodegolf.stackexchange.com/a/2684/21348
edc65

@ edc65なるほど!それはすてきです!だから、ここで、javascriptがmap()でi = 9のような引数を評価するとき、実際にグローバル変数iを作成し、それに9を割り当てますか?
ジェイ・サムドン

11

注:これらの手法はすべて、アルファベット文字列をvariableに割り当てますa


JavaScriptでこれを実現する最短の方法は確かに99%確信しています。

a="abcdefghijklmnopqrstuvwxyz" // 30 bytes

しかし、他にも興味深い方法がいくつかあります。文字列圧縮を使用できます:

a=btoa`i·?yø!?9%?z)ª»-ºü1`+'yz' // 31 bytes; each ? represents an unprintable

圧縮された文字列はから取得できますatob`abcdefghijklmnopqrstuvwx`'yz'あなたは、文字列全体を圧縮する場合、結果はわずか27バイトでありながら、それはのようになりますので、手動で追加する必要がありますabcdefghijklmnopqrstuvwxyw==

プログラムでそれを行う最短の方法は、あなたが提案した方法でもあると思います:

for(i=97,a='';i<123;)a+=String.fromCharCode(i++) // 48 bytes

必要に応じて、ES6機能(テンプレート文字列``スプレッド演算子...)でそれを行うことができます:

a=[...Array(26)].map(_=>String.fromCharCode(i++),i=97).join`` // 61 bytes
a=[...Array(26)].map((_,i)=>String.fromCharCode(i+97)).join`` // also 61 bytes
a=[...Array(i=26)].map(_=>String.fromCharCode(++i+70)).join`` // again, 61 bytes

次の代わりに変数を使用することで改善できます.join``

[...Array(26)].map(_=>a+=String.fromCharCode(i++),i=97,a='') // all 60 bytes
[...Array(26)].map((_,i)=>a+=String.fromCharCode(i+97),a='')
[...Array(i=26)].map(_=>a+=String.fromCharCode(++i+70),a='')

または、配列内包表記の ES7で、もう1バイト短くなっています。

a=[for(_ of Array(i=26))String.fromCharCode(++i+70)].join`` // 59 bytes

事前に変数を作成すると、さらに1バイト節約できます。

a='',[for(_ of Array(i=26))a+=String.fromCharCode(++i+70)] // 58 bytes

また、String.fromCharCode複数の引数を受け入れ、自動的にそれらを結合します。したがって、各ES6バージョンを57バイトまでゴルフできます。

a=String.fromCharCode(...[...Array(26)].map(_=>i++,i=97)) // all 57 bytes
a=String.fromCharCode(...[...Array(26)].map((_,i)=>i+97))
a=String.fromCharCode(...[...Array(i=26)].map(_=>++i+70))

そして、ES7は55まで:

a=String.fromCharCode(...[for(_ of Array(i=26))++i+70]) // 55 bytes

ゴルフ練習場の詳細については、この一連のヒントをご覧ください。ES7の配列内包についてもあります。

編集: edc65が指摘しているように、これらのほとんどは次のi.toString(36)代わりに短くなりString.fromCharCode(i)ます:

for(i=9,a='';++i<36;)a+=i.toString(36) // 38 bytes
a=[...Array(26)].map(_=>(++i).toString(36),i=9).join`` // 54 bytes
[...Array(26)].map(_=>a+=(++i).toString(36),i=9,a='') // 53 bytes
i=9,a=[for(_ of Array(26))(++i).toString(36)].join`` // 52 bytes
i=9,a='',[for(_ of Array(26))a+=(++i).toString(36)] // 51 bytes

これは関数の戻り値として呼び出すことができる最短のものだと思います:

eval("for(i=9,a='';++i<36;)a+=i.toString(36)") // 46 bytes

関数から手動で返すよりも3バイト短くなります。

x=>eval("for(i=9,a='';++i<36;)a+=i.toString(36)") // 49 bytes
x=>{for(i=9,a='';++i<36;)a+=i.toString(36);return a} // 52 bytes

もちろん、x=>"abcdefghijklmnopqrstuvwxyz"まだ他のすべてを打ち負かしています。


私はこれがどこに行くのかが本当に好きです-クロムでES7ができることを願っています:(
チャーリー・ウィン

2
@CharlieWynnはい、すべてのブラウザがすべての最新機能をサポートしているわけではないのは残念です。しかし、結局のところ、Chromeは1日で構築されなかった...;)
ETHproductions

これらのソリューションのほとんどは、String、.fromCharCodeの代わりに.toStringを使用して短縮できます。私の答えを参照してください
-edc65

1
@CharlieWynn Chrome Betaは、モジュールとテールコールの最適化を除く、ES7とES6のすべてをサポートするようになりました。
-gcampbell

ここでは関数の戻り値として呼び出すことができる42-byterがあります: (f=(i=9)=>++i<36?i.toString(36)+f(i):'')()
リック・ヒッチコック

7

51バイトのES6式という別のアプローチを次に示します。

String.fromCharCode(...Array(123).keys()).slice(97)

もちろん、大文字で50バイト。


大文字の場合:String.fromCharCode(... Array(91).keys())。slice(65)
jpoppe

1

36バイト、私が今学んだトリックを使って(この投稿から:https : //codegolf.stackexchange.com/a/176496/64538):

for(i=9;++i<36;)name+=i.toString(36)

window.name デフォルトでは空の文字列です。

もちろん、これは、より長い変数名を使用するため、38バイトのソリューションよりも実用的ではありません。


1

グローバルスコープで定義される場合とされない場合の使用

オブジェクトプロパティと配列の一致には39バイト a-z

a=`${Object.keys(top)}`.match(/[a-z]/g)

ソートされていない場合は48バイト Set

a=new Set(`${Object.keys(top)}`.match(/[a-z]/g))

ソート済みの場合は55バイト Set

a=new Set(`${Object.keys(top)}`.match(/[a-z]/g).sort())

ソートされたストリングの場合は67バイト

a=[...new Set(`${Object.keys(top)}`.match(/[a-z]/g).sort())].join``
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.