| 各階待ち人数 階数 最大搭乗人数 ボックス内人数 ボックス停止階 ラウンド数 移動数 完了ラウンド数 放置ラウンド数 ボックス移動 状態出力 | 各階待ち人数 := #(0 7 3 11 7). 階数 := 各階待ち人数 size. 最大搭乗人数 := 3. ボックス内人数 := 0. ボックス停止階 := 1. ラウンド数 := 0. 移動数 := 0. 完了ラウンド数 := Array new: 階数 withAll: 0. 放置ラウンド数 := Array new: 階数 withAll: 0. 放置ラウンド数 at: 1 put: -1. World findATranscript: nil. ボックス移動 := [:行き先階 | ラウンド数 := ラウンド数 + ((行き先階 - ボックス停止階) abs * 2) + 5. 移動数 := 移動数 + (行き先階 - ボックス停止階) abs. (放置ラウンド数 at: 行き先階) = 0 ifTrue: [放置ラウンド数 at: 行き先階 put: ラウンド数]. 行き先階 = 1 ifTrue: [ボックス停止階 := 1. ボックス内人数 := 0] ifFalse: [ | 待ち人数 搭乗者数 残り人数 | 待ち人数 := 各階待ち人数 at: 行き先階. 搭乗者数 := 待ち人数 min: 最大搭乗人数 - ボックス内人数. 残り人数 := 待ち人数 - 搭乗者数. ボックス停止階 = 1 ifTrue: [Transcript cr]. ボックス停止階 := 行き先階. Transcript show: ボックス停止階; show: '階: '; show: 待ち人数; show: ' -> '; show: (各階待ち人数 at: ボックス停止階 put: 残り人数); show: '. '. "Transcript show: ' (ラウンド: ', ラウンド数 printString, ', 移動数: ', 移動数 printString, ')'." ボックス内人数 := ボックス内人数 + 搭乗者数. 残り人数 = 0 ifTrue: [完了ラウンド数 at: ボックス停止階 put: ラウンド数]]]. 状態出力 := [ Transcript cr. 5 to: 1 by: -1 do: [:n | Transcript cr; show: n; show: '階; '; show: (各階待ち人数 at: n); show: ' 人 / 完了ラウンド: '; show: (完了ラウンド数 at: n)]. Transcript cr]. 状態出力 value. [ ボックス内人数 = 最大搭乗人数 ifTrue: [ボックス移動 value: 1] ifFalse: [ | 呼び出し階 | 呼び出し階 := 各階待ち人数 findLast: [:各階 | 各階 > 0]. 呼び出し階 = 0 ifTrue: [ボックス移動 value: 1] ifFalse: [ボックス移動 value: 呼び出し階]]. ボックス停止階 > 1 or: [各階待ち人数 anySatisfy: [:各階 | 各階 > 0]] ] whileTrue. 状態出力 value. Transcript cr; show: '経過時間: '; show: ラウンド数. "Transcript cr; show: '階別の放置時間一覧: '; show: 放置ラウンド数." Transcript cr; show: '階別の最大放置時間: '; show: 放置ラウンド数 max. Transcript cr; show: 'のべ移動階数: '; show: 移動数 "出力 => 5階; 7 人 / 完了ラウンド: 0 4階; 11 人 / 完了ラウンド: 0 3階; 3 人 / 完了ラウンド: 0 2階; 7 人 / 完了ラウンド: 0 1階; 0 人 / 完了ラウンド: 0 5階: 7 -> 4. 5階: 4 -> 1. 5階: 1 -> 0. 4階: 11 -> 9. 4階: 9 -> 6. 4階: 6 -> 3. 4階: 3 -> 0. 3階: 3 -> 0. 2階: 7 -> 4. 2階: 4 -> 1. 2階: 1 -> 0. 5階; 0 人 / 完了ラウンド: 65 4階; 0 人 / 完了ラウンド: 138 3階; 0 人 / 完了ラウンド: 158 2階; 0 人 / 完了ラウンド: 202 1階; 0 人 / 完了ラウンド: 0 経過時間: 209 階別の最大放置時間: 174 のべ移動階数: 52 "