Этот сценарий не имеет аргументов, флагов или команд. Просто запустите его и играйте!
Готовы проверить свое знание столиц штатов? Листинг 12.6 демонстрирует, насколько хорошо мы знаем столицы!
Листинг 12.6.Запуск игрового сценария states
$ states
What city is the capital of Indiana?
Answer: Bloomington
I’m afraid that’s not correct.
Answer: Indianapolis
*** Absolutely correct! Well done! ***
What city is the capital of Massachusetts?
Answer: Boston
*** Absolutely correct! Well done! ***
What city is the capital of West Virginia?
Answer: Charleston
*** Absolutely correct! Well done! ***
What city is the capital of Alaska?
Answer: Fairbanks
I’m afraid that’s not correct.
Answer: Anchorage
I’m afraid that’s not correct.
Answer: Nome
I’m afraid that’s not correct.
Answer: Juneau
*** Absolutely correct! Well done! ***
What city is the capital of Oregon?
Answer: quit
Salem is the capital of Oregon.
You got 4 out of 5 presented.
К счастью, игра запоминает количество только успешных попыток, а также не фиксирует, сколько раз вы обращались к Google, чтобы узнать ответ!
Усовершенствование сценария
Самый большой недостаток этой игры, пожалуй, ее придирчивость к правописанию. Неплохим усовершенствованием стал бы код, реализующий нечеткое сопоставление: чтобы, например, ответ пользователя Juneu вместо Juneau расценивался как правильный. Для этого можно было бы использовать модифицированный алгоритм Soundex (созвучия), который удаляет все гласные и из удвоенных согласных оставляет только одну (например, название Annapolis было бы преобразовано в npls). Это может оказаться слишком вольной трактовкой, но сама идея стоит того, чтобы ее рассмотреть.
Так же, как в других играх, в этой пригодились бы подсказки. Например, можно по запросу вывести первую букву правильного ответа и запоминать, как много подсказок запросил пользователь в сеансе игры.
Несмотря на то что эта игра написана для столиц штатов, ее легко переделать для работы с любыми парами данных. Например, создать отдельный файл для Италии, с соответствиями страна/валюта или политик/партия. Как мы не раз видели в Unix, достаточно универсальные сценарии порой можно использовать совершенно неожиданными и непредусмотренными ранее способами.
№ 86. Является ли число простым?
Простыми называют числа, которые делятся без остатка только на самих себя, например 7. С другой стороны, 6 и 8 не являются простыми числами. Простые однозначные числа распознаются легко, но с большими приходится попотеть.
В математике имеется несколько приемов определения простых чисел, но мы воспользуемся методом простого перебора и будем пытаться применить все возможные делители, сравнивая остаток от деления с нулем, как показано в листинге 12.7.
Листинг 12.7.Сценарий isprime
··#!/bin/bash
··# isprime — получает число и проверяет, является ли оно простым.
··#·· Использует прием, известный как пробное деление: просто перебирает
··#·· числа от 2 до (n/2) и пытается использовать их в качестве делителя,
··#·· проверяя остаток от деления.
··counter=2
··remainder=1
··if [$# −eq 0]; then
····echo "Usage: isprime NUMBER" >&2
····exit 1
··fi
··number=$1
··# 3 и 2 — простые числа, 1 — нет.
··if [$number −lt 2]; then
····echo "No, $number is not a prime"
····exit 0
··fi
··# Теперь выполним некоторые вычисления.
·· while [$counter −le $(expr $number / −a— a $remainder −ne 0]
··do
····remainder=$(expr $number % $counter) # '/’ деление, '%' остаток
····# echo " for counter $counter, remainder = $remainder"
····counter=$(expr $counter + 1)
··done
··if [$remainder −eq 0]; then
····echo "No, $number is not a prime"
··else
····echo "Yes, $number is a prime"
··fi
··exit 0
Основу сценария составляет цикл while
, поэтому уделим ему основное внимание. Для числа 77 условное выражение в заголовке цикла приняло бы вид:
while [2 −le 38 −a 1 −ne 0]
Очевидно, что оно не выполняется: 77 не делится нацело на 2. Каждый раз, когда код проверяет потенциальный делитель ($counter) и обнаруживает, что исходное число не делится на него нацело, он вычисляет остаток ($number % $counter), увеличивает $counter на 1 и повторяет вычисления.
Читать дальше