我正在寻找最酷的事情,你可以在几行简单的代码。我相信你可以用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。你还有什么其他的想法吗?
用Python将图像转换为音乐
从我的回答,我如何循环每4行每4个像素,使用Python?:
#!/usr/bin/env python
import easygui # http://easygui.sourceforge.net/
import Image # http://www.pythonware.com/products/pil/
import numpy # http://numpy.scipy.org/
filename = easygui.fileopenbox() # pick a file
im = Image.open(filename) # make picture
im.show() # show picture
ar = numpy.asarray(im) # get all pixels
N = 4
pixels = ar[::N,::4] # every 4th pixel in every N-th row
notes = pixels.sum(axis=2) / 9 + 24 # compute notes [0, 52]
print "number of notes to play:", notes.size
音符可以对应不同的音调。这里我用的是等温标度:
# play the notes
import audiere # http://pyaudiere.org/
import time
d = audiere.open_device()
# Notes in equal tempered scale
f0, a = 440, 2**(1/12.)
tones = [d.create_tone(f0*a**n) for n in range(-26, 27)] # 53
for y, row in enumerate(notes):
print N*y # print original row number
for t in (tones[note] for note in row):
t.volume = 1.0 # maximum volume
t.play()
time.sleep(0.1) # wait around 100 milliseconds
t.stop()
我一直很喜欢河内塔。在计划
(define (hanoi x from to spare)
(if (= x 1)
(begin
(display "move ")(display from)(display " to ")(display to)(display "\n"))
(begin
(hanoi (- x 1) from spare to)
(hanoi 1 from to spare)
(hanoi (- x 1) spare to from))))
示例输出
gosh> (hanoi 3 'start 'dest 'spare)
move start to dest
move start to spare
move dest to spare
move start to dest
move spare to start
move spare to dest
move start to dest
#<undef>
同样在Python中(尽管这不能像Scheme版本那样做1000张光盘)
def hanoi(x, source, dest, spare):
if x == 1:
print "%s to %s" % (source, dest)
else:
hanoi(x - 1, source, spare, dest)
hanoi(1, source, dest, spare)
hanoi(x - 1, spare, dest, source)
你可以创建一个选择随机数的应用程序。你得猜一下。如果你错了,它会说:更高或更低。如果你猜对了,这是个不错的消息。
为学生们演奏很酷。
简单的Python版本,没有适当的错误检查:
import random
while input('Want to play higher/lower? ').lower().startswith('y'):
n = random.randint(1, 100)
g = int(input('Guess: '))
while g != n:
print(' %ser!' % (g > n and 'low' or 'high'))
g = int(input('Guess: '))
print(' Correct! Congratulations!')
埃里克建议让电脑猜数字。这也可以在10行代码内完成(尽管现在缺乏适当的错误检查更加严重:在范围之外的有效数字会导致无限循环):
while input('Want to let the pc play higher/lower? ').lower().startswith('y'):
n = int(input('Give a number between 1 and 100: '))
lo, hi, guess, tries = 1, 100, 50, 1
while guess != n:
tries += 1
lo, hi = (guess + 1, hi) if guess < n else (lo, guess - 1)
guess = (lo + hi) // 2
print('Computer guessed number in %d tries' % tries)