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


28

Какие советы по выбору правильного языка для гольфа? Какие факторы влияют на язык, который будет выбран?

Вот несколько примеров типов проблем:

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

Не просто говорите что-то вроде «Используйте GolfScript | J», потому что они вам нравятся.


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

Я сделал это вики в соответствии с нашей политикой в ​​вопросах типа «Советы».
dmckee

99 бутылок полезно, если вам нужен язык, начинающийся с определенной буквы ...
Джесси Милликен,

Престижность ace, trimsty, алгоритмшарк и hosch250 за то, что они помогли сделать этот поток лучшим ресурсом. Пожалуйста, продолжайте представлять заявки! Это был сложный вызов между алгоритмистой и hosch250, которые оба приложили немало усилий, но в итоге герр Акула добивается успеха .
Джонатан Ван Матре

Выберите любой язык, который вы хотите. Это также соревнование на разных языках. Больше уникальных, интересных решений на большем количестве языков - это хорошо.
Mego

Ответы:


-1

Зависит от того, что нужно, C / C ++ работает быстро, но вы должны сами написать больше кода. Python и Ruby работают медленнее, но их гораздо проще кодировать с помощью встроенных методов, которые сокращают объем работы, и они автоматически обрабатывают бесконечно большие значения (если у вас есть ОЗУ). Использование функционального языка, такого как Haskell, отлично подходит для чисто математического функционального использования, если можно так решить проблему.


2
Будучи в первую очередь пользователем Python, в Py вы платите за простоту использования в подсчете символов, хотя есть некоторые действительно хакерские приемы, которые могут сохранять символы. Хаскель и Лисп, будучи забавными, имеют тенденцию работать даже дольше, чем Python.
arrdem

Это, вероятно, не должно быть принятым ответом. Описание языков высокого и низкого уровня на самом деле не имеет ничего общего с количеством символов.
Сами Бенчериф,

Да, действительно справедливо провести ответ 2011 года на вопрос, отредактированный 23 февраля 2017 года. Может быть, нам следует прекратить изменять вопросы после того, как на них дан ответ?
ewanm89

10

Помещение моих двух центов в языки программирования массива , в частности J и APL .

K / Kona, Q и Nial также попадают в эту категорию, но они, как правило, имеют те же преимущества и критику. Используйте усмотрение. Я буду использовать примеры J ниже, в основном потому, что это ASCII и, следовательно, их легко набирать - помните, что символы APL считаются как одиночные байты, поэтому не допускайте, чтобы это была ваша проблема с языком, выбранным для игры в гольф.

  • Математические проблемы
  • Решающие головоломки
  • Выполнение численных методов
  • Хитрые проблемы с двумерным массивом

Эти два очень хороших языка математики и манипулирования данными, потому что они отбрасывают массивы на высоком уровне, и много циклов выполняется неявно , например, добавляя десять к каждому из 3, 4 и 5 ( 10 + 3 4 5) или суммируя каждый строка массива ( +/"1 arr- цикл в "1).

  • Проблема, связанная с простыми числами

В частности, в случае простых чисел J имеет быстрые и короткие встроенные примитивы, как и некоторые диалекты APL. (Правка: я думаю о Nars2000, который является частью диалекта и частью совершенно другой реализации. У APL нет встроенной функции для простых чисел.) N-й простой ( p:), нет. простых чисел до ( _1&p:), факторинга ( q:), GCD и LCM ( +.и *.) и т. д., там много всего. Однако на практике этот вопрос будет часто указывать на то, что вам нужно готовить свои собственные простые реализации, поэтому они не видят особого смысла. Есть все еще изящные и причудливые способы получить основной материал, в котором Вы нуждаетесь, это просто становится немного меньше вырезать и вставить.

  • Обработка строк
  • Обработка массива

Обработка массивов и строк - это немного смешанный пакет: если в APL / J он хорош или имеет примитивную или общую идиому, то это почти тривиально; если это что-то очень последовательное и не очень распараллеливаемое, у вас будет плохое время. Все, что находится между ними, находится в воздухе, хотя обычно они реагируют положительно.

  • Проблемы, которые требуют решения ввода-вывода, либо консоли, либо файла
  • Проблемы, которые требуют от вас написать решение в виде определения функции

