Вибір мов для гольфу [закрито]


28

Які поради щодо вибору потрібної мови для гольфу? Які фактори впливають на обрану мову?

Ось кілька прикладів типів проблем:

  • Проблеми, які потребують рішення вводу / виводу , консольного чи файлового
  • Проблеми, які потребують розбору
  • Проблеми, які потребують написання рішення як визначення функції
  • Математичні проблеми
  • Проблема розгляду простих чисел
  • Розв’язування загадок із числом
  • Виконання числових методів
  • Обробка рядків
  • Обробка масиву
  • Хитрі проблеми 2D-масиву
  • Обчислювальна геометрія
  • Рекурсія
  • 2D графіка
  • 3D графіка
  • Аудіо
  • Мережа / веб
  • Паралельна обробка

Не кажіть просто такі речі, як "Використовуйте GolfScript | J", тому що вони вам подобаються.


Для деяких проблем це типова система. Наприклад, якщо вам потрібно мати цілі числа, що перевищують 64 біти, ви хочете мати вбудовані мови (наприклад, Golfscript, Haskell), а не мови, які роблять їх дорогими (наприклад, Java).
Пітер Тейлор

Я зробив це вікі відповідно до нашої політики щодо питань "Поради".
dmckee

99 пляшок корисно, якщо вам потрібна мова, що починається з конкретної літери ...
Джессі Мілікан,

Від кудів до туза, тримсті, алгоритму пошуку та hosch250, щоб допомогти зробити цю нитку кращим ресурсом. Будь ласка, продовжуйте подання! Це був жорсткий виклик з великою вигодою між алгоритмом Шарка та hosch250, який обом доклав багато детальних зусиль, але врешті-решт Герр Шарк отримує кивок на провід.
Джонатан Ван Матре

Виберіть мову, яку ви хочете. Це також конкуренція в мовах. Більш унікальні, цікаві рішення більш мовою - це добре.
Мего

Відповіді:


-1

Залежить від того, що потрібно, C / C ++ - це швидко, але ви повинні самі кодувати більшу частину роботи. Python і Ruby повільніше, але їх набагато простіше кодувати за допомогою вбудованих методів, що скорочує багато роботи, і вони автоматично обробляють нескінченно великі значення (якщо в них є оперативна пам'ять). Використання функціональної мови на зразок Haskell чудово підходить для чисто математичного функціонального використання, якщо можна вирішити проблему таким чином.


2
Як головний користувач python, в Py ви платите за простоту використання в кількості символів, хоча є кілька справді хитріх хитрощів, які можуть зберегти символів. Хаскель і Лісп, веселячись, як правило, бігають навіть довше, ніж Пітон.
arrdem

Це, мабуть, не повинно бути прийнятою відповіддю. Опис мов високого та низького рівнів насправді не має нічого спільного з кількістю символів.
Samy Bencherif

Так, справді справедливим є відповідь у 2011 році на питання, відредаговане 23 лютого 2017 року. Можливо, нам слід припинити змінювати питання після того, як на нього відповіли?
ewanm89

10

Введення моїх двох центів на мови програмування масиву , зокрема 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 просто виявились корисними для гри в гольф, поряд із іншими перевагами;)


Відмінний внесок! Дякуємо, що ви першими потрапили в басейн.
Джонатан Ван Матре

4

Чому Перла ще не оцінили? Це чудова мова для гольфу для майже кожного з них, особливо речей, пов'язаних зі строками (регекс).

Бурлеск добре підходить для програм, що стосуються номерів, в той час як Рубін чудово підходить для більш простої обробки тексту.

Там насправді список мов і гольф оцінки над тут .


Я не знаю присідання про Perl, але я згоден.
ckjbgames

2

Мені подобається використовувати незрозумілі мови програмування, щоб (спробувати) виконати роботу.

Ось мої улюблені деталі, які ви перелічили:

Проблеми, які потребують рішення вводу / виводу, консольного чи файлового

Такі мови, як TI-Basic, добре працюють, але я віддаю перевагу Рубі черезputs

Проблеми, які потребують розбору

Тут вам обов'язково допоможе GolfScript

Проблеми, які потребують написання рішення як визначення функції

Таблиця TI-84 - дозволяє виконувати функції, Y=наприклад, Y=|X|повертає абсолютне значення X

Математичні проблеми

TI-Basic - призначений для калькулятора, тому він включає математику;)

Проблема розгляду простих чисел

Нічого особливого; Математика - це, мабуть, правильний інструмент для роботи

Розв’язування загадок із числом

TI-Basic, оскільки він автоматично проходить через масиви

Виконання числових методів

TI-Basic або Mathematica

Обробка рядків

Python - має кілька чудових функцій струн.

Яким би хорошим ви не вважаєте TI-Basic , не використовуйте його для струн ...

Обробка масиву

