JavaScript에서 알파벳 생성


21

이 작업을 수행하는 더 좋은 방법은 없지만 확실하게 물어볼 수는 없다고 생각합니다.

입력하는 데 지쳤습니다 a='abcdefghijklmnopqrstuvwxyz'.

멋진 언어는 Range('a'..'z')유사하다

우리는 가능한 짧은 JS를 어떻게 만들 수 있습니까?

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

알파벳보다 길지만 어딘가에 망칠 수는 없습니다.

50 자 미만으로 z를 생성하는 불쾌한 비트 쉬프트 방법이 있기를 바랍니다.

나는 엉망 i=97;Array(26).map(x=>String.fromChar....i++

하지만 내가 합류 할 때마다 항상 길어졌고 배열 (26)을 사용할 수 있도록 분할했습니다.


편집 : 나는 그것을 얻었습니다.

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

60 바이트


11
@ muddyfish, LuisMendo : 이것은 메타 당 주제 입니다.
Doorknob

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에서?
Charlie Wynn

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으로 변환하고 인쇄합니까? 아즈!
Charlie Wynn

map 함수 호출의 a = ''및 i = 9 인수입니까? mdn에서 Array.prototype.map ()을 확인
했는데

@JaySomedon 이것들은 map 함수 호출에 대한 인수입니다. 어떻게 Javascript 함수는 예상하지 않은 매개 변수를 신경 쓰지 않고 버립니다. 나는 변수 I의 필요를 초기화 그래서, 호출 된 함수에 대한 아무 소용이있는 매개 변수를 추가하는 동안
edc65

@JaySomedon이 답변과 관련 의견도 참조하십시오 codegolf.stackexchange.com/a/2684/21348
edc65

@ edc65 아하! 그거 멋지다! 그래서 자바 스크립트가 map ()에서 i = 9와 같은 인수를 평가할 때 실제로 전역 변수 i를 생성 한 다음 9를 할당합니까?
Jay Somedon

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 은 다른 바이트보다 짧습니다.

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

미리 변수를 작성하면 또 다른 바이트가 저장됩니다.

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을 할 수 있기를 바랍니다 :(
Charlie Wynn

2
@CharlieWynn 예, 모든 브라우저가 모든 최신 기능을 지원하는 것은 아쉬운 일입니다. 그러나 결국, 크롬은 하루 안에 만들어지지 않았습니다 ...;)
ETHproductions

이러한 솔루션의 대부분은 String, .fromCharCode 대신 .toString을 사용하여 단축 할 수 있습니다. 내 답변보기
edc65

1
@CharlieWynn 크롬 베타는 이제 모듈 및 테일 콜 최적화를 제외한 모든 ES7 및 모든 ES6을 지원한다고 생각합니다.
gcampbell 2016 년

다음은 함수 반환 값으로 호출 할 수있는 42 바이트입니다. (f=(i=9)=>++i<36?i.toString(36)+f(i):'')()
Rick Hitchcock

7

다음은 또 다른 접근법 인 51 바이트 ES6 표현식입니다.

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

물론 대문자는 50 바이트입니다.


대문자 : String.fromCharCode (... Array (91) .keys ()). slice (65)
jpoppe

1

방금 배운 트릭을 사용하여 36 바이트 (이 게시물에서 /codegolf//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.