选择正确的高尔夫语言有哪些技巧?哪些因素影响选择的语言?
以下是一些示例问题类型:
- 需要I / O解决方案(控制台或文件)的问题
- 需要解析的问题
- 需要您将解决方案作为函数定义编写的问题
- 数学问题
- 处理质数时出现问题
- 解决数字难题
- 执行数值方法
- 字符串处理
- 数组处理
- 棘手的2D阵列问题
- 计算几何
- 递归
- 2D图形
- 3D图形
- 音讯
- 网络/网络
- 并行处理
不要仅仅因为喜欢而说“ Use GolfScript | J”之类的话。
选择正确的高尔夫语言有哪些技巧?哪些因素影响选择的语言?
以下是一些示例问题类型:
不要仅仅因为喜欢而说“ Use GolfScript | J”之类的话。
Answers:
根据需要,C / C ++很快,但是您必须自己编写更多的代码。Python和Ruby的速度较慢,但使用内置方法的代码更容易编写,这些方法缩短了很多工作,并且它们自动处理无限大的值(如果有RAM)。如果可以以这种方式构造问题,则使用Haskell这样的函数式语言非常适合纯粹的数学函数式使用。
投入我的两分钱 数组编程语言(尤其是J和APL)上。
K / Kona,Q和Nial也属于此类,但他们通常有相同的好处和批评。谨慎使用。我将在下面使用J例子,主要是因为它们是ASCII,因此易于键入-请记住,APL字符算作单个字节,所以不要将其作为打高尔夫球的语言的问题。
这两种都是非常好的数学和数据处理语言,因为它们在较高的层次上折腾数组,并且很多循环是隐式完成的,例如,将3、4和5(10 + 3 4 5
)分别加10 或求和数组的行(+/"1 arr
-循环在中"1
)。
特别是在质数问题上,J和APL的某些方言一样,J具有快速且简短的内置基元。(编辑:我想到的是Nars2000,它是部分方言,部分是完全不同的实现。APL没有内置的质数。)第N个质数(p:
),不。最多(_1&p:
),因数(q:
),GCD和LCM(+.
和*.
),依此类推,那里有很多。但是,在实践中,该问题通常会指定您必须自己编写主要的实现,因此这些使用不会太多。仍然有整洁而奇特的方式来获取所需的主要东西,它的剪切和粘贴变少了。
数组和字符串处理有点复杂:如果APL / J擅长于此或者具有原始的或惯用的习语,那么这几乎是微不足道的。如果这是非常顺序的并且不是很可并行化的,那么您将经历一段糟糕的时光。两者之间的任何事情都悬而未决,尽管通常他们会做出积极响应。
IO很奇怪。APL有一个单字符输入表达式,但是使用J时,您至少要花费8才能读取一个数字:".1!:1]1
。输出的详细程度稍差一些,但实际上,您仍在浪费6或7个字符。如果您可以将输入作为函数的参数,而不必费解IO本身,那么J特别喜欢它。
实际上,对于J和APL,通常将解决方案编写为您在控制台上调用的函数。使用APL,您基本上可以只为变量输入变量名,并用花括号将要使用的表达式包装起来,然后将其命名为day。
但是使用J时,显式定义函数会产生一些开销- 3 :'...'
并且您必须转义其中的任何字符串-因此通常要做的是所谓的默认编程:您可以在函数级别进行编程,以一种方式组合基元和Haskell一样。这既是福也是祸,因为您不必花费太多的字符来引用您的论点,但是很容易淹没在括号中并最终失去了数十个字符,从而试图将您本来简短而又聪明的解决方案改编为有用的东西。
我没有打高尔夫球这些特定问题的经验,但是我会这样说:最后,数组编程语言非常擅长以相同的方式进行管道传输和转换大量数据。如果您可以将问题转变为号码改组的练习,则可以使其成为APL / J问题,不费吹灰之力。
就是说,并非所有问题都是APL / J问题。与Golfscript不同,APL和J恰好对打高尔夫球有好处,还有其他好处;)
我喜欢使用晦涩的编程语言来(尝试)完成工作。
这是我列出的详细信息的我的最爱:
需要I / O解决方案(控制台或文件)的问题
TI-Basic之类的语言可以很好地工作,但是我更喜欢Ruby,因为puts
需要解析的问题
GolfScript一定会在这里为您提供帮助
需要您将解决方案作为函数定义编写的问题
TI-84表 -允许函数,Y=
例如Y=|X|
返回X的绝对值
数学问题
TI-Basic-专为计算器而设计,因此它包括数学;)
处理质数时出现问题
没什么特别的; Mathematica可能是工作的正确工具
解决数字难题
TI-Basic自动循环遍历数组
执行数值方法
TI基本或Mathematica
字符串处理
Python-有一些很棒的字符串函数。
无论您认为TI-Basic多么出色,都不要将它用于字符串...
数组处理
TI-基础 - 通过阵列自动循环 ; 例如增加数组中的所有值-L1+1→L1
Ruby-也具有非常强大的数组功能,当然这!
也将有助于压缩代码
棘手的2D阵列问题
Ruby或Python在这里效果最好,因为TI-Basic不支持2D数组
计算几何
TI-Basic具有几何特征,可用于大多数数学,包括微积分和线性代数
奖金
循环播放
无论是Arduino的或Quomplex。Arduino具有内置功能void loop(){}
,Quomplex具有括号包含的无限循环([]
)
绘图/ GUI
Game Maker语言具有非常强大的绘图功能,并且由于支持在图形上绘图,因此 TI-Basic也是通用的有用工具。
奎因
要么HQ9 +或Quomplex因为HQ9 +具有Q
输出程序的源代码和Quomplex除非将自动打印出它的源代码*
(输出)被指定,或者它不产生输出,具有限定#
如果您正在解决数学问题并且没有Mathematica,请尝试Sage。它基于Python,因此,如果您已经了解Python,则不需要太多时间来学习其语法。
例子:
它对图形绘制和方程式求解也很有用(例如,您可以solve()
在Sage中使用该函数,或者如果规则禁止使用该函数,则它可以轻松实现Newton Raphson流程,因为它具有diff()
可以执行符号微分的功能) 。
此外,如果您是Python2程序员,那么使用Sage可能会跳过长import
语句而作弊。例如,math
并且sys
默认情况下已导入。(请注意,如果您的Python2程序依赖整数除法,则此方法可能不起作用。)
我知道三种语言-Java,C ++和Python3。我不熟悉它们,但这是我的使用经验。
我再也不会用Java打高尔夫球了。仅需写80个字符Hello World!
。但是,它确实有其优势:
输入需要创建一个
Scanner
对象。输入单个字符很困难。它要求指定您要输入的类型。
由于for
循环,解析非常简单。增强的for
循环对此非常有用。
Java支持方法,但是方法声明很长。
Java和其他所有高级语言在数学方面都很出色。
当问题涉及修改字符串时,将很难使用Java。您不能对现有字符串进行修改。
Java的数组易于使用。
Java擅长递归。
Java包含内置图形。它们非常易于使用。
C ++是一门非常强大的语言,但是当尝试以56个字符打高尔夫球时,它会有些冗长Hello world!
。
输入和输出都很容易。您无需指定要输入的类型-这是自动完成的。但是,您必须包括iostream库。
解析非常容易。
函数声明很简单,但是却吃了很多重要的字符。C ++擅长数学,但不像Java那样包含PI或E。
C ++的字符串易于使用,并可根据需要进行更改。
我vector
尽可能使用s代替array
s,但是两者都很容易使用。
C ++擅长递归。
C ++不包括内置图形。
Python 3与C ++和Java类似。因为它不是强类型的,所以它要短得多-换句话说,它只是猜测变量是什么。
输入很容易,但是所有内容都以字符串形式输入。您必须手动将所有输入转换为所需的任何值。
解析和循环非常简单。
Python函数声明非常简单且简短。
Python擅长数学。
Python的字符串易于使用。
数组易于使用。
Python擅长递归。
Python不包含内置图形。