Поради щодо гольфу в Groovy


14

Оскільки я бачив багато питань, що задають поради щодо гри в гольф цікавою мовою, я вирішив попросити мою улюблену мову: Groovy. Люди можуть дати кілька порад та підказів, які будуть використані в гольфі з Groovy.


1
Що ж, це не дуже популярно, це :-(
Арман

@Alison: Мені погано, оскільки на цьому сайті немає підказок про Гольф для Groovy :(
Ant's

2
Чи є якісь поради, щоб почати нас?
Арманд

Відповіді:


5

Я новачок у всій гольф-справі, ось що я отримав дотепер:

Використовуйте замикання, а не функції:

def a (b) {print b}

довше, ніж

a = {роздрукувати}

Ви можете використовувати негативний індекс у масивах та списках як псевдонім для size () -

c = "abc"
d = ["a", "b", "c"]

стверджувати c [c.size () - 1] == c [-1]
стверджувати c [c.size () - 2] == c [-2]
стверджувати d [d.size () - 1] == d [-1]
стверджувати d.last () == d [-1]

Оператор розповсюдження - це ярлик для збирання:

assert d * .size () == d.collect {it.size ()}

Для сортування використовуйте оператор космічного корабля:

e = [54,5,12]
assert e.sort{a,b->a<=>b}==e.sort{a,b->a<b?-1:+1}
assert e.sort{a,b->a<=>b}==e.sort{a,b->if (a>b) {return(-1)} else {return(+1)}}

Редагування конверсій:

assert "123" as int == "123".toInteger()

якщо на чомусь спискувати, *.Xоператор розповсюдження часто може бути записаний як.X
cfrick

3

Оскільки Groovy є дещо багатослівною мовою, ви можете використовувати MOP Groovys для скорочення викликів методів.

Такий фрагмент, наприклад, окупиться після четвертого використання:

''.metaClass.r<<{i->(int)Math.random()*i}
''.r(12)

Порада з гольфу редагувати:

0.metaClass.r<<{i->(int)Math.random()*i}
0.r(12)

Або ви знаєте:

r={(int)Math.random()*it}
r(12)

2

grep короткий і працює над кількома проблемами

отримати символи рядка у вигляді списку з пробілами та без провідних елементів: 'ABC XYZ'.grep()return[A, B, C, , X, Y, Z]

grep з regexp коротше, ніж перехід у верхній регістр, якщо потрібно: it.grep(~/(?i)$c/)замістьit.toUpperCase().grep(c)


1
'ABC XYZ'as Setна один персонаж коротший і працює в більшості тих самих місць
Марті Ніл

2

Отримання масиву зі списку об'єктів

Якщо у вас є список об'єктів, таких як:

def users = [[user:'A',id:1],[user:'B',id:2],[user:'C',id:3]]

Ви можете створити ArrayList з певним властивістю, використовуючи:

def userIds = users*.id // [1, 2, 3] no explicit loops!

БОНУС: Groovy ... на рейках!

Що ж, у Grails Framework ми повинні отримати багато значень із вибору з декількома атрибутами . Ви можете використовувати петлі, вирівнювати та інше програмування більш типових структур, але ви можете зберегти деякі рядки. Якщо у вас є вибір типу:

<select id="users" multiple="true" name="users">
    <option value="193">User A</option>
    <option value="378">User B</option>
    <option value="377">User C</option>
</select><%-- No Grails tags for now --%>

Потім у свій контролер ви можете просто написати:

def aListOfUsers = User.getAll(params.list('userIds'))

1
Чи прийняли б це питання поради щодо грайлінгу щодо Грааля? Зізнаюсь, я боюся снайперських снайперів ...
Віктор Ф

2
Не бійтеся, PCG сповнений надзвичайно приємних людей :)
Beta Decay
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.