代码高尔夫:自动机
我使用这些规则制作了终极笑声发生器。 你能巧妙地用你最喜欢的语言实现它吗?
规则:
在每次迭代中,都会发生以下转换。
H -> AH
A -> HA
AA -> HA
HH -> AH
AAH -> HA
HAA -> AH
n = 0 | H
n = 1 | AH
n = 2 | HAAH
n = 3 | AHAH
n = 4 | HAAHHAAH
n = 5 | AHAHHA
n = 6 | HAAHHAAHHA
n = 7 | AHAHHAAHHA
n = 8 | HAAHHAAHHAAHHA
n = 9 | AHAHHAAHAHHA
n = ...
I made the ultimate laugh generator using these rules. Can you implement it in your favorite language in a clever manner?
Rules:
On every iteration, the following transformations occur.
H -> AH
A -> HA
AA -> HA
HH -> AH
AAH -> HA
HAA -> AH
n = 0 | H
n = 1 | AH
n = 2 | HAAH
n = 3 | AHAH
n = 4 | HAAHHAAH
n = 5 | AHAHHA
n = 6 | HAAHHAAHHA
n = 7 | AHAHHAAHHA
n = 8 | HAAHHAAHHAAHHA
n = 9 | AHAHHAAHAHHA
n = ...
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(14)
REBOL,150 个字符。 不幸的是,REBOL 并不是一种有利于编码高尔夫的语言,但正如 Adam Sandler 所说,150 个字符也不算太糟糕。
这假设循环变量
m
已经被定义。这是更好的布局:
REBOL, 150 characters. Unfortunately REBOL is not a language conducive to code golf, but 150 characters ain't too shabby, as Adam Sandler says.
This assumes the loop variable
m
has already been defined.And here it is with better layout:
F#: 184 个字符
似乎非常清楚地映射到 F#:
这是 fsi 中的运行:
F#: 184 chars
Seems to map pretty cleanly to F#:
Here's a run in fsi:
Lex/Flex
69 个字符。 在此处的文本中,我将制表符更改为 8 个空格,这样看起来就正确了,但所有这些连续的空格都应该是制表符,而且制表符很重要,因此它有 69 个字符。
就其价值而言,生成的 lex.yy.c 是 42736 个字符,但我认为这并不重要。 我可以(并且很快就会)编写一个纯 C 版本,该版本会更短并执行相同的操作,但我觉得这可能应该是一个单独的条目。
编辑:
这是一个更合法的 Lex/Flex 条目(302 个字符):
这会进行多次迭代(与上一个不同,后者只进行一次迭代,并且每次都必须手动播种,但会产生正确的结果)并且具有代码看起来极其可怕的优点。 我使用函数宏、字符串化运算符和两个全局变量。 如果您想要一个甚至不检查
malloc()
失败的更混乱的版本,它看起来像这样(282 个字符):可以在
c
处炮制一个更糟糕的版本> 是堆栈上的一个数组,我们只是给它某种MAX_BUFFER_SIZE
,但我觉得这太过分了。...只是在开玩笑。 207 个字符,如果我们采取“99 个字符总是就足够了”的心态:
我的偏好是效果最好的一个(即第一个可以迭代直到内存耗尽并检查其错误的字符),但这是代码高尔夫。
要编译第一个,请键入:(
如果您有
lex
而不是flex
,只需将flex
更改为lex
它们应该是兼容的。)要编译其他的,请输入:
否则 GCC 将抱怨在 C99 模式之外使用的
'for' 循环初始声明
和其他废话。纯 C 答案即将出现。
Lex/Flex
69 characters. In the text here, I changed tabs to 8 spaces so it would look right, but all those consecutive spaces should be tabs, and the tabs are important, so it comes out to 69 characters.
For what it's worth, the generated
lex.yy.c
is 42736 characters, but I don't think that really counts. I can (and soon will) write a pure-C version that will be much shorter and do the same thing, but I feel that should probably be a separate entry.EDIT:
Here's a more legit Lex/Flex entry (302 characters):
This does multiple iterations (unlike the last one, which only did one iteration, and had to be manually seeded each time, but produced the correct results) and has the advantage of being extremely horrific-looking code. I use a function macro, the stringizing operator, and two global variables. If you want an even messier version that doesn't even check for
malloc()
failure, it looks like this (282 characters):An even worse version could be concocted where
c
is an array on the stack, and we just give it aMAX_BUFFER_SIZE
of some sort, but I feel that's taking this too far....Just kidding. 207 characters if we take the "99 characters will always be enough" mindset:
My preference is for the one that works best (i.e. the first one that can iterate until memory runs out and checks its errors), but this is code golf.
To compile the first one, type:
(If you have
lex
instead offlex
, just changeflex
tolex
. They should be compatible.)To compile the others, type:
Or else GCC will whine about
‘for’ loop initial declaration used outside C99 mode
and other crap.Pure C answer coming up.
MATLAB (v7.8.0):
73 个字符(不包括用于使其看起来可读的格式化字符)
此脚本(“haha.m”)假设您已经定义了变量 n:
...并且这是单行版本:
测试:
MATLAB (v7.8.0):
73 characters (not including formatting characters used to make it look readable)
This script ("haha.m") assumes you have already defined the variable n:
...and here's the one-line version:
Test:
Haskell 的简单翻译:
以及较短的版本(122 个字符,优化为三个推导规则 + 基本情况):
以及 C++ 的翻译(182 个字符,仅执行一次迭代,在命令行上以初始状态调用):
A simple translation to Haskell:
And a shorter version (122 chars, optimized down to three derivation rules + base case):
And a translation to C++ (182 chars, only does one iteration, invoke with initial state on the command line):
Javascript:
120 剥离空格,我现在就不管它了!
扩展:
那个替代品很贵!
Javascript:
120 stripping whitespace and I'm leaving it alone now!
Expanded:
that replacer is expensive!
下面是一个 C# 示例,如果我将每项之间的空格减少为一个空格,则大小为 321 字节。
编辑:为了响应 @Johannes Rössel 评论,我从解决方案中删除了泛型找出更多的字节。
编辑:另一个更改,删除了所有临时变量。
重写后的解决方案具有更少的空格,但仍可编译,长度为 158 个字符:
对于 Visual Studio 2008 的完整源代码解决方案,下面提供了包含必要代码(包括单元测试)的 Subversion 存储库。
存储库位于此处、用户名和密码都是“guest”,不带引号。
Here's a C# example, coming in at 321 bytes if I reduce whitespace to one space between each item.
Edit: In response to @Johannes Rössel comment, I removed generics from the solution to eek out a few more bytes.
Edit: Another change, got rid of all temporary variables.
The rewritten solution with less whitespace, that still compiles, is 158 characters:
For a complete source code solution for Visual Studio 2008, a subversion repository with the necessary code, including unit tests, is available below.
Repository is here, username and password are both 'guest', without the quotes.
Ruby
此代码高尔夫没有很好地指定 - 我认为返回 n 次迭代字符串的函数是解决它的最佳方法。 它有 80 个字符。
代码打印出 n 个第一个字符串(71 个字符):
Ruby
This code golf is not very well specified -- I assumed that function returning n-th iteration string is best way to solve it. It has 80 characters.
Code printing out n first strings (71 characters):
Erlang
241 字节并准备运行:
可能需要改进。
Erlang
241 bytes and ready to run:
Could probably be improved.
Perl
168 个字符。(不计算不必要的换行符)
去混淆:
Perl
150 个字符。(不计算不必要的换行符)
去混淆
Perl
168 characters.(not counting unnecessary newlines)
De-obfuscated:
Perl
150 characters.(not counting unnecessary newlines)
De-obfuscated
Python(150 字节)
输出
Python (150 bytes)
Output
这是一个非常简单的 C++ 版本:
它不完全是代码高尔夫(它可以变得更短),但它可以工作。 将
LINES
更改为您想要打印的行数(注意:它不适用于0
)。 它将打印如下输出:Here is a very simple C++ version:
It's not exactly code-golf (it could be made a lot shorter), but it works. Change
LINES
to however many lines you want printed (note: it will not work for0
). It will print output like this:ANSI C99 的
字符数达到了残酷的 306 个:
有太多嵌套的 if 和条件运算符,我无法通过宏有效地减少这种情况。 相信我,我试过了。 可读版本:
将来我也许可以使用
strncmp()
制作一个较短的版本,但谁知道呢? 我们会看看会发生什么。ANSI C99
Coming in at a brutal 306 characters:
There are too many nested ifs and conditional operators for me to effectively reduce this with macros. Believe me, I tried. Readable version:
I may be able to make a shorter version with
strncmp()
in the future, but who knows? We'll see what happens.在Python中:
第一次尝试:198个字符的代码,我确信它可以变得更小:D
In python:
First attempt: 198 char of code, I'm sure it can get smaller :D