Генерування алфавіту в JavaScript


21

Я впевнений, що немає кращого способу зробити це, але подумав, що це не завадить запитати.

Мені набридло друкувати a='abcdefghijklmnopqrstuvwxyz'.

Класні мови мають Range('a'..'z')чи подібні

Що ми можемо придумати JS, що це якомога коротше ??

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

довше, ніж просто алфавіт, але гарантує, що я кудись не закручуюся.

Я сподіваюся, що існує неприємний спосіб злегка створити az менше ніж 50 символів.

Я заплутався навколо 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 байти і додайте ще 7 для.join``
andlrc


@ dev-null a = ''; i = 97; [... Масив (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

Викликають ці аргументи a = '' і i = 9? Перевірено Array.prototype.map () на mdn, і це не схоже на те, що карта підтримує такі аргументи ..
Jay Somedon

@JaySomedon - це аргументи для виклику функції карти, певним чином, функції Javascript наочно не хвилюються та відкидають параметри, яких вони не очікують. Тому я ініціалізую потрібну мені змінну, додаючи параметр, який не використовується для
виклику

@JaySomedon дивіться також цю відповідь та відповідні коментарі codegolf.stackexchange.com/a/2684/21348
edc65

@ edc65 ага я бачу! Це акуратно! Отже, коли javascript оцінює такі аргументи, як i = 9 у map (), він фактично створює глобальну змінну i потім призначає 9?
Джей Сомедон

11

Примітка. Усі ці методи призначають рядок алфавіту змінною a.


Я на 99% впевнений, що найшвидший спосіб досягти цього в JavaScript:

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 .

EDIT: Як зазначав 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

Це на три байти коротше, ніж повернути його вручну з функції:

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 Так, прикро, що не всі браузери підтримують усі найновіші функції. Але зрештою, Chrome не було побудовано за день ...;)
ETHproductions

Більшість цих рішень можна скоротити, використовуючи .toString замість String, .fromCharCode. Дивіться мою відповідь
edc65

1
@CharlieWynn Я думаю, що Chrome Beta тепер підтримує всі ES7 та всі ES6, за винятком модулів та оптимізації виклику.
gcampbell

Ось 42-байт, який можна назвати зворотним значенням функції: (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

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``
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.