3. 4 串列(一)
直條圖 (三)
52
讓直條圖的直線長度統一由底部向上數,且在圖形左側標示 s 軸,
由 9 向下遞減至 1,如此可觀察到對每條直條線,當 s 大於直條
線長度,則印空格(句點),否則印星號。加上一些設定,程式的主體
部份就可寫成以下形式:
n = int(input("> "))
vals = [ random.randint(1,9) for i in range(1,n) ]
for s in range(9,0,-1) :
for val in vals :
if s > val :
print( ’ ’ , end=" " )
else :
print( ’*’ , end=" " )
print()
5. 4 串列(一) 54
直條圖 (五)
import random
while True :
# 斜條線數量
n = int( input("> ") )
# m 最長直線高
# w 直條圖寬 (>=3)
m , w = 9 , 3
# 使用亂數設定各直條線長
vals = [ random.randint(1,m) for i in range(1,n+1) ]
# 畫直條線
for s in range(m,0,-1) :
for val in vals :
if s > val :
print( " "*w , end=" " )
elif s == val :
print( "/" + "*"*(w-2) + "" , end=" " )
else :
print( "|" + "*"*(w-2) + "|" , end=" " )
print()
# 組合格式列印所使用的字串:置中對齊數字
ws = "{:^" + str(w) + "}"
# 輸出長度數字
for val in vals :
print( ws.format(val) , end=" " )
print()
8. 4 串列(一) 57
螺旋數字 (三)
螺旋圖的四個循環方向可用變數 dir 來表示,以 0 1 2 3 分別代表 → ↓ ← ↑。
四個方向的行進方式可用 ds 與 dt 兩串列代表在 s 與 t 方向的移動距離。向 → 走
一步等同 dt 為 1,ds 不更動。向 ↓ 走一步即是 ds 為 1,dt 不變,以下表表示:
當填入的數字落到三角形位置時,就要轉彎改用下個方向,也就是要調整 dir 的數
值。此外程式設計的重點變得要找出所有三角形位置的幾何表示方式。仔細觀察三角形在
本頁圖中的位置分佈,利用簡單的國中數學即可推導出所有三角形都落在以下三個幾何條
件之中:
1. s + t == n-1
2. s >= n//2 and s == t
3. s < n//2 and s == t+1
有了以上的轉彎條件,換成程式語言就只是簡單的替換而已。由此例可知應用
「數學思維」於程式設計的重要性,否則本題的程式碼是無法憑空撰寫出來。
方向 → ↓ ← ↑
dir 0 1 2 3
ds 0 1 0 -1
dt 1 0 -1 0
9. 4 串列(一)
螺旋數字 (四)
58
while True :
n = int( input("> ") )
# 二維串列儲存數字
nums = [ [None]*n for i in range(n) ]
# 起始位置
s , t = 0 , 0
# 四個方向的前進方式
ds , dt = [0,1,0,-1] , [1,0,-1,0]
# 中間數
m = n//2 + ( 1 if n%2 else 0 )
# 起始方向
dir = 0
for i in range(n*n) :
nums[s][t] = i + 1
# 判斷是否轉彎
if s+t==n-1 or ( s >= m and s==t ) or ( s < m and s==t+1 ) :
dir += 1
if dir == 4 : dir = 0
# 更新位置
s += ds[dir]
t += dt[dir]
# 列印數字
print( "-"*(5*n+1) )
for i in range(n) :
for j in range(n) :
print( "|{:>3}".format(nums[i][j]) , end=" " )
print( "|" )
print( "-"*(5*n+1) )
print()
13. 4 串列(一)
點矩陣數字 (四)
62
# 0 到 9 數字點矩陣
bmap = ( (15,9,9,9,15), (2,2,2,2,2), (15,1,15,8,15), (15,1,15,1,15),
(9,9,15,1,1), (15,8,15,1,15), (15,8,15,9,15), (15,1,2,2,2),
(15,9,15,9,15), (15,9,15,1,15) )
# 每個矩矩陣的橫列數與直行數
R , C = len(bmap[0]) , 4
while True :
num = input("> " )
# nos 為 num 的各個位數串列
nos = [ int(s) for s in list(num) ] # num 也可不用置於 list() 內
print()
# 數字的每一列
for r in range(R) :
# 每個數字
for n in nos :
# 數字的每一行
for c in range(C-1,-1,-1) :
# 判斷位元位置是否有值
if bmap[n][r] & ( 1 << c ) :
print( n , end="" )
else :
print( " " , end="" )
print( " " , end="" )
print()
print()
21. 4 串列(一)
彈珠臺(四)
70
from random import *
n , total = 5 , 50000
counts = [ 0 for x in range(n+1) ]
for k in range(total) :
# 起始落下的位置
p = 2*randint(1,n) – 1
# 第一層釘子
move = 2*randint(0,1) – 1
p += move
# 第二到第五層釘子
for i in range(2) :
move = 2*randint(0,1) – 1
p += move
# 碰到兩側,提前離開
if p < 0 or p > 2*n : break
move = 2*randint(0,1) – 1
p += move
# 球數統計
if p < 0 :
counts[0] += 1
elif p > 2*n :
counts[-1] += 1
else :
counts[p//2] += 1
# 列印
for no in counts :
s = int(160*no/total+0.5)
print(str(s)+”/160”,end=” ”)
print()