我正在寻找最酷的事情,你可以在几行简单的代码。我相信你可以用Haskell用15行写一个Mandelbrot集,但是很难理解。
我的目标是启发学生编程很酷。
我们知道编程很酷,因为你可以创造任何你想象到的东西——它是最终的创意出口。我想激励这些初学者,让他们尽可能多地克服早期学习的困难。
Now, my reasons are selfish. I'm teaching an Intro to Computing course to a group of 60 half-engineering, half business majors; all freshmen. They are the students who came from underprivileged High schools. From my past experience, the group is generally split as follows: a few rock-stars, some who try very hard and kind of get it, the few who try very hard and barely get it, and the few who don't care. I want to reach as many of these groups as effectively as I can. Here's an example of how I'd use a computer program to teach:
Here's an example of what I'm looking
for: a 1-line VBS script to get your
computer to talk to you:
CreateObject("sapi.spvoice").Speak InputBox("Enter your text","Talk it")
I could use this to demonstrate order
of operations. I'd show the code, let
them play with it, then explain that
There's a lot going on in that line,
but the computer can make sense of it,
because it knows the rules. Then I'd
show them something like this:
4(5*5) / 10 + 9(.25 + .75)
And you can see that first I need to
do is (5*5). Then I can multiply for
4. And now I've created the Object. Dividing by 10 is the same as calling
Speak - I can't Speak before I have an
object, and I can't divide before I
have 100. Then on the other side I
first create an InputBox with some
instructions for how to display it.
When I hit enter on the input box it
evaluates or "returns" whatever I
entered. (Hint: 'oooooo' makes a
funny sound) So when I say Speak, the
right side is what to Speak. And I
get that from the InputBox.
So when you do several things on a
line, like:
x = 14 + y;
You need to be aware of the order of
things. First we add 14 and y. Then
we put the result (what it evaluates
to, or returns) into x.
这就是我的目标,有一堆很酷的例子来演示,并在他们玩得开心的时候教他们。我在我室友身上尝试了这个例子,虽然我可能不会把它作为第一课,但她喜欢它,并学到了一些东西。
一些很酷的数学程序,可以做出漂亮的图形或容易理解的形状,这是很好的想法,我将研究这些。这里有一些复杂的actionscript示例,但这有点太高级了,我不能教flash。你还有什么其他的想法吗?
PHP - Sierpinski垫圈,又名Triforce
好吧,它只有15行代码,但结果非常棒!这就是小时候让我抓狂的东西。这是来自PHP手册:
$x = 200;
$y = 200;
$gd = imagecreatetruecolor($x, $y);
$corners[0] = array('x' => 100, 'y' => 10);
$corners[1] = array('x' => 0, 'y' => 190);
$corners[2] = array('x' => 200, 'y' => 190);
$red = imagecolorallocate($gd, 255, 0, 0);
for ($i = 0; $i < 100000; $i++) {
imagesetpixel($gd, round($x),round($y), $red);
$a = rand(0, 2);
$x = ($x + $corners[$a]['x']) / 2;
$y = ($y + $corners[$a]['y']) / 2;
}
header('Content-Type: image/png');
imagepng($gd);
使用Tcl,你有一个简单的文本编辑器,其中有一个保存按钮,大约12行代码(但没有打开,那将需要另外8行代码)。它适用于所有标准平台:
pack [frame .toolbar] -side top -fill x
pack [button .save -text save -command save] -in .toolbar -side left
pack [scrollbar .vsb -orient vertical -command [list .text yview]] -side right -fill y
pack [text .text -wrap word -yscrollcommand [list .vsb set]] -side left -fill both -expand true
proc save {} {
set filename [tk_getSaveFile]
if {$filename ne ""} {
set f [open $filename w]
puts $f [.text get 1.0 end-1c]
close $f
}
}
我知道我们的目标是10行,所以如果你想要的是10行或更少,一个简单的文本编辑器没有加载或保存只有两行。这还不算太寒酸。
pack [scrollbar .vsb -orient vertical -command [list .text yview]] -side left -fill y
pack [text .text -wrap word -yscrollcommand [list .vsb set]] -side left -fill both -expand true
在您选择的平台上执行带有“wish文件名”的上述代码块中的任何一个。Wish安装在大多数*nix和mac上,但你必须手动安装windows。
更进一步,两行脚本也可以用python编写,尽管需要8行,但仍然低于10行的目标:
from Tkinter import *
root=Tk()
text = Text(wrap="word")
sb = Scrollbar(orient="vertical", command=text.yview)
text.configure(yscrollcommand=sb.set)
sb.pack(side="right", fill="y")
text.pack(side="left", fill="both", expand=True)
root.mainloop()
Mandelbrot集合可以用一种不太复杂的方式来表示,例如下面的Java:
public class MiniMandelbrot {
public static void main(String[] args) {
int[] rgbArray = new int[256 * 256];
for (int y=0; y<256; y++) {
for (int x=0; x<256; x++) {
double cReal=x/64.0-2.0, cImaginary=y/64.0-2.0;
double zReal=0.0, zImaginary=0.0, zRealSquared=0.0, zImaginarySquared=0.0;
int i;
for (i = 0; (i < 63) && (zRealSquared + zImaginarySquared < 4.0); i++) {
zImaginary = (zReal * zImaginary) + (zReal * zImaginary) + cImaginary;
zReal = zRealSquared - zImaginarySquared - cReal;
zImaginarySquared = zImaginary * zImaginary;
zRealSquared = zReal * zReal;
}
rgbArray[x+y*256] = i * 0x040404;
}
}
java.awt.image.BufferedImage bufferedImage = new java.awt.image.BufferedImage(256, 256, 1);
bufferedImage.setRGB(0, 0, 256, 256, rgbArray, 0, 256);
javax.swing.JOptionPane.showMessageDialog(null, new javax.swing.ImageIcon(bufferedImage), "The Mandelbrot Set", -1);
}
}