Введення моїх двох центів на мови програмування масиву , зокрема J та APL .
K / Kona, Q та Nial також потрапляють до цієї категорії, але вони, як правило, мають однакові переваги та зауваження. Використовуйте розсуд. Я буду використовувати приклади J нижче, здебільшого тому, що це ASCII, і тому їх легко набрати - пам’ятайте, ніж символи APL вважаються одиничними байтами, тому не дозволяйте це бути вашою проблемою з мовою, як вибором для гольфу.
- Математичні проблеми
- Розв’язування загадок із числом
- Виконання числових методів
- Хитрі проблеми 2D-масиву
Ці два є дуже хорошими мовами математики та обробки даних, тому що вони кидають масиви на високому рівні, і багато циклічного завершення робиться неявно , говорячи, наприклад, додайте десять до кожного з 3, 4 і 5 ( 10 + 3 4 5
) або підсумовуйте кожну рядок масиву ( +/"1 arr
- цикл знаходиться в the "1
).
- Проблема розгляду простих чисел
Зокрема, з проблемами простого числення J має швидкі та короткі вбудовані примітиви, як і деякі діалекти APL. (Редагувати: Я думаю про Nars2000, який є частиною діалекту та частиною зовсім іншої реалізації. APL не має вбудованого для прайметів.) N-й прайм ( p:
), ні. праймерів до ( _1&p:
), факторингу ( q:
), GCD та LCM ( +.
і *.
) тощо), там багато. Однак на практиці в питанні часто вказується, що вам потрібно готувати власні основні реалізації, тому вони не бачать великої користі. Є ще акуратні та хитромудрі способи отримання основного матеріалу, який вам потрібен, він просто стає трохи менше вирізати та вставляти.
- Обробка рядків
- Обробка масиву
Обробка масивів і рядків - це трохи мішана сумка: якщо це щось, на що APL / J добре підходить або має примітивну або загальну ідіому, це майже тривіально; якщо це щось дуже послідовне і не дуже паралелізоване, вам буде погано провести час. Все, що знаходиться між ними, знаходиться в повітрі, хоча зазвичай вони будуть сприятливо реагувати.
- Проблеми, які потребують рішення вводу / виводу, консольного чи файлового
- Проблеми, які потребують написання рішення як визначення функції
IO дивно. APL має вираз введення односимвольних, але з J ви повинні провести принаймні , 8 читати в номері: ".1!:1]1
. Вихід є трохи менш дослідним, але ви все ще дивитесь на 6 або 7 символів, на практиці. J, особливо це дуже подобається, якщо ви можете взяти вхідні дані як аргументи функції, замість того, щоб змусити себе спілкуватися з самим IO.
На практиці з J та APL зазвичай рішення записується як функція, яку ви викликаєте на консолі. За допомогою APL ви можете просто ввести імена змінних для своїх аргументів і обернути вираз, з яким працювали, у фігурні дужки і назвати його за день.
Але в J є трохи накладних витрат для чіткого визначення функцій-- 3 :'...'
, і вам доведеться уникати будь-яких рядків всередині - так що зазвичай робиться щось таке, що називається мовчазним програмуванням: ви програмуєте на рівні функцій, поєднуючи примітиви таким чином не на відміну від Хаскелла. Це може бути як благо, так і прокляття, тому що вам не доведеться витрачати стільки символів на ваші аргументи, але легко заглушити в дужках і в кінцевому підсумку втратити десятки символів, намагаючись зламати своє інакше коротке і розумне рішення в щось працює.
- Проблеми, які потребують розбору
- Обчислювальна геометрія
У мене немає досвіду роботи з такими проблемами в гольфі, але я скажу так: врешті-решт, мови програмування масиву дуже добре підходять до того, щоб конфігурувати та трансформувати безліч даних однаково. Якщо ви можете перетворити проблему на вправу в переміщенні числа, ви можете зробити це проблемою APL / J, без поту.
Однак, не все є проблемою APL / J. На відміну від Гольфскрипта, APL та J просто виявились корисними для гри в гольф, поряд із іншими перевагами;)