IO странно. APL имеет выражение ввода односимвольного, но с J вы должны провести по крайней мере , 8 читать в номере: ".1!:1]1. Вывод немного менее многословен, но на практике вы по-прежнему смотрите на 6 или 7 символов впустую. J, в частности, очень нравится, если вы можете воспринимать входные данные в качестве аргументов функции вместо того, чтобы возиться с самим вводом-выводом.

На практике, с J и APL, решение обычно пишется как функция, которую вы вызываете на консоли. С помощью APL вы можете просто ввести имена переменных для своих аргументов, обернуть выражение, с которым вы работали, в фигурные скобки и назвать его днем.

Но с J есть некоторые издержки для явного определения функций 3 :'...'- и вы должны избегать любых строк внутри - так что обычно делается так называемое молчаливое программирование: вы программируете на уровне функций, комбинируя примитивы таким образом, мало чем отличается от Хаскелла. Это может быть как благословением, так и проклятием, потому что вам не нужно тратить столько символов, ссылающихся на ваши аргументы, но легко утонуть в скобках и потерять десятки символов, пытаясь взломать ваше короткое и умное решение. то, что работает.

  • Проблемы, которые требуют разбора
  • Вычислительная геометрия

У меня нет опыта игры в гольф с этими конкретными проблемами, но я скажу так: в конце концов, языки программирования массивов очень хороши для передачи и преобразования большого количества данных таким же образом. Если вы можете превратить проблему в упражнение по перетасовке чисел, вы можете сделать это проблемой APL / J, без пота.

Тем не менее, не все это проблема APL / J. В отличие от Golfscript, APL и J оказались хороши для игры в гольф, наряду с другими преимуществами;)


Отличный вклад! Спасибо за то, что вы первый в бассейне.
Джонатан Ван Матре

4

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

Бурлеск хорош для программ, связанных с числами, а Ruby - для более простых манипуляций с текстом.

Там на самом деле список языков и гольф оценки над здесь .


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

2

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

Вот мои любимые для деталей, которые вы перечислили:

Проблемы, которые требуют решения ввода-вывода, либо консоли, либо файла

Такие языки, как TI-Basic, работают хорошо, но я предпочитаю Ruby из-заputs

Проблемы, которые требуют разбора

GolfScript определенно поможет вам здесь

Проблемы, которые требуют от вас написать решение в виде определения функции

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

Математические проблемы

TI-Basic - сделан для калькулятора, поэтому в него входит математика;)

Проблема, связанная с простыми числами

Ничего особенного; Mathematica , вероятно, правильный инструмент для работы

Решающие головоломки

TI-Basic, поскольку он автоматически перебирает массивы

Выполнение численных методов

TI-Basic или Mathematica

Обработка строк

Python - имеет несколько отличных строковых функций.

Независимо от того, насколько хорошо вы думаете, TI-Basic , не используйте его для строк ...

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

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

Ruby - также имеет очень мощные функции массива, и, конечно, это !также поможет сжать код

Хитрые проблемы с двумерным массивом

Здесь лучше всего работает Ruby или Python , так как TI-Basic не поддерживает 2D-массивы

Вычислительная геометрия

TI-Basic имеет геометрические особенности и может использоваться для большинства математических задач, вплоть до исчисления и линейной алгебры


БОНУС

перекручивание

Либо Arduino или Quomplex . Arduino имеет встроенный, void loop(){}а Quomplex имеет бесконечные циклы, заключенные в скобки ( [])

Рисование / GUI

Game Maker Language обладает очень мощными возможностями рисования, и TI-Basic также является в целом полезным инструментом благодаря поддержке рисования на графике.

Quines

Либо 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 для игры в гольф. Для написания требуется более 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 ++ не включает встроенную графику.

Python 3

Python 3 похож на C ++ и Java. Он намного короче, поскольку не является строго типизированным - другими словами, он просто догадывается, что это за переменные.

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


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

@foobar Да, я говорил об этом. Спасибо за информацию, я желал этого с тех пор, как взял Java.
Hosch250

У Java сейчас есть 61-байтовое решение, но ваша точка зрения остается в силе.
MilkyWay90
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.