TI-Basic - автоматично проходить цикл через масиви ; наприклад, збільшуючи всі значення в масиві -L1+1→L1

Ruby - також має дуже потужні функції масиву, і, звичайно, !також допоможе стиснути код

Хитрі проблеми 2D-масиву

Тут найкраще працює Ruby або Python , оскільки TI-Basic не підтримує 2D масиви

Обчислювальна геометрія

TI-Basic має геометричні особливості і може бути використаний для більшості математики до обчислення та лінійної алгебри


БОНУС

Цикл

Або Arduino, або Quomplex . У Arduino є вбудований, void loop(){}а у Quomplex є нескінченні петлі, що містяться в дужках ( [])

Малювання / GUI

Game Maker Language має дуже потужні функції малювання, а TI-Basic також є загалом корисним інструментом через підтримку малювання на графіку.

Лайки

Або HQ9 +, або Quomplex, оскільки HQ9 + має Qвихід для вихідного коду програми, і Quomplex автоматично роздруковує його вихідний код, якщо *(вихід) не вказаний або він не видає вихід, визначений з#


2

Якщо ви вирішуєте математичну задачу і у вас немає Mathematica, спробуйте Sage . Він заснований на Python, тому якщо ви вже знаєте Python, вам не потрібно багато часу, щоб вивчити його синтаксис.

Приклади:

Він також корисний для побудови графіків та вирішення рівнянь (наприклад, ви можете використовувати solve()функцію в Sage, або якщо це заборонено правилами, це дозволяє легко реалізувати процес Ньютона Рафсона, оскільки він має diff()функцію, яка може виконувати символічну диференціацію) .

Крім того, якщо ви програміст Python2, використання Sage може дозволити вам обманювати, пропускаючи довгі importзаяви. Наприклад, mathі sysвже імпортуються за замовчуванням. (Зверніть увагу, що це може не працювати, якщо ваша програма Python2 залежить від цілого поділу.)


Гарна інформація! Дякуємо за ваш внесок.
Джонатан Ван Матре

1

Я знаю три мови - Java, C ++ та Python 3. Я не знаю жодної з них на високому рівні, але це мій досвід роботи з ними.

Java:

Я ніколи більше не використовую Java для гри в гольф. Просто для написання потрібно 80 символів Hello World!. Однак він має свої сильні сторони:

Введення вимагає створення Scannerоб'єкта. Важко ввести один символ. Він вимагає уточнення того, які типи ви вводите.
Розбір досить простий через forпетлю. Покращений forцикл відмінно підходить для цього.
Java підтримує методи, але декларація методу досить довга.
Java відмінно підходить до математики, як і всі інші мови високого рівня.
Java важко використовувати, коли проблема пов'язана із зміною рядків. Ви не можете вносити зміни в існуючий рядок.
Масиви Java прості у використанні.
Ява хороша в рекурсії.
Java включає вбудовану графіку. Вони дуже прості у використанні.

C ++

C ++ - це дуже сильна мова, але вона дещо тривала при спробі гольфу на 56 символів для Hello world!.

Введення та вихід легко. Вам не потрібно вказувати, які типи ви вводите - це робиться автоматично. Однак ви повинні включити бібліотеку iostream.
Розбір дуже легко.
Декларація функції проста, але їсть багато важливих символів. C ++ перевершує математику, але вона не включає PI або E, як це робить Java.
Струми C ++ прості у використанні та змінюються за потребою.
Я використовую vectors, де можливо замість arrays, але обидва прості у використанні.
C ++ хороший при рекурсії.
C ++ не включає вбудовану графіку.

Пітон 3

Python 3 схожий на C ++ та Java. Це набагато коротше, оскільки він не є сильно типізованим - іншими словами, він просто здогадується, що таке змінні.

Введення легко, але все вводиться як рядки. Ви повинні вручну перетворити весь вхід у будь-які значення, які ви хочете.
Розбирання та петля дуже простий.
Оголошення функції Python досить прості та короткі.
Пітон хороший в математиці.
Струни Python прості у використанні.
Масиви прості у використанні.
Пітон хороший при рекурсії.
Python не включає вбудовану графіку.


Я думаю, що за допомогою розширеного for-loop ви говорите про цикл діапазону. C ++ підтримує це, оскільки C ++ 11 ( en.cppreference.com/w/cpp/language/range-for ). Він синтаксично схожий на цикл Java для діапазону і вимагає, щоб клас ітерабельного об'єкта реалізував для цього об'єкта start () і end () або begin (T) і end (T). Він також реалізований для рядків у стилі С та вбудованих масивів та працює для всіх стандартних бібліотечних контейнерів.
foobar

@foobar Так, я говорив про це. Дякую за інформацію, я цього бажав ще з тих пір, як взяв Java.
Hosch250

Тепер у Java є 61-байтове рішення, але ваше значення все ще стоїть.
MilkyWay90
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.